Skip to content

Commit 4fe91ad

Browse files
Merge branch 'master' of github.com:treefrogframework/treefrog-framework
2 parents 34f065d + 989d20a commit 4fe91ad

File tree

16 files changed

+234
-44
lines changed

16 files changed

+234
-44
lines changed

include/TSqlJoin

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "tsqljoin.h"

include/TreeFrogModel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "tsqlquery.h"
1111
#include "tsqlqueryormapper.h"
1212
#include "tsqlqueryormapperiterator.h"
13+
#include "tsqljoin.h"
1314
#include "tmongoodmapper.h"
1415
#include "twebapplication.h"
1516

include/headers.pri

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
HEADER_CLASSES = ../include/TAbstractModel ../include/TAbstractUser ../include/TActionContext ../include/TActionController ../include/TActionHelper ../include/TActionThread ../include/TActionView ../include/TPrototypeAjaxHelper ../include/TApplicationServerBase ../include/TThreadApplicationServer ../include/TPreforkApplicationServer ../include/TContentHeader ../include/TCookie ../include/TCookieJar ../include/TCriteria ../include/TCriteriaConverter ../include/TCryptMac ../include/TDirectView ../include/TDispatcher ../include/TGlobal ../include/THtmlAttribute ../include/THtmlParser ../include/THttpHeader ../include/THttpRequest ../include/THttpRequestHeader ../include/THttpResponse ../include/THttpResponseHeader ../include/THttpUtility ../include/TInternetMessageHeader ../include/TJavaScriptObject ../include/TLog ../include/TLogger ../include/TLoggerPlugin ../include/TMailMessage ../include/TModelUtil ../include/TMultipartFormData ../include/TOption ../include/TSession ../include/TSessionStore ../include/TSessionStorePlugin ../include/TSharedMemoryLogStream ../include/TSmtpMailer ../include/TSqlORMapper ../include/TSqlORMapperIterator ../include/TSqlObject ../include/TSqlQuery ../include/TSqlQueryORMapper ../include/TSystemGlobal ../include/TTemporaryFile ../include/TViewHelper ../include/TWebApplication ../include/TfException ../include/TfNamespace ../include/TreeFrogController ../include/TreeFrogModel ../include/TreeFrogView ../include/TAbstractController ../include/TActionMailer ../include/TFormValidator ../include/TSqlQueryORMapperIterator ../include/TAccessValidator ../include/TSqlTransaction ../include/TPaginator ../include/TKvsDatabase ../include/TKvsDriver ../include/TModelObject ../include/TPopMailer ../include/TMultiplexingServer ../include/TAccessLog ../include/TActionWorker ../include/TAtomicQueue ../include/TJsonUtil ../include/TScheduler ../include/TApplicationScheduler ../include/TCommandLineInterface ../include/TSendmailMailer ../include/TAppSettings ../include/TWebSocketEndpoint ../include/TDatabaseContext ../include/TWebSocketSession ../include/TRedis
1+
HEADER_CLASSES = ../include/TAbstractModel ../include/TAbstractUser ../include/TActionContext ../include/TActionController ../include/TActionHelper ../include/TActionThread ../include/TActionView ../include/TPrototypeAjaxHelper ../include/TApplicationServerBase ../include/TThreadApplicationServer ../include/TPreforkApplicationServer ../include/TContentHeader ../include/TCookie ../include/TCookieJar ../include/TCriteria ../include/TCriteriaConverter ../include/TCryptMac ../include/TDirectView ../include/TDispatcher ../include/TGlobal ../include/THtmlAttribute ../include/THtmlParser ../include/THttpHeader ../include/THttpRequest ../include/THttpRequestHeader ../include/THttpResponse ../include/THttpResponseHeader ../include/THttpUtility ../include/TInternetMessageHeader ../include/TJavaScriptObject ../include/TLog ../include/TLogger ../include/TLoggerPlugin ../include/TMailMessage ../include/TModelUtil ../include/TMultipartFormData ../include/TOption ../include/TSession ../include/TSessionStore ../include/TSessionStorePlugin ../include/TSharedMemoryLogStream ../include/TSmtpMailer ../include/TSqlORMapper ../include/TSqlORMapperIterator ../include/TSqlObject ../include/TSqlQuery ../include/TSqlQueryORMapper ../include/TSystemGlobal ../include/TTemporaryFile ../include/TViewHelper ../include/TWebApplication ../include/TfException ../include/TfNamespace ../include/TreeFrogController ../include/TreeFrogModel ../include/TreeFrogView ../include/TAbstractController ../include/TActionMailer ../include/TFormValidator ../include/TSqlQueryORMapperIterator ../include/TAccessValidator ../include/TSqlTransaction ../include/TPaginator ../include/TKvsDatabase ../include/TKvsDriver ../include/TModelObject ../include/TPopMailer ../include/TMultiplexingServer ../include/TAccessLog ../include/TActionWorker ../include/TAtomicQueue ../include/TJsonUtil ../include/TScheduler ../include/TApplicationScheduler ../include/TCommandLineInterface ../include/TSendmailMailer ../include/TAppSettings ../include/TWebSocketEndpoint ../include/TDatabaseContext ../include/TWebSocketSession ../include/TRedis ../include/TSqlJoin
22

