f8bb003114ce4905e38d07abb091465e9772ed46
[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(const 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                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
34                 m_lastresult=sqlite3_close(m_db);\r
35                 if(m_lastresult==SQLITE_OK)\r
36                 {\r
37                         m_db=NULL;\r
38                         return true;\r
39                 }\r
40                 else\r
41                 {\r
42                         return false;\r
43                 }\r
44         }\r
45         else\r
46         {\r
47                 return false;\r
48         }\r
49 }\r
50 \r
51 const bool DB::Execute(const std::string &sql)\r
52 {\r
53         if(IsOpen())\r
54         {\r
55                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
56                 m_lastresult=sqlite3_exec(m_db,sql.c_str(),NULL,NULL,NULL);\r
57                 if(m_lastresult==SQLITE_OK)\r
58                 {\r
59                         return true;\r
60                 }\r
61                 else\r
62                 {\r
63                         return false;\r
64                 }\r
65         }\r
66         else\r
67         {\r
68                 return false;\r
69         }\r
70 }\r
71 \r
72 const bool DB::ExecuteInsert(const std::string &sql, long &insertid)\r
73 {\r
74         if(IsOpen())\r
75         {\r
76                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
77                 m_lastresult=sqlite3_exec(m_db,sql.c_str(),NULL,NULL,NULL);\r
78                 if(m_lastresult==SQLITE_OK)\r
79                 {\r
80                         insertid=sqlite3_last_insert_rowid(m_db);\r
81                         return true;\r
82                 }\r
83                 else\r
84                 {\r
85                         return false;\r
86                 }\r
87         }\r
88         else\r
89         {\r
90                 return false;\r
91         }\r
92 }\r
93 \r
94 const int DB::GetLastError(std::string &errormessage)\r
95 {\r
96         if(IsOpen())\r
97         {\r
98                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
99                 int errcode=sqlite3_errcode(m_db);\r
100                 const char *errmsg=sqlite3_errmsg(m_db);\r
101                 if(errmsg)\r
102                 {\r
103                         errormessage=errmsg;\r
104                 }\r
105                 return errcode;\r
106         }\r
107         else\r
108         {\r
109                 return SQLITE_OK;\r
110         }\r
111 }\r
112 \r
113 void DB::Initialize()\r
114 {\r
115         m_db=NULL;\r
116         m_lastresult=SQLITE_OK;\r
117 }\r
118 \r
119 const bool DB::IsOpen()\r
120 {\r
121         Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
122         return m_db ? true : false;\r
123 }\r
124 \r
125 const bool DB::Open(const std::string &filename)\r
126 {\r
127         if(IsOpen()==true)\r
128         {\r
129                 Close();        \r
130         }\r
131         if(IsOpen()==false)\r
132         {\r
133                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
134                 m_lastresult=sqlite3_open(filename.c_str(),&m_db);\r
135                 if(m_lastresult==SQLITE_OK)\r
136                 {\r
137                         return true;\r
138                 }\r
139                 else\r
140                 {\r
141                         return false;\r
142                 }\r
143         }\r
144         else\r
145         {\r
146                 return false;\r
147         }\r
148 }\r
149 \r
150 Statement DB::Prepare(const std::string &sql)\r
151 {\r
152         if(IsOpen())\r
153         {\r
154                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
155                 sqlite3_stmt *statement=NULL;\r
156                 m_lastresult=sqlite3_prepare_v2(m_db,sql.c_str(),sql.size(),&statement,NULL);\r
157                 if(m_lastresult==SQLITE_OK)\r
158                 {\r
159                         return Statement(statement);\r
160                 }\r
161                 else\r
162                 {\r
163                         return Statement();\r
164                 }\r
165         }\r
166         else\r
167         {\r
168                 return Statement();\r
169         }\r
170 }\r
171 \r
172 Recordset DB::Query(const std::string &sql)\r
173 {\r
174         if(IsOpen())\r
175         {\r
176                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
177                 char **rs=NULL;\r
178                 int rows,cols;\r
179                 m_lastresult=sqlite3_get_table(m_db,sql.c_str(),&rs,&rows,&cols,NULL);\r
180                 if(m_lastresult==SQLITE_OK)\r
181                 {\r
182                         return Recordset(rs,rows,cols);\r
183                 }\r
184                 else\r
185                 {\r
186                         sqlite3_free_table(rs);\r
187                         return Recordset();\r
188                 }\r
189         }\r
190         else\r
191         {\r
192                 return Recordset();\r
193         }\r
194 }\r
195 \r
196 const int DB::SetBusyTimeout(const int ms)\r
197 {\r
198         if(IsOpen())\r
199         {\r
200                 Poco::ScopedLock<Poco::FastMutex> g(m_mutex);\r
201                 m_lastresult=sqlite3_busy_timeout(m_db,ms);\r
202                 return m_lastresult;\r
203         }\r
204         else\r
205         {\r
206                 return SQLITE_ERROR;\r
207         }\r
208 }\r
209 \r
210 }       // namespace\r