|
dvander@666
|
1 |
/** |
|
dvander@666
|
2 |
* vim: set ts=4 : |
|
dvander@666
|
3 |
* =============================================================== |
|
dvander@666
|
4 |
* SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. |
|
dvander@666
|
5 |
* All rights reserved. |
|
dvander@666
|
6 |
* =============================================================== |
|
dvander@666
|
7 |
* |
|
dvander@666
|
8 |
* This file is part of the SourceMod/SourcePawn SDK. This file may only be |
|
dvander@666
|
9 |
* used or modified under the Terms and Conditions of its License Agreement, |
|
dvander@666
|
10 |
* which is found in public/licenses/LICENSE.txt. As of this notice, derivative |
|
dvander@666
|
11 |
* works must be licensed under the GNU General Public License (version 2 or |
|
dvander@666
|
12 |
* greater). A copy of the GPL is included under public/licenses/GPL.txt. |
|
dvander@666
|
13 |
* |
|
dvander@666
|
14 |
* To view the latest information, see: http://www.sourcemod.net/license.php |
|
dvander@666
|
15 |
* |
|
dvander@666
|
16 |
* Version: $Id$ |
|
dvander@666
|
17 |
*/ |
|
dvander@666
|
18 |
|
|
dvander@666
|
19 |
#ifndef _INCLUDE_SOURCEMOD_INTERFACE_DBDRIVER_H_ |
|
dvander@666
|
20 |
#define _INCLUDE_SOURCEMOD_INTERFACE_DBDRIVER_H_ |
|
dvander@666
|
21 |
|
|
dvander@666
|
22 |
#include <IShareSys.h> |
|
dvander@858
|
23 |
#include <IHandleSys.h> |
|
dvander@666
|
24 |
#include <string.h> |
|
dvander@666
|
25 |
|
|
dvander@666
|
26 |
#define SMINTERFACE_DBI_NAME "IDBI" |
|
dvander@1095
|
27 |
#define SMINTERFACE_DBI_VERSION 4 |
|
dvander@666
|
28 |
|
|
dvander@666
|
29 |
namespace SourceMod |
|
dvander@666
|
30 |
{ |
|
dvander@666
|
31 |
/** |
|
dvander@666
|
32 |
* @brief Describes a database field value. |
|
dvander@666
|
33 |
*/ |
|
dvander@666
|
34 |
enum DBResult |
|
dvander@666
|
35 |
{ |
|
dvander@666
|
36 |
DBVal_Error = 0, /**< Column number/field is invalid */ |
|
dvander@666
|
37 |
DBVal_TypeMismatch = 1, /**< You cannot retrieve this data with this type */ |
|
dvander@666
|
38 |
DBVal_Null = 2, /**< Field has no data (NULL) */ |
|
dvander@666
|
39 |
DBVal_Data = 3, /**< Field has data */ |
|
dvander@666
|
40 |
}; |
|
dvander@666
|
41 |
|
|
dvander@666
|
42 |
/** |
|
dvander@858
|
43 |
* @brief Describes a primitive database type. |
|
dvander@858
|
44 |
*/ |
|
dvander@858
|
45 |
enum DBType |
|
dvander@858
|
46 |
{ |
|
dvander@858
|
47 |
DBType_Unknown = 0, /**< Type could not be inferred */ |
|
dvander@858
|
48 |
DBType_String, /**< NULL-terminated string (variable length) */ |
|
dvander@858
|
49 |
DBType_Blob, /**< Raw binary data (variable length) */ |
|
dvander@858
|
50 |
DBType_Integer, /**< 4-byte signed integer */ |
|
dvander@858
|
51 |
DBType_Float, /**< 4-byte floating point */ |
|
dvander@858
|
52 |
}; |
|
dvander@858
|
53 |
|
|
dvander@858
|
54 |
/** |
|
dvander@666
|
55 |
* @brief Represents a one database result row. |
|
dvander@858
|
56 |
* |
|
dvander@858
|
57 |
* Note that type mismatches will only occur when type safety is being |
|
dvander@858
|
58 |
* enforced. So far this is only the case for prepared statements in |
|
dvander@858
|
59 |
* MySQL and SQLite. |
|
dvander@858
|
60 |
* |
|
dvander@858
|
61 |
* Also, it is worth noting that retrieving as raw data will never cause a |
|
dvander@858
|
62 |
* type mismatch. |
|
dvander@666
|
63 |
*/ |
|
dvander@666
|
64 |
class IResultRow |
|
dvander@666
|
65 |
{ |
|
dvander@666
|
66 |
public: |
|
dvander@666
|
67 |
/** |
|
dvander@666
|
68 |
* @brief Retrieves a database field result as a string. |
|
dvander@666
|
69 |
* |
|
dvander@858
|
70 |
* For NULL values, the resulting string pointer will be non-NULL but |
|
dvander@858
|
71 |
* empty. The pointer returned will become invalid after advancing to |
|
dvander@858
|
72 |
* the next row. |
|
dvander@666
|
73 |
* |
|
dvander@666
|
74 |
* @param columnId Column to use, starting from 0. |
|
dvander@666
|
75 |
* @param pString Pointer to store a pointer to the string. |
|
dvander@858
|
76 |
* @param length Optional pointer to store the string length. |
|
dvander@666
|
77 |
* @return A DBResult return code. |
|
dvander@666
|
78 |
*/ |
|
dvander@858
|
79 |
virtual DBResult GetString(unsigned int columnId, const char **pString, size_t *length) =0; |
|
dvander@858
|
80 |
|
|
dvander@858
|
81 |
/** |
|
dvander@858
|
82 |
* @brief Retrieves a database field result as a string, using a |
|
dvander@858
|
83 |
* user-supplied buffer. If the field is NULL, an empty string |
|
dvander@858
|
84 |
* will be copied. |
|
dvander@858
|
85 |
* |
|
dvander@858
|
86 |
* @param columnId Column to use, starting from 0. |
|
dvander@858
|
87 |
* @param buffer Buffer to store string in. |
|
dvander@858
|
88 |
* @param maxlength Maximum length of the buffer. |
|
dvander@858
|
89 |
* @param written Optional pointer to store the number of bytes |
|
dvander@858
|
90 |
* written, excluding the null terminator. |
|
dvander@858
|
91 |
* @return A DBResult return code. |
|
dvander@858
|
92 |
*/ |
|
dvander@858
|
93 |
virtual DBResult CopyString(unsigned int columnId, |
|
dvander@858
|
94 |
char *buffer, |
|
dvander@858
|
95 |
size_t maxlength, |
|
dvander@858
|
96 |
size_t *written) =0; |
|
dvander@666
|
97 |
|
|
dvander@666
|
98 |
/** |
|
dvander@666
|
99 |
* @brief Retrieves a database field result as a float. |
|
dvander@666
|
100 |
* |
|
dvander@666
|
101 |
* For NULL entries, the returned float value will be 0.0. |
|
dvander@666
|
102 |
* |
|
dvander@666
|
103 |
* @param columnId Column to use, starting from 0. |
|
dvander@666
|
104 |
* @param pFloat Pointer to a floating point number to set. |
|
dvander@666
|
105 |
* @return A DBResult return code. |
|
dvander@666
|
106 |
*/ |
|
dvander@666
|
107 |
virtual DBResult GetFloat(unsigned int columnId, float *pFloat) =0; |
|
dvander@666
|
108 |
|
|
dvander@666
|
109 |
/** |
|
dvander@666
|
110 |
* @brief Retrieves a database field result as an integer. |
|
dvander@666
|
111 |
* |
|
dvander@666
|
112 |
* For NULL entries, the returned integer value will be 0. |
|
dvander@666
|
113 |
* |
|
dvander@666
|
114 |
* @param columnId Column to use, starting from 0. |
|
dvander@666
|
115 |
* @param pInt Pointer to an integer number to set. |
|
dvander@666
|
116 |
* @return A DBResult return code. |
|
dvander@666
|
117 |
*/ |
|
dvander@666
|
118 |
virtual DBResult GetInt(unsigned int columnId, int *pInt) =0; |
|
dvander@666
|
119 |
|
|
dvander@666
|
120 |
/** |
|
dvander@666
|
121 |
* @brief Returns whether or not a field is NULL. |
|
dvander@666
|
122 |
* |
|
dvander@666
|
123 |
* @param columnId Column to use, starting from 0. |
|
dvander@858
|
124 |
* @return True if field is NULL, false otherwise. |
|
dvander@666
|
125 |
*/ |
|
dvander@858
|
126 |
virtual bool IsNull(unsigned int columnId) =0; |
|
dvander@666
|
127 |
|
|
dvander@666
|
128 |
/** |
|
dvander@858
|
129 |
* @brief Returns the size of a field (text/raw/blob) in bytes. |
|
dvander@858
|
130 |
* For strings, this returned size will not include the null |
|
dvander@858
|
131 |
* terminator. |
|
dvander@858
|
132 |
* |
|
dvander@858
|
133 |
* When used on fields that are not of variable length, |
|
dvander@858
|
134 |
* the size returned will be the number of bytes required |
|
dvander@858
|
135 |
* to store the internal data. Note that the data size |
|
dvander@858
|
136 |
* will correspond to the ACTUAL data type, not the |
|
dvander@858
|
137 |
* COLUMN type. |
|
dvander@666
|
138 |
* |
|
dvander@666
|
139 |
* @param columnId Column to use, starting from 0. |
|
dvander@858
|
140 |
* @return Number of bytes required to store |
|
dvander@858
|
141 |
* the data, or 0 on failure. |
|
dvander@858
|
142 |
*/ |
|
dvander@858
|
143 |
virtual size_t GetDataSize(unsigned int columnId) =0; |
|
dvander@858
|
144 |
|
|
dvander@858
|
145 |
/** |
|
dvander@858
|
146 |
* @brief Retrieves field data as a raw bitstream. The pointer returned |
|
dvander@858
|
147 |
* will become invalid after advancing to the next row. |
|
dvander@858
|
148 |
* |
|
dvander@858
|
149 |
* @param columnId Column to use, starting from 0. |
|
dvander@858
|
150 |
* @param pData Pointer to store the raw bit stream. If the |
|
dvander@858
|
151 |
* data is NULL, a NULL pointer will be returned. |
|
dvander@666
|
152 |
* @param length Pointer to store the data length. |
|
dvander@666
|
153 |
* @return A DBResult return code. |
|
dvander@666
|
154 |
*/ |
|
dvander@858
|
155 |
virtual DBResult GetBlob(unsigned int columnId, const void **pData, size_t *length) =0; |
|
dvander@858
|
156 |
|
|
dvander@858
|
157 |
/** |
|
dvander@858
|
158 |
* @brief Copies field data as a raw bitstream. |
|
dvander@858
|
159 |
* |
|
dvander@858
|
160 |
* @param columnId Column to use, starting from 0. |
|
dvander@858
|
161 |
* @param buffer Pointer to copy the data to. If the data is |
|
dvander@858
|
162 |
* NULL, no data will be copied. |
|
dvander@858
|
163 |
* @param maxlength Maximum length of the buffer. |
|
dvander@858
|
164 |
* @param written Optional pointer to store the number of bytes |
|
dvander@858
|
165 |
* written. |
|
dvander@858
|
166 |
* @return A DBResult return code. |
|
dvander@858
|
167 |
*/ |
|
dvander@858
|
168 |
virtual DBResult CopyBlob(unsigned int columnId, void *buffer, size_t maxlength, size_t *written) =0; |
|
dvander@666
|
169 |
}; |
|
dvander@666
|
170 |
|
|
dvander@666
|
171 |
/** |
|
dvander@666
|
172 |
* @brief Describes a set of database results. |
|
dvander@666
|
173 |
*/ |
|
dvander@666
|
174 |
class IResultSet |
|
dvander@666
|
175 |
{ |
|
dvander@666
|
176 |
public: |
|
dvander@666
|
177 |
/** |
|
dvander@666
|
178 |
* @brief Returns the number of rows in the set. |
|
dvander@666
|
179 |
* |
|
dvander@666
|
180 |
* @return Number of rows in the set. |
|
dvander@666
|
181 |
*/ |
|
dvander@666
|
182 |
virtual unsigned int GetRowCount() =0; |
|
dvander@666
|
183 |
|
|
dvander@666
|
184 |
/** |
|
dvander@666
|
185 |
* @brief Returns the number of fields in the set. |
|
dvander@666
|
186 |
* |
|
dvander@666
|
187 |
* @return Number of fields in the set. |
|
dvander@666
|
188 |
*/ |
|
dvander@666
|
189 |
virtual unsigned int GetFieldCount() =0; |
|
dvander@666
|
190 |
|
|
dvander@666
|
191 |
/** |
|
dvander@666
|
192 |
* @brief Converts a column number to a column name. |
|
dvander@666
|
193 |
* |
|
dvander@666
|
194 |
* @param columnId Column to use, starting from 0. |
|
dvander@666
|
195 |
* @return Pointer to column name, or NULL if not found. |
|
dvander@666
|
196 |
*/ |
|
dvander@858
|
197 |
virtual const char *FieldNumToName(unsigned int columnId) =0; |
|
dvander@666
|
198 |
|
|
dvander@666
|
199 |
/** |
|
dvander@666
|
200 |
* @brief Converts a column name to a column id. |
|
dvander@666
|
201 |
* |
|
dvander@666
|
202 |
* @param name Column name (case sensitive). |
|
dvander@666
|
203 |
* @param columnId Pointer to store the column id. If the |
|
dvander@666
|
204 |
* name is not found, the value will be |
|
dvander@666
|
205 |
* undefined. |
|
dvander@666
|
206 |
* @return True on success, false if not found. |
|
dvander@666
|
207 |
*/ |
|
dvander@858
|
208 |
virtual bool FieldNameToNum(const char *name, unsigned int *columnId) =0; |
|
dvander@666
|
209 |
|
|
dvander@666
|
210 |
/** |
|
dvander@666
|
211 |
* @brief Returns if there is still data in the result set. |
|
dvander@666
|
212 |
* |
|
dvander@666
|
213 |
* @return False if there is more data to be read, |
|
dvander@666
|
214 |
* true, otherwise. |
|
dvander@666
|
215 |
*/ |
|
dvander@858
|
216 |
virtual bool MoreRows() =0; |
|
dvander@666
|
217 |
|
|
dvander@666
|
218 |
/** |
|
dvander@666
|
219 |
* @brief Returns a pointer to the current row and advances |
|
dvander@666
|
220 |
* the internal row pointer/counter to the next row available. |
|
dvander@666
|
221 |
* |
|
dvander@666
|
222 |
* @return IResultRow pointer to the current row, |
|
dvander@666
|
223 |
* or NULL if there is no more data. |
|
dvander@666
|
224 |
*/ |
|
dvander@666
|
225 |
virtual IResultRow *FetchRow() =0; |
|
dvander@666
|
226 |
|
|
dvander@666
|
227 |
/** |
|
dvander@862
|
228 |
* @brief Returns a pointer to the current row. |
|
dvander@862
|
229 |
* |
|
dvander@862
|
230 |
* @return IResultRow pointer to the current row, |
|
dvander@862
|
231 |
* or NULL if the current row is invalid. |
|
dvander@862
|
232 |
*/ |
|
dvander@862
|
233 |
virtual IResultRow *CurrentRow() =0; |
|
dvander@862
|
234 |
|
|
dvander@862
|
235 |
/** |
|
dvander@666
|
236 |
* @brief Rewinds back to the beginning of the row iteration. |
|
dvander@666
|
237 |
* |
|
dvander@666
|
238 |
* @return True on success, false otherwise. |
|
dvander@666
|
239 |
*/ |
|
dvander@666
|
240 |
virtual bool Rewind() =0; |
|
dvander@858
|
241 |
|
|
dvander@858
|
242 |
/** |
|
dvander@858
|
243 |
* @brief Returns a field's type as it should be interpreted |
|
dvander@858
|
244 |
* by the user. |
|
dvander@858
|
245 |
* |
|
dvander@858
|
246 |
* @param field Field number (starting from 0). |
|
dvander@858
|
247 |
* @return A DBType value. |
|
dvander@858
|
248 |
*/ |
|
dvander@858
|
249 |
virtual DBType GetFieldType(unsigned int field) =0; |
|
dvander@858
|
250 |
|
|
dvander@858
|
251 |
/** |
|
dvander@858
|
252 |
* @brief Returns a field's type as it will be interpreted |
|
dvander@858
|
253 |
* by the GetDataSize() function. For example, MySQL |
|
dvander@858
|
254 |
* for non-prepared queries will store all results as |
|
dvander@858
|
255 |
* strings internally. |
|
dvander@858
|
256 |
* |
|
dvander@858
|
257 |
* @param field Field number (starting from 0). |
|
dvander@858
|
258 |
* @return A DBType value. |
|
dvander@858
|
259 |
*/ |
|
dvander@858
|
260 |
virtual DBType GetFieldDataType(unsigned int field) =0; |
|
dvander@666
|
261 |
}; |
|
dvander@666
|
262 |
|
|
dvander@858
|
263 |
class IDBDriver; |
|
dvander@666
|
264 |
|
|
dvander@666
|
265 |
class IQuery |
|
dvander@666
|
266 |
{ |
|
dvander@666
|
267 |
public: |
|
dvander@666
|
268 |
/** |
|
dvander@858
|
269 |
* @brief Returns a pointer to the current result set, if any. |
|
dvander@858
|
270 |
* |
|
dvander@858
|
271 |
* @return An IResultSet pointer on success, |
|
dvander@858
|
272 |
* NULL if no result set exists. |
|
dvander@858
|
273 |
*/ |
|
dvander@858
|
274 |
virtual IResultSet *GetResultSet() =0; |
|
dvander@858
|
275 |
|
|
dvander@858
|
276 |
/** |
|
dvander@858
|
277 |
* @brief Advances to the next result set if one exists. This |
|
dvander@858
|
278 |
* is for checking for MORE result sets, and should not be used |
|
dvander@858
|
279 |
* on the first result set. |
|
dvander@858
|
280 |
* |
|
dvander@858
|
281 |
* Multiple results only happen in certain cases, such as CALLing |
|
dvander@858
|
282 |
* stored procedure that have a SELECTs, where MySQL will return |
|
dvander@858
|
283 |
* both the CALL status and one or more SELECT result sets. If |
|
dvander@858
|
284 |
* you do not process these results, they will be automatically |
|
dvander@858
|
285 |
* processed for you. However, the behaviour of creating a new |
|
dvander@858
|
286 |
* query from the same connection while results are left |
|
dvander@858
|
287 |
* unprocessed is undefined, and may result in a dropped |
|
dvander@858
|
288 |
* connection. Therefore, process all extra results or destroy the |
|
dvander@858
|
289 |
* IQuery pointer before starting a new query. |
|
dvander@858
|
290 |
* |
|
dvander@858
|
291 |
* Again, this only happens in very specific cases, so there is |
|
dvander@858
|
292 |
* no need to call this for normal queries. |
|
dvander@858
|
293 |
* |
|
dvander@858
|
294 |
* After calling this function, GetResultSet() must be called |
|
dvander@858
|
295 |
* again to return the result set. The previous result set |
|
dvander@858
|
296 |
* is automatically destroyed and will be unusable. |
|
dvander@858
|
297 |
* |
|
dvander@858
|
298 |
* @return True if another result set is |
|
dvander@858
|
299 |
* available, false otherwise. |
|
dvander@858
|
300 |
*/ |
|
dvander@858
|
301 |
virtual bool FetchMoreResults() =0; |
|
dvander@858
|
302 |
|
|
dvander@858
|
303 |
/** |
|
dvander@858
|
304 |
* @brief Frees resources created by this query. |
|
dvander@858
|
305 |
*/ |
|
dvander@858
|
306 |
virtual void Destroy() =0; |
|
dvander@858
|
307 |
}; |
|
dvander@858
|
308 |
|
|
dvander@858
|
309 |
class IPreparedQuery : public IQuery |
|
dvander@858
|
310 |
{ |
|
dvander@858
|
311 |
public: |
|
dvander@858
|
312 |
/** |
|
dvander@858
|
313 |
* @brief Binds an integer parameter. |
|
dvander@858
|
314 |
* |
|
dvander@858
|
315 |
* @param param Parameter index, starting from 0. |
|
dvander@858
|
316 |
* @param num Number to bind as a value. |
|
dvander@858
|
317 |
* @param signd True to write as signed, false to write as |
|
dvander@858
|
318 |
* unsigned. |
|
dvander@858
|
319 |
* @return True on success, false otherwise. |
|
dvander@858
|
320 |
*/ |
|
dvander@858
|
321 |
virtual bool BindParamInt(unsigned int param, int num, bool signd=true) =0; |
|
dvander@858
|
322 |
|
|
dvander@858
|
323 |
/** |
|
dvander@858
|
324 |
* @brief Binds a float parameter. |
|
dvander@858
|
325 |
* |
|
dvander@858
|
326 |
* @param param Parameter index, starting from 0. |
|
dvander@858
|
327 |
* @param f Float to bind as a value. |
|
dvander@858
|
328 |
* @return True on success, false otherwise. |
|
dvander@858
|
329 |
*/ |
|
dvander@858
|
330 |
virtual bool BindParamFloat(unsigned int param, float f) =0; |
|
dvander@858
|
331 |
|
|
dvander@858
|
332 |
/** |
|
dvander@858
|
333 |
* @brief Binds an SQL NULL type as a parameter. |
|
dvander@858
|
334 |
* |
|
dvander@858
|
335 |
* @param param Parameter index, starting from 0. |
|
dvander@858
|
336 |
* @return True on success, false otherwise. |
|
dvander@858
|
337 |
*/ |
|
dvander@858
|
338 |
virtual bool BindParamNull(unsigned int param) =0; |
|
dvander@858
|
339 |
|
|
dvander@858
|
340 |
/** |
|
dvander@858
|
341 |
* @brief Binds a string as a parameter. |
|
dvander@858
|
342 |
* |
|
dvander@858
|
343 |
* @param param Parameter index, starting from 0. |
|
dvander@858
|
344 |
* @param text Pointer to a null-terminated string. |
|
dvander@858
|
345 |
* @param copy If true, the pointer is assumed to be |
|
dvander@858
|
346 |
* volatile and a temporary copy may be |
|
dvander@858
|
347 |
* made for safety. |
|
dvander@858
|
348 |
* @return True on success, false otherwise. |
|
dvander@858
|
349 |
*/ |
|
dvander@858
|
350 |
virtual bool BindParamString(unsigned int param, const char *text, bool copy) =0; |
|
dvander@858
|
351 |
|
|
dvander@858
|
352 |
/** |
|
dvander@858
|
353 |
* @brief Binds a blob of raw data as a parameter. |
|
dvander@858
|
354 |
* |
|
dvander@858
|
355 |
* @param param Parameter index, starting from 0. |
|
dvander@858
|
356 |
* @param data Pointer to a blob of memory. |
|
dvander@858
|
357 |
* @param length Number of bytes to copy. |
|
dvander@858
|
358 |
* @param copy If true, the pointer is assumed to be |
|
dvander@858
|
359 |
* volatile and a temporary copy may be |
|
dvander@858
|
360 |
* made for safety. |
|
dvander@858
|
361 |
* @return True on success, false otherwise. |
|
dvander@858
|
362 |
*/ |
|
dvander@858
|
363 |
virtual bool BindParamBlob(unsigned int param, |
|
dvander@858
|
364 |
const void *data, |
|
dvander@858
|
365 |
size_t length, |
|
dvander@858
|
366 |
bool copy) =0; |
|
dvander@858
|
367 |
|
|
dvander@858
|
368 |
/** |
|
dvander@858
|
369 |
* @brief Executes the query with the currently bound parameters. |
|
dvander@858
|
370 |
|
|
dvander@858
|
371 |
* @return True on success, false otherwise. |
|
dvander@858
|
372 |
*/ |
|
dvander@858
|
373 |
virtual bool Execute() =0; |
|
dvander@858
|
374 |
|
|
dvander@858
|
375 |
/** |
|
dvander@858
|
376 |
* @brief Returns the last error message from this statement. |
|
dvander@858
|
377 |
* |
|
dvander@858
|
378 |
* @param errCode Optional pointer to store the driver-specific |
|
dvander@858
|
379 |
* error code. |
|
dvander@858
|
380 |
* @return Error message string. |
|
dvander@858
|
381 |
*/ |
|
dvander@858
|
382 |
virtual const char *GetError(int *errCode=NULL) =0; |
|
dvander@858
|
383 |
|
|
dvander@858
|
384 |
/** |
|
dvander@666
|
385 |
* @brief Number of rows affected by the last execute. |
|
dvander@666
|
386 |
* |
|
dvander@666
|
387 |
* @return Number of rows affected by the last execute. |
|
dvander@666
|
388 |
*/ |
|
dvander@666
|
389 |
virtual unsigned int GetAffectedRows() =0; |
|
dvander@666
|
390 |
|
|
dvander@666
|
391 |
/** |
|
dvander@858
|
392 |
* @brief Retrieves the last insert ID on this database connection. |
|
dvander@666
|
393 |
* |
|
dvander@666
|
394 |
* @return Row insertion ID of the last execute, if any. |
|
dvander@666
|
395 |
*/ |
|
dvander@666
|
396 |
virtual unsigned int GetInsertID() =0; |
|
dvander@666
|
397 |
}; |
|
dvander@666
|
398 |
|
|
dvander@1095
|
399 |
class IDBDriver; |
|
dvander@1095
|
400 |
|
|
dvander@666
|
401 |
/** |
|
dvander@666
|
402 |
* @brief Encapsulates a database connection. |
|
dvander@666
|
403 |
*/ |
|
dvander@666
|
404 |
class IDatabase |
|
dvander@666
|
405 |
{ |
|
dvander@666
|
406 |
public: |
|
dvander@666
|
407 |
/** |
|
dvander@666
|
408 |
* @brief Disconnects the database and frees its associated memory. |
|
dvander@858
|
409 |
* Note that the actual object will not be freed until all open |
|
dvander@858
|
410 |
* references have been closed. |
|
dvander@858
|
411 |
* |
|
dvander@858
|
412 |
* It is guaranteed that an IDatabase pointer won't be destroyed until |
|
dvander@858
|
413 |
* all open IQuery or IPreparedQuery pointers are closed. |
|
dvander@875
|
414 |
* |
|
dvander@858
|
415 |
* @return True if object was destroyed, false if |
|
dvander@858
|
416 |
* references are remaining. |
|
dvander@666
|
417 |
*/ |
|
dvander@875
|
418 |
virtual bool Close() =0; |
|
dvander@666
|
419 |
|
|
dvander@666
|
420 |
/** |
|
dvander@666
|
421 |
* @brief Error code and string returned by the last operation on this |
|
dvander@666
|
422 |
* connection. |
|
dvander@666
|
423 |
* |
|
dvander@666
|
424 |
* @param errorCode Optional pointer to retrieve an error code. |
|
dvander@666
|
425 |
* @return Error string pointer (empty if none). |
|
dvander@666
|
426 |
*/ |
|
dvander@858
|
427 |
virtual const char *GetError(int *errorCode=NULL) =0; |
|
dvander@858
|
428 |
|
|
dvander@858
|
429 |
/** |
|
dvander@858
|
430 |
* @brief Prepares and executes a query in one step, and discards |
|
dvander@858
|
431 |
* any return data. |
|
dvander@858
|
432 |
* |
|
dvander@858
|
433 |
* @param query Query string. |
|
dvander@858
|
434 |
* @return True on success, false otherwise. |
|
dvander@858
|
435 |
*/ |
|
dvander@858
|
436 |
virtual bool DoSimpleQuery(const char *query) =0; |
|
dvander@666
|
437 |
|
|
dvander@666
|
438 |
/** |
|
dvander@666
|
439 |
* @brief Prepares and executes a query in one step, and returns |
|
dvander@858
|
440 |
* the resultant data set. |
|
dvander@858
|
441 |
* |
|
dvander@858
|
442 |
* Note: If a query contains more than one result set, each |
|
dvander@858
|
443 |
* result set must be processed before a new query is started. |
|
dvander@666
|
444 |
* |
|
dvander@858
|
445 |
* @param query Query string. |
|
dvander@858
|
446 |
* @return IQuery pointer on success, NULL otherwise. |
|
dvander@666
|
447 |
*/ |
|
dvander@858
|
448 |
virtual IQuery *DoQuery(const char *query) =0; |
|
dvander@858
|
449 |
|
|
dvander@858
|
450 |
/** |
|
dvander@858
|
451 |
* @brief Prepares a query statement for multiple executions and/or |
|
dvander@858
|
452 |
* binding marked parameters (? in MySQL/sqLite, $n in PostgreSQL). |
|
dvander@858
|
453 |
* |
|
dvander@858
|
454 |
* @param query Query string. |
|
dvander@858
|
455 |
* @param error Error buffer. |
|
dvander@858
|
456 |
* @param maxlength Maximum length of the error buffer. |
|
dvander@858
|
457 |
* @param errCode Optional pointer to store a driver-specific error code. |
|
dvander@858
|
458 |
* @return IPreparedQuery pointer on success, NULL |
|
dvander@858
|
459 |
* otherwise. |
|
dvander@858
|
460 |
*/ |
|
dvander@858
|
461 |
virtual IPreparedQuery *PrepareQuery(const char *query, char *error, size_t maxlength, int *errCode=NULL) =0; |
|
dvander@666
|
462 |
|
|
dvander@666
|
463 |
/** |
|
dvander@666
|
464 |
* Quotes a string for insertion into a query. |
|
dvander@666
|
465 |
* |
|
dvander@666
|
466 |
* @param str Source string. |
|
dvander@666
|
467 |
* @param buffer Buffer to store new string (should not overlap source string). |
|
dvander@666
|
468 |
* @param maxlen Maximum length of the output buffer. |
|
dvander@666
|
469 |
* @param newSize Pointer to store the output size. |
|
dvander@666
|
470 |
* @return True on success, false if the output buffer is not big enough. |
|
dvander@666
|
471 |
* If not big enough, the required buffer size is passed through |
|
dvander@666
|
472 |
* newSize. |
|
dvander@666
|
473 |
*/ |
|
dvander@666
|
474 |
virtual bool QuoteString(const char *str, char buffer[], size_t maxlen, size_t *newSize) =0; |
|
dvander@666
|
475 |
|
|
dvander@666
|
476 |
/** |
|
dvander@858
|
477 |
* @brief Number of rows affected by the last execute. |
|
dvander@858
|
478 |
* |
|
dvander@858
|
479 |
* @return Number of rows affected by the last execute. |
|
dvander@858
|
480 |
*/ |
|
dvander@858
|
481 |
virtual unsigned int GetAffectedRows() =0; |
|
dvander@858
|
482 |
|
|
dvander@858
|
483 |
/** |
|
dvander@858
|
484 |
* @brief Retrieves the last insert ID on this database connection. |
|
dvander@666
|
485 |
* |
|
dvander@858
|
486 |
* @return Row insertion ID of the last execute, if any. |
|
dvander@666
|
487 |
*/ |
|
dvander@858
|
488 |
virtual unsigned int GetInsertID() =0; |
|
dvander@1095
|
489 |
|
|
dvander@1095
|
490 |
/** |
|
dvander@1095
|
491 |
* @brief Locks the database for an atomic query+retrieval operation. |
|
dvander@1095
|
492 |
* |
|
dvander@1095
|
493 |
* @return True on success, false if not supported. |
|
dvander@1095
|
494 |
*/ |
|
dvander@1095
|
495 |
virtual bool LockForFullAtomicOperation() =0; |
|
dvander@1095
|
496 |
|
|
dvander@1095
|
497 |
/** |
|
dvander@1095
|
498 |
* @brief Unlocks a locked atomic fetch. |
|
dvander@1095
|
499 |
*/ |
|
dvander@1095
|
500 |
virtual void UnlockFromFullAtomicOperation() =0; |
|
dvander@1095
|
501 |
|
|
dvander@1095
|
502 |
/** |
|
dvander@1095
|
503 |
* @brief Increases the reference count on the database. |
|
dvander@1095
|
504 |
*/ |
|
dvander@1095
|
505 |
virtual void IncReferenceCount() =0; |
|
dvander@1095
|
506 |
|
|
dvander@1095
|
507 |
/** |
|
dvander@1095
|
508 |
* @brief Returns the parent driver. |
|
dvander@1095
|
509 |
*/ |
|
dvander@1095
|
510 |
virtual IDBDriver *GetDriver() =0; |
|
dvander@666
|
511 |
}; |
|
dvander@666
|
512 |
|
|
dvander@666
|
513 |
/** |
|
dvander@666
|
514 |
* @brief Describes database connection info. |
|
dvander@666
|
515 |
*/ |
|
dvander@666
|
516 |
struct DatabaseInfo |
|
dvander@666
|
517 |
{ |
|
dvander@666
|
518 |
DatabaseInfo() |
|
dvander@666
|
519 |
{ |
|
dvander@666
|
520 |
dbiVersion = SMINTERFACE_DBI_VERSION; |
|
dvander@666
|
521 |
port = 0; |
|
dvander@666
|
522 |
maxTimeout = 0; |
|
dvander@666
|
523 |
} |
|
dvander@666
|
524 |
unsigned int dbiVersion; /**< DBI Version for backwards compatibility */ |
|
dvander@666
|
525 |
const char *host; /**< Host string */ |
|
dvander@666
|
526 |
const char *database; /**< Database name string */ |
|
dvander@666
|
527 |
const char *user; /**< User to authenticate as */ |
|
dvander@666
|
528 |
const char *pass; /**< Password to authenticate with */ |
|
dvander@666
|
529 |
const char *driver; /**< Driver to use */ |
|
dvander@666
|
530 |
unsigned int port; /**< Port to use, 0=default */ |
|
dvander@666
|
531 |
unsigned int maxTimeout; /**< Maximum timeout, 0=default */ |
|
dvander@666
|
532 |
}; |
|
dvander@666
|
533 |
|
|
dvander@666
|
534 |
/** |
|
dvander@666
|
535 |
* @brief Describes an SQL driver. |
|
dvander@666
|
536 |
*/ |
|
dvander@666
|
537 |
class IDBDriver |
|
dvander@666
|
538 |
{ |
|
dvander@666
|
539 |
public: |
|
dvander@666
|
540 |
virtual unsigned int GetDBIVersion() |
|
dvander@666
|
541 |
{ |
|
dvander@666
|
542 |
return SMINTERFACE_DBI_VERSION; |
|
dvander@666
|
543 |
} |
|
dvander@666
|
544 |
public: |
|
dvander@666
|
545 |
/** |
|
dvander@666
|
546 |
* @brief Initiates a database connection. |
|
dvander@666
|
547 |
* |
|
dvander@666
|
548 |
* @param info Database connection info pointer. |
|
dvander@858
|
549 |
* @param persistent If true, a previous persistent connection will |
|
dvander@858
|
550 |
* be re-used if possible. |
|
dvander@858
|
551 |
* @param error Buffer to store error message. |
|
dvander@858
|
552 |
* @param maxlength Maximum size of the error buffer. |
|
dvander@666
|
553 |
* @return A new IDatabase pointer, or NULL on failure. |
|
dvander@666
|
554 |
*/ |
|
dvander@858
|
555 |
virtual IDatabase *Connect(const DatabaseInfo *info, bool persistent, char *error, size_t maxlength) =0; |
|
dvander@666
|
556 |
|
|
dvander@666
|
557 |
/** |
|
dvander@666
|
558 |
* @brief Returns a case insensitive database identifier string. |
|
dvander@858
|
559 |
* |
|
dvander@858
|
560 |
* @return String containing an identifier. |
|
dvander@666
|
561 |
*/ |
|
dvander@666
|
562 |
virtual const char *GetIdentifier() =0; |
|
dvander@666
|
563 |
|
|
dvander@666
|
564 |
/** |
|
dvander@666
|
565 |
* @brief Returns a case sensitive implementation name. |
|
dvander@858
|
566 |
* |
|
dvander@858
|
567 |
* @return String containing an implementation name. |
|
dvander@666
|
568 |
*/ |
|
dvander@666
|
569 |
virtual const char *GetProductName() =0; |
|
dvander@666
|
570 |
|
|
dvander@666
|
571 |
/** |
|
dvander@858
|
572 |
* @brief Retrieves a Handle_t handle of the IDBDriver type. |
|
dvander@858
|
573 |
* |
|
dvander@858
|
574 |
* @return A Handle_t handle. |
|
dvander@858
|
575 |
*/ |
|
dvander@858
|
576 |
virtual Handle_t GetHandle() =0; |
|
dvander@858
|
577 |
|
|
dvander@858
|
578 |
/** |
|
dvander@868
|
579 |
* @brief Returns the driver's controlling identity (must be the same |
|
dvander@868
|
580 |
* as from IExtension::GetIdentity). |
|
dvander@666
|
581 |
* |
|
dvander@858
|
582 |
* @return An IdentityToken_t identity. |
|
dvander@666
|
583 |
*/ |
|
dvander@858
|
584 |
virtual IdentityToken_t *GetIdentity() =0; |
|
dvander@1095
|
585 |
|
|
dvander@1095
|
586 |
/** |
|
dvander@1095
|
587 |
* @brief Returns whether the driver is thread safe. |
|
dvander@1095
|
588 |
* |
|
dvander@1095
|
589 |
* @return True if thread safe, false otherwise. |
|
dvander@1095
|
590 |
*/ |
|
dvander@1095
|
591 |
virtual bool IsThreadSafe() =0; |
|
dvander@1095
|
592 |
|
|
dvander@1095
|
593 |
/** |
|
dvander@1095
|
594 |
* @brief Initializes thread safety for the calling thread. |
|
dvander@1095
|
595 |
* |
|
dvander@1095
|
596 |
* @return True on success, false otherwise. |
|
dvander@1095
|
597 |
*/ |
|
dvander@1095
|
598 |
virtual bool InitializeThreadSafety() =0; |
|
dvander@1095
|
599 |
|
|
dvander@1095
|
600 |
/** |
|
dvander@1095
|
601 |
* @brief Shuts down thread safety for the calling thread. |
|
dvander@1095
|
602 |
*/ |
|
dvander@1095
|
603 |
virtual void ShutdownThreadSafety() =0; |
|
dvander@858
|
604 |
}; |
|
dvander@858
|
605 |
|
|
dvander@858
|
606 |
/** |
|
dvander@858
|
607 |
* @brief Database-related Handle types. |
|
dvander@858
|
608 |
*/ |
|
dvander@858
|
609 |
enum DBHandleType |
|
dvander@858
|
610 |
{ |
|
dvander@858
|
611 |
DBHandle_Driver = 0, /**< Driver Handle */ |
|
dvander@858
|
612 |
DBHandle_Database = 1, /**< Database Handle */ |
|
dvander@666
|
613 |
}; |
|
dvander@666
|
614 |
|
|
dvander@666
|
615 |
/** |
|
dvander@666
|
616 |
* @brief Describes the DBI manager. |
|
dvander@666
|
617 |
*/ |
|
dvander@666
|
618 |
class IDBManager : public SMInterface |
|
dvander@666
|
619 |
{ |
|
dvander@666
|
620 |
public: |
|
dvander@666
|
621 |
virtual const char *GetInterfaceName() =0; |
|
dvander@666
|
622 |
virtual unsigned int GetInterfaceVersion() =0; |
|
dvander@666
|
623 |
public: |
|
dvander@666
|
624 |
/** |
|
dvander@1095
|
625 |
* @brief Adds a driver to the DBI system. Not thread safe. |
|
dvander@666
|
626 |
* |
|
dvander@666
|
627 |
* @param pDriver Database driver. |
|
dvander@666
|
628 |
*/ |
|
dvander@858
|
629 |
virtual void AddDriver(IDBDriver *pDriver) =0; |
|
dvander@666
|
630 |
|
|
dvander@666
|
631 |
/** |
|
dvander@1095
|
632 |
* @brief Removes a driver from the DBI system. Not thread safe. |
|
dvander@666
|
633 |
* |
|
dvander@666
|
634 |
* @param pDriver Database driver. |
|
dvander@666
|
635 |
*/ |
|
dvander@666
|
636 |
virtual void RemoveDriver(IDBDriver *pDriver) =0; |
|
dvander@666
|
637 |
|
|
dvander@666
|
638 |
/** |
|
dvander@868
|
639 |
* @brief Searches for database info by name. Both the return pointer |
|
dvander@868
|
640 |
* and all pointers contained therein should be considered volatile. |
|
dvander@666
|
641 |
* |
|
dvander@666
|
642 |
* @param name Named database info. |
|
dvander@666
|
643 |
* @return DatabaseInfo pointer. |
|
dvander@666
|
644 |
*/ |
|
dvander@666
|
645 |
virtual const DatabaseInfo *FindDatabaseConf(const char *name) =0; |
|
dvander@666
|
646 |
|
|
dvander@666
|
647 |
/** |
|
dvander@1095
|
648 |
* @brief Tries to connect to a named database. Not thread safe. |
|
dvander@666
|
649 |
* |
|
dvander@666
|
650 |
* @param name Named database info. |
|
dvander@666
|
651 |
* @param pdr Pointer to store the IDBDriver pointer in. |
|
dvander@666
|
652 |
* If driver is not found, NULL will be stored. |
|
dvander@666
|
653 |
* @param pdb Pointer to store the IDatabase pointer in. |
|
dvander@666
|
654 |
* If connection fails, NULL will be stored. |
|
dvander@666
|
655 |
* @param persistent If true, the dbmanager will attempt to PConnect |
|
dvander@666
|
656 |
* instead of connect. |
|
dvander@858
|
657 |
* @param error Error buffer to store a driver's error message. |
|
dvander@858
|
658 |
* @param maxlength Maximum length of the error buffer. |
|
dvander@666
|
659 |
* @return True on success, false otherwise. |
|
dvander@666
|
660 |
*/ |
|
dvander@858
|
661 |
virtual bool Connect(const char *name, |
|
dvander@858
|
662 |
IDBDriver **pdr, |
|
dvander@858
|
663 |
IDatabase **pdb, |
|
dvander@858
|
664 |
bool persistent, |
|
dvander@858
|
665 |
char *error, |
|
dvander@858
|
666 |
size_t maxlength) =0; |
|
dvander@666
|
667 |
|
|
dvander@666
|
668 |
/** |
|
dvander@1095
|
669 |
* @brief Returns the number of drivers loaded. Not thread safe. |
|
dvander@666
|
670 |
* |
|
dvander@666
|
671 |
* @return Number of drivers loaded. |
|
dvander@666
|
672 |
*/ |
|
dvander@666
|
673 |
virtual unsigned int GetDriverCount() =0; |
|
dvander@666
|
674 |
|
|
dvander@666
|
675 |
/** |
|
dvander@1095
|
676 |
* @brief Returns a driver by index. Not thread safe. |
|
dvander@666
|
677 |
* |
|
dvander@666
|
678 |
* @param index Driver index, starting from 0. |
|
dvander@666
|
679 |
* @return IDBDriver pointer for the given index. |
|
dvander@666
|
680 |
*/ |
|
dvander@858
|
681 |
virtual IDBDriver *GetDriver(unsigned int index) =0; |
|
dvander@858
|
682 |
|
|
dvander@858
|
683 |
/** |
|
dvander@1095
|
684 |
* @brief Creates a Handle_t of the IDBDriver type. Not thread safe. |
|
dvander@858
|
685 |
* |
|
dvander@858
|
686 |
* @param type A DBHandleType value. |
|
dvander@868
|
687 |
* @param ptr A pointer corrresponding to a DBHandleType |
|
dvander@868
|
688 |
* object. |
|
dvander@858
|
689 |
* @param token Identity pointer of the owning identity. |
|
dvander@858
|
690 |
* @return A new Handle_t handle, or 0 on failure. |
|
dvander@858
|
691 |
*/ |
|
dvander@858
|
692 |
virtual Handle_t CreateHandle(DBHandleType type, void *ptr, IdentityToken_t *pToken) =0; |
|
dvander@858
|
693 |
|
|
dvander@858
|
694 |
/** |
|
dvander@1095
|
695 |
* @brief Reads an IDBDriver pointer from an IDBDriver handle. Not |
|
dvander@1095
|
696 |
* thread safe. |
|
dvander@858
|
697 |
* |
|
dvander@858
|
698 |
* @param hndl Handle_t handle to read. |
|
dvander@858
|
699 |
* @param type A DBHandleType value. |
|
dvander@858
|
700 |
* @param ptr Pointer to store the object pointer. |
|
dvander@858
|
701 |
* @return HandleError value. |
|
dvander@858
|
702 |
*/ |
|
dvander@858
|
703 |
virtual HandleError ReadHandle(Handle_t hndl, DBHandleType type, void **ptr) =0; |
|
dvander@858
|
704 |
|
|
dvander@858
|
705 |
/** |
|
dvander@858
|
706 |
* @brief Releases an IDBDriver handle. |
|
dvander@858
|
707 |
* |
|
dvander@858
|
708 |
* @param hndl Handle_t handle to release. |
|
dvander@858
|
709 |
* @param type A DBHandleType value. |
|
dvander@858
|
710 |
* @param token Identity pointer of the owning identity. |
|
dvander@858
|
711 |
* @return HandleError value. |
|
dvander@858
|
712 |
*/ |
|
dvander@858
|
713 |
virtual HandleError ReleaseHandle(Handle_t hndl, DBHandleType type, IdentityToken_t *token) =0; |
|
dvander@868
|
714 |
|
|
dvander@868
|
715 |
/** |
|
dvander@868
|
716 |
* @brief Given a driver name, attempts to find it. If it is not found, SourceMod |
|
dvander@1095
|
717 |
* will attempt to load it. This function is not thread safe. |
|
dvander@868
|
718 |
* |
|
dvander@868
|
719 |
* @param name Driver identifier name. |
|
dvander@868
|
720 |
* @return IDBDriver pointer on success, NULL otherwise. |
|
dvander@868
|
721 |
*/ |
|
dvander@868
|
722 |
virtual IDBDriver *FindOrLoadDriver(const char *driver) =0; |
|
dvander@868
|
723 |
|
|
dvander@868
|
724 |
/** |
|
dvander@1095
|
725 |
* @brief Returns the default driver, or NULL if none is set. This |
|
dvander@1095
|
726 |
* function is not thread safe. |
|
dvander@868
|
727 |
* |
|
dvander@868
|
728 |
* @return IDBDriver pointer on success, NULL otherwise. |
|
dvander@868
|
729 |
*/ |
|
dvander@868
|
730 |
virtual IDBDriver *GetDefaultDriver() =0; |
|
dvander@666
|
731 |
}; |
|
dvander@666
|
732 |
} |
|
dvander@666
|
733 |
|
|
dvander@666
|
734 |
#endif //_INCLUDE_SOURCEMOD_INTERFACE_DBDRIVER_H_ |