X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/2501ff5278198b17c195536d0953cbb40d1a5d3b..9a834ba2e0caea6edffec5c1db403cf9832ea96e:/projects/sgconv/main.cpp diff --git a/projects/sgconv/main.cpp b/projects/sgconv/main.cpp new file mode 100644 index 00000000..e0679d07 --- /dev/null +++ b/projects/sgconv/main.cpp @@ -0,0 +1,446 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Author : Maxim Mamontov + */ + + /* + $Revision: 1.11 $ + $Date: 2010/03/25 12:32:30 $ + $Author: faust $ + */ + +#include + +#include +#include +#include +#include +#include + +#include "stg/common.h" +#include "stg/store.h" +#include "stg/conffiles.h" + +#include "stg/user_stat.h" +#include "stg/user_conf.h" +#include "stg/corp_conf.h" +#include "stg/service_conf.h" +#include "stg/admin_conf.h" +#include "stg/tariff_conf.h" +#include "stg/settings.h" +#include "stg/message.h" + +#include "settings_impl.h" + +using namespace std; + +volatile time_t stgTime = time(NULL); + +int main(int argc, char **argv) +{ +printfd(__FILE__, "Start\n"); + +STORE * fromStore = NULL; +STORE * toStore = NULL; + +SETTINGS_IMPL * settings = NULL; + +string modulePath; + +MODULE_SETTINGS fromStoreSettings; +MODULE_SETTINGS toStoreSettings; + +ADMIN_CONF ac; +USER_CONF uc; +USER_STAT us; +STG_MSG msg; +TARIFF_DATA td; +CORP_CONF cc; +SERVICE_CONF sc; +vector hdrs; + +if (argc == 2) + settings = new SETTINGS_IMPL(argv[1]); +else + settings = new SETTINGS_IMPL(); + +if (settings->ReadSettings()) + { + printfd(__FILE__, "Error reading settings\n"); + delete settings; + return -1; + } + +fromStoreSettings = settings->GetSourceStoreModuleSettings(); +toStoreSettings = settings->GetDestStoreModuleSettings(); +modulePath = settings->GetModulesPath(); + +string sourcePlugin(modulePath + "/mod_" + fromStoreSettings.moduleName + ".so"); +string destPlugin(modulePath + "/mod_" + toStoreSettings.moduleName + ".so"); + +void * src_lh = dlopen(sourcePlugin.c_str(), RTLD_NOW); +if (!src_lh) + { + printfd(__FILE__, "Source storage plugin loading failed: %s\n", dlerror()); + delete settings; + return -1; + } + +void * dst_lh = dlopen(destPlugin.c_str(), RTLD_NOW); +if (!dst_lh) + { + printfd(__FILE__, "Destination storage plugin loading failed: %s\n", dlerror()); + delete settings; + return -1; + } + +STORE * (*GetSourceStore)(); +STORE * (*GetDestStore)(); +GetSourceStore = (STORE * (*)())dlsym(src_lh, "GetStore"); +if (!GetSourceStore) + { + printfd(__FILE__, "Source storage plugin loading failed. GetStore not found: %s\n", dlerror()); + delete settings; + return -1; + } +GetDestStore = (STORE * (*)())dlsym(dst_lh, "GetStore"); +if (!GetDestStore) + { + printfd(__FILE__, "Storage plugin (firebird) loading failed. GetStore not found: %s\n", dlerror()); + delete settings; + return -1; + } + +fromStore = GetSourceStore(); +toStore = GetDestStore(); + +vector entities; +vector ready; +fromStore->SetSettings(fromStoreSettings); +fromStore->ParseSettings(); +toStore->SetSettings(toStoreSettings); +toStore->ParseSettings(); + +printfd(__FILE__, "Importing admins:\n"); +entities.erase(entities.begin(), entities.end()); +ready.erase(ready.begin(), ready.end()); +if (fromStore->GetAdminsList(&entities)) + { + printfd(__FILE__, "Error getting admins list: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } +if (toStore->GetAdminsList(&ready)) + { + printfd(__FILE__, "Error getting admins list: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + +vector::const_iterator it; +for (it = entities.begin(); it != entities.end(); ++it) + { + printfd(__FILE__, "\t - %s\n", it->c_str()); + if (find(ready.begin(), ready.end(), *it) == ready.end()) + if (toStore->AddAdmin(*it)) + { + printfd(__FILE__, "Error adding admin: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (fromStore->RestoreAdmin(&ac, *it)) + { + printfd(__FILE__, "Error getting admin's confi: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + ac.login = *it; + if (toStore->SaveAdmin(ac)) + { + printfd(__FILE__, "Error saving admin's conf: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + } + +printfd(__FILE__, "Importing tariffs:\n"); +entities.erase(entities.begin(), entities.end()); +ready.erase(ready.begin(), ready.end()); +if (fromStore->GetTariffsList(&entities)) + { + printfd(__FILE__, "Error getting tariffs list: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } +if (toStore->GetTariffsList(&ready)) + { + printfd(__FILE__, "Error getting tariffs list: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + +for (it = entities.begin(); it != entities.end(); ++it) + { + printfd(__FILE__, "\t - %s\n", it->c_str()); + if (find(ready.begin(), ready.end(), *it) == ready.end()) + if (toStore->AddTariff(*it)) + { + printfd(__FILE__, "Error adding tariff: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (fromStore->RestoreTariff(&td, *it)) + { + printfd(__FILE__, "Error getting tariff's data: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (toStore->SaveTariff(td, *it)) + { + printfd(__FILE__, "Error saving tariff's data: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + } + +printfd(__FILE__, "Importing services:\n"); +entities.erase(entities.begin(), entities.end()); +ready.erase(ready.begin(), ready.end()); +if (fromStore->GetServicesList(&entities)) + { + printfd(__FILE__, "Error getting service list: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } +if (toStore->GetServicesList(&ready)) + { + printfd(__FILE__, "Error getting service list: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + +for (it = entities.begin(); it != entities.end(); ++it) + { + printfd(__FILE__, "\t - %s\n", it->c_str()); + if (find(ready.begin(), ready.end(), *it) == ready.end()) + if (toStore->AddService(*it)) + { + printfd(__FILE__, "Error adding service: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (fromStore->RestoreService(&sc, *it)) + { + printfd(__FILE__, "Error getting service's data: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (toStore->SaveService(sc)) + { + printfd(__FILE__, "Error saving service's data: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + } + +printfd(__FILE__, "Importing corporations:\n"); +entities.erase(entities.begin(), entities.end()); +ready.erase(ready.begin(), ready.end()); +if (fromStore->GetCorpsList(&entities)) + { + printfd(__FILE__, "Error getting corporations list: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } +if (toStore->GetCorpsList(&ready)) + { + printfd(__FILE__, "Error getting corporations list: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + +for (it = entities.begin(); it != entities.end(); ++it) + { + printfd(__FILE__, "\t - %s\n", it->c_str()); + if (find(ready.begin(), ready.end(), *it) == ready.end()) + if (toStore->AddCorp(*it)) + { + printfd(__FILE__, "Error adding corporation: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (fromStore->RestoreCorp(&cc, *it)) + { + printfd(__FILE__, "Error getting corporation's data: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (toStore->SaveCorp(cc)) + { + printfd(__FILE__, "Error saving corporation's data: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + } + +printfd(__FILE__, "Importing users:\n"); +entities.erase(entities.begin(), entities.end()); +ready.erase(ready.begin(), ready.end()); +if (fromStore->GetUsersList(&entities)) + { + printfd(__FILE__, "Error getting users list: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } +if (toStore->GetUsersList(&ready)) + { + printfd(__FILE__, "Error getting users list: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + +sort(ready.begin(), ready.end()); +for (it = entities.begin(); it != entities.end(); ++it) + { + printfd(__FILE__, "\t - %s\n", it->c_str()); + if (!binary_search(ready.begin(), ready.end(), *it)) { + if (toStore->AddUser(*it)) + { + printfd(__FILE__, "Error adding user: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + } else { + printfd(__FILE__, "\t\t(adding passed)\n"); + } + if (fromStore->RestoreUserConf(&uc, *it)) + { + printfd(__FILE__, "Error getting user's conf: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (fromStore->RestoreUserStat(&us, *it)) + { + printfd(__FILE__, "Error getting user's stat: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (toStore->SaveUserConf(uc, *it)) + { + printfd(__FILE__, "Error saving user's conf: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + if (toStore->SaveUserStat(us, *it)) + { + printfd(__FILE__, "Error saving user's stat: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + hdrs.erase(hdrs.begin(), hdrs.end()); + if (fromStore->GetMessageHdrs(&hdrs, *it)) + { + printfd(__FILE__, "Error getting user's messages: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + vector::iterator mit; + for (mit = hdrs.begin(); mit != hdrs.end(); ++mit) + { + if (fromStore->GetMessage(mit->id, &msg, *it)) + { + printfd(__FILE__, "Error getting message for a user: %s\n", fromStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + printfd(__FILE__, "\t\t * %s\n", msg.text.c_str()); + if (toStore->AddMessage(&msg, *it)) + { + printfd(__FILE__, "Error adding message to a user: %s\n", toStore->GetStrError().c_str()); + dlclose(src_lh); + dlclose(dst_lh); + delete settings; + return -1; + } + } + } + +dlclose(src_lh); +dlclose(dst_lh); +printfd(__FILE__, "Done\n"); +delete settings; +return 0; +}