summaryrefslogtreecommitdiffabout
path: root/src/sqlite.h
blob: ad276ee4ebcb1bdfcb32aac305258d6daf03d582 (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
#ifndef __SQLITE_H
#define __SQLITE_H

#include <cassert>
#include <stdexcept>
#include <string>
#include <sqlite3.h>

namespace sqlite {
    using std::string;

    class exception : public std::runtime_error {
	public:
	    int rcode;
	    explicit exception(const string& w,int rc=-1)
		: std::runtime_error(w), rcode(rc) { }
	    ~exception() throw() { }
    };

    class db_t {
	public:
	    sqlite3 *_D;

	    db_t()
		: _D(0) { }
	    db_t(const char *f)
		: _D(0) { open(f); }
	    ~db_t() { close(); }

	    operator const sqlite3*(void) const { return _D; }
	    operator sqlite3*(void) { return _D; }

	    void close() {
		if(_D) {
		    sqlite3_close(_D);
		    _D = 0;
		}
	    }
	    void open(const char *f) {
		close();
		int r = sqlite3_open(f,&_D);
		if(r!=SQLITE_OK) {
		    string msg = sqlite3_errmsg(_D); sqlite3_close(_D);
		    throw exception("Failed to open SQLite database: "+msg,r);
		}
	    }

	    void exec(const char *sql) {
		assert(_D);
		char *errm;
		int r = sqlite3_exec(_D,sql,NULL,NULL,&errm);
		if(r!=SQLITE_OK)
		    throw exception(string("Failed to sqlite3_exec():")+errm,r);
	    }
	    void get_table(const char *sql,char ***resp,int *nr,int *nc) {
		assert(_D);
		char *errm;
		int r = sqlite3_get_table(_D,sql,resp,nr,nc,&errm);
		if(r!=SQLITE_OK)
		    throw exception(string("Failed to sqlite3_get_table():")+errm,r);
	    }
    };

    template<typename T>
    class mem_t {
	public:
	    T _M;

	    mem_t(T M) :_M(M) { }
	    ~mem_t() { if(_M) sqlite3_free(_M); }

	    operator const T&(void) const { return _M; }
	    operator T&(void) { return _M; }

	    mem_t operator=(T M) {
		if(_M) sqlite3_free(_M);
		_M = M;
	    }
    };

    class table_t {
	public:
	    char **_T;

	    table_t() : _T(0) { }
	    table_t(char **T) : _T(T) { }
	    ~table_t() { if(_T) sqlite3_free_table(_T); }

	    operator char**&(void) { return _T; }

	    operator char ***(void) {
		if(_T) sqlite3_free_table(_T);
		return &_T; }

	    const char *get(int r,int c,int nc) {
		assert(_T);
		return _T[r*nc+c];
	    }
    };

}

#endif /* __SQLITE_H */