Use native tqt3 sqlite3 driver instead of local copy
Remove local copy of sqlite3 driverpull/1/head
parent
fd80b15803
commit
c5d461380e
@ -1,17 +0,0 @@
|
||||
## Makefile.am for krecipes
|
||||
|
||||
# this is the program that gets installed. it's name is used for all
|
||||
# of the other Makefile.am variables
|
||||
|
||||
# set the include path for X, qt and KDE
|
||||
INCLUDES = $(all_includes)
|
||||
|
||||
#building the library
|
||||
|
||||
noinst_LTLIBRARIES=libkrecqsqlite.la
|
||||
libkrecqsqlite_la_SOURCES=krecqsqlitedb.cpp krecqsqliteresult.cpp
|
||||
libkrecqsqlite_la_METASOURCES=AUTO
|
||||
|
||||
#the library search path.
|
||||
libkrecqsqlite_la_LDFLAGS = $(KDE_RPATH) $(all_libraries)
|
||||
|
@ -1,171 +0,0 @@
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Copyright (C) 2003 *
|
||||
* by Unai Garro (ugarro@users.sourceforge.net) *
|
||||
* Martin Imobersteg <imm@gmx.ch> *
|
||||
* and opie project *
|
||||
* *
|
||||
* *
|
||||
* This code was originally developed by the opie project, on which *
|
||||
* Martin Imobersteg based his work. *
|
||||
* This file is adds a small extension, necessary to perform some minimum *
|
||||
* SQL actions *
|
||||
* *
|
||||
* (this project is different from that in qsqlite.sf.net) *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include "krecqsqlitedb.h"
|
||||
#include "krecqsqliteresult.h"
|
||||
|
||||
#include <ntqvaluelist.h>
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#if HAVE_SQLITE
|
||||
#include <sqlite.h>
|
||||
#elif HAVE_SQLITE3
|
||||
#include <sqlite3.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
|
||||
TQSQLiteDB::TQSQLiteDB( TQObject *, const char * )
|
||||
{}
|
||||
|
||||
bool TQSQLiteDB::open( const TQString &dbname )
|
||||
{
|
||||
char * errmsg = 0;
|
||||
|
||||
#if HAVE_SQLITE
|
||||
|
||||
m_db = sqlite_open( dbname.latin1(), 0, &errmsg );
|
||||
#elif HAVE_SQLITE3
|
||||
|
||||
int res = sqlite3_open( dbname.latin1(), &m_db );
|
||||
|
||||
if ( res != SQLITE_OK )
|
||||
return false;
|
||||
#endif
|
||||
|
||||
if ( m_db == 0L ) {
|
||||
#if HAVE_SQLITE
|
||||
sqlite_freemem( errmsg );
|
||||
#elif HAVE_SQLITE3
|
||||
sqlite3_free( errmsg );
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
int func_res;
|
||||
#if HAVE_SQLITE
|
||||
func_res = sqlite_create_function(m_db,"lastInsertID",0,&lastInsertID,m_db );
|
||||
#elif HAVE_SQLITE3
|
||||
func_res = sqlite3_create_function(m_db,"lastInsertID",0,SQLITE_ANY,m_db,
|
||||
&lastInsertID, 0, 0 );
|
||||
#endif
|
||||
|
||||
return func_res == 0;
|
||||
}
|
||||
|
||||
void TQSQLiteDB::close()
|
||||
{
|
||||
if ( m_db ) {
|
||||
#if HAVE_SQLITE
|
||||
sqlite_close( m_db );
|
||||
#elif HAVE_SQLITE3
|
||||
|
||||
sqlite3_close( m_db );
|
||||
#endif
|
||||
|
||||
m_db = 0L;
|
||||
}
|
||||
}
|
||||
|
||||
TQSQLiteResult TQSQLiteDB::executeQuery( const TQString &query, int *lastID )
|
||||
{
|
||||
TQSQLiteResult res;
|
||||
if ( !m_db ) {
|
||||
return res;
|
||||
}
|
||||
|
||||
char *errmsg = 0;
|
||||
#if HAVE_SQLITE
|
||||
|
||||
if ( sqlite_exec( m_db, query.latin1(), &call_back, &res, &errmsg ) > 0 )
|
||||
#elif HAVE_SQLITE3
|
||||
|
||||
if ( sqlite3_exec( m_db, query.latin1(), &call_back, &res, &errmsg ) > 0 )
|
||||
#endif
|
||||
|
||||
{
|
||||
kdDebug() << "SQLite error: " << errmsg << endl <<
|
||||
"\t (Query: " << query << ")" << endl;
|
||||
res.setError( errmsg );
|
||||
res.setStatus( TQSQLiteResult::Failure );
|
||||
#if HAVE_SQLITE
|
||||
sqlite_freemem( errmsg );
|
||||
#elif HAVE_SQLITE3
|
||||
sqlite3_free( errmsg );
|
||||
#endif
|
||||
}
|
||||
|
||||
if ( lastID ) {
|
||||
#if HAVE_SQLITE
|
||||
* lastID = sqlite_last_insert_rowid( m_db );
|
||||
#elif HAVE_SQLITE3
|
||||
|
||||
*lastID = sqlite3_last_insert_rowid( m_db );
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
res.setStatus( TQSQLiteResult::Success );
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int TQSQLiteDB::call_back( void* result, int argc, char** argv, char** columns )
|
||||
{
|
||||
TQSQLiteResult * res = ( TQSQLiteResult* ) result;
|
||||
|
||||
TQMap<TQString, TQCString> tableString;
|
||||
TQMap<int, TQCString> tableInt;
|
||||
|
||||
for ( int i = 0; i < argc; i++ ) {
|
||||
tableInt.insert( i, argv[ i ] );
|
||||
tableString.insert( columns[ i ],
|
||||
argv[ i ] );
|
||||
}
|
||||
|
||||
TQSQLiteResultRow row( tableString, tableInt );
|
||||
res->addRow( row );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if HAVE_SQLITE
|
||||
void TQSQLiteDB::lastInsertID(sqlite_func *context,int argc,const char**)
|
||||
{
|
||||
Q_ASSERT( argc==0 );
|
||||
|
||||
void *db = sqlite_user_data(context);
|
||||
sqlite_set_result_int(context, sqlite_last_insert_rowid( (sqlite*)db ) );
|
||||
}
|
||||
#elif HAVE_SQLITE3
|
||||
void TQSQLiteDB::lastInsertID( sqlite3_context *context, int argc, sqlite3_value ** )
|
||||
{
|
||||
Q_ASSERT( argc==0 );
|
||||
|
||||
void *db = sqlite3_user_data(context);
|
||||
sqlite3_result_int(context, sqlite3_last_insert_rowid( (sqlite3*)db ) );
|
||||
}
|
||||
#endif
|
||||
|
@ -1,59 +0,0 @@
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Copyright (C) 2003 *
|
||||
* by Unai Garro (ugarro@users.sourceforge.net) *
|
||||
* Martin Imobersteg <imm@gmx.ch> *
|
||||
* and opie project *
|
||||
* *
|
||||
* *
|
||||
* This code was originally developed by the opie project, on which *
|
||||
* Martin Imobersteg based his work. *
|
||||
* This file is adds a small extension, necessary to perform some minimum *
|
||||
* SQL actions *
|
||||
* *
|
||||
* (this project is different from that in qsqlite.sf.net) *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef TQSQLITEDB_H
|
||||
#define TQSQLITEDB_H
|
||||
|
||||
#include <ntqvaluelist.h>
|
||||
#include <ntqstringlist.h>
|
||||
#include <ntqobject.h>
|
||||
|
||||
#include "config.h"
|
||||
#if HAVE_SQLITE
|
||||
#include <sqlite.h>
|
||||
#elif HAVE_SQLITE3
|
||||
#include <sqlite3.h>
|
||||
#endif
|
||||
|
||||
#include "krecqsqliteresult.h"
|
||||
|
||||
|
||||
class TQSQLiteDB
|
||||
{
|
||||
public:
|
||||
TQSQLiteDB( TQObject *parent = 0, const char *name = 0 );
|
||||
bool open( const TQString &dbname );
|
||||
void close();
|
||||
TQSQLiteResult executeQuery( const TQString &query, int *lastID = 0 );
|
||||
int size(); //Returns the number of rows returned
|
||||
|
||||
private:
|
||||
static int call_back( void* res, int argc, char** argv, char** columns );
|
||||
|
||||
#if HAVE_SQLITE
|
||||
static void lastInsertID(sqlite_func*,int,const char**);
|
||||
sqlite *m_db;
|
||||
#elif HAVE_SQLITE3
|
||||
static void lastInsertID(sqlite3_context *context, int argc, sqlite3_value **argv);
|
||||
sqlite3 *m_db;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif
|
@ -1,197 +0,0 @@
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Copyright (C) 2003 *
|
||||
* by Unai Garro (ugarro@users.sourceforge.net) *
|
||||
* Martin Imobersteg <imm@gmx.ch> *
|
||||
* and opie project *
|
||||
* *
|
||||
* *
|
||||
* This code was originally developed by the opie project, on which *
|
||||
* Martin Imobersteg based his work. *
|
||||
* This file is adds a small extension, necessary to perform some minimum *
|
||||
* SQL actions *
|
||||
* *
|
||||
* (this project is different from that in qsqlite.sf.net) *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "krecqsqliteresult.h"
|
||||
|
||||
TQSQLiteResultRow::TQSQLiteResultRow( const TableString& string, const TableInt& Int )
|
||||
: m_string( string ), m_int( Int )
|
||||
{}
|
||||
|
||||
TQSQLiteResultRow::~TQSQLiteResultRow()
|
||||
{}
|
||||
|
||||
TQSQLiteResultRow::TQSQLiteResultRow( const TQSQLiteResultRow& item )
|
||||
{
|
||||
*this = item;
|
||||
}
|
||||
|
||||
TQSQLiteResultRow &TQSQLiteResultRow::operator=( const TQSQLiteResultRow& other )
|
||||
{
|
||||
m_string = other.m_string;
|
||||
m_int = other.m_int;
|
||||
return *this;
|
||||
}
|
||||
|
||||
TQSQLiteResultRow::TableString TQSQLiteResultRow::tableString() const
|
||||
{
|
||||
return m_string;
|
||||
}
|
||||
|
||||
TQSQLiteResultRow::TableInt TQSQLiteResultRow::tableInt() const
|
||||
{
|
||||
return m_int;
|
||||
}
|
||||
|
||||
TQCString TQSQLiteResultRow::data( const TQString& columnName, bool *ok )
|
||||
{
|
||||
TableString::Iterator it = m_string.find( columnName );
|
||||
|
||||
/* if found */
|
||||
if ( it != m_string.end() ) {
|
||||
if ( ok )
|
||||
* ok = true;
|
||||
return it.data();
|
||||
}
|
||||
else {
|
||||
if ( ok )
|
||||
* ok = false;
|
||||
return TQCString(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TQCString TQSQLiteResultRow::data( int column, bool *ok )
|
||||
{
|
||||
TableInt::Iterator it = m_int.find( column );
|
||||
|
||||
// if found
|
||||
if ( it != m_int.end() ) {
|
||||
if ( ok )
|
||||
* ok = true;
|
||||
return it.data();
|
||||
}
|
||||
else {
|
||||
if ( ok )
|
||||
* ok = false;
|
||||
return TQCString(0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* DateFormat is 'YYYY-MM-DD'
|
||||
*/
|
||||
TQDate TQSQLiteResultRow::dataToDate( const TQString& column, bool *ok )
|
||||
{
|
||||
TQDate date = TQDate::currentDate();
|
||||
TQString str = data( column, ok );
|
||||
if ( !str.isEmpty() ) {
|
||||
; // convert
|
||||
}
|
||||
return date;
|
||||
}
|
||||
|
||||
TQDate TQSQLiteResultRow::dataToDate( int column, bool *ok )
|
||||
{
|
||||
TQDate date = TQDate::currentDate();
|
||||
TQString str = data( column, ok );
|
||||
if ( !str.isEmpty() ) {
|
||||
; // convert
|
||||
}
|
||||
return date;
|
||||
}
|
||||
|
||||
TQDateTime TQSQLiteResultRow::dataToDateTime( const TQString& column )
|
||||
{
|
||||
TQDateTime time = TQDateTime::currentDateTime();
|
||||
return time;
|
||||
}
|
||||
|
||||
TQDateTime TQSQLiteResultRow::dataToDateTime( int column )
|
||||
{
|
||||
TQDateTime time = TQDateTime::currentDateTime();
|
||||
return time;
|
||||
}
|
||||
|
||||
TQSQLiteResult::TQSQLiteResult( enum Status status,
|
||||
const TQSQLiteResult::Columns& list,
|
||||
const TQString &error )
|
||||
: m_status( status ), m_list( list ), m_error( error )
|
||||
{}
|
||||
|
||||
TQSQLiteResult::~TQSQLiteResult()
|
||||
{}
|
||||
|
||||
TQSQLiteResult::Status TQSQLiteResult::getStatus() const
|
||||
{
|
||||
return m_status;
|
||||
}
|
||||
|
||||
void TQSQLiteResult::setStatus( TQSQLiteResult::Status status )
|
||||
{
|
||||
m_status = status;
|
||||
}
|
||||
|
||||
TQSQLiteResult::Columns TQSQLiteResult::getResults() const
|
||||
{
|
||||
return m_list;
|
||||
}
|
||||
|
||||
void TQSQLiteResult::setResults( const TQSQLiteResult::Columns& result )
|
||||
{
|
||||
m_list = result;
|
||||
}
|
||||
|
||||
void TQSQLiteResult::addRow( TQSQLiteResultRow row )
|
||||
{
|
||||
m_list.append( row );
|
||||
}
|
||||
|
||||
TQString TQSQLiteResult::getError() const
|
||||
{
|
||||
return m_error;
|
||||
}
|
||||
|
||||
void TQSQLiteResult::setError( const TQString &error )
|
||||
{
|
||||
m_error = error;
|
||||
}
|
||||
|
||||
TQSQLiteResultRow TQSQLiteResult::first()
|
||||
{
|
||||
it = m_list.begin();
|
||||
return ( *it );
|
||||
}
|
||||
|
||||
TQSQLiteResultRow TQSQLiteResult::next()
|
||||
{
|
||||
++it;
|
||||
return ( *it );
|
||||
}
|
||||
|
||||
bool TQSQLiteResult::atEnd()
|
||||
{
|
||||
if ( it == m_list.end() ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
TQSQLiteResult::Columns::ConstIterator TQSQLiteResult::iterator() const
|
||||
{
|
||||
TQSQLiteResult::Columns::ConstIterator it;
|
||||
it = m_list.begin();
|
||||
return it;
|
||||
}
|
||||
|
||||
int TQSQLiteResult::size() const
|
||||
{
|
||||
return ( m_list.size() );
|
||||
}
|
@ -1,142 +0,0 @@
|
||||
/***************************************************************************
|
||||
* *
|
||||
* Copyright (C) 2003 *
|
||||
* by Unai Garro (ugarro@users.sourceforge.net) *
|
||||
* Martin Imobersteg <imm@gmx.ch> *
|
||||
* and opie project *
|
||||
* *
|
||||
* *
|
||||
* This code was originally developed by the opie project, on which *
|
||||
* Martin Imobersteg based his work. *
|
||||
* This file is adds a small extension, necessary to perform some minimum *
|
||||
* SQL actions *
|
||||
* *
|
||||
* (this project is different from that in qsqlite.sf.net) *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef TQSQLITERESULT_H
|
||||
#define TQSQLITERESULT_H
|
||||
|
||||
#include <ntqdatetime.h>
|
||||
#include <ntqmap.h>
|
||||
#include <ntqvaluelist.h>
|
||||
|
||||
/**
|
||||
* ResultRow represents one row of the resulting answer
|
||||
*/
|
||||
class TQSQLiteResultRow
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* TableString is used to establish the relations
|
||||
* between the column name and the real item
|
||||
*/
|
||||
typedef TQMap<TQString, TQCString> TableString;
|
||||
|
||||
/**
|
||||
* TableInt is used to establish a relation between a
|
||||
* position of a column and the row value
|
||||
*/
|
||||
typedef TQMap<int, TQCString> TableInt;
|
||||
|
||||
/**
|
||||
* Default c'tor. It has a TableString and a TableInt
|
||||
*/
|
||||
TQSQLiteResultRow( const TableString& = TableString(),
|
||||
const TableInt& = TableInt() );
|
||||
TQSQLiteResultRow( const TQSQLiteResultRow& );
|
||||
~TQSQLiteResultRow();
|
||||
TQSQLiteResultRow &operator=( const TQSQLiteResultRow& );
|
||||
|
||||
/**
|
||||
* returns the TableString
|
||||
*/
|
||||
TableString tableString() const;
|
||||
|
||||
/**
|
||||
* returns the TableInt
|
||||
*/
|
||||
TableInt tableInt() const;
|
||||
|
||||
/**
|
||||
* retrieves the Data from columnName
|
||||
*
|
||||
*/
|
||||
TQCString data( const TQString& columnName, bool *ok = 0 );
|
||||
|
||||
/**
|
||||
* TQString for column number
|
||||
*/
|
||||
TQCString data( int columnNumber, bool *ok = 0 );
|
||||
|
||||
/**
|
||||
* Date conversion from columnName
|
||||
*/
|
||||
TQDate dataToDate( const TQString& columnName, bool *ok = 0 );
|
||||
|
||||
/**
|
||||
* Date conversion from column-number
|
||||
*/
|
||||
TQDate dataToDate( int columnNumber, bool *ok = 0 );
|
||||
|
||||
TQDateTime dataToDateTime( const TQString& columName );
|
||||
TQDateTime dataToDateTime( int columnNumber );
|
||||
|
||||
private:
|
||||
TableString m_string;
|
||||
TableInt m_int;
|
||||
};
|
||||
|
||||
/**
|
||||
* the TQSQLiteResult
|
||||
* either a SQL statusment failed or succeeded
|
||||
*/
|
||||
class TQSQLiteResult
|
||||
{
|
||||
|
||||
public:
|
||||
typedef TQValueList<TQSQLiteResultRow> Columns;
|
||||
|
||||
/** The Status of a Result */
|
||||
enum Status{ Success = 0, Failure, Undefined };
|
||||
|
||||
/**
|
||||
* default c'tor
|
||||
* @param status The Status of the Result
|
||||
* @param r ResultItems
|
||||
* @param error Error Message
|
||||
*/
|
||||
TQSQLiteResult( enum Status status = Undefined,
|
||||
const Columns &r = Columns(),
|
||||
const TQString &error = 0L );
|
||||
~TQSQLiteResult();
|
||||
|
||||
Status getStatus() const;
|
||||
Columns getResults() const;
|
||||
TQString getError() const;
|
||||
|
||||
void setStatus( enum Status status );
|
||||
void setResults( const Columns &result );
|
||||
void setError( const TQString &error );
|
||||
|
||||
void addRow( TQSQLiteResultRow row );
|
||||
|
||||
TQSQLiteResultRow first();
|
||||
TQSQLiteResultRow next();
|
||||
bool atEnd();
|
||||
|
||||
Columns::ConstIterator iterator() const;
|
||||
int size() const;
|
||||
|
||||
private:
|
||||
enum Status m_status;
|
||||
Columns m_list;
|
||||
TQString m_error;
|
||||
Columns::Iterator it;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,470 +0,0 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005 by *
|
||||
* Jason Kivlighn (jkivlighn@gmail.com) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "qsql_sqlite.h"
|
||||
|
||||
#include <ntqdatetime.h>
|
||||
#include <ntqregexp.h>
|
||||
#include <ntqfile.h>
|
||||
|
||||
#include <ntqptrvector.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "libqsqlite/krecqsqlitedb.h"
|
||||
#include "libqsqlite/krecqsqliteresult.h"
|
||||
|
||||
#define TQSQLITE_DRIVER_NAME "KRE_QSQLITE"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#if HAVE_SQLITE3
|
||||
#include <sqlite3.h>
|
||||
#define sqlite_free sqlite3_free
|
||||
#elif HAVE_SQLITE
|
||||
#include <sqlite.h>
|
||||
#endif
|
||||
|
||||
class KreSQLiteResult : public TQSqlResult
|
||||
{
|
||||
public:
|
||||
KreSQLiteResult( const KreSQLiteDriver *d ): TQSqlResult( d )
|
||||
{
|
||||
db = d->db;
|
||||
}
|
||||
~KreSQLiteResult() {}
|
||||
protected:
|
||||
TQVariant data( int );
|
||||
bool reset ( const TQString& );
|
||||
bool fetch( int );
|
||||
bool fetchFirst();
|
||||
bool fetchNext();
|
||||
bool fetchLast();
|
||||
bool isNull( int );
|
||||
TQSqlRecord record();
|
||||
int size();
|
||||
int numRowsAffected();
|
||||
|
||||
private:
|
||||
TQSQLiteResult result;
|
||||
TQSQLiteResultRow row;
|
||||
|
||||
TQSQLiteDB *db;
|
||||
};
|
||||
|
||||
|
||||
TQVariant KreSQLiteResult::data( int field )
|
||||
{
|
||||
if ( !isSelect() ) {
|
||||
//tqWarning( "KreSQLiteResult::data: column %d out of range", field );
|
||||
tqWarning( "KreSQLiteResult::data: not a select statement" );
|
||||
return TQVariant();
|
||||
}
|
||||
|
||||
return TQVariant(row.data(field));
|
||||
}
|
||||
|
||||
bool KreSQLiteResult::fetch( int i )
|
||||
{
|
||||
kdDebug()<<"fetch_i"<<endl;
|
||||
if ( isForwardOnly() ) { // fake a forward seek
|
||||
if ( at() < i ) {
|
||||
int x = i - at();
|
||||
while ( --x && fetchNext() );
|
||||
return fetchNext();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if ( at() == i )
|
||||
return true;
|
||||
|
||||
row = result.first();
|
||||
for ( int j = 0; j < i; ++j ) {
|
||||
if ( result.atEnd() )
|
||||
return false;
|
||||
|
||||
row = result.next();
|
||||
}
|
||||
|
||||
setAt( i );
|
||||
return true;
|
||||
}
|
||||
|
||||
bool KreSQLiteResult::fetchNext()
|
||||
{
|
||||
row = result.next();
|
||||
|
||||
if ( result.atEnd() )
|
||||
return false;
|
||||
|
||||
setAt( at() + 1 );
|
||||
return true;
|
||||
}
|
||||
|
||||
bool KreSQLiteResult::fetchFirst()
|
||||
{
|
||||
row = result.first();
|
||||
|
||||
if ( result.atEnd() )
|
||||
return false;
|
||||
|
||||
setAt(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool KreSQLiteResult::fetchLast()
|
||||
{kdDebug()<<"fetchlast"<<endl;
|
||||
if ( isForwardOnly() ) { // fake this since MySQL can't seek on forward only queries
|
||||
bool success = fetchNext(); // did we move at all?
|
||||
while ( fetchNext() );
|
||||
return success;
|
||||
}
|
||||
int numRows = size();
|
||||
if ( !numRows )
|
||||
return false;
|
||||
return fetch( numRows - 1 );
|
||||
}
|
||||
|
||||
bool KreSQLiteResult::isNull( int i )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
TQSqlRecord KreSQLiteResult::record()
|
||||
{kdDebug()<<"record"<<endl;
|
||||
return TQSqlRecord();
|
||||
}
|
||||
|
||||
int KreSQLiteResult::size()
|
||||
{
|
||||
//kdDebug()<<"size: "<<result.size()<<endl;
|
||||
return result.size();
|
||||
}
|
||||
|
||||
int KreSQLiteResult::numRowsAffected()
|
||||
{kdDebug()<<"numrowsaffected"<<endl;
|
||||
return 1;/*sqlite3_changes(db)*/
|
||||
}
|
||||
|
||||
/*
|
||||
Execute \a query.
|
||||
*/
|
||||
bool KreSQLiteResult::reset(const TQString& query)
|
||||
{
|
||||
// this is where we build a query.
|
||||
if (!driver())
|
||||
return false;
|
||||
if (!driver()-> isOpen() || driver()->isOpenError())
|
||||
return false;
|
||||
|
||||
//cleanup
|
||||
setAt( -1 );
|
||||
|
||||
setSelect(true);
|
||||
|
||||
|
||||
result = db->executeQuery( query );
|
||||
int res = result.getStatus();
|
||||
|
||||
if (res != SQLITE_OK ) {
|
||||
setLastError(TQSqlError("Unable to execute statement", result.getError(), TQSqlError::Statement, res));
|
||||
}
|
||||
|
||||
setActive(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
|
||||
KreSQLiteDriver::KreSQLiteDriver(TQObject * parent, const char * name)
|
||||
: TQSqlDriver(parent, name ? name : TQSQLITE_DRIVER_NAME)
|
||||
{
|
||||
}
|
||||
|
||||
KreSQLiteDriver::KreSQLiteDriver(TQSQLiteDB *connection, TQObject *parent, const char *name)
|
||||
: TQSqlDriver(parent, name ? name : TQSQLITE_DRIVER_NAME)
|
||||
{
|
||||
db = connection;
|
||||
setOpen(true);
|
||||
setOpenError(false);
|
||||
}
|
||||
|
||||
|
||||
KreSQLiteDriver::~KreSQLiteDriver()
|
||||
{
|
||||
}
|
||||
|
||||
bool KreSQLiteDriver::hasFeature(DriverFeature f) const
|
||||
{
|
||||
switch (f) {
|
||||
case QuerySize:
|
||||
case Transactions:
|
||||
return true;
|
||||
// case BLOB:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
SQLite dbs have no user name, passwords, hosts or ports.
|
||||
just file names.
|
||||
*/
|
||||
bool KreSQLiteDriver::open(const TQString & file, const TQString &, const TQString &, const TQString &, int)
|
||||
{
|
||||
if (isOpen())
|
||||
close();
|
||||
|
||||
if (file.isEmpty())
|
||||
return false;
|
||||
|
||||
db = new TQSQLiteDB;
|
||||
if ( !db->open(TQFile::encodeName(file)) ) {
|
||||
setLastError(TQSqlError("Error to open database", 0, TQSqlError::Connection));
|
||||
setOpenError(true);
|
||||
setOpen(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
setOpen(true);
|
||||
setOpenError(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
void KreSQLiteDriver::close()
|
||||
{
|
||||
if (isOpen()) {
|
||||
db->close();
|
||||
delete db; db = 0;
|
||||
setOpen(false);
|
||||
setOpenError(false);
|
||||
}
|
||||
}
|
||||
|
||||
bool KreSQLiteDriver::ping()
|
||||
{
|
||||
if ( !isOpen() ) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// FIXME
|
||||
// Implement ping if available
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
TQSqlQuery KreSQLiteDriver::createQuery() const
|
||||
{
|
||||
return TQSqlQuery(new KreSQLiteResult(this));
|
||||
}
|
||||
|
||||
bool KreSQLiteDriver::beginTransaction()
|
||||
{
|
||||
if (!isOpen() || isOpenError())
|
||||
return false;
|
||||
|
||||
TQSQLiteResult result = db->executeQuery( "BEGIN" );
|
||||
int status = result.getStatus();
|
||||
if (status == TQSQLiteResult::Success)
|
||||
return true;
|
||||
|
||||
setLastError(TQSqlError("Unable to begin transaction", result.getError(), TQSqlError::Transaction, status));
|
||||
return false;
|
||||
}
|
||||
|
||||
bool KreSQLiteDriver::commitTransaction()
|
||||
{
|
||||
if (!isOpen() || isOpenError())
|
||||
return false;
|
||||
|
||||
TQSQLiteResult result = db->executeQuery( "COMMIT" );
|
||||
int status = result.getStatus();
|
||||
if (status == TQSQLiteResult::Success)
|
||||
return true;
|
||||
|
||||
setLastError(TQSqlError("Unable to commit transaction", result.getError(), TQSqlError::Transaction, status));
|
||||
return false;
|
||||
}
|
||||
|
||||
bool KreSQLiteDriver::rollbackTransaction()
|
||||
{
|
||||
if (!isOpen() || isOpenError())
|
||||
return false;
|
||||
|
||||
TQSQLiteResult result = db->executeQuery( "ROLLBACK" );
|
||||
int status = result.getStatus();
|
||||
if (status == SQLITE_OK)
|
||||
return true;
|
||||
|
||||
setLastError(TQSqlError("Unable to rollback transaction", result.getError(), TQSqlError::Transaction, status));
|
||||
return false;
|
||||
}
|
||||
|
||||
TQStringList KreSQLiteDriver::tables(const TQString &typeName) const
|
||||
{
|
||||
TQStringList res;
|
||||
if (!isOpen())
|
||||
return res;
|
||||
|
||||
int type = typeName.toInt();
|
||||
|
||||
TQSqlQuery q = createQuery();
|
||||
q.setForwardOnly(true);
|
||||
#if (TQT_VERSION-0 >= 0x030000)
|
||||
if ((type & (int)TQSql::Tables) && (type & (int)TQSql::Views))
|
||||
q.exec("SELECT name FROM sqlite_master WHERE type='table' OR type='view'");
|
||||
else if (typeName.isEmpty() || (type & (int)TQSql::Tables))
|
||||
q.exec("SELECT name FROM sqlite_master WHERE type='table'");
|
||||
else if (type & (int)TQSql::Views)
|
||||
q.exec("SELECT name FROM sqlite_master WHERE type='view'");
|
||||
#else
|
||||
q.exec("SELECT name FROM sqlite_master WHERE type='table' OR type='view'");
|
||||
#endif
|
||||
|
||||
if (q.isActive()) {
|
||||
while(q.next()) {
|
||||
res.append(q.value(0).toString());
|
||||
}
|
||||
}
|
||||
|
||||
#if (TQT_VERSION-0 >= 0x030000)
|
||||
if (type & (int)TQSql::SystemTables) {
|
||||
// there are no internal tables beside this one:
|
||||
res.append("sqlite_master");
|
||||
}
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
TQSqlIndex KreSQLiteDriver::primaryIndex(const TQString &tblname) const
|
||||
{
|
||||
TQSqlRecordInfo rec(recordInfo(tblname)); // expensive :(
|
||||
|
||||
if (!isOpen())
|
||||
return TQSqlIndex();
|
||||
|
||||
TQSqlQuery q = createQuery();
|
||||
q.setForwardOnly(true);
|
||||
// finrst find a UNIQUE INDEX
|
||||
q.exec("PRAGMA index_list('" + tblname + "');");
|
||||
TQString indexname;
|
||||
while(q.next()) {
|
||||
if (q.value(2).toInt()==1) {
|
||||
indexname = q.value(1).toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (indexname.isEmpty())
|
||||
return TQSqlIndex();
|
||||
|
||||
q.exec("PRAGMA index_info('" + indexname + "');");
|
||||
|
||||
TQSqlIndex index(tblname, indexname);
|
||||
while(q.next()) {
|
||||
TQString name = q.value(2).toString();
|
||||
TQSqlVariant::Type type = TQSqlVariant::Invalid;
|
||||
if (rec.contains(name))
|
||||
type = rec.find(name).type();
|
||||
index.append(TQSqlField(name, type));
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
#if 0
|
||||
TQSqlRecordInfo KreSQLiteDriver::recordInfo(const TQString &tbl) const
|
||||
{
|
||||
if (!isOpen())
|
||||
return TQSqlRecordInfo();
|
||||
|
||||
TQSqlQuery q = createQuery();
|
||||
q.setForwardOnly(true);
|
||||
q.exec("SELECT * FROM " + tbl + " LIMIT 1");
|
||||
return TQSqlRecordInfo();
|
||||
// return recordInfo(q);
|
||||
}
|
||||
|
||||
TQSqlRecord KreSQLiteDriver::record(const TQString &tblname) const
|
||||
{
|
||||
if (!isOpen())
|
||||
return TQSqlRecord();
|
||||
|
||||
return recordInfo(tblname).toRecord();
|
||||
}
|
||||
|
||||
TQSqlRecord KreSQLiteDriver::record(const TQSqlQuery& query) const
|
||||
{
|
||||
if (query.isActive() && query.driver() == this) {
|
||||
KreSQLiteResult* result = (KreSQLiteResult*)query.result();
|
||||
return result->rInf.toRecord();
|
||||
}
|
||||
return TQSqlRecord();
|
||||
}
|
||||
|
||||
TQSqlRecordInfo KreSQLiteDriver::recordInfo(const TQSqlQuery& query) const
|
||||
{
|
||||
if (query.isActive() && query.driver() == this) {
|
||||
KreSQLiteResult* result = (KreSQLiteResult*)query.result();
|
||||
return result->rInf;
|
||||
}
|
||||
return TQSqlRecordInfo();
|
||||
}
|
||||
|
||||
//this would be used below in formatValue()
|
||||
static TQString escape( const TQString &s )
|
||||
{
|
||||
TQString s_escaped = s;
|
||||
|
||||
if ( !s_escaped.isEmpty() ) { //###: sqlite_mprintf() seems to fill an empty string with garbage
|
||||
// Escape using SQLite's function
|
||||
#if HAVE_SQLITE
|
||||
char * escaped = sqlite_mprintf( "%q", s.latin1() ); // Escape the string(allocates memory)
|
||||
#elif HAVE_SQLITE3
|
||||
char * escaped = sqlite3_mprintf( "%q", s.latin1() ); // Escape the string(allocates memory)
|
||||
#endif
|
||||
s_escaped = escaped;
|
||||
#if HAVE_SQLITE
|
||||
sqlite_freemem( escaped ); // free allocated memory
|
||||
#elif HAVE_SQLITE3
|
||||
sqlite3_free( escaped ); // free allocated memory
|
||||
#endif
|
||||
}
|
||||
|
||||
return ( s_escaped );
|
||||
}
|
||||
|
||||
|
||||
// Everything is considered a string given the implementation of this driver (we don't have field info). This would ruin a TQByteArray (for the photo).
|
||||
TQString KreSQLiteDriver::formatValue( const TQSqlField* field, bool trimStrings ) const
|
||||
{
|
||||
TQString r;
|
||||
if ( field->isNull() ) {
|
||||
r = nullText();
|
||||
} else {
|
||||
switch( field->type() ) {
|
||||
case TQVariant::String:
|
||||
case TQVariant::CString: {
|
||||
// Escape '\' characters
|
||||
r = TQSqlDriver::formatValue( field );
|
||||
//r = escape(r);
|
||||
//kdDebug()<<"escaping sqlite string: "<<r<<endl;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
r = TQSqlDriver::formatValue( field, trimStrings );
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
|
@ -1,54 +0,0 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005 by *
|
||||
* Jason Kivlighn (jkivlighn@gmail.com) *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef TQSQL_SQLITE_H
|
||||
#define TQSQL_SQLITE_H
|
||||
|
||||
#include <ntqsqldriver.h>
|
||||
#include <ntqsqlresult.h>
|
||||
#include <ntqsqlrecord.h>
|
||||
#include <ntqsqlindex.h>
|
||||
|
||||
typedef TQVariant TQSqlVariant;
|
||||
|
||||
class TQSQLiteDB;
|
||||
|
||||
class KreSQLiteDriver : public TQSqlDriver
|
||||
{
|
||||
public:
|
||||
KreSQLiteDriver(TQObject * parent = 0, const char * name = 0);
|
||||
KreSQLiteDriver(TQSQLiteDB *connection, TQObject *parent = 0, const char *name = 0);
|
||||
~KreSQLiteDriver();
|
||||
|
||||
bool hasFeature( DriverFeature ) const;
|
||||
bool open( const TQString&,
|
||||
const TQString&,
|
||||
const TQString&,
|
||||
const TQString&,
|
||||
int );
|
||||
void close();
|
||||
bool ping();
|
||||
TQSqlQuery createQuery() const;
|
||||
|
||||
bool beginTransaction();
|
||||
bool commitTransaction();
|
||||
bool rollbackTransaction();
|
||||
TQStringList tables(const TQString &typeName) const;
|
||||
TQSqlIndex primaryIndex(const TQString &tblname) const;
|
||||
//TQSqlRecordInfo recordInfo(const TQString &tbl) const;
|
||||
//TQSqlRecord record(const TQString &tblname) const;
|
||||
//TQString formatValue( const TQSqlField* field, bool trimStrings ) const;
|
||||
|
||||
private:
|
||||
friend class KreSQLiteResult;
|
||||
|
||||
TQSQLiteDB *db;
|
||||
};
|
||||
#endif
|
Loading…
Reference in New Issue