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