-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfbSQL.cpp
More file actions
216 lines (174 loc) · 3.99 KB
/
fbSQL.cpp
File metadata and controls
216 lines (174 loc) · 3.99 KB
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/* $Id: fbSQL.cpp,v 1.18 2008/04/11 02:21:15 ctubbsii Exp $ */
#include "fbSQL.h"
/**
* fbSQL
* Thread safe wrapper for SQLite3
* @author Byron Heads
* @date March 14, 2008
* @note depends on libsqlite3-dev
*/
/**
* fbSQL
* constructor
* @param errlog Pointer to main error logger
*/
fbSQL::fbSQL(fbErrorLogger* log): errlog(log), cs(), qCS(), db(NULL), open(false), _rows(0), _cols(0)
{
errlog->debug(NONE, "fbSQL.this");
}
/**
* fbSQL
* constructor
* @param errlog Pointer to main error logger
*/
fbSQL::fbSQL(fbErrorLogger* log, sqlite3* database): errlog(log), cs(), qCS(), db(database), open(false), _rows(0), _cols(0)
{
errlog->debug(NONE, "fbSQL.this");
}
/**
* fbSQL
* constructor
* @param errlog Pointer to main error logger
*/
fbSQL::fbSQL(fbSQL& sql): errlog(sql.errlog), cs(), qCS(), db(sql.db), open(false), _rows(0), _cols(0)
{
errlog->debug(NONE, "fbSQL.this");
}
/// Destructor
fbSQL::~fbSQL()
{
errlog->debug(NONE, "fbSQL.~this");
close();
}
/**
* connect
* connects to a database file
* @param database File to open
*/
void fbSQL::connect(const char* database)
{
errlog->debug(NONE, "fbSQL.connect");
errlog->debug(NONE, database);
// lock for thread safety
fbLock lock(cs);
//error string
string err = "File: ";
// if not open already
if(!open)
{
// try to open
int ret = sqlite3_open(database, &db);
if(ret)
{ //open failed report error
err = database;
errlog->err(FAILEDTOOPENDB, err);
return;
}
}
//were open, mark it
open = true;
//force table creation
//string cmd = "CREATE TABLE backup (ID INTEGER PRIMARY KEY, desc TEXT, date INTEGER, time INTEGER, repeatmode INTEGER, repeatval INTEGER, disk TEXT);";
//exe(cmd);
//cmd = "CREATE TABLE restore(ID INTEGER PRIMARY KEY, tarfile TEXT, path TEXT);";
//exe(cmd);
}
/**
* connect
* connect database, string overload
* @param database String
*/
void fbSQL::connect(string database)
{
connect(database.c_str());
}
/**
* close
* close connection to database
*/
void fbSQL::close()
{
fbLock lock(cs);
if(open)
sqlite3_close(db);
open = false;
}
/**
* isConnected
* test if were connected to a database
* @return True if connect passed
*/
bool fbSQL::isConnected()
{
return open;
}
/**
* exe
* exectues an command on the database
* @param command SQL command to send to DB
*/
int fbSQL::exe(string& cmd)
{
int ret = 0;
char* errmsg;
// lock so two commands can't be sent at once
fbLock lock(cs);
// send command
errlog->debug(NONE, cmd);
ret = sqlite3_exec(db, cmd.c_str(), NULL, 0 , &errmsg);
// test if okay
if(ret != SQLITE_OK)
{
errlog->warn(SQLEXECERROR, "fbSQL: sqlite3 error code: %s", errmsg);
sqlite3_free(errmsg);
}
//done, after return
return ret;
}
void fbSQL::queryDone()
{
qCS.unlock();
errlog->debug(NONE, "fbSQL: Query Unlocked");
}
int fbSQL::query(string& cmd)
{
int ret = 0;
char* errmsg;
char** result;
if(db == NULL)
{
errlog->warn(FAILEDTOOPENDB, "fbSQL: Query on non-opened database");
return -1;
}
// lock so two commands can't be sent at once
fbLock lock(cs);
errlog->debug(NONE, "fbSQL: Query Locked");
qCS.lock(); /// < lock query
// send command
//ret = sqlite3_exec(db, command, callback, 0 , &errmsg);
ret = sqlite3_get_table(db, cmd.c_str(), &result, &_rows, &_cols, &errmsg);
// test if okay
if(ret != SQLITE_OK)
{ //error, report warning
errlog->warn(SQLEXECERROR, "fbSQL: sqlite3 error code: %s", errmsg);
sqlite3_free(errmsg);
return ret;
}
errlog->debug(NONE, "fbSQL: found %d rows with %d cols", _rows, _cols);
//clear vectors
if(col_header.size() != 0) col_header.clear();
if(table.size() != 0) table.clear();
//save header information
for(int i = 0; i < _cols; ++i)
col_header.push_back(result[i]);
//save data
for(int i = 0; i < _cols*_rows; ++i)
if(result[_cols+i] != NULL)
table.push_back(result[_cols+i]);
else
table.push_back("");
errlog->debug(NONE, "fbSQL: Filled Table data: %d", (int)table.size());
sqlite3_free_table(result);
errlog->debug(NONE, "fbSQL: Query OK");
return ret;
}