Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions plugins/code_generator/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#
# Created by: Riccardo Campisano riccardo.campisano AT gmail DOT com
# Original code: https://github.com/pgmodeler/pgmodeler/tree/develop/plugins/xml2object
#
# NOTE: pgmodeler plugins needs 'qttools5-dev' system package
#
###
# Example of pgmodeler compilation (under debian):
# from http://www.campisano.org/wiki/en/Postgresql#Pgmodeler :
###
# sudo su -
# apt-get install g++ pkg-config qt5-qmake qt5-default qtchooser libpq-dev libxml2-dev
# exit
#
# cd $HOME
# git clone https://github.com/campisano/pgmodeler
# cd $HOME/pgmodeler/
# qmake PREFIX=$HOME/pgmodeler_dev pgmodeler.pro
# make
# make install
# $HOME/pgmodeler_dev/bin/pgmodeler # to run
#
###
# Example of plugin compilation
###
# sudo su -
# apt-get install qttools5-dev
# exit
# cd $HOME/pgmodeler/plugins
# qmake PREFIX=$HOME/pgmodeler_dev plugins.pro
# make
# make install
# cd $HOME
# rm -rf pgmodeler
# $HOME/pgmodeler_dev/bin/pgmodeler
# # open a model and press CTRL+ALT+G to generate the code
1 change: 1 addition & 0 deletions plugins/code_generator/code_generator.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "Keys": [ "code_generator" ] }
66 changes: 66 additions & 0 deletions plugins/code_generator/code_generator.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# code_generator.pro
#

# Unix or Windows directory configuration
PGMODELER_SRC_DIR=../../

!exists($$PGMODELER_SRC_DIR) {
warning("The pgModeler source code directory '$$PGMODELER_SRC_DIR' could not be found! Make sure the variable PGMODELER_SRC_DIR points to a valid location!")
error("qmake aborted.")
}

include(../plugins.pro)

CONFIG += plugin qt uic4
QT += core gui uitools
TEMPLATE = lib
TARGET = code_generator
OTHER_FILES += code_generator.json
CODECFORTR = UTF8
DEPENDPATH = ". res src ui moc obj"
MOC_DIR = moc
OBJECTS_DIR = obj
UI_DIR = src

windows: DESTDIR += $$PWD

unix|windows: LIBS += -L$$OUT_PWD/../../libpgmodeler_ui/ -lpgmodeler_ui \
-L$$OUT_PWD/../../libobjrenderer/ -lobjrenderer \
-L$$OUT_PWD/../../libpgconnector/ -lpgconnector \
-L$$OUT_PWD/../../libpgmodeler/ -lpgmodeler \
-L$$OUT_PWD/../../libparsers/ -lparsers \
-L$$OUT_PWD/../../libutils/ -lutils

INCLUDEPATH += $$PWD/../../libpgmodeler_ui \
$$PWD/../../libpgmodeler_ui/src \
$$PWD/../../libobjrenderer/src \
$$PWD/../../libpgconnector/src \
$$PWD/../../libpgmodeler/src \
$$PWD/../../libparsers/src \
$$PWD/../../libutils/src

DEPENDPATH += $$PWD/../../libpgmodeler_ui \
$$PWD/../../libobjrenderer \
$$PWD/../../libpgconnector \
$$PWD/../../libpgmodeler \
$$PWD/../../libparsers \
$$PWD/../../libutils

HEADERS += src/code_generator_plugin.h \
src/code_generator_widget.h \
src/base_code_generator.h \
src/python_daos_generator.h \
src/base_logger.h

SOURCES += src/code_generator_plugin.cpp \
src/code_generator_widget.cpp \
src/python_daos_generator.cpp

FORMS += ui/code_generator_widget.ui

target.path = $$PLUGINSDIR/$$TARGET

resources.path = $$PLUGINSDIR/$$TARGET
resources.files += res/code_generator.png lang code_generator.json

INSTALLS += target resources
Binary file added plugins/code_generator/res/code_generator.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions plugins/code_generator/src/base_code_generator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#ifndef BASE_CODE_GENERATOR_H
#define BASE_CODE_GENERATOR_H

#include "base_logger.h"
#include "pgmodelerplugin.h"
#include <map>
#include <string>

class BaseCodeGenerator {

public:
virtual void generateCode(DatabaseModel &model, BaseLogger &logger, std::map< std::string, std::string > &files_to_generate) = 0;
};

#endif
12 changes: 12 additions & 0 deletions plugins/code_generator/src/base_logger.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef BASE_LOGGER_H
#define BASE_LOGGER_H

#include <string>

class BaseLogger {

public:
virtual void log(std::string text) = 0;
};

#endif
68 changes: 68 additions & 0 deletions plugins/code_generator/src/code_generator_plugin.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include "code_generator_plugin.h"
#include "code_generator_widget.h"
#include "exception.h"
#include "messagebox.h"
#include "python_daos_generator.h"

CodeGeneratorPlugin::CodeGeneratorPlugin(void)
{
this->widget = new CodeGeneratorWidget();
this->generator = new PythonDAOsGenerator();
((CodeGeneratorWidget*)this->widget)->setGenerator((BaseCodeGenerator *) this->generator);

configurePluginInfo(
getPluginTitle(),
getPluginVersion(),
getPluginAuthor(),
getPluginDescription(),

GlobalAttributes::PLUGINS_DIR +
GlobalAttributes::DIR_SEPARATOR +
QString("code_generator") +
GlobalAttributes::DIR_SEPARATOR + QString("code_generator.png")
);
}

