Gavan Fantom
16 years ago
2 changed files with 104 additions and 0 deletions
@ -0,0 +1,99 @@ |
|||||||
|
/* sql.c */ |
||||||
|
|
||||||
|
#include <fcntl.h> |
||||||
|
#include <unistd.h> |
||||||
|
#include <err.h> |
||||||
|
#include <errno.h> |
||||||
|
#include <stdio.h> |
||||||
|
#include "sqlite3.h" |
||||||
|
#include "vm.h" |
||||||
|
|
||||||
|
sqlite3 *sql_db; |
||||||
|
int sql_initialised = 0; |
||||||
|
|
||||||
|
#define SQL_FILENAME ".lsdata" |
||||||
|
|
||||||
|
void sql_error(char *msg) |
||||||
|
{ |
||||||
|
fprintf(stderr, "sql error: %s: %s\n", msg, sqlite3_errmsg(sql_db)); |
||||||
|
} |
||||||
|
|
||||||
|
int sql_init(void) |
||||||
|
{ |
||||||
|
if (sqlite3_open(SQL_FILENAME, &sql_db) != SQLITE_OK) { |
||||||
|
sql_error("can't open sql database"); |
||||||
|
sql_initialised = 0; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
sql_initialised = 1; |
||||||
|
|
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
void sql_close(void) |
||||||
|
{ |
||||||
|
sqlite3_close(sql_db); |
||||||
|
/*
|
||||||
|
* XXX technically, this could return SQLITE_BUSY, which we ought |
||||||
|
* to deal with |
||||||
|
*/ |
||||||
|
sql_initialised = 0; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
* We return 0 for failure, 1 for query with no rows, 2 for query with |
||||||
|
* a valid return value. |
||||||
|
*/ |
||||||
|
int sql_query(char *query, int qlen, int *result) |
||||||
|
{ |
||||||
|
sqlite3_stmt *stmt; |
||||||
|
const char *ztail; |
||||||
|
int done; |
||||||
|
int rows; |
||||||
|
|
||||||
|
if (!sql_initialised) |
||||||
|
return 0; |
||||||
|
|
||||||
|
*result = 0; |
||||||
|
done = 0; |
||||||
|
rows = 0; |
||||||
|
|
||||||
|
if (sqlite3_prepare_v2(sql_db, query, qlen, &stmt, &ztail) |
||||||
|
!= SQLITE_OK) { |
||||||
|
sql_error("error from sqlite3_prepare"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
while (1) { |
||||||
|
int rv = sqlite3_step(stmt); |
||||||
|
|
||||||
|
if (rv == SQLITE_DONE) { |
||||||
|
done = 1; |
||||||
|
break; |
||||||
|
} |
||||||
|
if (rv == SQLITE_ROW) { |
||||||
|
/* XXX we just deal with one return value for now */ |
||||||
|
*result = sqlite3_column_int(stmt, 0); |
||||||
|
rows++; |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (rv == SQLITE_OK) |
||||||
|
continue; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
if (!done) { |
||||||
|
sql_error("error after sqlite3_step"); |
||||||
|
} |
||||||
|
if (sqlite3_finalize(stmt) != SQLITE_OK) { |
||||||
|
sql_error("error from sqlite3_finalize"); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
if (done) |
||||||
|
return (rows ? 2 : 1); |
||||||
|
|
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue