Qore Programming Language  0.8.11.1
DBI.h
Go to the documentation of this file.
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  DBI.h
4 
5  Qore Programming Language
6 
7  Copyright (C) 2003 - 2014 David Nichols
8 
9  Permission is hereby granted, free of charge, to any person obtaining a
10  copy of this software and associated documentation files (the "Software"),
11  to deal in the Software without restriction, including without limitation
12  the rights to use, copy, modify, merge, publish, distribute, sublicense,
13  and/or sell copies of the Software, and to permit persons to whom the
14  Software is furnished to do so, subject to the following conditions:
15 
16  The above copyright notice and this permission notice shall be included in
17  all copies or substantial portions of the Software.
18 
19  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25  DEALINGS IN THE SOFTWARE.
26 
27  Note that the Qore library is released under a choice of three open-source
28  licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
29  information.
30 */
31 
32 #ifndef _QORE_DBI_H
33 #define _QORE_DBI_H
34 
36 
37 // DBI Driver capabilities
38 #define DBI_CAP_NONE 0
39 #define DBI_CAP_TIME_ZONE_SUPPORT (1 << 0)
40 #define DBI_CAP_CHARSET_SUPPORT (1 << 1)
41 #define DBI_CAP_TRANSACTION_MANAGEMENT (1 << 2)
42 #define DBI_CAP_STORED_PROCEDURES (1 << 3)
43 #define DBI_CAP_LOB_SUPPORT (1 << 4)
44 #define DBI_CAP_BIND_BY_VALUE (1 << 5)
45 #define DBI_CAP_BIND_BY_PLACEHOLDER (1 << 6)
46 #define DBI_CAP_HAS_EXECRAW (1 << 7)
47 #define DBI_CAP_HAS_STATEMENT (1 << 8)
48 #define DBI_CAP_HAS_SELECT_ROW (1 << 9)
49 #define DBI_CAP_HAS_NUMBER_SUPPORT (1 << 10)
50 #define DBI_CAP_HAS_OPTION_SUPPORT (1 << 11)
51 #define DBI_CAP_SERVER_TIME_ZONE (1 << 12)
52 #define DBI_CAP_AUTORECONNECT (1 << 13)
53 #define DBI_CAP_EVENTS (1 << 14)
54 #define DBI_CAP_HAS_DESCRIBE (1 << 15)
55 
56 #define BN_PLACEHOLDER 0
57 #define BN_VALUE 1
58 
59 #define DBI_DEFAULT_STR_LEN 512
60 
61 // DBI method codes
62 #define QDBI_METHOD_OPEN 1
63 #define QDBI_METHOD_CLOSE 2
64 #define QDBI_METHOD_SELECT 3
65 #define QDBI_METHOD_SELECT_ROWS 4
66 #define QDBI_METHOD_EXEC 5
67 #define QDBI_METHOD_COMMIT 6
68 #define QDBI_METHOD_ROLLBACK 7
69 #define QDBI_METHOD_BEGIN_TRANSACTION 8
70 #define QDBI_METHOD_ABORT_TRANSACTION_START 9
71 #define QDBI_METHOD_GET_SERVER_VERSION 10
72 #define QDBI_METHOD_GET_CLIENT_VERSION 11
73 #define QDBI_METHOD_EXECRAW 12
74 #define QDBI_METHOD_STMT_PREPARE 13
75 #define QDBI_METHOD_STMT_PREPARE_RAW 14
76 #define QDBI_METHOD_STMT_BIND 15
77 #define QDBI_METHOD_STMT_BIND_PLACEHOLDERS 16
78 #define QDBI_METHOD_STMT_BIND_VALUES 17
79 #define QDBI_METHOD_STMT_EXEC 18
80 #define QDBI_METHOD_STMT_FETCH_ROW 19
81 #define QDBI_METHOD_STMT_FETCH_ROWS 20
82 #define QDBI_METHOD_STMT_FETCH_COLUMNS 21
83 #define QDBI_METHOD_STMT_NEXT 22
84 #define QDBI_METHOD_STMT_CLOSE 23
85 #define QDBI_METHOD_STMT_AFFECTED_ROWS 24
86 #define QDBI_METHOD_STMT_GET_OUTPUT 25
87 #define QDBI_METHOD_STMT_GET_OUTPUT_ROWS 26
88 #define QDBI_METHOD_STMT_DEFINE 27
89 #define QDBI_METHOD_SELECT_ROW 28
90 #define QDBI_METHOD_OPT_SET 29
91 #define QDBI_METHOD_OPT_GET 30
92 #define QDBI_METHOD_STMT_DESCRIBE 31
93 #define QDBI_METHOD_DESCRIBE 32
94 
95 #define QDBI_VALID_CODES 32
96 
97 /* DBI EVENT Types
98  all DBI events must have the following keys:
99  - user: db username (if available)
100  - db: db name (if available)
101  - eventtype: integer event code
102 */
103 // warning events have the following additional keys: warning, desc, [info]
104 #define QDBI_EVENT_WARNING 1
105 
106 class Datasource;
107 class ExceptionSink;
108 class QoreString;
109 class QoreListNode;
110 class AbstractQoreNode;
111 class QoreHashNode;
112 class QoreNamespace;
113 class SQLStatement;
114 
115 // DBI method signatures - note that only get_client_version uses a "const Datasource"
116 // the others do not so that automatic reconnects can be supported (which will normally
117 // require writing to the Datasource)
118 
120 
124 typedef int (*q_dbi_open_t)(Datasource* ds, ExceptionSink* xsink);
125 
127 
131 typedef int (*q_dbi_close_t)(Datasource* ds);
132 
134 
141 typedef AbstractQoreNode* (*q_dbi_select_t)(Datasource* ds, const QoreString* str, const QoreListNode* args, ExceptionSink* xsink);
142 
144 
151 typedef AbstractQoreNode* (*q_dbi_select_rows_t)(Datasource* ds, const QoreString* str, const QoreListNode* args, ExceptionSink* xsink);
152 
154 
162 typedef QoreHashNode* (*q_dbi_select_row_t)(Datasource* ds, const QoreString* str, const QoreListNode* args, ExceptionSink* xsink);
163 
165 
172 typedef AbstractQoreNode* (*q_dbi_exec_t)(Datasource* ds, const QoreString* str, const QoreListNode* args, ExceptionSink* xsink);
173 
175 
181 typedef AbstractQoreNode* (*q_dbi_execraw_t)(Datasource* ds, const QoreString* str, ExceptionSink* xsink);
182 
184 
189 typedef int (*q_dbi_commit_t)(Datasource* ds, ExceptionSink* xsink);
190 
192 
197 typedef int (*q_dbi_rollback_t)(Datasource* ds, ExceptionSink* xsink);
198 
200 
206 
208 
214 
216 
221 typedef AbstractQoreNode* (*q_dbi_get_server_version_t)(Datasource* ds, ExceptionSink* xsink);
222 
224 
229 typedef AbstractQoreNode* (*q_dbi_get_client_version_t)(const Datasource* ds, ExceptionSink* xsink);
230 
231 // FIXME: document
233 
235 typedef int (*q_dbi_stmt_prepare_t)(SQLStatement* stmt, const QoreString& str, const QoreListNode* args, ExceptionSink* xsink);
236 
238 
240 typedef int (*q_dbi_stmt_prepare_raw_t)(SQLStatement* stmt, const QoreString& str, ExceptionSink* xsink);
241 
243 
245 typedef int (*q_dbi_stmt_bind_t)(SQLStatement* stmt, const QoreListNode& l, ExceptionSink* xsink);
246 
248 
250 typedef int (*q_dbi_stmt_exec_t)(SQLStatement* stmt, ExceptionSink* xsink);
251 
253 
256 
258 
260 typedef QoreHashNode* (*q_dbi_stmt_get_output_t)(SQLStatement* stmt, ExceptionSink* xsink);
261 
263 
265 typedef QoreHashNode* (*q_dbi_stmt_get_output_rows_t)(SQLStatement* stmt, ExceptionSink* xsink);
266 
267 typedef int (*q_dbi_stmt_define_t)(SQLStatement* stmt, ExceptionSink* xsink);
268 typedef QoreHashNode* (*q_dbi_stmt_fetch_row_t)(SQLStatement* stmt, ExceptionSink* xsink);
269 typedef QoreHashNode* (*q_dbi_stmt_fetch_columns_t)(SQLStatement* stmt, int rows, ExceptionSink* xsink);
270 typedef QoreListNode* (*q_dbi_stmt_fetch_rows_t)(SQLStatement* stmt, int rows, ExceptionSink* xsink);
271 typedef bool (*q_dbi_stmt_next_t)(SQLStatement* stmt, ExceptionSink* xsink);
272 typedef int (*q_dbi_stmt_close_t)(SQLStatement* stmt, ExceptionSink* xsink);
273 
274 typedef int (*q_dbi_option_set_t)(Datasource* ds, const char* opt, const AbstractQoreNode* val, ExceptionSink* xsink);
275 typedef AbstractQoreNode* (*q_dbi_option_get_t)(const Datasource* ds, const char* opt);
276 
278 
285 typedef QoreHashNode* (*q_dbi_describe_t)(Datasource* ds, const QoreString* str, const QoreListNode* args, ExceptionSink* xsink);
286 
287 #define DBI_OPT_NUMBER_OPT "optimal-numbers"
288 #define DBI_OPT_NUMBER_STRING "string-numbers"
289 #define DBI_OPT_NUMBER_NUMERIC "numeric-numbers"
290 #define DBI_OPT_TIMEZONE "timezone"
291 
292 
296  friend struct qore_dbi_mlist_private;
297 
298 private:
299  struct qore_dbi_mlist_private* priv; // private implementation
300 
301  // not implemented
303  DLLLOCAL qore_dbi_method_list& operator=(const qore_dbi_method_list&);
304 
305 public:
306  DLLEXPORT qore_dbi_method_list();
307  DLLEXPORT ~qore_dbi_method_list();
308 
309  // covers open, commit, rollback, and begin transaction
310  DLLEXPORT void add(int code, q_dbi_open_t method);
311  // for close
312  DLLEXPORT void add(int code, q_dbi_close_t method);
313  // covers select, select_rows, select, and exec
314  DLLEXPORT void add(int code, q_dbi_select_t method);
315  // covers select_row
316  DLLEXPORT void add(int code, q_dbi_select_row_t method);
317  // covers execRaw
318  DLLEXPORT void add(int code, q_dbi_execraw_t method);
319  // covers get_server_version
320  DLLEXPORT void add(int code, q_dbi_get_server_version_t method);
321  // covers get_client_version
322  DLLEXPORT void add(int code, q_dbi_get_client_version_t method);
323 
324  // covers prepare
325  DLLEXPORT void add(int code, q_dbi_stmt_prepare_t method);
326  // covers prepare_raw
327  DLLEXPORT void add(int code, q_dbi_stmt_prepare_raw_t method);
328  // covers bind, bind_placeholders, bind_values
329  DLLEXPORT void add(int code, q_dbi_stmt_bind_t method);
330  // covers exec, close, affected_rows, and define
331  DLLEXPORT void add(int code, q_dbi_stmt_exec_t method);
332  // covers fetch_row, get_output, and get_output_rows
333  DLLEXPORT void add(int code, q_dbi_stmt_fetch_row_t method);
334  // covers fetch_columns
335  DLLEXPORT void add(int code, q_dbi_stmt_fetch_columns_t method);
336  // covers fetch_rows
337  DLLEXPORT void add(int code, q_dbi_stmt_fetch_rows_t method);
338  // covers next
339  DLLEXPORT void add(int code, q_dbi_stmt_next_t method);
340 
341  // covers set option
342  DLLEXPORT void add(int code, q_dbi_option_set_t method);
343  // covers get option
344  DLLEXPORT void add(int code, q_dbi_option_get_t method);
345 
346  // for registering valid options
347  DLLEXPORT void registerOption(const char* name, const char* desc, const QoreTypeInfo* type = 0);
348 };
349 
351 
356 class DBIDriver {
357  friend struct qore_dbi_private;
358 
359 private:
361  struct qore_dbi_private* priv;
362 
364  DLLLOCAL DBIDriver(const DBIDriver&);
366  DLLLOCAL DBIDriver& operator=(const DBIDriver&);
367 
368 public:
370 
373  DLLEXPORT const char* getName() const;
374 
376  DLLEXPORT bool hasStatementAPI() const;
377 
379 
385  DLLEXPORT QoreHashNode* getOptionHash() const;
386 
387  DLLLOCAL DBIDriver(struct qore_dbi_private* p);
388  DLLLOCAL ~DBIDriver();
389 };
390 
391 struct qore_dbi_dlist_private;
392 
394 
399 private:
401  struct qore_dbi_dlist_private *priv;
402 
403  DLLLOCAL DBIDriver* find_intern(const char* name) const;
404 
405 public:
407 
414  DLLEXPORT DBIDriver* registerDriver(const char* name, const qore_dbi_method_list &methods, int caps);
415 
417 
424  DLLEXPORT DBIDriver* find(const char* name) const;
425 
427 
435  DLLEXPORT DBIDriver* find(const char* name, ExceptionSink* xsink) const;
436 
437  DLLLOCAL DBIDriverList();
438  DLLLOCAL ~DBIDriverList();
439  DLLLOCAL QoreListNode* getDriverList() const;
440 };
441 
443 DLLEXPORT extern DBIDriverList DBI;
444 
446 DLLEXPORT QoreHashNode* parseDatasource(const char* ds, ExceptionSink* xsink);
447 
449 DLLEXPORT void DBI_concat_numeric(QoreString* str, const AbstractQoreNode* v);
450 
452 
455 DLLEXPORT int DBI_concat_string(QoreString* str, const AbstractQoreNode* v, ExceptionSink* xsink);
456 
457 #endif // _QORE_DBI_H
AbstractQoreNode *(* q_dbi_execraw_t)(Datasource *ds, const QoreString *str, ExceptionSink *xsink)
signature for the DBI "execRawSQL" method - must be defined in each DBI driver
Definition: DBI.h:181
int(* q_dbi_abort_transaction_start_t)(Datasource *ds, ExceptionSink *xsink)
signature for the rollback method to be executed when the first statement in an explicit transaction ...
Definition: DBI.h:213
int(* q_dbi_close_t)(Datasource *ds)
signature for the DBI "close" method - must be defined in each DBI driver
Definition: DBI.h:131
This is the hash or associative list container type in Qore, dynamically allocated only...
Definition: QoreHashNode.h:49
int(* q_dbi_stmt_bind_t)(SQLStatement *stmt, const QoreListNode &l, ExceptionSink *xsink)
bind input values and optionally describe output parameters
Definition: DBI.h:245
QoreHashNode *(* q_dbi_select_row_t)(Datasource *ds, const QoreString *str, const QoreListNode *args, ExceptionSink *xsink)
signature for the DBI "selectRow" method - must be defined in each DBI driver
Definition: DBI.h:162
AbstractQoreNode *(* q_dbi_get_client_version_t)(const Datasource *ds, ExceptionSink *xsink)
signature for the "get_client_version" method
Definition: DBI.h:229
int(* q_dbi_begin_transaction_t)(Datasource *ds, ExceptionSink *xsink)
signature for the DBI "begin_transaction" method, should only be defined for drivers needing this to ...
Definition: DBI.h:205
int(* q_dbi_stmt_prepare_raw_t)(SQLStatement *stmt, const QoreString &str, ExceptionSink *xsink)
prepare statement with no bind parsing
Definition: DBI.h:240
The base class for all value and parse types in Qore expression trees.
Definition: AbstractQoreNode.h:55
contains constants, classes, and subnamespaces in QoreProgram objects
Definition: QoreNamespace.h:58
this class provides the internal link to the database driver for Qore's DBI layer ...
Definition: DBI.h:356
int(* q_dbi_open_t)(Datasource *ds, ExceptionSink *xsink)
signature for the DBI "open" method - must be defined in each DBI driver
Definition: DBI.h:124
DLLEXPORT bool hasStatementAPI() const
returns true if the driver supports the statement API
AbstractQoreNode *(* q_dbi_select_t)(Datasource *ds, const QoreString *str, const QoreListNode *args, ExceptionSink *xsink)
signature for the DBI "select" method - must be defined in each DBI driver
Definition: DBI.h:141
DLLEXPORT QoreHashNode * getOptionHash() const
returns the valid options for this driver with descriptions
Qore's string type supported by the QoreEncoding class.
Definition: QoreString.h:50
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:52
DLLEXPORT DBIDriverList DBI
list of DBI drivers currently reigsted by the Qore library
the base class for accessing databases in Qore through a Qore DBI driver
Definition: Datasource.h:54
DLLEXPORT const char * getName() const
this is the only public exported function available in this class
this is the data structure Qore DBI drivers will use to pass the supported DBI methods ...
Definition: DBI.h:295
This is the public class for DBI drivers supporting Qore's new prepared statement API...
Definition: SQLStatement.h:40
int(* q_dbi_stmt_exec_t)(SQLStatement *stmt, ExceptionSink *xsink)
execute statement
Definition: DBI.h:250
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:43
int(* q_dbi_rollback_t)(Datasource *ds, ExceptionSink *xsink)
signature for the DBI "rollback" method - must be defined in each DBI driver
Definition: DBI.h:197
int(* q_dbi_stmt_prepare_t)(SQLStatement *stmt, const QoreString &str, const QoreListNode *args, ExceptionSink *xsink)
prepare statement and process placeholder specifications and bind parameters
Definition: DBI.h:235
DLLEXPORT DBIDriver * registerDriver(const char *name, const qore_dbi_method_list &methods, int caps)
registers a new DBI driver
int(* q_dbi_commit_t)(Datasource *ds, ExceptionSink *xsink)
signature for the DBI "commit" method - must be defined in each DBI driver
Definition: DBI.h:189
this class is used to register and find DBI drivers loaded in qore
Definition: DBI.h:398
AbstractQoreNode *(* q_dbi_get_server_version_t)(Datasource *ds, ExceptionSink *xsink)
signature for the "get_server_version" method
Definition: DBI.h:221
int(* q_dbi_stmt_affected_rows_t)(SQLStatement *stmt, ExceptionSink *xsink)
get number of affected rows
Definition: DBI.h:255
DLLEXPORT QoreHashNode * parseDatasource(const char *ds, ExceptionSink *xsink)
parses a datasource string and returns a hash of the component parts
DLLEXPORT void DBI_concat_numeric(QoreString *str, const AbstractQoreNode *v)
concatenates a numeric value to the QoreString from the QoreNode
DLLEXPORT DBIDriver * find(const char *name) const
finds a driver, will try to load the driver using the ModuleManager if no such driver is already pres...
DLLEXPORT int DBI_concat_string(QoreString *str, const AbstractQoreNode *v, ExceptionSink *xsink)
concatenates a string value to the QoreString from the AbstractQoreNode