CodeGeneratorPlugin::~CodeGeneratorPlugin(void)
{
delete ((CodeGeneratorWidget*)this->widget);
this->widget = 0;
}

QString CodeGeneratorPlugin::getPluginTitle(void)
{
return(trUtf8("CodeGenerator"));
}

QString CodeGeneratorPlugin::getPluginVersion(void)
{
return(QString("0.1"));
}

QString CodeGeneratorPlugin::getPluginAuthor(void)
{
return(QString("Riccardo Campisano"));
}

QString CodeGeneratorPlugin::getPluginDescription(void)
{
return(trUtf8("This plugin automatically gerate code."));
}

void CodeGeneratorPlugin::showPluginInfo(void)
{
plugin_info_frm->show();
}

void CodeGeneratorPlugin::executePlugin(ModelWidget *model)
{
if(!model)
throw Exception(trUtf8("This plugin must be executed with at least one model opened!"),ERR_CUSTOM,__PRETTY_FUNCTION__,__FILE__,__LINE__);

((CodeGeneratorWidget*)this->widget)->show(model->getDatabaseModel(), model->getOperationList());
}

QKeySequence CodeGeneratorPlugin::getPluginShortcut(void)
{
return(QKeySequence(QString("Ctrl+Alt+G")));
}
39 changes: 39 additions & 0 deletions plugins/code_generator/src/code_generator_plugin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/**
\ingroup code_generator_plugin
\class CodeGeneratorPlugin
\brief Code generator plugin for pgModeler
*/

#ifndef CODE_GENERATOR_PLUGINH
#define CODE_GENERATOR_PLUGIN_H

#include "pgmodelerplugin.h"

class CodeGeneratorPlugin: public QObject, public PgModelerPlugin {
private:
Q_OBJECT

Q_PLUGIN_METADATA(IID "br.com.pgmodeler.PgModelerPlugin" FILE "code_generator.json")

//! \brief Declares the interface which is used to implement the plugin
Q_INTERFACES(PgModelerPlugin)

void *widget;
void *generator;

public:
CodeGeneratorPlugin(void);
~CodeGeneratorPlugin(void);

QString getPluginTitle(void);
QString getPluginVersion(void);
QString getPluginAuthor(void);
QString getPluginDescription(void);
QKeySequence getPluginShortcut(void);
void executePlugin(ModelWidget *);

public slots:
void showPluginInfo(void);
};

#endif
76 changes: 76 additions & 0 deletions plugins/code_generator/src/code_generator_widget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include "code_generator_widget.h"

#include <iostream>
#include <fstream>
#include <map>
#include <string>

CodeGeneratorWidget::CodeGeneratorWidget(QWidget *parent, Qt::WindowFlags f) : QDialog(parent,f)
{
setupUi(this);

code_hl=new SyntaxHighlighter(code_txt);
code_hl->loadConfiguration(GlobalAttributes::XML_HIGHLIGHT_CONF_PATH);

connect(close_btn, SIGNAL(clicked(void)), this, SLOT(close(void)));
connect(clear_btn, SIGNAL(clicked(void)), this, SLOT(doClearCode(void)));
connect(generate_btn, SIGNAL(clicked(void)), this, SLOT(doGenerateCode(void)));

this->generator = 0;
}

void CodeGeneratorWidget::setGenerator(BaseCodeGenerator *generator)
{
this->generator = generator;
}

void CodeGeneratorWidget::show(DatabaseModel *model, OperationList *op_list)
{
doClearCode();
this->setEnabled(model!=nullptr && op_list!=nullptr);
this->op_list = op_list;
this->model = model;
QDialog::show();
}

void CodeGeneratorWidget::doClearCode(void)
{
code_txt->setPlainText(QString("Ready.."));
}

void CodeGeneratorWidget::doGenerateCode(void)
{
std::map< std::string, std::string > files_to_generate;
std::map< std::string, std::string >::iterator it;

try
{
if(!op_list->isOperationChainStarted())
op_list->startOperationChain();

this->generator->generateCode(*model, *this, files_to_generate);

for(it = files_to_generate.begin(); it != files_to_generate.end(); ++it)
{
std::ofstream out_file("/tmp/" + it->first);
out_file << it->second;
out_file.close();
}

op_list->finishOperationChain();
}
catch(Exception &e)
{
if(op_list->isOperationChainStarted())
op_list->finishOperationChain();

op_list->undoOperation();
op_list->removeLastOperation();
throw Exception(e.getErrorMessage(), e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
}
}

void CodeGeneratorWidget::log(std::string text)
{
code_txt->setPlainText(QString::fromStdString(text));
}
33 changes: 33 additions & 0 deletions plugins/code_generator/src/code_generator_widget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#ifndef CODE_GENERATOR_WIDGET_H
#define CODE_GENERATOR_WIDGET_H

#include <string>
#include "ui_code_generator_widget.h"
#include "syntaxhighlighter.h"
#include "databasemodel.h"
#include "operationlist.h"
#include "base_code_generator.h"
#include "base_logger.h"

class CodeGeneratorWidget: public QDialog, public Ui::CodeGeneratorWidget, public BaseLogger {
private:
Q_OBJECT
SyntaxHighlighter *code_hl;
DatabaseModel *model;
OperationList *op_list;
BaseCodeGenerator *generator;

public:
CodeGeneratorWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);
void setGenerator(BaseCodeGenerator *generator);
void log(std::string text);

public slots:
void show(DatabaseModel *model, OperationList *op_list);

private slots:
void doClearCode(void);
void doGenerateCode(void);
};

#endif
Loading