2015-10-28 19:21:55 +01:00
#include <QDir>
#include <QApplication>
#include <QPluginLoader>
2015-11-13 15:11:47 +01:00
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlResult>
#include <QSqlError>
#include <QDebug>
2016-03-09 19:56:45 +01:00
#include <QTranslator>
2015-10-28 19:21:55 +01:00
#include <odb/sqlite/database.hxx>
2015-10-30 13:57:13 +01:00
#include "core.h"
2015-11-13 15:11:47 +01:00
#include "coreplugin.h"
2015-11-19 22:12:36 +01:00
#include "users/users.h"
2015-12-10 22:00:58 +01:00
#include "roles/roles.h"
2015-12-22 16:08:47 +01:00
#include "permissionservice.h"
2015-10-30 13:57:13 +01:00
2016-02-09 10:04:17 +01:00
Context ::~ Context ()
{
this -> destroy ();
}
2015-10-28 19:21:55 +01:00
Context & Context :: instance ()
{
static Context ctx ;
return ctx ;
}
QList < IPlugin *> Context :: plugins ()
{
return m_plugins ;
}
2015-11-13 15:11:47 +01:00
IPlugin * Context :: plugin ( const QString & pluginId )
{
2015-11-15 22:26:50 +01:00
QList < IPlugin *>:: iterator it = std :: find_if ( ALL ( m_plugins ), [ & pluginId ]( IPlugin * p ) { return p -> pluginId () == pluginId ; });
2015-11-13 15:11:47 +01:00
if ( it != m_plugins . end ())
{
return * it ;
}
return NULL ;
}
2015-10-28 19:21:55 +01:00
void Context :: loadPlugins ()
{
2015-11-13 15:11:47 +01:00
IPlugin * corePlugin = new CorePlugin ();
m_plugins . append ( corePlugin );
2015-11-19 22:12:36 +01:00
m_plugins . append ( new Users );
2015-12-10 22:00:58 +01:00
m_plugins . append ( new Roles );
2015-11-13 15:11:47 +01:00
2016-05-27 16:47:40 +02:00
QDir pluginsDir ( qApp -> applicationDirPath () + "/../../plugins" );
2015-10-28 19:21:55 +01:00
2015-10-30 13:57:13 +01:00
foreach ( QString fileName , pluginsDir . entryList ( QStringList () << "*.so" << "*.dll" )) {
2015-10-28 19:21:55 +01:00
QPluginLoader pluginLoader ( pluginsDir . absoluteFilePath ( fileName ));
QObject * p = pluginLoader . instance ();
if ( p != NULL ) {
IPlugin * plugin = qobject_cast < IPlugin *> ( p );
if ( plugin != NULL ) {
2015-10-30 13:57:13 +01:00
plugin -> init ( pluginLoader . metaData ());
2015-10-28 19:21:55 +01:00
m_plugins . append ( plugin );
}
}
}
2015-11-24 16:14:36 +01:00
QString dbPath = m_settings -> value ( "db/path" , "" ). toString ();
if ( ! dbPath . isEmpty ())
{
openDb ( dbPath );
}
2015-10-28 19:21:55 +01:00
}
void Context :: openDb ( const QString & path )
{
if ( m_db != NULL ) {
delete m_db ;
2016-01-17 21:31:50 +01:00
m_solved . clear ();
2015-11-24 16:14:36 +01:00
m_dbOpened = false ;
2015-10-28 19:21:55 +01:00
}
2015-11-13 15:11:47 +01:00
checkDb ( path );
2015-10-28 19:21:55 +01:00
m_db = new odb :: sqlite :: database ( path . toStdString ());
2015-11-24 16:14:36 +01:00
m_settings -> setValue ( "db/path" , path );
m_dbOpened = true ;
2015-12-22 16:08:47 +01:00
checkPermissions ();
2015-11-24 16:14:36 +01:00
}
void Context :: destroy ()
{
if ( m_db != NULL )
{
delete m_db ;
m_db = NULL ;
m_dbOpened = false ;
}
2016-02-11 07:30:33 +01:00
/*if (m_settings != NULL && m_settings->parent() == NULL)
2016-02-09 10:04:17 +01:00
{
delete m_settings;
2016-02-11 07:30:33 +01:00
}*/
2015-11-24 16:14:36 +01:00
foreach ( IPlugin * plugin , m_plugins )
{
delete plugin ;
}
m_plugins . clear ();
2015-10-28 19:21:55 +01:00
}
2015-12-22 16:08:47 +01:00
QStringList Context :: defaultPerms ()
{
return QStringList () << PERM_READ << PERM_ADD << PERM_EDIT << PERM_DELETE ;
}
2015-10-28 19:21:55 +01:00
Context :: Context ()
{
m_db = NULL ;
2015-11-24 16:14:36 +01:00
m_settings = new QSettings ( "itsolved.cz" , "prodejna" );
m_dbOpened = false ;
2015-10-28 19:21:55 +01:00
}
2015-11-13 15:11:47 +01:00
2016-02-09 10:04:17 +01:00
QSharedPointer < User > Context :: currentUser () const
{
return m_currentUser ;
}
void Context :: setCurrentUser ( const QSharedPointer < User > & currentUser )
{
m_currentUser = currentUser ;
}
2016-02-13 21:41:05 +01:00
odb :: session & Context :: session ()
{
return m_session ;
}
2015-11-13 15:11:47 +01:00
void Context :: checkDb ( const QString & path )
{
{
2015-12-22 16:08:47 +01:00
QSqlDatabase db = QSqlDatabase :: addDatabase ( "QSQLITE" , "check" );
db . setDatabaseName ( path );
db . open ();
QSqlQuery q ( db );
QString verSql = "SELECT pluginId, schemaVersion FROM system" ;
2016-05-27 16:47:40 +02:00
QString createSysSql = "CREATE TABLE \" system \" ( \" id \" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \" pluginId \" TEXT NULL, \" schemaVersion \" TEXT NULL, \" settings \" TEXT NULL)" ;
2015-12-22 16:08:47 +01:00
if ( q . exec ( verSql ))
2015-11-13 15:11:47 +01:00
{
2015-12-22 16:08:47 +01:00
QMap < QString , int > schemas ;
while ( q . next ())
{
schemas [ q . value ( "pluginId" ). toString ()] = q . value ( "schemaVersion" ). toInt ();
}
checkSchema ( db , schemas );
}
else
{
q . exec ( createSysSql );
checkSchema ( db , QMap < QString , int > ());
2015-11-13 15:11:47 +01:00
}
2015-12-22 16:08:47 +01:00
db . close ();
}
QSqlDatabase :: removeDatabase ( "check" );
2015-11-13 15:11:47 +01:00
}
void Context :: checkSchema ( const QSqlDatabase & db , const QMap < QString , int > & schemaMap )
{
foreach ( IPlugin * plugin , m_plugins ) {
2015-11-15 22:26:50 +01:00
solveDep ( plugin , db , schemaMap );
}
}
void Context :: solveDep ( IPlugin * plugin , const QSqlDatabase & db , const QMap < QString , int > & schemaMap )
{
foreach ( QString dep , plugin -> dependsOn ()) {
QList < IPlugin *>:: iterator it = std :: find_if ( ALL ( m_plugins ), [ & dep ]( IPlugin * p ) { return p -> pluginId () == dep ; });
if ( it != m_plugins . end ())
2015-11-13 15:11:47 +01:00
{
2015-11-15 22:26:50 +01:00
solveDep ( * it , db , schemaMap );
}
2015-11-19 22:12:36 +01:00
}
2015-11-13 15:11:47 +01:00
2015-11-19 22:12:36 +01:00
if ( ! m_solved . contains ( plugin -> pluginId ()))
{
createSchema ( plugin , db , schemaMap );
m_solved . append ( plugin -> pluginId ());
2015-11-15 22:26:50 +01:00
}
}
void Context :: createSchema ( IPlugin * plugin , const QSqlDatabase & db , const QMap < QString , int > & schemaMap )
{
if ( ! schemaMap . contains ( plugin -> pluginId ()) || schemaMap [ plugin -> pluginId ()] < plugin -> schemaVersion ())
{
int ver = schemaMap [ plugin -> pluginId ()];
2015-11-13 15:11:47 +01:00
2015-11-15 22:26:50 +01:00
for ( int i = 0 ; i < plugin -> schemas (). count (); i ++ )
{
if ( ! schemaMap . contains ( plugin -> pluginId ()) || i >= ver )
{
QString sql = plugin -> schemas ()[ i ];
2016-01-17 21:31:50 +01:00
sql = sql . trimmed ();
2015-11-15 22:26:50 +01:00
QSqlQuery q ( db );
2015-11-13 15:11:47 +01:00
2015-11-15 22:26:50 +01:00
QStringList sqlList = sql . split ( ";" );
bool error = false ;
2015-11-13 15:11:47 +01:00
2015-11-15 22:26:50 +01:00
foreach ( QString s , sqlList ) {
2015-11-19 22:12:36 +01:00
if ( ! s . isEmpty () && ! q . exec ( s ))
2015-11-13 15:11:47 +01:00
{
2015-11-15 22:26:50 +01:00
qDebug () << q . lastError (). text ();
error = true ;
2015-11-13 15:11:47 +01:00
}
}
2015-11-15 22:26:50 +01:00
if ( error )
{
continue ;
}
if ( ver == 0 )
{
sql = "INSERT INTO system(pluginId, schemaVersion) VALUES('" + plugin -> pluginId () + "', 1)" ;
}
else
{
sql = "UPDATE system SET schemaVersion = " + QString :: number ( i + 1 ) + " WHERE pluginId = '" + plugin -> pluginId () + "'" ;
}
q . exec ( sql );
2015-11-13 15:11:47 +01:00
}
}
}
}
2015-12-22 16:08:47 +01:00
void Context :: checkPermissions ()
{
PermissionService permService ;
foreach ( IPlugin * plugin , m_plugins ) {
foreach ( QString perm , defaultPerms ()) {
QSharedPointer < Permission > p = permService . forNameAndPlugin ( perm , plugin -> pluginId ());
if ( p . isNull ())
{
QSharedPointer < Permission > nPerm ( new Permission );
nPerm -> setPermissionName ( perm );
nPerm -> setPluginId ( plugin -> pluginId ());
permService . save ( nPerm );
}
}
}
2016-02-09 10:04:17 +01:00
permService . checkForAdmin ();
2015-12-22 16:08:47 +01:00
}