165
180
return ok ? id : 0;
183
//-----------------------------------------
185
TableOrQuerySchema::TableOrQuerySchema(Connection *conn, const QCString& name, bool table)
187
, m_table(table ? conn->tableSchema(QString(name)) : 0)
188
, m_query(table ? 0 : conn->querySchema(QString(name)))
190
if (table && !m_table)
191
kdWarning() << "TableOrQuery(Connection *conn, const QCString& name, bool table) : "
192
"no table specified!" << endl;
193
if (!table && !m_query)
194
kdWarning() << "TableOrQuery(Connection *conn, const QCString& name, bool table) : "
195
"no query specified!" << endl;
198
TableOrQuerySchema::TableOrQuerySchema(FieldList &tableOrQuery)
199
: m_table(dynamic_cast<TableSchema*>(&tableOrQuery))
200
, m_query(dynamic_cast<QuerySchema*>(&tableOrQuery))
202
if (!m_table && !m_query)
203
kdWarning() << "TableOrQuery(FieldList &tableOrQuery) : "
204
" tableOrQuery is nether table nor query!" << endl;
207
TableOrQuerySchema::TableOrQuerySchema(Connection *conn, int id)
209
m_table = conn->tableSchema(id);
210
m_query = m_table ? 0 : conn->querySchema(id);
211
if (!m_table && !m_query)
212
kdWarning() << "TableOrQuery(Connection *conn, int id) : no table or query found for id=="
213
<< id << "!" << endl;
216
TableOrQuerySchema::TableOrQuerySchema(TableSchema* table)
221
kdWarning() << "TableOrQuery(TableSchema* table) : no table specified!" << endl;
224
TableOrQuerySchema::TableOrQuerySchema(QuerySchema* query)
229
kdWarning() << "TableOrQuery(QuerySchema* query) : no query specified!" << endl;
232
const QueryColumnInfo::Vector TableOrQuerySchema::columns(bool unique)
235
return m_table->query()->fieldsExpanded();
238
return m_query->fieldsExpanded(unique);
240
kdWarning() << "TableOrQuery::fields() : no query or table specified!" << endl;
241
return QueryColumnInfo::Vector();
244
QCString TableOrQuerySchema::name() const
247
return m_table->name().latin1();
249
return m_query->name().latin1();
253
QString TableOrQuerySchema::captionOrName() const
255
SchemaData *sdata = m_table ? static_cast<SchemaData *>(m_table) : static_cast<SchemaData *>(m_query);
258
return sdata->caption().isEmpty() ? sdata->name() : sdata->caption();
261
Field* TableOrQuerySchema::field(const QString& name)
264
return m_table->field(name);
266
return m_query->field(name);
271
QueryColumnInfo* TableOrQuerySchema::columnInfo(const QString& name)
274
return m_table->query()->columnInfo(name);
277
return m_query->columnInfo(name);
282
QString TableOrQuerySchema::debugString()
285
return m_table->debugString();
287
return m_query->debugString();
288
return QString::null;
291
void TableOrQuerySchema::debug()
294
return m_table->debug();
296
return m_query->debug();
299
Connection* TableOrQuerySchema::connection() const
302
return m_table->connection();
304
return m_query->connection();
309
//------------------------------------------
311
class ConnectionTestThread : public QThread {
313
ConnectionTestThread(ConnectionTestDialog *dlg, const KexiDB::ConnectionData& connData);
316
ConnectionTestDialog* m_dlg;
317
KexiDB::ConnectionData m_connData;
320
ConnectionTestThread::ConnectionTestThread(ConnectionTestDialog* dlg, const KexiDB::ConnectionData& connData)
321
: m_dlg(dlg), m_connData(connData)
325
void ConnectionTestThread::run()
327
KexiDB::DriverManager manager;
328
KexiDB::Driver* drv = manager.driver(m_connData.driverName);
329
// KexiGUIMessageHandler msghdr;
330
if (!drv || manager.error()) {
331
//move msghdr.showErrorMessage(&Kexi::driverManager());
332
m_dlg->error(&manager);
335
KexiDB::Connection * conn = drv->createConnection(m_connData);
336
if (!conn || drv->error()) {
337
//move msghdr.showErrorMessage(drv);
342
if (!conn->connect() || conn->error()) {
343
//move msghdr.showErrorMessage(conn);
348
// SQL database backends like PostgreSQL require executing "USE database"
349
// if we really want to know connection to the server succeeded.
351
if (!conn->useTemporaryDatabaseIfNeeded( tmpDbName )) {
360
ConnectionTestDialog::ConnectionTestDialog(QWidget* parent,
361
const KexiDB::ConnectionData& data,
362
KexiDB::MessageHandler& msgHandler)
363
: KProgressDialog(parent, "testconn_dlg",
364
i18n("Test Connection"), i18n("<qt>Testing connection to <b>%1</b> database server...</qt>")
365
.arg(data.serverInfoString(true)), true /*modal*/)
366
, m_thread(new ConnectionTestThread(this, data))
368
, m_msgHandler(&msgHandler)
371
, m_stopWaiting(false)
373
showCancelButton(true);
374
progressBar()->setPercentageVisible(false);
375
progressBar()->setTotalSteps(0);
376
connect(&m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
378
resize(250, height());
381
ConnectionTestDialog::~ConnectionTestDialog()
384
m_thread->terminate();
388
int ConnectionTestDialog::exec()
392
const int res = KProgressDialog::exec();
398
void ConnectionTestDialog::slotTimeout()
400
// KexiDBDbg << "ConnectionTestDialog::slotTimeout() " << m_errorObj << endl;
401
bool notResponding = false;
402
if (m_elapsedTime >= 1000*5) {//5 seconds
403
m_stopWaiting = true;
404
notResponding = true;
407
m_timer.disconnect(this);
413
m_msgHandler->showErrorMessage(m_errorObj);
416
else if (notResponding) {
417
KMessageBox::sorry(0,
418
i18n("<qt>Test connection to <b>%1</b> database server failed. The server is not responding.</qt>")
419
.arg(m_connData.serverInfoString(true)),
420
i18n("Test Connection"));
423
KMessageBox::information(0,
424
i18n("<qt>Test connection to <b>%1</b> database server established successfully.</qt>")
425
.arg(m_connData.serverInfoString(true)),
426
i18n("Test Connection"));
434
progressBar()->setProgress( m_elapsedTime );
437
void ConnectionTestDialog::error(KexiDB::Object *obj)
439
KexiDBDbg << "ConnectionTestDialog::error()" << endl;
440
m_stopWaiting = true;
443
m_msgHandler->showErrorMessage(obj);
452
void ConnectionTestDialog::slotCancel()
455
m_thread->terminate();
456
m_timer.disconnect(this);
458
KProgressDialog::slotCancel();
461
void KexiDB::connectionTestDialog(QWidget* parent, const KexiDB::ConnectionData& data,
462
KexiDB::MessageHandler& msgHandler)
464
ConnectionTestDialog dlg(parent, data, msgHandler);
468
int KexiDB::rowCount(const KexiDB::TableSchema& tableSchema)
470
//! @todo does not work with non-SQL data sources
471
if (!tableSchema.connection()) {
472
KexiDBWarn << "KexiDB::rowsCount(const KexiDB::TableSchema&): no tableSchema.connection() !" << endl;
475
int count = -1; //will be changed only on success of querySingleNumber()
476
tableSchema.connection()->querySingleNumber(
477
QString::fromLatin1("SELECT COUNT() FROM ")
478
+ tableSchema.connection()->driver()->escapeIdentifier(tableSchema.name()),
484
int KexiDB::rowCount(KexiDB::QuerySchema& querySchema)
486
//! @todo does not work with non-SQL data sources
487
if (!querySchema.connection()) {
488
KexiDBWarn << "KexiDB::rowsCount(const KexiDB::QuerySchema&): no querySchema.connection() !" << endl;
491
int count = -1; //will be changed only on success of querySingleNumber()
492
querySchema.connection()->querySingleNumber(
493
QString::fromLatin1("SELECT COUNT() FROM (")
494
+ querySchema.connection()->selectStatement(querySchema) + ")",
500
int KexiDB::rowCount(KexiDB::TableOrQuerySchema& tableOrQuery)
502
if (tableOrQuery.table())
503
return rowCount( *tableOrQuery.table() );
504
if (tableOrQuery.query())
505
return rowCount( *tableOrQuery.query() );
509
int KexiDB::fieldCount(KexiDB::TableOrQuerySchema& tableOrQuery)
511
if (tableOrQuery.table())
512
return tableOrQuery.table()->fieldCount();
513
if (tableOrQuery.query())
514
return tableOrQuery.query()->fieldsExpanded().count();
518
QMap<QString,QString> KexiDB::toMap( const ConnectionData& data )
520
QMap<QString,QString> m;
521
m["caption"] = data.caption;
522
m["description"] = data.description;
523
m["driverName"] = data.driverName;
524
m["hostName"] = data.hostName;
525
m["port"] = QString::number(data.port);
526
m["useLocalSocketFile"] = QString::number((int)data.useLocalSocketFile);
527
m["localSocketFileName"] = data.localSocketFileName;
528
m["password"] = data.password;
529
m["savePassword"] = QString::number((int)data.savePassword);
530
m["userName"] = data.userName;
531
m["fileName"] = data.fileName();
535
void KexiDB::fromMap( const QMap<QString,QString>& map, ConnectionData& data )
537
data.caption = map["caption"];
538
data.description = map["description"];
539
data.driverName = map["driverName"];
540
data.hostName = map["hostName"];
541
data.port = map["port"].toInt();
542
data.useLocalSocketFile = map["useLocalSocketFile"].toInt()==1;
543
data.localSocketFileName = map["localSocketFileName"];
544
data.password = map["password"];
545
data.savePassword = map["savePassword"].toInt()==1;
546
data.userName = map["userName"];
547
data.setFileName(map["fileName"]);
550
bool KexiDB::splitToTableAndFieldParts(const QString& string,
551
QString& tableName, QString& fieldName,
552
SetFieldNameIfNoTableNameOptions option)
554
const int id = string.find('.');
555
if (option & SetFieldNameIfNoTableName && id==-1) {
556
tableName = QString::null;
560
if (id<=0 || id==int(string.length()-1))
562
tableName = string.left(id);
563
fieldName = string.mid(id+1);
567
#include "utils_p.moc"