mirror of
https://github.com/mangosfour/server.git
synced 2025-12-17 07:37:03 +00:00
Fixed the db_version queries, added code to remove the updates from previous commits, other cleanups.
This commit is contained in:
parent
c733c0f70c
commit
1e824ba2d9
1 changed files with 131 additions and 63 deletions
|
|
@ -5,6 +5,8 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <list>
|
||||||
|
#include <sstream>
|
||||||
#include "../../src/framework/Platform/CompilerDefs.h"
|
#include "../../src/framework/Platform/CompilerDefs.h"
|
||||||
|
|
||||||
#if PLATFORM == PLATFORM_WINDOWS
|
#if PLATFORM == PLATFORM_WINDOWS
|
||||||
|
|
@ -72,6 +74,7 @@ char origin_hash[MAX_HASH];
|
||||||
char last_sql_update[NUM_DATABASES][MAX_PATH];
|
char last_sql_update[NUM_DATABASES][MAX_PATH];
|
||||||
|
|
||||||
std::set<std::string> new_sql_updates;
|
std::set<std::string> new_sql_updates;
|
||||||
|
std::ostringstream str_updates;
|
||||||
|
|
||||||
FILE *cmd_pipe;
|
FILE *cmd_pipe;
|
||||||
|
|
||||||
|
|
@ -274,7 +277,7 @@ bool find_head_msg()
|
||||||
bool amend_commit()
|
bool amend_commit()
|
||||||
{
|
{
|
||||||
printf("+ amending last commit\n");
|
printf("+ amending last commit\n");
|
||||||
snprintf(cmd, MAX_CMD, "git commit --amend -F- %s%s", path_prefix, rev_file);
|
snprintf(cmd, MAX_CMD, "git commit --amend -F- %s%s%s", path_prefix, rev_file, str_updates.str().c_str());
|
||||||
if( (cmd_pipe = popen( cmd, "w" )) == NULL )
|
if( (cmd_pipe = popen( cmd, "w" )) == NULL )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
@ -284,6 +287,34 @@ bool amend_commit()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct sql_update_info
|
||||||
|
{
|
||||||
|
int rev;
|
||||||
|
int nr;
|
||||||
|
int db_idx;
|
||||||
|
char db[MAX_BUF];
|
||||||
|
char table[MAX_BUF];
|
||||||
|
bool has_table;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool get_sql_update_info(const char *buffer, sql_update_info &info)
|
||||||
|
{
|
||||||
|
info.table[0] = '\0';
|
||||||
|
if(sscanf(buffer, "%d_%d_%[^_]_%[^.].sql", &info.rev, &info.nr, info.db, info.table) != 4 &&
|
||||||
|
sscanf(buffer, "%d_%d_%[^.].sql", &info.rev, &info.nr, info.db) != 3)
|
||||||
|
{
|
||||||
|
info.rev = 0; // this may be set by the first scans, even if they fail
|
||||||
|
if(sscanf(buffer, "%d_%[^_]_%[^.].sql", &info.nr, info.db, info.table) != 3 &&
|
||||||
|
sscanf(buffer, "%d_%[^.].sql", &info.nr, info.db) != 2)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(info.db_idx = 0; info.db_idx < NUM_DATABASES; info.db_idx++)
|
||||||
|
if(strncmp(info.db, databases[info.db_idx], MAX_DB) == 0) break;
|
||||||
|
info.has_table = (info.table[0] != '\0');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool find_sql_updates()
|
bool find_sql_updates()
|
||||||
{
|
{
|
||||||
printf("+ finding new sql updates on HEAD\n");
|
printf("+ finding new sql updates on HEAD\n");
|
||||||
|
|
@ -296,40 +327,35 @@ bool find_sql_updates()
|
||||||
if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; }
|
if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; }
|
||||||
if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; }
|
if(!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; }
|
||||||
|
|
||||||
int nr, cur_rev, i;
|
sql_update_info info;
|
||||||
char db[MAX_BUF], table[MAX_BUF];
|
|
||||||
|
|
||||||
while(fgets(buffer, MAX_BUF, cmd_pipe))
|
while(fgets(buffer, MAX_BUF, cmd_pipe))
|
||||||
{
|
{
|
||||||
buffer[strnlen(buffer, MAX_BUF) - 1] = '\0';
|
buffer[strnlen(buffer, MAX_BUF) - 1] = '\0';
|
||||||
if(sscanf(buffer, "%d_%d_%[^_]_%[^.].sql", &cur_rev, &nr, db, table) == 4 ||
|
|
||||||
sscanf(buffer, "%d_%d_%[^.].sql", &cur_rev, &nr, db) == 3)
|
if(get_sql_update_info(buffer, info))
|
||||||
|
{
|
||||||
|
if(info.rev > 0)
|
||||||
{
|
{
|
||||||
// find the update with the highest rev for each database
|
// find the update with the highest rev for each database
|
||||||
// (will be the required version for the new update)
|
// (will be the required version for the new update)
|
||||||
// new updates should not have a rev number already
|
// new updates should not have a rev number already
|
||||||
for(i = 0; i < NUM_DATABASES; i++)
|
|
||||||
if(cur_rev > last_sql_rev[i] &&
|
|
||||||
strncmp(db, databases[i], MAX_DB) == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if(i < NUM_DATABASES)
|
if(info.db_idx < NUM_DATABASES && info.rev > last_sql_rev[info.db_idx])
|
||||||
{
|
{
|
||||||
last_sql_rev[i] = cur_rev;
|
last_sql_rev[info.db_idx] = info.rev;
|
||||||
strncpy(last_sql_update[i], buffer, MAX_PATH);
|
sscanf(buffer, "%[^.]", last_sql_update[info.db_idx]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(sscanf(buffer, "%d_%[^_]_%[^.].sql", &nr, db, table) == 3 ||
|
else
|
||||||
sscanf(buffer, "%d_%[^.].sql", &nr, db) == 2)
|
|
||||||
{
|
{
|
||||||
for(i = 0; i < NUM_DATABASES; i++)
|
if(info.db_idx == NUM_DATABASES)
|
||||||
if(strncmp(db, databases[i], MAX_DB) == 0) break;
|
|
||||||
if(i == NUM_DATABASES)
|
|
||||||
printf("WARNING: incorrect database name for sql update %s\n", buffer);
|
printf("WARNING: incorrect database name for sql update %s\n", buffer);
|
||||||
else
|
else
|
||||||
new_sql_updates.insert(buffer);
|
new_sql_updates.insert(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pclose(cmd_pipe);
|
pclose(cmd_pipe);
|
||||||
|
|
||||||
|
|
@ -345,7 +371,6 @@ bool find_sql_updates()
|
||||||
while(fgets(buffer, MAX_BUF, cmd_pipe))
|
while(fgets(buffer, MAX_BUF, cmd_pipe))
|
||||||
{
|
{
|
||||||
buffer[strnlen(buffer, MAX_BUF) - 1] = '\0';
|
buffer[strnlen(buffer, MAX_BUF) - 1] = '\0';
|
||||||
if(sscanf(buffer, "%d_%[^.].sql", &nr, db) == 2)
|
|
||||||
new_sql_updates.erase(buffer);
|
new_sql_updates.erase(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -354,7 +379,11 @@ bool find_sql_updates()
|
||||||
if(!new_sql_updates.empty())
|
if(!new_sql_updates.empty())
|
||||||
{
|
{
|
||||||
for(std::set<std::string>::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr)
|
for(std::set<std::string>::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr)
|
||||||
|
{
|
||||||
printf("%s\n", itr->c_str());
|
printf("%s\n", itr->c_str());
|
||||||
|
// store the deleted files to be amended to the commit later
|
||||||
|
str_updates << ' ' << path_prefix << "sql/updates/" << itr->c_str();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("WARNING: no new sql updates found.\n");
|
printf("WARNING: no new sql updates found.\n");
|
||||||
|
|
@ -362,36 +391,6 @@ bool find_sql_updates()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool convert_sql_update(const char *src_file, const char *dst_file, const char *dst_name)
|
|
||||||
{
|
|
||||||
FILE * fin = fopen( src_file, "r" );
|
|
||||||
if(!fin) return false;
|
|
||||||
FILE * fout = fopen( dst_file, "w" );
|
|
||||||
if(!fout) { fclose(fin); return false; }
|
|
||||||
|
|
||||||
int cur_rev, nr, i;
|
|
||||||
char db[MAX_PATH], table[MAX_PATH];
|
|
||||||
if(sscanf(dst_name, "%d_%d_%[^_]_%[^.].sql", &cur_rev, &nr, db, table) != 4 &&
|
|
||||||
sscanf(dst_name, "%d_%d_%[^.].sql", &cur_rev, &nr, db) != 3)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for(i = 0; i < NUM_DATABASES; i++)
|
|
||||||
if(strncmp(db, databases[i], MAX_DB) == 0) break;
|
|
||||||
if(i == NUM_DATABASES) return false;
|
|
||||||
|
|
||||||
fprintf(fout, "ALTER TABLE %s CHANGE COLUMN required_%s required_%s bit;\n\n",
|
|
||||||
db_version_table[i], last_sql_update[i], dst_name);
|
|
||||||
|
|
||||||
char c;
|
|
||||||
while( (c = getc(fin)) != EOF )
|
|
||||||
putc(c, fout);
|
|
||||||
|
|
||||||
fclose(fin);
|
|
||||||
fclose(fout);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool convert_sql_updates()
|
bool convert_sql_updates()
|
||||||
{
|
{
|
||||||
if(new_sql_updates.empty()) return true;
|
if(new_sql_updates.empty()) return true;
|
||||||
|
|
@ -400,15 +399,44 @@ bool convert_sql_updates()
|
||||||
|
|
||||||
for(std::set<std::string>::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr)
|
for(std::set<std::string>::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr)
|
||||||
{
|
{
|
||||||
char src_file[MAX_PATH], dst_file[MAX_PATH], dst_name[MAX_PATH];
|
sql_update_info info;
|
||||||
|
if(!get_sql_update_info(itr->c_str(), info)) return false;
|
||||||
|
if(info.db_idx == NUM_DATABASES) return false;
|
||||||
|
|
||||||
|
// generating the new name should work for updates with or without a rev
|
||||||
|
char src_file[MAX_PATH], new_name[MAX_PATH], dst_file[MAX_PATH];
|
||||||
snprintf(src_file, MAX_PATH, "%s%s/%s", path_prefix, sql_update_dir, itr->c_str());
|
snprintf(src_file, MAX_PATH, "%s%s/%s", path_prefix, sql_update_dir, itr->c_str());
|
||||||
snprintf(dst_name, MAX_PATH, "%d_%s", rev, itr->c_str());
|
snprintf(new_name, MAX_PATH, "%d_%0*d_%s%s%s", rev, 2, info.nr, info.db, info.has_table ? "_" : "", info.table);
|
||||||
snprintf(dst_file, MAX_PATH, "%s%s/%s", path_prefix, sql_update_dir, dst_name);
|
snprintf(dst_file, MAX_PATH, "%s%s/%s.sql", path_prefix, sql_update_dir, new_name);
|
||||||
if(!convert_sql_update(src_file, dst_file, dst_name)) return false;
|
|
||||||
|
FILE * fin = fopen( src_file, "r" );
|
||||||
|
if(!fin) return false;
|
||||||
|
FILE * fout = fopen( dst_file, "w" );
|
||||||
|
if(!fout) { fclose(fin); return false; }
|
||||||
|
|
||||||
|
// add the update requirements
|
||||||
|
fprintf(fout, "ALTER TABLE %s CHANGE COLUMN required_%s required_%s bit;\n\n",
|
||||||
|
db_version_table[info.db_idx], last_sql_update[info.db_idx], new_name);
|
||||||
|
|
||||||
|
// copy the rest of the file
|
||||||
|
char c;
|
||||||
|
while( (c = getc(fin)) != EOF )
|
||||||
|
putc(c, fout);
|
||||||
|
|
||||||
|
fclose(fin);
|
||||||
|
fclose(fout);
|
||||||
|
|
||||||
|
// rename the file in git
|
||||||
snprintf(cmd, MAX_CMD, "git add %s", dst_file);
|
snprintf(cmd, MAX_CMD, "git add %s", dst_file);
|
||||||
system(cmd);
|
system(cmd);
|
||||||
snprintf(cmd, MAX_CMD, "git rm %s", src_file);
|
snprintf(cmd, MAX_CMD, "git rm %s", src_file);
|
||||||
system(cmd);
|
system(cmd);
|
||||||
|
|
||||||
|
// update the last sql update for the current database
|
||||||
|
strncpy(last_sql_update[info.db_idx], new_name, MAX_PATH);
|
||||||
|
|
||||||
|
// store the new files to be amended to the commit later
|
||||||
|
str_updates << ' ' << dst_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -502,6 +530,44 @@ bool generate_sql_makefile()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool change_sql_history()
|
||||||
|
{
|
||||||
|
snprintf(cmd, MAX_CMD, "git log HEAD --pretty=\"format:%%H\"");
|
||||||
|
if( (cmd_pipe = popen( cmd, "r" )) == NULL )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::list<std::string> hashes;
|
||||||
|
while(fgets(buffer, MAX_BUF, cmd_pipe))
|
||||||
|
{
|
||||||
|
buffer[strnlen(buffer, MAX_BUF) - 1] = '\0';
|
||||||
|
if(strncmp(origin_hash, buffer, MAX_HASH) == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
hashes.push_back(buffer);
|
||||||
|
}
|
||||||
|
pclose(cmd_pipe);
|
||||||
|
if(hashes.empty()) return false; // must have at least one commit
|
||||||
|
if(hashes.size() < 2) return true; // only one commit, ok but nothing to do
|
||||||
|
|
||||||
|
snprintf(cmd, MAX_CMD, "git reset --hard %s", origin_hash);
|
||||||
|
system(cmd);
|
||||||
|
|
||||||
|
for(std::list<std::string>::reverse_iterator next = hashes.rbegin(), itr = next++; next != hashes.rend(); ++itr, ++next)
|
||||||
|
{
|
||||||
|
snprintf(cmd, MAX_CMD, "git cherry-pick %s", itr->c_str());
|
||||||
|
system(cmd);
|
||||||
|
snprintf(cmd, MAX_CMD, "git checkout %s %s%s", origin_hash, path_prefix, sql_update_dir);
|
||||||
|
system(cmd);
|
||||||
|
snprintf(cmd, MAX_CMD, "git commit --amend -C HEAD %s%s", path_prefix, sql_update_dir);
|
||||||
|
system(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(cmd, MAX_CMD, "git cherry-pick %s", hashes.begin());
|
||||||
|
system(cmd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#define DO(cmd) if(!cmd) { printf("FAILED\n"); return 1; }
|
#define DO(cmd) if(!cmd) { printf("FAILED\n"); return 1; }
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
|
@ -554,6 +620,8 @@ int main(int argc, char *argv[])
|
||||||
DO( generate_sql_makefile() );
|
DO( generate_sql_makefile() );
|
||||||
}
|
}
|
||||||
DO( amend_commit() );
|
DO( amend_commit() );
|
||||||
|
if(do_sql)
|
||||||
|
DO( change_sql_history() );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue