diff --git a/libIRDB/src/util/IRDB_Objects.cpp b/libIRDB/src/util/IRDB_Objects.cpp index 9ac100435cb4d8373454d7ab37232b47ec5ada65..55b0087ec57025bfa4ad95fbd843377e0c78e615 100644 --- a/libIRDB/src/util/IRDB_Objects.cpp +++ b/libIRDB/src/util/IRDB_Objects.cpp @@ -107,6 +107,11 @@ bool IRDBObjects_t::FilesAlreadyPresent(set<File_t*> the_files) int IRDBObjects_t::AddVariant(db_id_t variant_id) { + if(GetVariant(variant_id) != NULL) + { + return 1; + } + shared_ptr<VariantID_t> the_variant = make_shared<VariantID_t>(variant_id); assert(the_variant->IsRegistered()==true); diff --git a/libIRDB/test/SConscript b/libIRDB/test/SConscript index c94a07a0ab9fb0c3de4af52ea649f7b54f084908..39df700cd793ffb37f33cfa88429c50bfae29932 100644 --- a/libIRDB/test/SConscript +++ b/libIRDB/test/SConscript @@ -17,10 +17,11 @@ if 'build_tools' not in myenv or myenv['build_tools'] is None or int(myenv['buil $SECURITY_TRANSFORMS_HOME/libEXEIO/include $SECURITY_TRANSFORMS_HOME/libehp/include $SECURITY_TRANSFORMS_HOME/third_party/elfio-code + $SECURITY_TRANSFORMS_HOME/libtransform/include ''' LIBPATH="$SECURITY_TRANSFORMS_HOME/lib" - LIBS=Split( 'IRDB-cfg IRDB-util ' + env.subst('$BASE_IRDB_LIBS')+ " MEDSannotation ehp") + LIBS=Split( 'IRDB-cfg IRDB-util ' + env.subst('$BASE_IRDB_LIBS')+ " MEDSannotation ehp transform") myenv=myenv.Clone(CPPPATH=Split(cpppath)) @@ -34,8 +35,8 @@ if 'build_tools' not in myenv or myenv['build_tools'] is None or int(myenv['buil Default(install) installed=installed+install - pgm=myenv.Program("fill_in_cfg.exe", split_eh_frame+Split("fill_in_cfg_driver.cpp fill_in_cfg.cpp"), LIBPATH=LIBPATH, LIBS=LIBS) - install=myenv.Install("$SECURITY_TRANSFORMS_HOME/bin/", pgm) + pgm=myenv.SharedLibrary("fill_in_cfg.so", Split("fill_in_cfg.cpp split_eh_frame.cpp"), LIBPATH=LIBPATH, LIBS=LIBS) + install=myenv.Install("$SECURITY_TRANSFORMS_HOME/plugins_install/transform_step_plugins", pgm) Default(install) installed=installed+install diff --git a/libIRDB/test/fill_in_cfg.cpp b/libIRDB/test/fill_in_cfg.cpp index 676f866442038a6538c28d18453079100525c2f3..f609a7bfc36ac171e9ff7c51c42ee60a748bfb6b 100644 --- a/libIRDB/test/fill_in_cfg.cpp +++ b/libIRDB/test/fill_in_cfg.cpp @@ -580,43 +580,47 @@ void PopulateCFG::fill_in_landing_pads(FileIR_t *firp) } -PopulateCFG PopulateCFG::Factory +int PopulateCFG::ParseArgs ( int argc, - char* argv[], - pqxxDB_t* the_pqxx_interface, - list<FileIR_t *> the_firp_list + char* argv[] ) -{ - bool p_fix_landing_pads = true; // default - +{ if(argc<2) { cerr<<"Usage: fill_in_cfg <id> [--fix-landing-pads | --no-fix-landing-pads]"<<endl; - exit(-1); + return -1; } + + variant_id = atoi(argv[1]); - for (int i = 0; i < argc; ++i) + for (int i = 2; i < argc; ++i) { if (strcmp("--fix-landing-pads", argv[i]) == 0) { - p_fix_landing_pads = true; + fix_landing_pads = true; } else if (strcmp("--no-fix-landing-pads", argv[i]) == 0) { - p_fix_landing_pads = false; + fix_landing_pads = false; } } - return PopulateCFG(the_pqxx_interface, the_firp_list, p_fix_landing_pads); + return 0; } -bool PopulateCFG::execute() +int PopulateCFG::ExecuteStep(IRDBObjects_t *irdb_objects) { try { - for( FileIR_t* firp : firp_list) + pqxx_interface = irdb_objects->GetDBInterface(); + irdb_objects->AddVariant(variant_id); + shared_ptr<VariantID_t> variant = irdb_objects->GetVariant(variant_id); + for(File_t* file : variant->GetFiles()) { + irdb_objects->AddFileIR(variant_id, file->GetBaseID()); + shared_ptr<FileIR_t> firp = irdb_objects->GetFileIR(file->GetBaseID()); + assert(firp); cout<<"Filling in cfg for "<<firp->GetFile()->GetURL()<<endl; @@ -630,24 +634,35 @@ bool PopulateCFG::execute() assert(elfiop); elfiop->load(string("readeh_tmp_file.exe")); - fill_in_cfg(firp); - fill_in_scoops(firp); + fill_in_cfg(firp.get()); + fill_in_scoops(firp.get()); if (fix_landing_pads) { - fill_in_landing_pads(firp); + fill_in_landing_pads(firp.get()); } delete elfiop; - firp=NULL; elfiop=NULL; } } catch (DatabaseError_t pnide) { - cout<<"Unexpected database error: "<<pnide<<endl; - return false; + cerr<<"Unexpected database error: "<<pnide<<endl; + return -1; } + catch(...) + { + cerr<<"Unexpected error"<<endl; + return -1; + } - return true; + return 0; +} + + +extern "C" +Transform_SDK::TransformStep_t* TransformStepFactory(void) +{ + return new PopulateCFG(); } diff --git a/libIRDB/test/fill_in_cfg.hpp b/libIRDB/test/fill_in_cfg.hpp index abe5abc1239fce2f070e809cc3367731fdf28c32..ac75298bd8640cc60bcb1d7e3479d4712fc9fcc8 100644 --- a/libIRDB/test/fill_in_cfg.hpp +++ b/libIRDB/test/fill_in_cfg.hpp @@ -2,20 +2,22 @@ #define fill_in_cfg_hpp #include <libIRDB-core.hpp> +#include <libIRDB-util.hpp> #include <stdlib.h> #include <map> #include <exeio.h> +#include "transform_step.h" -class PopulateCFG +class PopulateCFG : public Transform_SDK::TransformStep_t { public: - PopulateCFG(libIRDB::pqxxDB_t* the_pqxx_interface, - std::list<libIRDB::FileIR_t *> the_firp_list, + PopulateCFG(libIRDB::pqxxDB_t* p_pqxx_interface = NULL, + libIRDB::db_id_t p_variant_id = 0, bool p_fix_landing_pads = true ) : - pqxx_interface(the_pqxx_interface), - firp_list(the_firp_list), + pqxx_interface(p_pqxx_interface), + variant_id(p_variant_id), fix_landing_pads(p_fix_landing_pads) { odd_target_count = 0; @@ -25,8 +27,13 @@ class PopulateCFG elfiop = NULL; } - static PopulateCFG Factory(int argc, char* argv[], libIRDB::pqxxDB_t*, std::list<libIRDB::FileIR_t *>); - bool execute(); + + std::string GetStepName(void) + { + return std::string("fill_in_cfg"); + } + int ParseArgs(int argc, char* argv[]); + int ExecuteStep(libIRDB::IRDBObjects_t*); private: // methods @@ -68,7 +75,7 @@ class PopulateCFG // non-optional libIRDB::pqxxDB_t* pqxx_interface; - std::list<libIRDB::FileIR_t *> firp_list; + libIRDB::db_id_t variant_id; bool fix_landing_pads; EXEIO::exeio *elfiop; diff --git a/libIRDB/test/fill_in_cfg_driver.cpp b/libIRDB/test/fill_in_cfg_driver.cpp deleted file mode 100644 index aee0cf8d678c0c0de3dc7d6d09dedf94df87b5fa..0000000000000000000000000000000000000000 --- a/libIRDB/test/fill_in_cfg_driver.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "fill_in_cfg.hpp" -#include <assert.h> - -using namespace std; -using namespace libIRDB; - -int main(int argc, char* argv[]) -{ - VariantID_t *pidp=NULL; - list<FileIR_t *> the_firp_list; - - try - { - /* setup the interface to the sql server */ - pqxxDB_t the_pqxx_interface; - BaseObj_t::SetInterface(&the_pqxx_interface); - - pidp=new VariantID_t(atoi(argv[1])); - - assert(pidp->IsRegistered()==true); - - cout<<"New Variant, after reading registration, is: "<<*pidp << endl; - - // setup - for(File_t* it : pidp->GetFiles()) - { - File_t* this_file=it; - assert(this_file); - - // read the db - FileIR_t* firp=new FileIR_t(*pidp, this_file); - assert(firp); - the_firp_list.push_back(firp); - } - - // fill_in_cfg for all files - PopulateCFG fill_in_cfg = PopulateCFG::Factory(argc, argv, &the_pqxx_interface, the_firp_list); - - bool success = fill_in_cfg.execute(); - if(!success) - { - cout<<"Unexpected error, skipping changes."<<endl; - exit(-1); - } - - // cleanup - for(FileIR_t* the_firp : the_firp_list) - { - assert(the_firp); - // write the DB back and commit our changes - the_firp->WriteToDB(); - delete the_firp; - } - the_pqxx_interface.Commit(); - } - catch (DatabaseError_t pnide) - { - cout<<"Unexpected database error: "<<pnide<<endl; - exit(-1); - } - - assert(pidp); - - delete pidp; - pidp=NULL; - return 0; -} diff --git a/libtransform/include/transform_step.h b/libtransform/include/transform_step.h index 5624af87da1967a8cd10b256a266cfb5d21a7196..cda4022bd09f5ed34654b7424528e3859d3d44a0 100644 --- a/libtransform/include/transform_step.h +++ b/libtransform/include/transform_step.h @@ -14,12 +14,12 @@ namespace Transform_SDK virtual std::string GetStepName(void) = 0; // Allows all steps to parse args before any step takes time to execute - virtual int ParseArgs(int argc, char* argv[]) + virtual int ParseArgs(int argc, char* argv[], libIRDB::IRDBObjects_t *irdb_objects) { return 0; // success } - virtual int ExecuteStep(libIRDB::IRDB_Objects_t *irdb_objects) + virtual int ExecuteStep(libIRDB::IRDBObjects_t *irdb_objects) { return 0; // success }