Skip to content

Commit

Permalink
Merge pull request treefrogframework#155 from treefrogframework/upserts
Browse files Browse the repository at this point in the history
Upsert Statement
  • Loading branch information
treefrogframework authored Jul 22, 2017
2 parents d281705 + f9b2553 commit 0a56efd
Show file tree
Hide file tree
Showing 21 changed files with 780 additions and 111 deletions.
3 changes: 3 additions & 0 deletions defaults/database.ini
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ UserName=
Password=
ConnectOptions=
PostOpenStatements=
EnableUpsert=false

[test]
DriverType=QMYSQL
Expand All @@ -35,6 +36,7 @@ UserName=
Password=
ConnectOptions=
PostOpenStatements=
EnableUpsert=false

[product]
DriverType=QMYSQL
Expand All @@ -45,3 +47,4 @@ UserName=
Password=
ConnectOptions=
PostOpenStatements=
EnableUpsert=false
6 changes: 6 additions & 0 deletions src/corelib.pro
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ HEADERS += tactionview.h
SOURCES += tactionview.cpp
HEADERS += tactionmailer.h
SOURCES += tactionmailer.cpp
HEADERS += tsqldatabase.h
SOURCES += tsqldatabase.cpp
HEADERS += tsqldatabasepool.h
SOURCES += tsqldatabasepool.cpp
HEADERS += tsqlobject.h
Expand All @@ -116,6 +118,10 @@ HEADERS += tsqlqueryormapperiterator.h
SOURCES += tsqlqueryormapperiterator.cpp
HEADERS += tsqltransaction.h
SOURCES += tsqltransaction.cpp
HEADERS += tsqldriverextension.h
SOURCES += tsqldriverextension.cpp
HEADERS += tsqldriverextensionfactory.h
SOURCES += tsqldriverextensionfactory.cpp
HEADERS += tcriteria.h
SOURCES += tcriteria.cpp
HEADERS += tcriteriaconverter.h
Expand Down
2 changes: 1 addition & 1 deletion src/tabstractmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ bool TAbstractModel::create()
*/
bool TAbstractModel::save()
{
return (modelData()->isNull()) ? create() : update();
return modelData()->save();
}

/*!
Expand Down
3 changes: 2 additions & 1 deletion src/tapplicationscheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
\class TApplicationScheduler
\brief The TApplicationScheduler class provides functionality for job
scheduler. Jobs scheduled by this class will be executed in only one
application server process.
application server process. This scheduler will be started in
staticInitialize() function.
*/

