bool MailerGenerator::generate() const { if (actionList.isEmpty()) { qCritical("Bad parameter: Action name empty"); return false; } QStringList files; FileWriter fwh(dstDir.filePath(mailerName.toLower() + "mailer.h")); FileWriter fws(dstDir.filePath(mailerName.toLower() + "mailer.cpp")); // Generates a mailer header file QString act; for (QStringListIterator i(actionList); i.hasNext(); ) { act.append(" void ").append(i.next()).append("();\n"); } QString code = QString(MAILER_HEADER_FILE_TEMPLATE).arg(mailerName.toUpper(), mailerName, act); fwh.write(code, false); files << fwh.fileName(); // Generates a mailer source code QString actimpl; for (QStringListIterator i(actionList); i.hasNext(); ) { actimpl.append("void ").append(mailerName).append("Mailer::").append(i.next()).append("()\n{\n //\n // write codes\n //\n\n deliver(\"mail\");\n}\n\n"); } code = QString(MAILER_SOURCE_FILE_TEMPLATE).arg(mailerName.toLower(), actimpl); fws.write(code, false); files << fws.fileName(); // Updates a project file ProjectFileGenerator progen(dstDir.filePath("controllers.pro")); return progen.add(files); }
bool ModelGenerator::generate(bool userModel) const { QStringList files; if (!TableSchema(tableName).exists()) { qCritical("table not found, %s", qPrintable(tableName)); return false; } // Generates models files << generateSqlObject(); if (userModel) { if (fieldList.count() == 2) { files << genUserModel(fieldList.value(0), fieldList.value(1)); } else if (fieldList.isEmpty()) { files << genUserModel(); } else { qCritical("invalid parameters"); return false; } } else { files << genModel(); } // Generates a project file ProjectFileGenerator progen(dstDir.filePath("models.pro")); return progen.add(files); }
bool ViewGenerator::generate() const { QStringList files; // Reserved word check if (excludedDirName()->contains(dstDir.dirName())) { qCritical("Reserved word error. Please use another word. View name: %s", qPrintable(dstDir.dirName())); return false; } mkpath(dstDir); if (!TableSchema(tableName).exists()) { qCritical("table not found, %s", qPrintable(tableName)); return false; } // Generates view files files << generateViews(); // Generates a project file QDir dir(QDir::cleanPath(dstDir.filePath(".."))); ProjectFileGenerator progen(dir.filePath("views.pro")); return progen.generate(QStringList(), VIEWS_PROJECT); }
static bool createNewApplication(const QString &name) { if (name.isEmpty()) { qCritical("invalid argument"); return false; } QDir dir("."); if (dir.exists(name)) { qCritical("directory already exists"); return false; } if (!dir.mkdir(name)) { qCritical("failed to create a directory %s", qPrintable(name)); return false; } printf(" created %s\n", qPrintable(name)); // Creates sub-directories for (QStringListIterator i(*subDirs()); i.hasNext(); ) { const QString &str = i.next(); QString d = name + SEP + str; if (!mkpath(dir, d)) { return false; } } // Copies files copy(dataDirPath + "app.pro", name + SEP + name + ".pro"); for (QStringListIterator it(*filePaths()); it.hasNext(); ) { const QString &path = it.next(); QString filename = QFileInfo(path).fileName(); QString dst = name + SEP + path; copy(dataDirPath + filename, dst); // Replaces a string in application.ini file if (filename == "application.ini") { replaceString(dst, "$SessionSecret$", randomString(30)); } } #ifdef Q_OS_WIN // Add dummy model files ProjectFileGenerator progen(name + SEP + D_MODELS + "models.pro"); QStringList dummy = { "_dummymodel.h", "_dummymodel.cpp" }; progen.add(dummy); #endif return true; }
bool ValidatorGenerator::generate() const { // Writes each files QString output = QString(VALIDATOR_HEADER_TEMPLATE).arg(name.toUpper()).arg(name); FileWriter(dstDir.filePath(name.toLower() + "validator.h")).write(output, false); output = QString(VALIDATOR_IMPL_TEMPLATE).arg(name.toLower()).arg(name); FileWriter(dstDir.filePath(name.toLower() + "validator.cpp")).write(output, false); // Updates the project file ProjectFileGenerator progen(dstDir.filePath("helpers.pro")); QStringList files; files << name.toLower() + "validator.h" << name.toLower() + "validator.cpp"; return progen.add(files); }
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; }
bool ControllerGenerator::generate(const QString &dstDir) const { // Reserved word check if (ngCtlrName()->contains(tableName.toLower())) { qCritical("Reserved word error. Please use another word. Controller name: %s", qPrintable(tableName)); return false; } QDir dir(dstDir); QStringList files; FileWriter fwh(dir.filePath(controllerName.toLower() + "controller.h")); FileWriter fws(dir.filePath(controllerName.toLower() + "controller.cpp")); if (actionList.isEmpty()) { if (fieldList.isEmpty()) { qCritical("Incorrect parameters."); return false; } QPair<QString, QVariant::Type> pair; if (primaryKeyIndex >= 0) pair = fieldList[primaryKeyIndex]; // Generates a controller source code QString sessInsertStr; QString sessGetStr; QString revStr; QString varName = enumNameToVariableName(controllerName); // Generates a controller header file QString code = QString(CONTROLLER_HEADER_FILE_TEMPLATE).arg(controllerName.toUpper(), controllerName, fieldNameToVariableName(pair.first)); fwh.write(code, false); files << fwh.fileName(); if (lockRevIndex >= 0) { sessInsertStr = QString(" session().insert(\"%1_lockRevision\", model.lockRevision());\n").arg(varName); sessGetStr = QString(" int rev = session().value(\"%1_lockRevision\").toInt();\n").arg(varName); revStr = QLatin1String(", rev"); } code = QString(CONTROLLER_SOURCE_FILE_TEMPLATE).arg(controllerName.toLower(), controllerName, varName, convMethod()->value(pair.second).arg(fieldNameToVariableName(pair.first)), sessInsertStr, sessGetStr, revStr, fieldNameToVariableName(pair.first)); fws.write(code, false); files << fws.fileName(); } else { // Generates a controller header file QString actions; for (QStringListIterator i(actionList); i.hasNext(); ) { actions.append(" void ").append(i.next()).append("();\n"); } QString code = QString(CONTROLLER_TINY_HEADER_FILE_TEMPLATE).arg(controllerName.toUpper(), controllerName, actions); fwh.write(code, false); files << fwh.fileName(); // Generates a controller source code QString actimpl; for (QStringListIterator i(actionList); i.hasNext(); ) { actimpl.append("void ").append(controllerName).append("Controller::").append(i.next()).append("()\n{\n // write code\n}\n\n"); } code = QString(CONTROLLER_TINY_SOURCE_FILE_TEMPLATE).arg(controllerName.toLower(), controllerName, actimpl); fws.write(code, false); files << fws.fileName(); } // Generates a project file ProjectFileGenerator progen(dir.filePath("controllers.pro")); return progen.add(files); }