File: sqlite_inter.cc

package info (click to toggle)
kaya 0.2.0-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 3,012 kB
  • ctags: 1,307
  • sloc: cpp: 6,691; haskell: 4,833; sh: 2,868; yacc: 768; makefile: 700; perl: 87
file content (140 lines) | stat: -rw-r--r-- 3,025 bytes parent folder | download
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
137
138
139
140
#include "sqlite_inter.h"

void* sqlite_connect(wchar_t* info)
{
    sqlite3* db;
    int rc = sqlite3_open(wctostr(info), &db);
    SQLiteConnection* con = new SQLiteConnection();
    con->db = db;
    con->ok = (rc==0);
    return (void*)con;
}

int sqlite_ok(void* con)
{
    return ((SQLiteConnection*)con)->ok;
}

wchar_t* sqlite_getError(void* con)
{
    sqlite3* db = ((SQLiteConnection*)con)->db;
    return strtowc(sqlite3_errmsg(db));
}

void sqlite_close(void* con)
{
    sqlite3* db = ((SQLiteConnection*)con)->db;
    sqlite3_close(db);
}

void sqlite_buildRow(sqlite3_stmt* stmt, SQLiteResult* sqlr)
{
    int cols = sqlite3_column_count(stmt);
    int getnames = 0;
    if (KayaArraySize(sqlr->col_names)==0) {
	getnames = 1;
    }

    KValue entry;
    int intval;
    double dblval;
    const char* txt;

    KArray row = newKayaArray(cols);
    sqlr->cols = cols;

    for(int x = 0; x<cols; ++x) {
	switch(sqlite3_column_type(stmt, x)) {
	case SQLITE_INTEGER:
	    intval = sqlite3_column_int(stmt,x);
	    entry = KayaUnion(1,1);
	    KayaUnionSetArg(entry, 0, KayaInt(intval));
	    KayaArrayPush(row, entry);
	    break;
	case SQLITE_FLOAT:
	    dblval = sqlite3_column_double(stmt,x);
	    entry = KayaUnion(2,1);
	    KayaUnionSetArg(entry, 0, KayaFloat(dblval));
	    KayaArrayPush(row, entry);
	    break;
	default:
	    txt = (const char*)(sqlite3_column_text(stmt, x));
	    entry = KayaUnion(0,1);
	    KayaUnionSetArg(entry, 0, KayaString(KSTRING(txt)));
	    KayaArrayPush(row, entry);
	}
	if (getnames==1) {
	    txt = (sqlite3_column_name(stmt, x));
	    KayaArrayPush(sqlr->col_names, KayaString(KSTRING(txt)));
	}
    }
    KayaArrayPush(sqlr->res_table, KayaArrayVal(row));
}

void* sqlite_exec(void* con, wchar_t* query)
{
    // result array had better be empty here!

    sqlite3_stmt* stmt; // statement handle
    const char* tail; // unused, from sqlite3_prepare

    sqlite3* db = ((SQLiteConnection*)con)->db;
    SQLiteResult* result = new SQLiteResult();
    result->res = 0;
    result->res_table = newKayaArray(0);
    result->col_names = newKayaArray(0);
    result->rows = 0;
    result->cols = 0;

    int rc = sqlite3_prepare(db, wctostr(query), -1, &stmt, &tail);
    if (rc!=0) {
	result->res = 2;
	return result;
    }

    int res;
    do {
	res = sqlite3_step(stmt);
	switch(res) {
	case SQLITE_BUSY: 
	    result->res = 1;
	    break;
	case SQLITE_ERROR:
	    result->res = 2;
	    break;
	case SQLITE_ROW:
	    result->rows++;
	    sqlite_buildRow(stmt, result);
	case SQLITE_DONE:
	    break;
	default:
	    result->res = 3;
	}
    } while (res!=SQLITE_DONE);
    return (void*)result;
}

KArray sql_getcolnames(void* res)
{
    return ((SQLiteResult*)res)->col_names;
}

KArray sql_getrestable(void* res)
{
    return ((SQLiteResult*)res)->res_table;
}

int sql_numrows(void* res)
{
    return ((SQLiteResult*)res)->rows;
}

int sql_numcols(void* res)
{
    return ((SQLiteResult*)res)->cols;
}

int sql_resrc(void* res)
{
    return ((SQLiteResult*)res)->res;
}