diff options
author | Mark Spruiell <mes@zeroc.com> | 2004-01-19 16:59:41 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2004-01-19 16:59:41 +0000 |
commit | 88d55d270b358200a787b6bf519d3d5357fe4a43 (patch) | |
tree | 37f187ff90063250adc178d2900212dd030e6c29 /cpp/src/Transform/TransformDB.cpp | |
parent | fixed IceStorm test to not rely on sleep() (diff) | |
download | ice-88d55d270b358200a787b6bf519d3d5357fe4a43.tar.bz2 ice-88d55d270b358200a787b6bf519d3d5357fe4a43.tar.xz ice-88d55d270b358200a787b6bf519d3d5357fe4a43.zip |
removing old Transform code, tests
Diffstat (limited to 'cpp/src/Transform/TransformDB.cpp')
-rw-r--r-- | cpp/src/Transform/TransformDB.cpp | 665 |
1 files changed, 0 insertions, 665 deletions
diff --git a/cpp/src/Transform/TransformDB.cpp b/cpp/src/Transform/TransformDB.cpp deleted file mode 100644 index 74f5bff5fa8..00000000000 --- a/cpp/src/Transform/TransformDB.cpp +++ /dev/null @@ -1,665 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003 -// ZeroC, Inc. -// Billerica, MA, USA -// -// All Rights Reserved. -// -// Ice is free software; you can redistribute it and/or modify it under -// the terms of the GNU General Public License version 2 as published by -// the Free Software Foundation. -// -// ********************************************************************** - -#include <Slice/Preprocessor.h> -#include <Transform/Transformer.h> -#include <Transform/TransformUtil.h> -#include <db_cxx.h> -#include <sys/stat.h> -#include <fstream> -#include <algorithm> - -using namespace std; - -#ifdef _WIN32 -# define TRANSFORM_DB_MODE 0 -#else -# define TRANSFORM_DB_MODE (S_IRUSR | S_IWUSR) -#endif - -static void -usage(const char* n) -{ - cerr << "Usage: " << n << " [options] [dbenv db newdbenv]\n"; - cerr << - "Options:\n" - "-h, --help Show this message.\n" - "-v, --version Display the Ice version.\n" - "-DNAME Define NAME as 1.\n" - "-DNAME=DEF Define NAME as DEF.\n" - "-UNAME Remove any definition for NAME.\n" - "-d, --debug Print debug messages.\n" - "--ice Permit `Ice' prefix (for building Ice source code only)\n" - "-o FILE Output transformation descriptors into the file FILE.\n" - " Database transformation is not performed.\n" - "-i Ignore incompatible type changes.\n" - "-p Purge objects whose types no longer exist.\n" - "-c Use catastrophic recovery on the old database environment.\n" - "-f FILE Execute the transformation descriptors in the file FILE.\n" - "--include-old DIR Put DIR in the include file search path for old Slice\n" - " definitions.\n" - "--include-new DIR Put DIR in the include file search path for new Slice\n" - " definitions.\n" - "--old SLICE Load old Slice definitions from the file SLICE.\n" - "--new SLICE Load new Slice definitions from the file SLICE.\n" - "-e Indicates the database is an Evictor database.\n" - "--key TYPE[,TYPE] Specifies the Slice types of the database key. If the\n" - " type names have not changed, only one needs to be\n" - " specified. Otherwise, the type names are specified as\n" - " old-type,new-type.\n" - "--value TYPE[,TYPE] Specifies the Slice types of the database value. If the\n" - " type names have not changed, only one needs to be\n" - " specified. Otherwise, the type names are specified as\n" - " old-type,new-type.\n" - ; - // Note: --case-sensitive is intentionally not shown here! -} - -static bool -parseSlice(const string& n, const Slice::UnitPtr& u, const vector<string>& files, const string& cppArgs, bool debug) -{ - // - // Parse the Slice files. - // - for(vector<string>::const_iterator p = files.begin(); p != files.end(); ++p) - { - Slice::Preprocessor icecpp(n, *p, cppArgs); - - FILE* cppHandle = icecpp.preprocess(false); - - if(cppHandle == 0) - { - return false; - } - - int status = u->parse(cppHandle, debug); - - if(!icecpp.close()) - { - return false; - } - - if(status != EXIT_SUCCESS) - { - return false; - } - } - - u->mergeModules(); - - return true; -} - -static int -run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) -{ - string oldCppArgs; - string newCppArgs; - bool debug = false; - bool ice = true; // Needs to be true in order to create default definitions. - bool caseSensitive = false; - string outputFile; - bool ignoreTypeChanges = false; - bool purgeObjects = false; - bool catastrophicRecover = false; - string inputFile; - vector<string> oldSlice; - vector<string> newSlice; - bool evictor = false; - string keyTypeNames; - string valueTypeNames; - string dbEnvName, dbName, dbEnvNameNew; - - int idx = 1; - while(idx < argc) - { - if(strcmp(argv[idx], "-h") == 0 || strcmp(argv[idx], "--help") == 0) - { - usage(argv[0]); - return EXIT_SUCCESS; - } - else if(strcmp(argv[idx], "-v") == 0 || strcmp(argv[idx], "--version") == 0) - { - cout << ICE_STRING_VERSION << endl; - return EXIT_SUCCESS; - } - else if(strncmp(argv[idx], "-D", 2) == 0 || strncmp(argv[idx], "-U", 2) == 0) - { - oldCppArgs += ' '; - oldCppArgs += argv[idx]; - newCppArgs += ' '; - newCppArgs += argv[idx]; - - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "-d") == 0 || strcmp(argv[idx], "--debug") == 0) - { - debug = true; - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "--ice") == 0) - { - ice = true; - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "--case-sensitive") == 0) - { - caseSensitive = true; - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "-o") == 0) - { - if(idx + 1 >= argc || argv[idx + 1][0] == '-') - { - cerr << argv[0] << ": argument expected for `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - - outputFile = argv[idx + 1]; - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(strcmp(argv[idx], "-i") == 0) - { - ignoreTypeChanges = true; - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "-p") == 0) - { - purgeObjects = true; - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "-c") == 0) - { - catastrophicRecover = true; - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "-f") == 0) - { - if(idx + 1 >= argc || argv[idx + 1][0] == '-') - { - cerr << argv[0] << ": argument expected for `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - - inputFile = argv[idx + 1]; - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(strcmp(argv[idx], "--include-old") == 0) - { - oldCppArgs += " -I"; - oldCppArgs += argv[idx + 1]; - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(strcmp(argv[idx], "--include-new") == 0) - { - newCppArgs += " -I"; - newCppArgs += argv[idx + 1]; - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(strcmp(argv[idx], "--old") == 0) - { - if(idx + 1 >= argc || argv[idx + 1][0] == '-') - { - cerr << argv[0] << ": argument expected for `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - - oldSlice.push_back(argv[idx + 1]); - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(strcmp(argv[idx], "--new") == 0) - { - if(idx + 1 >= argc || argv[idx + 1][0] == '-') - { - cerr << argv[0] << ": argument expected for `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - - newSlice.push_back(argv[idx + 1]); - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(strcmp(argv[idx], "-e") == 0) - { - evictor = true; - for(int i = idx ; i + 1 < argc ; ++i) - { - argv[i] = argv[i + 1]; - } - --argc; - } - else if(strcmp(argv[idx], "--key") == 0) - { - if(idx + 1 >= argc || argv[idx + 1][0] == '-') - { - cerr << argv[0] << ": argument expected for `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - - keyTypeNames = argv[idx + 1]; - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(strcmp(argv[idx], "--value") == 0) - { - if(idx + 1 >= argc || argv[idx + 1][0] == '-') - { - cerr << argv[0] << ": argument expected for `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - - valueTypeNames = argv[idx + 1]; - - for(int i = idx ; i + 2 < argc ; ++i) - { - argv[i] = argv[i + 2]; - } - argc -= 2; - } - else if(argv[idx][0] == '-') - { - cerr << argv[0] << ": unknown option `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - else - { - ++idx; - } - } - - if(outputFile.empty() && argc < 4) - { - usage(argv[0]); - return EXIT_FAILURE; - } - - if(argc > 1) - { - dbEnvName = argv[1]; - } - if(argc > 2) - { - dbName = argv[2]; - } - if(argc > 3) - { - dbEnvNameNew = argv[3]; - } - - Slice::UnitPtr oldUnit = Slice::Unit::createUnit(true, true, ice, caseSensitive); - Transform::Destroyer<Slice::UnitPtr> oldD(oldUnit); - if(!parseSlice(argv[0], oldUnit, oldSlice, oldCppArgs, debug)) - { - return EXIT_FAILURE; - } - - Slice::UnitPtr newUnit = Slice::Unit::createUnit(true, true, ice, caseSensitive); - Transform::Destroyer<Slice::UnitPtr> newD(newUnit); - if(!parseSlice(argv[0], newUnit, newSlice, newCppArgs, debug)) - { - return EXIT_FAILURE; - } - - // - // Create the Transformer. - // - Transform::Transformer transformer(communicator, oldUnit, newUnit, ignoreTypeChanges, purgeObjects); - - // - // If no input file was provided, then we need to analyze the Slice types. - // - string descriptors; - if(inputFile.empty()) - { - ostringstream out; - vector<string> missingTypes; - vector<string> analyzeErrors; - - if(evictor) - { - transformer.analyze(out, missingTypes, analyzeErrors); - } - else - { - string oldKeyName, newKeyName, oldValueName, newValueName; - string::size_type pos; - - if(keyTypeNames.empty() || valueTypeNames.empty()) - { - usage(argv[0]); - return EXIT_FAILURE; - } - - pos = keyTypeNames.find(','); - if(pos == 0 || pos == keyTypeNames.size()) - { - usage(argv[0]); - return EXIT_FAILURE; - } - if(pos == string::npos) - { - oldKeyName = keyTypeNames; - newKeyName = keyTypeNames; - } - else - { - oldKeyName = keyTypeNames.substr(0, pos); - newKeyName = keyTypeNames.substr(pos + 1); - } - - pos = valueTypeNames.find(','); - if(pos == 0 || pos == valueTypeNames.size()) - { - usage(argv[0]); - return EXIT_FAILURE; - } - if(pos == string::npos) - { - oldValueName = valueTypeNames; - newValueName = valueTypeNames; - } - else - { - oldValueName = valueTypeNames.substr(0, pos); - newValueName = valueTypeNames.substr(pos + 1); - } - - transformer.analyze(oldKeyName, newKeyName, oldValueName, newValueName, out, missingTypes, analyzeErrors); - } - - if(!analyzeErrors.empty()) - { - for(vector<string>::const_iterator p = analyzeErrors.begin(); p != analyzeErrors.end(); ++p) - { - cerr << argv[0] << ": " << *p << endl; - } - } - - if(!missingTypes.empty()) - { - sort(missingTypes.begin(), missingTypes.end()); - unique(missingTypes.begin(), missingTypes.end()); - if(!analyzeErrors.empty()) - { - cerr << endl; - } - cerr << "The following types had no matching definitions in the new Slice:" << endl; - for(vector<string>::const_iterator p = missingTypes.begin(); p != missingTypes.end(); ++p) - { - cerr << " " << *p << endl; - } - } - - if(!analyzeErrors.empty()) - { - return EXIT_FAILURE; - } - - descriptors = out.str(); - - if(!outputFile.empty()) - { - ofstream of(outputFile.c_str()); - if(!of.good()) - { - cerr << argv[0] << ": unable to open file `" << outputFile << "'" << endl; - return EXIT_FAILURE; - } - of << descriptors; - of.close(); - return EXIT_SUCCESS; - } - } - else - { - ifstream in(inputFile.c_str()); - char buff[1024]; - while(true) - { - in.read(buff, 1024); - descriptors.append(buff, in.gcount()); - if(in.gcount() < 1024) - { - break; - } - } - in.close(); - } - - if(dbEnvName == dbEnvNameNew) - { - cerr << argv[0] << ": database environment names must be different" << endl; - return EXIT_FAILURE; - } - - DbEnv dbEnv(0); - DbEnv dbEnvNew(0); - DbTxn* txn = 0; - DbTxn* txnNew = 0; - Db* db = 0; - Db* dbNew = 0; - int status = EXIT_SUCCESS; - try - { -#ifdef _WIN32 - // - // Berkeley DB may use a different C++ runtime. - // - dbEnv.set_alloc(::malloc, ::realloc, ::free); - dbEnvNew.set_alloc(::malloc, ::realloc, ::free); -#endif - - // - // Open the old database environment. Use DB_RECOVER_FATAL if -c is specified. - // - { - u_int32_t flags = DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_CREATE; - if(catastrophicRecover) - { - flags |= DB_RECOVER_FATAL; - } - else - { - flags |= DB_RECOVER; - } - dbEnv.open(dbEnvName.c_str(), flags, TRANSFORM_DB_MODE); - } - - // - // Open the new database environment. - // - { - u_int32_t flags = DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER | DB_CREATE; - dbEnvNew.open(dbEnvNameNew.c_str(), flags, TRANSFORM_DB_MODE); - } - - // - // Open the old database in a transaction. - // - db = new Db(&dbEnv, 0); - dbEnv.txn_begin(0, &txn, 0); - db->open(txn, dbName.c_str(), 0, DB_BTREE, DB_RDONLY, TRANSFORM_DB_MODE); - - // - // Open the new database in a transaction. - // - dbNew = new Db(&dbEnvNew, 0); - dbEnvNew.txn_begin(0, &txnNew, 0); - dbNew->open(txnNew, dbName.c_str(), 0, DB_BTREE, DB_CREATE | DB_EXCL, TRANSFORM_DB_MODE); - - istringstream istr(descriptors); - transformer.transform(istr, db, txn, dbNew, txnNew, cerr); - - // - // Checkpoint to migrate changes from the log to the database. - // - dbEnvNew.txn_checkpoint(0, 0, DB_FORCE); - } - catch(const DbException& ex) - { - cerr << argv[0] << ": database error: " << ex.what() << endl; - status = EXIT_FAILURE; - } - catch(...) - { - if(txn) - { - txn->abort(); - } - if(db) - { - db->close(0); - delete db; - } - if(txnNew) - { - txnNew->abort(); - } - if(dbNew) - { - dbNew->close(0); - delete dbNew; - } - dbEnv.close(0); - dbEnvNew.close(0); - throw; - } - - if(txn) - { - txn->abort(); - } - if(db) - { - db->close(0); - delete db; - } - if(txnNew) - { - if(status == EXIT_FAILURE) - { - txnNew->abort(); - } - else - { - txnNew->commit(0); - } - } - if(dbNew) - { - dbNew->close(0); - delete dbNew; - } - dbEnv.close(0); - dbEnvNew.close(0); - - return status; -} - -int -main(int argc, char* argv[]) -{ - Ice::CommunicatorPtr communicator; - int status = EXIT_SUCCESS; - try - { - communicator = Ice::initialize(argc, argv); - status = run(argc, argv, communicator); - } - catch(const Transform::TransformException& ex) - { - cerr << ex.reason(); - return EXIT_FAILURE; - } - catch(const IceUtil::Exception& ex) - { - cerr << argv[0] << ": " << ex << endl; - return EXIT_FAILURE; - } - - if(communicator) - { - communicator->destroy(); - } - - return status; -} |