@@ -79,31 +79,33 @@ template <class T>
7979class TCriteriaConverter
8080{
8181public:
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
8687protected:
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
9293private:
9394 TCriteria criteria;
9495 QSqlDatabase database;
96+ QString tableAlias;
9597};
9698
9799
98100template <class T >
99101inline QString TCriteriaConverter<T>::toString() const
100102{
101- return criteriaToString (QVariant::fromValue (criteria), database );
103+ return criteriaToString (QVariant::fromValue (criteria));
102104}
103105
104106
105107template <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
209211template <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
279290template <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;
0 commit comments