bool Upgrader::copyDir(bfs::path source, bfs::path target, bool recursive) { if (!verifyPath(source, false) || !verifyPath(target, true)) {return false;} pathvec iteraton = this->fvector(source); for (pathvec::const_iterator mongo (iteraton.begin()); mongo != iteraton.end(); ++mongo) { bfs::path fongo = *mongo; if (!bfs::exists(source / fongo)) { printf("Error, file/directory does not exist\n"); return false; } if (bfs::is_directory(source / fongo)) { if ((fongo == "upgrade") || (fongo == "backup") || (!recursive)) { continue; } verifyPath(target / fongo, true); copyDir(source / fongo, target / fongo, recursive); } else { if (bfs::exists(target / fongo)) { bfs::remove(target / fongo); } // avoid overwriting bfs::copy_file(source / fongo, target / fongo); // the actual upgrade/recovery } } return true; }
bool Upgrader::juggler(int pf, bool recovery) // for upgrade, backs up target and copies over upgraded file { // for recovery, copies over backup static std::locale loc(std::cout.getloc(), new bpt::time_facet("%Y-%b-%d %H%M%S")); std::stringstream datestream; datestream.imbue(loc); datestream << bpt::second_clock::local_time(); std::string subdir = (pf == BLOCKS)? "Blockchain " : "Client " + datestream.str(); bfs::path backupdir(path(DATA) / "backup" / subdir); bfs::path sourcedir(path(DATA)); if (recovery) sourcedir = backupdir; else sourcedir /= "upgrade"; if (!verifyPath(sourcedir, true)) {return false;} if ((pf == PROGRAM) && (path(pf) == "")) { return false; } //printf("Copying %s into %s\n", path(pf).c_str(), backupdir.c_str()); if ((pf == PROGRAM) && (safeProgramDir())) { pathvec iteraton = this->fvector(sourcedir); for (pathvec::const_iterator mongo (iteraton.begin()); mongo != iteraton.end(); ++mongo) { bfs::path fongo = *mongo; if (!bfs::exists(sourcedir / fongo) || bfs::is_directory(sourcedir / fongo)) { continue; } if (bfs::exists(path(pf) / fongo) && !recovery) // i.e. backup files before upgrading { if (!verifyPath(backupdir, true)) {return false;} bfs::copy_file(path(pf) / fongo, backupdir / fongo, bfs::copy_option::overwrite_if_exists); } if (bfs::exists(path(pf) / fongo)) // avoid overwriting {bfs::remove(path(pf) / fongo);} bfs::copy_file(sourcedir / fongo, path(pf) / fongo); // the actual upgrade/recovery } } else { copyDir(path(pf), backupdir, true); copyDir(sourcedir, path(pf), true); } if (!recovery) { bfs::remove_all(sourcedir); // include removing directory to avoid having users tempted to store files here } return true; }
int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); qsrand(time(NULL)); QStringList args = QCoreApplication::arguments(); int subcmd = subCommands()->value(args.value(1), Invalid); switch (subcmd) { case Invalid: qCritical("invalid argument"); return 1; break; case Help: usage(); break; case New: // Creates new project if (!createNewApplication(args.value(2))) { return 1; } break; case ShowDrivers: printf("Available database drivers for Qt:\n"); for (QStringListIterator i(TableSchema::databaseDrivers()); i.hasNext(); ) { printf(" %s\n", qPrintable(i.next())); } break; case ShowDriverPath: { QString path = QLibraryInfo::location(QLibraryInfo::PluginsPath) + QDir::separator() + "sqldrivers"; QFileInfo fi(path); if (!fi.exists() || !fi.isDir()) { qCritical("Error: database driver's directory not found"); return 1; } printf("%s\n", qPrintable(fi.canonicalFilePath())); break; } case ShowTables: if (checkIniFile()) { QStringList tables = TableSchema::tables(); if (!tables.isEmpty()) { printf("-----------------\nAvailable tables:\n"); for (QStringListIterator i(tables); i.hasNext(); ) { printf(" %s\n", qPrintable(i.next())); } putchar('\n'); } } else { return 2; } break; case ShowCollections: if (checkIniFile()) { // MongoDB settings QString mongoini = appSettings.value("MongoDbSettingsFile").toString().trimmed(); QString mnginipath = QLatin1String("config") + QDir::separator() + mongoini; if (mongoini.isEmpty() || !QFile(mnginipath).exists()) { qCritical("MongoDB settings file not found"); return 2; } MongoCommand mongo(mnginipath); if (!mongo.open("dev")) { return 2; } QStringList colls = mongo.getCollectionNames(); printf("-----------------\nExisting collections:\n"); for (auto &col : colls) { printf(" %s\n", qPrintable(col)); } putchar('\n'); } break; default: { if (argc < 3) { qCritical("invalid argument"); return 1; } if (!checkIniFile()) { return 2; } // Sets codec QTextCodec *codec = QTextCodec::codecForName(appSettings.value("InternalEncoding").toByteArray().trimmed()); codec = (codec) ? codec : QTextCodec::codecForLocale(); QTextCodec::setCodecForLocale(codec); #if QT_VERSION < 0x050000 QTextCodec::setCodecForTr(codec); QTextCodec::setCodecForCStrings(codec); #endif // ERB or Otama templateSystem = devSettings.value("TemplateSystem").toString().toLower(); if (templateSystem.isEmpty()) { templateSystem = appSettings.value("TemplateSystem", "Erb").toString().toLower(); } switch (subcmd) { case Controller: { QString ctrl = args.value(2); ControllerGenerator crtlgen(ctrl, args.mid(3)); crtlgen.generate(D_CTRLS); // Create view directory QDir dir(D_VIEWS + ((ctrl.contains('_')) ? ctrl.toLower() : fieldNameToVariableName(ctrl).toLower())); mkpath(dir, "."); copy(dataDirPath + ".trim_mode", dir); break; } case Model: { ModelGenerator modelgen(ModelGenerator::Sql, args.value(3), args.value(2)); modelgen.generate(D_MODELS); break; } case Helper: { HelperGenerator helpergen(args.value(2)); helpergen.generate(D_HELPERS); break; } case UserModel: { ModelGenerator modelgen(ModelGenerator::Sql, args.value(5), args.value(2), args.mid(3, 2)); modelgen.generate(D_MODELS, true); break; } case SqlObject: { SqlObjGenerator sqlgen(args.value(3), args.value(2)); QString path = sqlgen.generate(D_MODELS); // Generates a project file ProjectFileGenerator progen(D_MODELS + "models.pro"); progen.add(QStringList(path)); break; } case MongoScaffold: { ModelGenerator modelgen(ModelGenerator::Mongo, args.value(2)); bool success = modelgen.generate(D_MODELS); ControllerGenerator crtlgen(modelgen.model(), modelgen.fieldList(), modelgen.primaryKeyIndex(), modelgen.lockRevisionIndex()); success &= crtlgen.generate(D_CTRLS); // Generates view files of the specified template system if (templateSystem == "otama") { OtamaGenerator viewgen(modelgen.model(), modelgen.fieldList(), modelgen.primaryKeyIndex(), modelgen.autoValueIndex()); viewgen.generate(D_VIEWS); } else if (templateSystem == "erb") { ErbGenerator viewgen(modelgen.model(), modelgen.fieldList(), modelgen.primaryKeyIndex(), modelgen.autoValueIndex()); viewgen.generate(D_VIEWS); } else { qCritical("Invalid template system specified: %s", qPrintable(templateSystem)); return 2; } if (success) { printSuccessMessage(modelgen.model()); } break; } case MongoModel: { ModelGenerator modelgen(ModelGenerator::Mongo, args.value(2)); modelgen.generate(D_MODELS); break; } case WebSocketEndpoint: { const QString appendpointfiles[] = { L("controllers") + SEP + "applicationendpoint.h", L("controllers") + SEP + "applicationendpoint.cpp" }; ProjectFileGenerator progen(D_CTRLS + "controllers.pro"); for (auto &dst : appendpointfiles) { if (!QFile::exists(dst)) { QString filename = QFileInfo(dst).fileName(); copy(dataDirPath + filename, dst); progen.add(QStringList(filename)); } } WebSocketGenerator wsgen(args.value(2)); wsgen.generate(D_CTRLS); break; } case Validator: { ValidatorGenerator validgen(args.value(2)); validgen.generate(D_HELPERS); break; } case Mailer: { MailerGenerator mailgen(args.value(2), args.mid(3)); mailgen.generate(D_CTRLS); copy(dataDirPath + "mail.erb", D_VIEWS + "mailer" + SEP +"mail.erb"); break; } case Scaffold: { ModelGenerator modelgen(ModelGenerator::Sql, args.value(3), args.value(2)); bool success = modelgen.generate(D_MODELS); if (!success) return 2; int pkidx = modelgen.primaryKeyIndex(); if (pkidx < 0) { qWarning("Primary key not found. [table name: %s]", qPrintable(args.value(2))); return 2; } ControllerGenerator crtlgen(modelgen.model(), modelgen.fieldList(), pkidx, modelgen.lockRevisionIndex()); success &= crtlgen.generate(D_CTRLS); // Generates view files of the specified template system if (templateSystem == "otama") { OtamaGenerator viewgen(modelgen.model(), modelgen.fieldList(), pkidx, modelgen.autoValueIndex()); viewgen.generate(D_VIEWS); } else if (templateSystem == "erb") { ErbGenerator viewgen(modelgen.model(), modelgen.fieldList(), pkidx, modelgen.autoValueIndex()); viewgen.generate(D_VIEWS); } else { qCritical("Invalid template system specified: %s", qPrintable(templateSystem)); return 2; } if (success) { printSuccessMessage(modelgen.model()); } break; } case Delete: { // Removes files int ret = deleteScaffold(args.value(2)); if (ret) { return ret; } break; } default: qCritical("internal error"); return 1; } break; } } return 0; }