3-
HEADER_FILES = tabstractmodel.h tabstractuser.h tactioncontext.h tactioncontroller.h tactionhelper.h tactionthread.h tactionview.h tprototypeajaxhelper.h tapplicationserverbase.h tthreadapplicationserver.h tpreforkapplicationserver.h tcontentheader.h tcookie.h tcookiejar.h tcriteria.h tcriteriaconverter.h tcryptmac.h tdirectview.h tdispatcher.h tfcore.h tfexception.h tfnamespace.h tglobal.h thtmlattribute.h thtmlparser.h thttpheader.h thttprequest.h thttprequestheader.h thttpresponse.h thttpresponseheader.h thttputility.h tinternetmessageheader.h tjavascriptobject.h tlog.h tlogger.h tloggerplugin.h tmailmessage.h tmodelutil.h tmultipartformdata.h toption.h tsession.h tsessionstore.h tsessionstoreplugin.h tsharedmemorylogstream.h tsmtpmailer.h tsqlobject.h tsqlormapper.h tsqlormapperiterator.h tsqlquery.h tsqlqueryormapper.h tsystemglobal.h ttemporaryfile.h tviewhelper.h twebapplication.h tabstractcontroller.h tactionmailer.h tformvalidator.h tsqlqueryormapperiterator.h taccessvalidator.h tsqltransaction.h tpaginator.h tkvsdatabase.h tkvsdriver.h tmodelobject.h tpopmailer.h tmultiplexingserver.h taccesslog.h tactionworker.h tatomicqueue.h tjsonutil.h tscheduler.h tapplicationscheduler.h tcommandlineinterface.h tsendmailmailer.h tappsettings.h twebsocketendpoint.h tdatabasecontext.h tsystembus.h tprocessinfo.h twebsocketsession.h tredis.h
3+
HEADER_FILES = tabstractmodel.h tabstractuser.h tactioncontext.h tactioncontroller.h tactionhelper.h tactionthread.h tactionview.h tprototypeajaxhelper.h tapplicationserverbase.h tthreadapplicationserver.h tpreforkapplicationserver.h tcontentheader.h tcookie.h tcookiejar.h tcriteria.h tcriteriaconverter.h tcryptmac.h tdirectview.h tdispatcher.h tfcore.h tfexception.h tfnamespace.h tglobal.h thtmlattribute.h thtmlparser.h thttpheader.h thttprequest.h thttprequestheader.h thttpresponse.h thttpresponseheader.h thttputility.h tinternetmessageheader.h tjavascriptobject.h tlog.h tlogger.h tloggerplugin.h tmailmessage.h tmodelutil.h tmultipartformdata.h toption.h tsession.h tsessionstore.h tsessionstoreplugin.h tsharedmemorylogstream.h tsmtpmailer.h tsqlobject.h tsqlormapper.h tsqlormapperiterator.h tsqlquery.h tsqlqueryormapper.h tsystemglobal.h ttemporaryfile.h tviewhelper.h twebapplication.h tabstractcontroller.h tactionmailer.h tformvalidator.h tsqlqueryormapperiterator.h taccessvalidator.h tsqltransaction.h tpaginator.h tkvsdatabase.h tkvsdriver.h tmodelobject.h tpopmailer.h tmultiplexingserver.h taccesslog.h tactionworker.h tatomicqueue.h tjsonutil.h tscheduler.h tapplicationscheduler.h tcommandlineinterface.h tsendmailmailer.h tappsettings.h twebsocketendpoint.h tdatabasecontext.h tsystembus.h tprocessinfo.h twebsocketsession.h tredis.h tsqljoin.h
44

