00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef KEXIDB_UTILS_H
00022 #define KEXIDB_UTILS_H
00023
00024 #include <qvaluelist.h>
00025 #include <qvariant.h>
00026
00027 #include <kexidb/connection.h>
00028 #include <kexidb/driver.h>
00029
00030 class QDomNode;
00031 class QDomElement;
00032 class QDomDocument;
00033
00034 namespace KexiDB
00035 {
00037 inline KEXI_DB_EXPORT bool deleteRow(Connection &conn, TableSchema *table,
00038 const QString &keyname, const QString &keyval)
00039 {
00040 return table!=0 && conn.executeSQL("DELETE FROM " + table->name() + " WHERE "
00041 + keyname + "=" + conn.driver()->valueToSQL( Field::Text, QVariant(keyval) ));
00042 }
00043
00044 inline KEXI_DB_EXPORT bool deleteRow(Connection &conn, const QString &tableName,
00045 const QString &keyname, const QString &keyval)
00046 {
00047 return conn.executeSQL("DELETE FROM " + tableName + " WHERE "
00048 + keyname + "=" + conn.driver()->valueToSQL( Field::Text, QVariant(keyval) ));
00049 }
00050
00051 inline KEXI_DB_EXPORT bool deleteRow(Connection &conn, TableSchema *table,
00052 const QString &keyname, int keyval)
00053 {
00054 return table!=0 && conn.executeSQL("DELETE FROM " + table->name() + " WHERE "
00055 + keyname + "=" + conn.driver()->valueToSQL( Field::Integer, QVariant(keyval) ));
00056 }
00057
00058 inline KEXI_DB_EXPORT bool deleteRow(Connection &conn, const QString &tableName,
00059 const QString &keyname, int keyval)
00060 {
00061 return conn.executeSQL("DELETE FROM " + tableName + " WHERE "
00062 + keyname + "=" + conn.driver()->valueToSQL( Field::Integer, QVariant(keyval) ));
00063 }
00064
00066 inline KEXI_DB_EXPORT bool deleteRow(Connection &conn, const QString &tableName,
00067 const QString &keyname1, Field::Type keytype1, const QVariant& keyval1,
00068 const QString &keyname2, Field::Type keytype2, const QVariant& keyval2)
00069 {
00070 return conn.executeSQL("DELETE FROM " + tableName + " WHERE "
00071 + keyname1 + "=" + conn.driver()->valueToSQL( keytype1, keyval1 )
00072 + " AND " + keyname2 + "=" + conn.driver()->valueToSQL( keytype2, keyval2 ));
00073 }
00074
00075 inline KEXI_DB_EXPORT bool replaceRow(Connection &conn, TableSchema *table,
00076 const QString &keyname, const QString &keyval, const QString &valname, QVariant val, int ftype)
00077 {
00078 if (!table || !KexiDB::deleteRow(conn, table, keyname, keyval))
00079 return false;
00080 return conn.executeSQL("INSERT INTO " + table->name()
00081 + " (" + keyname + "," + valname + ") VALUES ("
00082 + conn.driver()->valueToSQL( Field::Text, QVariant(keyval) ) + ","
00083 + conn.driver()->valueToSQL( ftype, val) + ")");
00084 }
00085
00086 typedef QValueList<uint> TypeGroupList;
00087
00089 KEXI_DB_EXPORT const TypeGroupList typesForGroup(Field::TypeGroup typeGroup);
00090
00092 KEXI_DB_EXPORT QStringList typeNamesForGroup(Field::TypeGroup typeGroup);
00093
00095 KEXI_DB_EXPORT QStringList typeStringsForGroup(Field::TypeGroup typeGroup);
00096
00101 KEXI_DB_EXPORT Field::Type defaultTypeForGroup(Field::TypeGroup typeGroup);
00102
00105 inline bool isEmptyValue(Field *f, const QVariant &v) {
00106 if (f->hasEmptyProperty() && v.toString().isEmpty() && !v.toString().isNull())
00107 return true;
00108 return v.isNull();
00109 }
00110
00117 KEXI_DB_EXPORT void getHTMLErrorMesage(Object* obj, QString& msg, QString &details);
00118
00121 KEXI_DB_EXPORT void getHTMLErrorMesage(Object* obj, QString& msg);
00122
00124 KEXI_DB_EXPORT void getHTMLErrorMesage(Object* obj, ResultInfo *result);
00125
00130 inline KEXI_DB_EXPORT QString sqlWhere(Driver *drv, Field::Type t,
00131 const QString fieldName, const QVariant value)
00132 {
00133 if (value.isNull())
00134 return fieldName + " is NULL";
00135 return fieldName + "=" + drv->valueToSQL( t, value );
00136 }
00137
00140 KEXI_DB_EXPORT int idForObjectName( Connection &conn, const QString& objName, int objType );
00141
00143 class KEXI_DB_EXPORT TableOrQuerySchema {
00144 public:
00150 TableOrQuerySchema(Connection *conn, const QCString& name);
00151
00157 TableOrQuerySchema(Connection *conn, const QCString& name, bool table);
00158
00163 TableOrQuerySchema(FieldList &tableOrQuery);
00164
00169 TableOrQuerySchema(Connection *conn, int id);
00170
00173 TableOrQuerySchema(TableSchema* table);
00174
00177 TableOrQuerySchema(QuerySchema* query);
00178
00180 QuerySchema* query() const { return m_query; }
00181
00183 TableSchema* table() const { return m_table; }
00184
00186 QCString name() const;
00187
00189 QString captionOrName() const;
00190
00192 const QueryColumnInfo::Vector columns(bool unique = false);
00193
00196 Field* field(const QString& name);
00197
00200 QueryColumnInfo* columnInfo(const QString& name);
00201
00203 Connection* connection() const;
00204
00206 QString debugString();
00207
00209 void debug();
00210
00211 protected:
00212 QCString m_name;
00213
00214 TableSchema* m_table;
00215 QuerySchema* m_query;
00216 };
00217
00219
00224 int rowCount(Connection &conn, const QString& sql);
00225
00227
00233 KEXI_DB_EXPORT int rowCount(const TableSchema& tableSchema);
00234
00236
00237 KEXI_DB_EXPORT int rowCount(QuerySchema& querySchema);
00238
00240
00241 KEXI_DB_EXPORT int rowCount(TableOrQuerySchema& tableOrQuery);
00242
00246 KEXI_DB_EXPORT int fieldCount(TableOrQuerySchema& tableOrQuery);
00247
00252 KEXI_DB_EXPORT void connectionTestDialog(QWidget* parent, const ConnectionData& data,
00253 MessageHandler& msgHandler);
00254
00256 KEXI_DB_EXPORT QMap<QString,QString> toMap( const ConnectionData& data );
00257
00259 KEXI_DB_EXPORT void fromMap( const QMap<QString,QString>& map, ConnectionData& data );
00260
00262 enum SplitToTableAndFieldPartsOptions {
00263 FailIfNoTableOrFieldName = 0,
00264 SetFieldNameIfNoTableName = 1
00265 };
00266
00282 KEXI_DB_EXPORT bool splitToTableAndFieldParts(const QString& string,
00283 QString& tableName, QString& fieldName,
00284 SplitToTableAndFieldPartsOptions option = FailIfNoTableOrFieldName);
00285
00287 KEXI_DB_EXPORT bool supportsVisibleDecimalPlacesProperty(Field::Type type);
00288
00300 KEXI_DB_EXPORT QString formatNumberForVisibleDecimalPlaces(double value, int decimalPlaces);
00301
00303 KEXI_DB_EXPORT bool isBuiltinTableFieldProperty( const QCString& propertyName );
00304
00306 KEXI_DB_EXPORT bool isExtendedTableFieldProperty( const QCString& propertyName );
00307
00311 KEXI_DB_EXPORT Field::Type intToFieldType( int type );
00312
00318 KEXI_DB_EXPORT bool setFieldProperties( Field& field, const QMap<QCString, QVariant>& values );
00319
00327 KEXI_DB_EXPORT bool setFieldProperty(Field& field, const QCString& propertyName,
00328 const QVariant& value);
00329
00334 KEXI_DB_EXPORT QVariant loadPropertyValueFromDom( const QDomNode& node );
00335
00337 KEXI_DB_EXPORT int loadIntPropertyValueFromDom( const QDomNode& node, bool* ok );
00338
00340 KEXI_DB_EXPORT QString loadStringPropertyValueFromDom( const QDomNode& node, bool* ok );
00341
00349 QDomElement saveNumberElementToDom(QDomDocument& doc, QDomElement& parentEl,
00350 const QString& elementName, int value);
00351
00356 QDomElement saveBooleanElementToDom(QDomDocument& doc, QDomElement& parentEl,
00357 const QString& elementName, bool value);
00358
00366 KEXI_DB_EXPORT QVariant emptyValueForType( Field::Type type );
00367
00376 KEXI_DB_EXPORT QVariant notEmptyValueForType( Field::Type type );
00377
00379 enum BLOBEscapingType {
00380 BLOBEscapeXHex = 1,
00381 BLOBEscape0xHex,
00382 BLOBEscapeHex,
00383 BLOBEscapeOctal
00384
00385
00386 };
00387
00389
00394 KEXI_DB_EXPORT QString escapeBLOB(const QByteArray& array, BLOBEscapingType type);
00395
00400 KEXI_DB_EXPORT QByteArray pgsqlByteaToByteArray(const char* data, int length);
00401
00408 KEXI_DB_EXPORT QString variantToString( const QVariant& v );
00409
00413 KEXI_DB_EXPORT QVariant stringToVariant( const QString& s, QVariant::Type type, bool &ok );
00414
00418 KEXI_DB_EXPORT bool isDefaultValueAllowed( Field* field );
00419
00425
00426 KEXI_DB_EXPORT void getLimitsForType(Field::Type type, int &minValue, int &maxValue);
00427
00429 KEXI_DB_EXPORT void debugRowData(const RowData& rowData);
00430
00433 KEXI_DB_EXPORT Field::Type maximumForIntegerTypes(Field::Type t1, Field::Type t2);
00434
00437 inline QVariant cstringToVariant(const char* data, KexiDB::Field* f, int length = -1)
00438 {
00439 if (!data)
00440 return QVariant();
00441
00442
00443 if (!f || f->isTextType())
00444 return QString::fromUtf8(data, length);
00445 if (f->isIntegerType()) {
00446 if (f->type()==KexiDB::Field::BigInteger)
00447 return QVariant( QString::fromLatin1(data, length).toLongLong() );
00448 return QVariant( QString::fromLatin1(data, length).toInt() );
00449 }
00450 if (f->isFPNumericType())
00451 return QString::fromLatin1(data, length).toDouble();
00452 if (f->type()==KexiDB::Field::BLOB) {
00453 QByteArray ba;
00454 ba.duplicate(data, length);
00455 return ba;
00456 }
00457
00459 QVariant result(QString::fromUtf8(data, length));
00460 if (!result.cast( KexiDB::Field::variantType(f->type()) ))
00461 return QVariant();
00462 return result;
00463 }
00464 }
00465
00466 #endif