/*!
Expand Down
2 changes: 1 addition & 1 deletion src/tglobal.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#define TF_VERSION_STR "1.19.0"
#define TF_VERSION_NUMBER 0x011900
#define TF_SRC_REVISION 1533
#define TF_SRC_REVISION 1544

#include <QtGlobal>
#include <QMetaType>
Expand Down
133 changes: 87 additions & 46 deletions src/tkvsdatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
#include <TSystemGlobal>
#include <QMap>
#include <QString>
#include <QMutex>
#include <QMutexLocker>
#include <QReadWriteLock>
#include "tmongodriver.h"
#include "tredisdriver.h"

Expand All @@ -21,13 +20,13 @@ class TKvsDatabaseData
QString connectionName;
QString databaseName;
QString hostName;
quint16 port;
quint16 port {0};
QString userName;
QString password;
QString connectOptions;
TKvsDriver *driver; // pointer to a singleton object
TKvsDriver *driver {nullptr}; // pointer to a singleton object

TKvsDatabaseData() : port(0), driver(0) { }
TKvsDatabaseData() {}
};


Expand All @@ -39,13 +38,18 @@ class TKvsDatabaseData

const char *const TKvsDatabase::defaultConnection = "tf_default_connection";

static QMap<QString, TKvsDatabaseData> databaseMap;
static QMutex mutex(QMutex::Recursive);

class TKvsDatabaseDict : public QMap<QString, TKvsDatabaseData>
{
public:
mutable QReadWriteLock lock;
};
Q_GLOBAL_STATIC(TKvsDatabaseDict, databaseDict)


static TKvsDriver *createDriver(const QString &driverName)
{
TKvsDriver *ret = 0;
TKvsDriver *ret = nullptr;

if (driverName == QLatin1String("MONGODB")) {
ret = new TMongoDriver();
Expand All @@ -62,56 +66,59 @@ static TKvsDriver *createDriver(const QString &driverName)

TKvsDatabase TKvsDatabase::database(const QString &connectionName)
{
QMutexLocker lock(&mutex);
TKvsDatabaseData &d = databaseMap[connectionName];
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);

const TKvsDatabaseData &d = (*dict)[connectionName];
return TKvsDatabase(d.connectionName, d.driver);
}


TKvsDatabase TKvsDatabase::addDatabase(const QString &driver, const QString &connectionName)
{
QMutexLocker lock(&mutex);
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);

// Removes it if exists
if (databaseMap.contains(connectionName)) {
removeDatabase(connectionName);
if (dict->contains(connectionName)) {
auto data = dict->take(connectionName);
if (data.driver) {
delete data.driver;
}
}

TKvsDatabaseData data;
data.connectionName = connectionName;
data.driver = createDriver(driver); // creates a driver
databaseMap.insert(connectionName, data);
return database(connectionName);
dict->insert(connectionName, data);
return TKvsDatabase(data);
}


void TKvsDatabase::removeDatabase(const QString &connectionName)
{
QMutexLocker lock(&mutex);
TKvsDatabase db = database(connectionName);
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);

TKvsDatabase db(dict->take(connectionName));

db.close();
if (db.drv) {
delete db.drv;
}
databaseMap.remove(connectionName);
}


void TKvsDatabase::removeAllDatabases()
{
QMutexLocker lock(&mutex);
const QStringList keys = databaseMap.keys();

for (auto &key : keys) {
removeDatabase(key);
}
databaseMap.clear();
}

// void TKvsDatabase::removeAllDatabases()
// {
// QMutexLocker lock(&mutex);
// const QStringList keys = databaseDict()->keys();

TKvsDatabase::TKvsDatabase()
: connectName(), drv(0)
{ }
// for (auto &key : keys) {
// removeDatabase(key);
// }
// databaseDict()->clear();
// }


TKvsDatabase::TKvsDatabase(const TKvsDatabase &other)
Expand All @@ -124,6 +131,11 @@ TKvsDatabase::TKvsDatabase(const QString &connectionName, TKvsDriver *driver)
{ }


TKvsDatabase::TKvsDatabase(const TKvsDatabaseData &data)
: connectName(data.connectionName), drv(data.driver)
{ }


TKvsDatabase &TKvsDatabase::operator=(const TKvsDatabase &other)
{
connectName = other.connectName;
Expand All @@ -140,14 +152,18 @@ bool TKvsDatabase::isValid() const

bool TKvsDatabase::open()
{
return (driver()) ? driver()->open(databaseName(), userName(), password(), hostName(), port(), connectOptions()) : false;
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);
const TKvsDatabaseData &data = (*dict)[connectName];
return (driver()) ? driver()->open(data.databaseName, data.userName, data.password, data.hostName, data.port, data.connectOptions) : false;
}


void TKvsDatabase::close()
{
if (driver())
if (driver()) {
driver()->close();
}
}


Expand All @@ -162,85 +178,110 @@ QString TKvsDatabase::driverName() const
return (driver()) ? driver()->key() : QString();
}


QString TKvsDatabase::databaseName() const
{
return databaseMap[connectName].databaseName;
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);
return (*dict)[connectName].databaseName;
}


void TKvsDatabase::setDatabaseName(const QString &name)
{
if (!connectName.isEmpty()) {
databaseMap[connectName].databaseName = name;
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);
(*dict)[connectName].databaseName = name;
}
}


QString TKvsDatabase::hostName() const
{
return databaseMap[connectName].hostName;
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);
return (*dict)[connectName].hostName;
}


void TKvsDatabase::setHostName(const QString &hostName)
{
if (!connectName.isEmpty()) {
databaseMap[connectName].hostName = hostName;
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);
(*dict)[connectName].hostName = hostName;
}
}


int TKvsDatabase::port() const
{
return databaseMap[connectName].port;
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);
return (*dict)[connectName].port;
}


void TKvsDatabase::setPort(int port)
{
if (!connectName.isEmpty()) {
databaseMap[connectName].port = port;
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);
(*dict)[connectName].port = port;
}
}


QString TKvsDatabase::userName() const
{
return databaseMap[connectName].userName;
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);
return (*dict)[connectName].userName;
}


void TKvsDatabase::setUserName(const QString &userName)
{
if (!connectName.isEmpty()) {
databaseMap[connectName].userName = userName;
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);
(*dict)[connectName].userName = userName;
}
}


QString TKvsDatabase::password() const
{
return databaseMap[connectName].password;
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);
return (*dict)[connectName].password;
}


void TKvsDatabase::setPassword(const QString &password)
{
if (!connectName.isEmpty()) {
databaseMap[connectName].password = password;
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);
(*dict)[connectName].password = password;
}
}


QString TKvsDatabase::connectOptions() const
{
return databaseMap[connectName].connectOptions;
auto *dict = databaseDict();
QReadLocker locker(&dict->lock);
return (*dict)[connectName].connectOptions;
}


void TKvsDatabase::setConnectOptions(const QString &options)
{
if (!connectName.isEmpty()) {
databaseMap[connectName].connectOptions = options;
auto *dict = databaseDict();
QWriteLocker locker(&dict->lock);
(*dict)[connectName].connectOptions = options;
}
}
9 changes: 5 additions & 4 deletions src/tkvsdatabase.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <TGlobal>

class TKvsDriver;
class TKvsDatabaseData;


class T_CORE_EXPORT TKvsDatabase
Expand All @@ -16,9 +17,9 @@ class T_CORE_EXPORT TKvsDatabase
TypeNum // = 2
};

TKvsDatabase();
TKvsDatabase() {}
TKvsDatabase(const TKvsDatabase &other);
~TKvsDatabase() { }
~TKvsDatabase() {}
TKvsDatabase &operator=(const TKvsDatabase &other);

QString driverName() const;
Expand Down Expand Up @@ -47,14 +48,14 @@ class T_CORE_EXPORT TKvsDatabase
static TKvsDatabase database(const QString &connectionName = QLatin1String(defaultConnection));
static TKvsDatabase addDatabase(const QString &driver, const QString &connectionName = QLatin1String(defaultConnection));
static void removeDatabase(const QString &connectionName = QLatin1String(defaultConnection));
static void removeAllDatabases();
static bool contains(const QString &connectionName = QLatin1String(defaultConnection));

private:
QString connectName;
TKvsDriver *drv;
TKvsDriver *drv {nullptr};

TKvsDatabase(const QString &connectionName, TKvsDriver *driver);
TKvsDatabase(const TKvsDatabaseData &data);
};

#endif // TKVSDATABASE_H
Loading

0 comments on commit 0a56efd

Please sign in to comment.