55
unix {
66
HEADER_FILES += tfcore_unix.h

include/tsqljoin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "../src/tsqljoin.h"

src/corelib.pro

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ SOURCES += tactionthread.cpp
9494
#SOURCES += tactionforkprocess.cpp
9595
HEADERS += thttpsocket.h
9696
SOURCES += thttpsocket.cpp
97+
#HEADERS += thttp2socket.h
98+
#SOURCES += thttp2socket.cpp
9799
#HEADERS += thttpbuffer.h
98100
#SOURCES += thttpbuffer.cpp
99101
HEADERS += tsendbuffer.h
@@ -281,6 +283,7 @@ HEADERS += \
281283
tsessionstoreplugin.h \
282284
tjavascriptobject.h \
283285
tsqlormapper.h \
286+
tsqljoin.h \
284287
thttprequestheader.h \
285288
thttpresponseheader.h \
286289
tcommandlineinterface.h

src/tcriteriaconverter.h

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,31 +79,33 @@ template <class T>
7979
class TCriteriaConverter
8080
{
8181
public:
82-
TCriteriaConverter(const TCriteria &cri, const QSqlDatabase &db) : criteria(cri), database(db) { }
82+
TCriteriaConverter(const TCriteria &cri, const QSqlDatabase &db, const QString &aliasTableName = QString()) : criteria(cri), database(db), tableAlias(aliasTableName) { }
8383
QString toString() const;
84-
static QString propertyName(int property);
84+
static QString propertyName(int property, const QSqlDriver *driver, const QString &aliasTableName = QString());
85+
8586

8687
protected:
87-
static QString criteriaToString(const QVariant &cri, const QSqlDatabase &database);
88+
QString criteriaToString(const QVariant &cri) const;
8889
static QString criteriaToString(const QString &propertyName, TSql::ComparisonOperator op, const QVariant &val1, const QVariant &val2, const QSqlDatabase &database);
8990
static QString criteriaToString(const QString &propertyName, TSql::ComparisonOperator op1, TSql::ComparisonOperator op2, const QVariant &val, const QSqlDatabase &database);
90-
static QString join(const QString &s1, TCriteria::LogicalOperator op, const QString &s2);
91+
static QString concat(const QString &s1, TCriteria::LogicalOperator op, const QString &s2);
9192

9293
private:
9394
TCriteria criteria;
9495
QSqlDatabase database;
96+
QString tableAlias;
9597
};
9698

9799

98100
template <class T>
99101
inline QString TCriteriaConverter<T>::toString() const
100102
{
101-
return criteriaToString(QVariant::fromValue(criteria), database);
103+
return criteriaToString(QVariant::fromValue(criteria));
102104
}
103105

104106

105107
template <class T>
106-
inline QString TCriteriaConverter<T>::criteriaToString(const QVariant &var, const QSqlDatabase &database)
108+
inline QString TCriteriaConverter<T>::criteriaToString(const QVariant &var) const
107109
{
108110
QString sqlString;
109111
if (var.isNull()) {
@@ -115,16 +117,16 @@ inline QString TCriteriaConverter<T>::criteriaToString(const QVariant &var, cons
115117
if (cri.isEmpty()) {
116118
return QString();
117119
}
118-
sqlString = join(criteriaToString(cri.first(), database), cri.logicalOperator(),
119-
criteriaToString(cri.second(), database));
120+
sqlString = concat(criteriaToString(cri.first()), cri.logicalOperator(),
121+
criteriaToString(cri.second()));
120122

121123
} else if (var.canConvert<TCriteriaData>()) {
122124
TCriteriaData cri = var.value<TCriteriaData>();
123125
if (cri.isEmpty()) {
124126
return QString();
125127
}
126128

127-
QString name = propertyName(cri.property);
129+
QString name = propertyName(cri.property, database.driver(), tableAlias);
128130
if (name.isEmpty()) {
129131
return QString();
130132
}
@@ -207,10 +209,19 @@ inline QString TCriteriaConverter<T>::criteriaToString(const QVariant &var, cons
207209

208210

209211
template <class T>
210-
inline QString TCriteriaConverter<T>::propertyName(int property)
212+
inline QString TCriteriaConverter<T>::propertyName(int property, const QSqlDriver *driver, const QString &aliasTableName)
211213
{
212214
const QMetaObject *metaObject = T().metaObject();
213-
return (metaObject) ? metaObject->property(metaObject->propertyOffset() + property).name() : QString();
215+
QString name = (metaObject) ? metaObject->property(metaObject->propertyOffset() + property).name() : QString();
216+
if (name.isEmpty()) {
217+
return name;
218+
}
219+
220+
name = TSqlQuery::escapeIdentifier(name, QSqlDriver::FieldName, driver);
221+
if (!aliasTableName.isEmpty()) {
222+
name = aliasTableName + QLatin1Char('.') + name;
223+
}
224+
return name;
214225
}
215226

216227

@@ -277,7 +288,7 @@ inline QString TCriteriaConverter<T>::criteriaToString(const QString &propertyNa
277288

278289

279290
template <class T>
280-
inline QString TCriteriaConverter<T>::join(const QString &s1, TCriteria::LogicalOperator op, const QString &s2)
291+
inline QString TCriteriaConverter<T>::concat(const QString &s1, TCriteria::LogicalOperator op, const QString &s2)
281292
{
282293
if (op == TCriteria::None || (s2.isEmpty() && op != TCriteria::Not)) {
283294
return s1;

src/test/buildtest/main.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include <TSqlORMapperIterator>
33
#include <TSqlQueryORMapper>
44
#include <TSqlQueryORMapperIterator>
5+
#include <TSqlJoin>
56
#include <TMongoODMapper>
67
#include <TModelUtil>
78
#include <TAtomicQueue>
@@ -46,6 +47,8 @@ void build_check_TSqlORMapper()
4647
mapper.removeAll(crt && crt);
4748
mapper.removeAll(crt || crt);
4849
mapper.removeAll(!crt);
50+
auto joinCri = TCriteria(BlogObject::Title, "hoge");
51+
mapper.setJoin(BlogObject::Id, TSqlJoin<BlogObject>(BlogObject::Title, joinCri));
4952
}
5053

5154
void build_check_TSqlORMapperIterator()

src/tfnamespace.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,12 @@ namespace TSql
250250
Any, // ANY (val1, ...)
251251
All, // ALL (val1, ...)
252252
};
253+
254+
enum JoinMode {
255+
InnerJoin = 0,
256+
LeftJoin,
257+
RightJoin,
258+
};
253259
}
254260

255261
/*!

src/tglobal.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
#include <TfNamespace>
77
#include <cstdint>
88

9-
#define TF_VERSION_STR "1.9.2"
10-
#define TF_VERSION_NUMBER 0x010902
11-
#define TF_SRC_REVISION 954
9+
#define TF_VERSION_STR "1.10.0"
10+
#define TF_VERSION_NUMBER 0x0101000
11+
#define TF_SRC_REVISION 984
1212

1313

1414
#define T_DECLARE_CONTROLLER(TYPE, NAME) \

src/tmongoodmapper.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ inline int TMongoODMapper<T>::find(const TCriteria &criteria)
131131
{
132132
QVariantMap order;
133133
if (sortColumn >= 0) {
134-
QString name = TCriteriaConverter<T>::propertyName(sortColumn);
134+
QString name = TCriteriaMongoConverter<T>::propertyName(sortColumn);
135135
if (!name.isEmpty()) {
136136
order.insert(name, (sortOrder == Tf::AscendingOrder) ? 1 : -1);
137137
}
@@ -221,7 +221,7 @@ inline QList<T> TMongoODMapper<T>::findAllIn(int column, const QVariantList &val
221221
template <class T>
222222
inline int TMongoODMapper<T>::updateAll(const TCriteria &cri, int column, QVariant value)
223223
{
224-
QString s = TCriteriaConverter<T>::propertyName(column);
224+
QString s = TCriteriaMongoConverter<T>::propertyName(column);
225225
if (s.isEmpty())
226226
return -1;
227227

@@ -239,7 +239,7 @@ inline int TMongoODMapper<T>::updateAll(const TCriteria &cri, const QMap<int, QV
239239

240240
for (QMapIterator<int, QVariant> it(values); it.hasNext(); ) {
241241
it.next();
242-
QString s = TCriteriaConverter<T>::propertyName(it.key());
242+
QString s = TCriteriaMongoConverter<T>::propertyName(it.key());
243243
if (!s.isEmpty()) {
244244
doc.insert(s, it.value());
245245
}

0 commit comments

Comments
 (0)