kexi

kexidbconnection.cpp
1/***************************************************************************
2 * kexidbconnection.cpp
3 * This file is part of the KDE project
4 * copyright (C)2004-2005 by Sebastian Sauer (mail@dipe.org)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public License
15 * along with this program; see the file COPYING. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 ***************************************************************************/
19
20#include "kexidbconnection.h"
21#include "kexidbconnectiondata.h"
22#include "kexidbdrivermanager.h"
23#include "kexidbdriver.h"
24#include "kexidbcursor.h"
25#include "kexidbfieldlist.h"
26#include "kexidbschema.h"
27#include "kexidbtransaction.h"
28#include "kexidbparser.h"
29
30#include <api/exception.h>
31
32#include <kdebug.h>
33
34#include <kexidb/transaction.h>
35
36using namespace Kross::KexiDB;
37
38KexiDBConnection::KexiDBConnection(::KexiDB::Connection* connection, KexiDBDriver* driver, KexiDBConnectionData* connectiondata)
39 : Kross::Api::Class<KexiDBConnection>("KexiDBConnection")
40 , m_connection(connection)
41 , m_connectiondata(connectiondata ? connectiondata : new KexiDBConnectionData(connection->data()))
42 , m_driver(driver ? driver : new KexiDBDriver(connection->driver()))
43{
44 this->addFunction0< Kross::Api::Variant >("hadError", this, &KexiDBConnection::hadError);
45 this->addFunction0< Kross::Api::Variant >("lastError", this, &KexiDBConnection::lastError);
46
47 this->addFunction0< KexiDBConnectionData >("data", this, &KexiDBConnection::data);
48 this->addFunction0< KexiDBDriver >("driver", this, &KexiDBConnection::driver);
49
50 this->addFunction0< Kross::Api::Variant >("connect", this, &KexiDBConnection::connect);
51 this->addFunction0< Kross::Api::Variant >("isConnected", this, &KexiDBConnection::isConnected);
52 this->addFunction0< Kross::Api::Variant >("disconnect", this, &KexiDBConnection::disconnect);
53
54 this->addFunction1< Kross::Api::Variant, Kross::Api::Variant >("databaseExists", this, &KexiDBConnection::databaseExists);
55 this->addFunction0< Kross::Api::Variant >("currentDatabase", this, &KexiDBConnection::currentDatabase);
56 this->addFunction0< Kross::Api::Variant >("databaseNames", this, &KexiDBConnection::databaseNames);
57 this->addFunction0< Kross::Api::Variant >("isDatabaseUsed", this, &KexiDBConnection::isDatabaseUsed);
58 this->addFunction1< Kross::Api::Variant, Kross::Api::Variant >("useDatabase", this, &KexiDBConnection::useDatabase);
59 this->addFunction0< Kross::Api::Variant >("closeDatabase", this, &KexiDBConnection::closeDatabase);
60
61 this->addFunction0< Kross::Api::Variant >("tableNames", this, &KexiDBConnection::tableNames);
62 this->addFunction0< Kross::Api::Variant >("queryNames", this, &KexiDBConnection::queryNames);
63
64 this->addFunction1< KexiDBCursor, Kross::Api::Variant >("executeQueryString", this, &KexiDBConnection::executeQueryString);
65 this->addFunction1< KexiDBCursor, KexiDBQuerySchema >("executeQuerySchema", this, &KexiDBConnection::executeQuerySchema);
66
67 addFunction("insertRecord", &KexiDBConnection::insertRecord);
68
69 this->addFunction1< Kross::Api::Variant, Kross::Api::Variant >("createDatabase", this, &KexiDBConnection::createDatabase);
70 this->addFunction1< Kross::Api::Variant, Kross::Api::Variant >("dropDatabase", this, &KexiDBConnection::dropDatabase);
71
72 this->addFunction1< Kross::Api::Variant, KexiDBTableSchema >("createTable", this, &KexiDBConnection::createTable);
73 this->addFunction1< Kross::Api::Variant, Kross::Api::Variant >("dropTable", this, &KexiDBConnection::dropTable);
74 this->addFunction2< Kross::Api::Variant, KexiDBTableSchema, KexiDBTableSchema >("alterTable", this, &KexiDBConnection::alterTable);
75 this->addFunction2< Kross::Api::Variant, KexiDBTableSchema, Kross::Api::Variant >("alterTableName", this, &KexiDBConnection::alterTableName);
76
77 this->addFunction1< KexiDBTableSchema, Kross::Api::Variant >("tableSchema", this, &KexiDBConnection::tableSchema);
78 this->addFunction1< Kross::Api::Variant, KexiDBTableSchema >("isEmptyTable", this, &KexiDBConnection::isEmptyTable);
79 this->addFunction1< KexiDBQuerySchema, Kross::Api::Variant >("querySchema", this, &KexiDBConnection::querySchema);
80
81 this->addFunction0< Kross::Api::Variant >("autoCommit", this, &KexiDBConnection::autoCommit);
82 this->addFunction1< Kross::Api::Variant, Kross::Api::Variant >("setAutoCommit", this, &KexiDBConnection::setAutoCommit);
83
84 this->addFunction0< KexiDBTransaction >("beginTransaction", this, &KexiDBConnection::beginTransaction);
85 this->addFunction1< Kross::Api::Variant, KexiDBTransaction >("commitTransaction", this, &KexiDBConnection::commitTransaction);
86 this->addFunction1< Kross::Api::Variant, KexiDBTransaction >("rollbackTransaction", this, &KexiDBConnection::rollbackTransaction);
87 this->addFunction0< KexiDBTransaction >("defaultTransaction", this, &KexiDBConnection::defaultTransaction);
88 this->addFunction1< void, KexiDBTransaction >("setDefaultTransaction", this, &KexiDBConnection::setDefaultTransaction);
89 this->addFunction0<Kross::Api::List>("transactions", this, &KexiDBConnection::transactions);
90
91 this->addFunction0< KexiDBParser >("parser", this, &KexiDBConnection::parser);
92}
93
94KexiDBConnection::~KexiDBConnection() {
95}
96
97const TQString KexiDBConnection::getClassName() const {
98 return "Kross::KexiDB::KexiDBConnection";
99}
100
101::KexiDB::Connection* KexiDBConnection::connection() const {
102 if(! m_connection)
103 throw Kross::Api::Exception::Ptr( new Kross::Api::Exception(TQString("KexiDB::Connection is NULL.")) );
104 //if(m_connection->error())
105 // throw Kross::Api::Exception::Ptr( new Kross::Api::Exception(TQString("KexiDB::Connection error: %1").arg(m_connection->errorMsg())) );
106 return m_connection;
107}
108
109bool KexiDBConnection::hadError() const { return connection()->error(); }
110const TQString KexiDBConnection::lastError() const { return connection()->errorMsg(); }
111
112KexiDBConnectionData* KexiDBConnection::data() { return m_connectiondata.data(); }
113KexiDBDriver* KexiDBConnection::driver() { return m_driver.data(); }
114
115bool KexiDBConnection::connect() { return connection()->connect(); }
116bool KexiDBConnection::isConnected() { return connection()->isConnected(); }
117bool KexiDBConnection::disconnect() { return connection()->disconnect(); }
118
119bool KexiDBConnection::isReadOnly() const { return connection()->isReadOnly(); }
120
121bool KexiDBConnection::databaseExists(const TQString& dbname) { return connection()->databaseExists(dbname); }
122const TQString KexiDBConnection::currentDatabase() const { return connection()->currentDatabase(); }
123const TQStringList KexiDBConnection::databaseNames() const { return connection()->databaseNames(); }
124bool KexiDBConnection::isDatabaseUsed() const { return connection()->isDatabaseUsed(); }
125bool KexiDBConnection::useDatabase(const TQString& dbname) { return connection()->databaseExists(dbname) && m_connection->useDatabase(dbname); }
126bool KexiDBConnection::closeDatabase() { return connection()->closeDatabase(); }
127
128const TQStringList KexiDBConnection::allTableNames() const { return connection()->tableNames(true); }
129const TQStringList KexiDBConnection::tableNames() const { return connection()->tableNames(false); }
130
131const TQStringList KexiDBConnection::queryNames() const {
132 bool ok = true;
133 TQStringList queries = connection()->objectNames(::KexiDB::QueryObjectType, &ok);
134 if(! ok) throw Kross::Api::Exception::Ptr( new Kross::Api::Exception(TQString("Failed to determinate querynames.")) );
135 return queries;
136}
137
138KexiDBCursor* KexiDBConnection::executeQueryString(const TQString& sqlquery) {
139 // The ::KexiDB::Connection::executeQuery() method does not check if we pass a valid SELECT-statement
140 // or e.g. a DROP TABLE operation. So, let's check for such dangerous operations right now.
141 ::KexiDB::Parser parser( connection() );
142 if(! parser.parse(sqlquery))
143 throw Kross::Api::Exception::Ptr( new Kross::Api::Exception(TQString("Failed to parse query: %1 %2").arg(parser.error().type()).arg(parser.error().error())) );
144 if( parser.query() == 0 || parser.operation() != ::KexiDB::Parser::OP_Select )
145 throw Kross::Api::Exception::Ptr( new Kross::Api::Exception(TQString("Invalid query operation \"%1\"").arg(parser.operationString()) ) );
146 ::KexiDB::Cursor* cursor = connection()->executeQuery(sqlquery);
147 return cursor ? new KexiDBCursor(cursor) : 0;
148}
149
150KexiDBCursor* KexiDBConnection::executeQuerySchema(KexiDBQuerySchema* queryschema) {
151 ::KexiDB::Cursor* cursor = connection()->executeQuery( *queryschema->queryschema() );
152 return cursor ? new KexiDBCursor(cursor) : 0;
153}
154
155/*TODO
156bool KexiDBConnection::insertRecordIntoFieldlist(KexiDBFieldList* fieldlist, TQValueList<TQVariant> values) {
157 return connection()->insertRecord(*fieldlist->fieldlist(), values);
158}
159
160bool KexiDBConnection::insertRecordIntoTable(KexiDBTableSchema* tableschema, TQValueList<TQVariant> values) {
161 return connection()->insertRecord(*tableschema->tableschema(), values);
162}
163*/
164Kross::Api::Object::Ptr KexiDBConnection::insertRecord(Kross::Api::List::Ptr args) {
165 TQValueList<TQVariant> values = Kross::Api::Variant::toList(args->item(1));
166 Kross::Api::Object::Ptr obj = args->item(0);
167 if(obj->getClassName() == "Kross::KexiDB::KexiDBFieldList")
168 return new Kross::Api::Variant(
169 TQVariant(connection()->insertRecord(
170 *Kross::Api::Object::fromObject<KexiDBFieldList>(obj)->fieldlist(), values)));
171 return new Kross::Api::Variant(
172 TQVariant(connection()->insertRecord(
173 *Kross::Api::Object::fromObject<KexiDBTableSchema>(obj)->tableschema(), values)));
174}
175
176bool KexiDBConnection::createDatabase(const TQString& dbname) { return connection()->createDatabase(dbname); }
177bool KexiDBConnection::dropDatabase(const TQString& dbname) { return connection()->dropDatabase(dbname); }
178
179bool KexiDBConnection::createTable(KexiDBTableSchema* tableschema) { return connection()->createTable(tableschema->tableschema(), false); }
180bool KexiDBConnection::dropTable(const TQString& tablename) { return true == connection()->dropTable(tablename); }
181bool KexiDBConnection::alterTable(KexiDBTableSchema* fromschema, KexiDBTableSchema* toschema) { return true == connection()->alterTable(*fromschema->tableschema(), *toschema->tableschema()); }
182bool KexiDBConnection::alterTableName(KexiDBTableSchema* tableschema, const TQString& newtablename) { return connection()->alterTableName(*tableschema->tableschema(), newtablename); }
183
184KexiDBTableSchema* KexiDBConnection::tableSchema(const TQString& tablename) const {
185 ::KexiDB::TableSchema* tableschema = connection()->tableSchema(tablename);
186 return tableschema ? new KexiDBTableSchema(tableschema) : 0;
187}
188
189bool KexiDBConnection::isEmptyTable(KexiDBTableSchema* tableschema) const {
190 bool success;
191 bool notempty = connection()->isEmpty(*tableschema->tableschema(), success);
192 return (! (success && notempty));
193}
194
195KexiDBQuerySchema* KexiDBConnection::querySchema(const TQString& queryname) const {
196 ::KexiDB::QuerySchema* queryschema = connection()->querySchema(queryname);
197 return queryschema ? new KexiDBQuerySchema(queryschema) : 0;
198}
199
200bool KexiDBConnection::autoCommit() const { return connection()->autoCommit(); }
201bool KexiDBConnection::setAutoCommit(bool enabled) { return connection()->setAutoCommit(enabled); }
202
203KexiDBTransaction* KexiDBConnection::beginTransaction() {
204 ::KexiDB::Transaction t = connection()->beginTransaction();
205 return new KexiDBTransaction(t);
206}
207
208bool KexiDBConnection::commitTransaction(KexiDBTransaction* transaction) { return connection()->commitTransaction( transaction->transaction() ); }
209bool KexiDBConnection::rollbackTransaction(KexiDBTransaction* transaction) { return connection()->rollbackTransaction( transaction->transaction() ); }
210KexiDBTransaction* KexiDBConnection::defaultTransaction() { return new KexiDBTransaction( connection()->defaultTransaction() ); }
211void KexiDBConnection::setDefaultTransaction(KexiDBTransaction* transaction) { connection()->setDefaultTransaction( transaction->transaction() ); }
212
213Kross::Api::List* KexiDBConnection::transactions() {
214 return new Kross::Api::ListT<KexiDBTransaction>( connection()->transactions() );
215}
216
217KexiDBParser* KexiDBConnection::parser() { return new KexiDBParser(this, new ::KexiDB::Parser(connection())); }
Provides database connection, allowing queries and data modification.
Definition connection.h:62
@ OP_Select
Alter an existing table.
Definition parser.h:125
A KexiDBConnectionData is used to store the details needed for a connection with a database.
A connection to a database.
The cursor provides a control structure for the successive traversal of records in a result set as re...
Drivers are the implementations Kexi uses to access the driver-backends.
The KexiDBParser could be used to parse SQL-statements.
The KexiDBTableSchema object implements a KexiDBSchema for queries.
The KexiDBTableSchema object implements a KexiDBSchema for tables.
Transactions are used to ensure that integrity of a database is maintained.
KrossKexiDB provides access to the KexiDB database functionality.