summaryrefslogtreecommitdiff
path: root/libopie2/opiedb/osqlitedriver.cpp
blob: 99fd21886d4e39f4ee594da1cbee1b3dc33dd605 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <stdlib.h>

#include "osqlresult.h"
#include "osqlquery.h"
#include "osqlitedriver.h"

// fromLocal8Bit() does not work as expected. Thus it 
// is replaced by fromLatin1() (eilers)
#define __BUGGY_LOCAL8BIT_


namespace {
    struct Query {
        OSQLError::ValueList errors;
        OSQLResultItem::ValueList items;
        OSQLiteDriver *driver;
    };
}

OSQLiteDriver::OSQLiteDriver( QLibrary *lib )
    : OSQLDriver( lib )
{
    m_sqlite = 0l;
}
OSQLiteDriver::~OSQLiteDriver() {
    close();
}

QString OSQLiteDriver::id()const {
    return QString::fromLatin1("SQLite");
}

void OSQLiteDriver::setUserName( const QString& ) {}
void OSQLiteDriver::setPassword( const QString& ) {}

void OSQLiteDriver::setUrl( const QString& url ) {
    m_url = url;
}
void OSQLiteDriver::setOptions( const QStringList& ) {
}
/*
 * try to open a db specified via setUrl
 * and options
 */
bool OSQLiteDriver::open() {
    char *error;
    qWarning("about to open");
    m_sqlite = sqlite_open(m_url.local8Bit(),
                           0,
                           &error );

    /* failed to open */
    if (m_sqlite == 0l ) {
        // FIXME set the last error
        qWarning("error:%s",  error );
        free( error );
        return false;
    }
    return true;
}
/* close the db
 * sqlite closes them without
 * telling failure or success
 */
bool OSQLiteDriver::close() {
    if (m_sqlite )
        sqlite_close( m_sqlite ), m_sqlite=0l;

    return true;
}
/* Query */
OSQLResult OSQLiteDriver::query( OSQLQuery* qu) {
    if ( !m_sqlite ) {
        // FIXME set error code
        OSQLResult result( OSQLResult::Failure );
        return result;
    }
    Query query;
    query.driver = this;
    char *err;
    /* SQLITE_OK 0 if return code > 0 == failure */
    if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err)  > 0 ) {
        qWarning("Error while executing");
        free(err );
        // FixMe Errors
    }
    // qWarning("Item count is %d", query.items.count() );
    OSQLResult result(OSQLResult::Success,
                      query.items,
                      query.errors );
    return result;
}
OSQLTable::ValueList OSQLiteDriver::tables() const {

}
OSQLError OSQLiteDriver::lastError() {
    OSQLError error;
    return error;
};
/* handle a callback add the row to the global
 * OSQLResultItem
 */
int OSQLiteDriver::handleCallBack( int, char**, char** ) {
    return 0;
}
/* callback_handler add the values to the list*/
int OSQLiteDriver::call_back( void* voi, int argc,
                              char** argv, char** columns) {
    // qWarning("Callback with %d items", argc );
    Query* qu = (Query*)voi;

    //copy them over to a OSQLResultItem
    QMap<QString, QString> tableString;
    QMap<int, QString> tableInt;
    for (int i = 0; i < argc; i++ ) {
	//qWarning("%s|%s", columns[i], argv[i] );

#ifdef __BUGGY_LOCAL8BIT_
        tableInt.insert( i, QString::fromLatin1( argv[i] ) );
        tableString.insert( QString::fromLatin1( columns[i] ),
                            QString::fromLatin1( argv[i] ) );
#else
        tableInt.insert( i, QString::fromLocal8Bit( argv[i] ) );
        tableString.insert( QString::fromLocal8Bit( columns[i] ),
                            QString::fromLocal8Bit( argv[i] ) );
#endif
    }
    OSQLResultItem item( tableString, tableInt );
    qu->items.append( item );

    return ((Query*)voi)->driver->handleCallBack( argc,
                                                  argv,
                                                  columns );


}