20#include <kexidb/driver.h>
21#include <kexidb/driver_p.h>
22#include <kexidb/drivermanager.h>
23#include <kexidb/drivermanager_p.h>
25#include "drivermanager.h"
26#include "connection.h"
27#include "connectiondata.h"
30#include <tqfileinfo.h>
41TQValueVector<TQString> dflt_typeNames;
47DriverBehaviour::DriverBehaviour()
48 : UNSIGNED_TYPE_KEYWORD(
"UNSIGNED")
49 , AUTO_INCREMENT_FIELD_OPTION(
"AUTO_INCREMENT")
50 , AUTO_INCREMENT_PK_FIELD_OPTION(
"AUTO_INCREMENT PRIMARY KEY")
51 , SPECIAL_AUTO_INCREMENT_DEF(false)
52 , AUTO_INCREMENT_REQUIRES_PK(false)
53 , ROW_ID_FIELD_RETURNS_LAST_AUTOINCREMENTED_VALUE(false)
54 , QUOTATION_MARKS_FOR_IDENTIFIER(
'"')
55 , USING_DATABASE_REQUIRED_TO_CONNECT(true)
56 , _1ST_ROW_READ_AHEAD_REQUIRED_TO_KNOW_IF_THE_RESULT_IS_EMPTY(false)
57 , SELECT_1_SUBQUERY_SUPPORTED(false)
66 , allowImportingTo(true)
72Driver::Driver( TQObject *parent,
const char *name,
const TQStringList & )
73 : TQObject( parent, name )
75 , beh( new DriverBehaviour() )
76 , d( new DriverPrivate() )
78 d->connections.setAutoDelete(
false);
80 d->connections.resize(101);
83 d->initKexiKeywords();
89 DriverManagerInternal::self()->aboutDelete(
this );
91 TQPtrDictIterator<Connection> it( d->connections );
93 while ( (conn = it.toFirst()) ) {
107 setError(ERR_INCOMPAT_DRIVER_VERSION,
108 i18n(
"Incompatible database driver's \"%1\" version: found version %2, expected version %3.")
115 TQString inv_impl = i18n(
"Invalid database driver's \"%1\" implementation:\n").arg(name());
116 TQString not_init = i18n(
"Value of \"%1\" is not initialized for the driver.");
117 if (beh->ROW_ID_FIELD_NAME.isEmpty()) {
118 setError(ERR_INVALID_DRIVER_IMPL, inv_impl + not_init.arg(
"DriverBehaviour::ROW_ID_FIELD_NAME"));
127 TQPtrList<Connection> clist;
128 TQPtrDictIterator<Connection> it( d->connections );
129 for( ; it.current(); ++it )
130 clist.append( &(*it) );
135{
return d->fileDBDriverMimeType; }
138{
return TQString::fromLatin1(
"application/x-kexiproject-sqlite3"); }
147{
return d->service; }
150{
return d->isFileDriver; }
153{
return d->features; }
161 d->adminTools = drv_createAdminTools();
162 return *d->adminTools;
165AdminTools* Driver::drv_createAdminTools()
const
184 if (d->isFileDriver) {
185 if (conn_data.
fileName().isEmpty()) {
186 setError(ERR_MISSING_DB_LOCATION, i18n(
"File name expected for file-based database driver.") );
196 d->connections.insert( conn, conn );
203 return d->connections.take( conn );
210 if (dflt_typeNames.isEmpty()) {
218 dflt_typeNames[Field::Date]=
"Date";
219 dflt_typeNames[Field::DateTime]=
"DateTime";
220 dflt_typeNames[Field::Time]=
"Time";
227 return dflt_typeNames[id_t];
237 if (!n.lower().startsWith(
"kexi__"))
240 return list.find(n.lower())!=list.constEnd();
245 if (!beh->ROW_ID_FIELD_NAME.isEmpty() && n.lower()==beh->ROW_ID_FIELD_NAME.lower())
257 TQString s = v.toString();
267 if (v.type()==TQVariant::String) {
269 TQString s(v.toString());
270 return s.replace(
',',
".");
276 return TQString::number(v.toInt()?1:0);
278 return TQString(
"\'")+v.toTime().toString(TQt::ISODate)+
"\'";
280 return TQString(
"\'")+v.toDate().toString(TQt::ISODate)+
"\'";
281 case Field::DateTime:
284 if (v.toByteArray().isEmpty())
285 return TQString::fromLatin1(
"NULL");
286 if (v.type()==TQVariant::String)
291 return "!INVALIDTYPE!";
293 KexiDBDbg <<
"Driver::valueToSQL(): UNKNOWN!" << endl;
301 return d->properties[propName.lower()];
306 return d->propertyCaptions[propName.lower()];
311 TQValueList<TQCString> names = d->properties.keys();
318 TQCString cstr = str.latin1();
324 bool needOuterQuotes =
false;
328 if(options & EscapeAlways)
329 needOuterQuotes =
true;
332 else if(!d->driverSQLDict)
333 needOuterQuotes =
true;
336 else if(d->kexiSQLDict->find(str))
337 needOuterQuotes =
true;
341 else if((options & EscapeDriver) && d->driverSQLDict->find(str))
342 needOuterQuotes =
true;
345 else if(str.find(
' ') != -1)
346 needOuterQuotes =
true;
348 if(needOuterQuotes && (options & EscapeKexi)) {
349 const char quote =
'"';
350 return quote + TQCString(str).replace( quote,
"\"\"" ) + quote;
352 else if (needOuterQuotes) {
353 const char quote = beh->QUOTATION_MARKS_FOR_IDENTIFIER.latin1();
362 if(!d->driverSQLDict && beh->SQL_KEYWORDS != 0) {
363 d->initDriverKeywords(beh->SQL_KEYWORDS, hashSize);
TQString driverName
the name of the driver that should be used to create a connection
Database specific connection data, e.g. host, port.
TQString fileName() const
Get the filename used by the connection.
Provides database connection, allowing queries and data modification.
static const TQStringList & kexiDBSystemTableNames()
Database driver management, e.g. finding and loading drivers.
TQString lookupByMime(const TQString &mimeType)
TQString escapeIdentifier(const TQString &str, int options=EscapeDriver|EscapeAsNecessary) const
Driver-specific identifier escaping (e.g. for a table name, db name, etc.)
const TQPtrList< Connection > connectionsList() const
virtual TQString dateTimeToSQL(const TQDateTime &v) const
bool transactionsSupported() const
virtual TQString valueToSQL(uint ftype, const TQVariant &v) const
TQString fileDBDriverMimeType() const
@ SingleTransactions
single trasactions are only supported
@ MultipleTransactions
multiple concurrent trasactions are supported (this implies !SingleTransactions)
static TQString defaultFileBasedDriverName()
TQValueList< TQCString > propertyNames() const
TQString propertyCaption(const TQCString &propName) const
virtual TQString escapeString(const TQString &str) const =0
virtual DatabaseVersionInfo version() const =0
static TQString defaultFileBasedDriverMimeType()
AdminTools & adminTools() const
virtual TQString escapeBLOB(const TQByteArray &array) const =0
TQVariant propertyValue(const TQCString &propName) const
virtual bool drv_isSystemFieldName(const TQString &n) const =0
static TQString defaultSQLTypeName(int id_t)
const KService * service() const
bool isFileDriver() const
Connection * createConnection(ConnectionData &conn_data, int options=0)
bool isSystemFieldName(const TQString &n) const
virtual bool isSystemObjectName(const TQString &n) const
Connection * removeConnection(Connection *conn)
virtual TQString drv_escapeIdentifier(const TQString &str) const =0
void initSQLKeywords(int hashSize=17)
virtual TQString sqlTypeName(int id_t, int p=0) const
Driver(TQObject *parent, const char *name, const TQStringList &args=TQStringList())
virtual Connection * drv_createConnection(ConnectionData &conn_data)=0
@ ReadOnlyConnection
set to perform read only connection
static bool isKexiDBSystemObjectName(const TQString &n)
virtual void clearError()
virtual void setError(int code=ERR_OTHER, const TQString &msg=TQString())
High-level database connectivity library with database backend drivers.
KEXI_DB_EXPORT DatabaseVersionInfo version()