version 0.1.11
[fms.git] / src / db / sqlite3db.cpp
1 #include "../../include/db/sqlite3db.h"\r
2 \r
3 #ifdef XMEM\r
4         #include <xmem.h>\r
5 #endif\r
6 \r
7 namespace SQLite3DB\r
8 {\r
9 \r
10 DB::DB()\r
11 {\r
12         Initialize();\r
13 }\r
14 \r
15 DB::DB(std::string filename)\r
16 {\r
17         Initialize();\r
18         Open(filename);\r
19 }\r
20 \r
21 DB::~DB()\r
22 {\r
23         if(IsOpen())\r
24         {\r
25                 Close();        \r
26         }\r
27 }\r
28 \r
29 const bool DB::Close()\r
30 {\r
31         if(IsOpen())\r
32         {\r
33                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
34                 PThread::Guard g(m_mutex);\r
35                 m_lastresult=sqlite3_close(m_db);\r
36                 if(m_lastresult==SQLITE_OK)\r
37                 {\r
38                         m_db=NULL;\r
39                         return true;\r
40                 }\r
41                 else\r
42                 {\r
43                         return false;   \r
44                 }\r
45         }\r
46         else\r
47         {\r
48                 return false;   \r
49         }\r
50 }\r
51 \r
52 const bool DB::Execute(const std::string &sql)\r
53 {\r
54         if(IsOpen())\r
55         {\r
56                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
57                 PThread::Guard g(m_mutex);\r
58                 m_lastresult=sqlite3_exec(m_db,sql.c_str(),NULL,NULL,NULL);\r
59                 if(m_lastresult==SQLITE_OK)\r
60                 {\r
61                         return true;\r
62                 }\r
63                 else\r
64                 {\r
65                         return false;   \r
66                 }\r
67         }\r
68         else\r
69         {\r
70                 return false;\r
71         }\r
72 }\r
73 \r
74 const bool DB::ExecuteInsert(const std::string &sql, long &insertid)\r
75 {\r
76         if(IsOpen())\r
77         {\r
78                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
79                 PThread::Guard g(m_mutex);\r
80                 m_lastresult=sqlite3_exec(m_db,sql.c_str(),NULL,NULL,NULL);\r
81                 if(m_lastresult==SQLITE_OK)\r
82                 {\r
83                         insertid=sqlite3_last_insert_rowid(m_db);\r
84                         return true;\r
85                 }\r
86                 else\r
87                 {\r
88                         return false;   \r
89                 }\r
90         }\r
91         else\r
92         {\r
93                 return false;\r
94         }\r
95 }\r
96 \r
97 const int DB::GetLastError(std::string &errormessage)\r
98 {\r
99         if(IsOpen())\r
100         {\r
101                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
102                 PThread::Guard g(m_mutex);\r
103                 int errcode=sqlite3_errcode(m_db);\r
104                 const char *errmsg=sqlite3_errmsg(m_db);\r
105                 if(errmsg)\r
106                 {\r
107                         errormessage=errmsg;\r
108                 }\r
109                 return errcode;\r
110         }\r
111         else\r
112         {\r
113                 return SQLITE_OK;       \r
114         }\r
115 }\r
116 \r
117 void DB::Initialize()\r
118 {\r
119         m_db=NULL;\r
120         m_lastresult=SQLITE_OK;\r
121 }\r
122 \r
123 const bool DB::IsOpen()\r
124 {\r
125         //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
126         PThread::Guard g(m_mutex);\r
127         return m_db ? true : false; \r
128 }\r
129 \r
130 const bool DB::Open(const std::string &filename)\r
131 {\r
132         if(IsOpen()==true)\r
133         {\r
134                 Close();        \r
135         }\r
136         if(IsOpen()==false)\r
137         {\r
138                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
139                 PThread::Guard g(m_mutex);\r
140                 m_lastresult=sqlite3_open(filename.c_str(),&m_db);\r
141                 if(m_lastresult==SQLITE_OK)\r
142                 {\r
143                         return true;\r
144                 }\r
145                 else\r
146                 {\r
147                         return false;   \r
148                 }\r
149         }\r
150         else\r
151         {\r
152                 return false;   \r
153         }\r
154 }\r
155 \r
156 Statement DB::Prepare(const std::string &sql)\r
157 {\r
158         if(IsOpen())\r
159         {\r
160                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
161                 PThread::Guard g(m_mutex);\r
162                 sqlite3_stmt *statement=NULL;\r
163                 m_lastresult=sqlite3_prepare_v2(m_db,sql.c_str(),sql.size(),&statement,NULL);\r
164                 if(m_lastresult==SQLITE_OK)\r
165                 {\r
166                         return Statement(statement);\r
167                 }\r
168                 else\r
169                 {\r
170                         return Statement();\r
171                 }\r
172         }\r
173         else\r
174         {\r
175                 return Statement();\r
176         }\r
177 }\r
178 \r
179 Recordset DB::Query(const std::string &sql)\r
180 {\r
181         if(IsOpen())\r
182         {\r
183                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
184                 PThread::Guard g(m_mutex);\r
185                 char **rs=NULL;\r
186                 int rows,cols;\r
187                 m_lastresult=sqlite3_get_table(m_db,sql.c_str(),&rs,&rows,&cols,NULL);\r
188                 if(m_lastresult==SQLITE_OK)\r
189                 {\r
190                         return Recordset(rs,rows,cols);\r
191                 }\r
192                 else\r
193                 {\r
194                         sqlite3_free_table(rs);\r
195                         return Recordset();\r
196                 }\r
197         }\r
198         else\r
199         {\r
200                 return Recordset();\r
201         }\r
202 }\r
203 \r
204 const int DB::SetBusyTimeout(const int ms)\r
205 {\r
206         if(IsOpen())\r
207         {\r
208                 //ZThread::Guard<ZThread::Mutex> g(m_mutex);\r
209                 PThread::Guard g(m_mutex);\r
210                 m_lastresult=sqlite3_busy_timeout(m_db,ms);\r
211                 return m_lastresult;\r
212         }\r
213         else\r
214         {\r
215                 return SQLITE_ERROR;\r
216         }\r
217 }\r
218 \r
219 }       // namespace\r