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