Annotation of parser3/src/sql/pa_sql_driver.h, revision 1.34
1.22 paf 1: /** @file
2: Parser: sql driver interface.
3:
1.34 ! paf 4: Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
1.26 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.22 paf 6:
7:
8: driver dynamic library must look like this:
9: @code
10: class X_SQL_Driver : public SQL_Driver {
11: public:
12:
13: X_SQL_Driver() : SQL_driver() {}
14:
15: int api_version() { return SQL_DRIVER_API_VERSION; }
16:
17: //...
18: };
19:
20: extern "C" SQL_Driver *create() {
21: return new X_SQL_Driver();
22: }
23: @endcode
24: */
25:
26: #ifndef PA_SQL_DRIVER_H
27: #define PA_SQL_DRIVER_H
1.27 paf 28:
1.34 ! paf 29: static const char* IDENT_SQL_DRIVER_H="$Date: 2002/12/14 12:43:26 $";
1.22 paf 30:
31: #include <sys/types.h>
32:
1.32 paf 33: #define SQL_DRIVER_API_VERSION 0x0005
1.29 paf 34: #define SQL_DRIVER_CREATE create /* used in driver implementation */
35: #define SQL_DRIVER_CREATE_NAME "create" /* could not figure out how to # it :( */
36:
37: /// fields are freed elsewhere
1.32 paf 38: class SQL_Error {
1.29 paf 39: bool fdefined;
40: const char *ftype;
41: const void *fproblem_source;
42: const char *fcomment;
43: public:
1.32 paf 44: SQL_Error():
1.29 paf 45: fdefined(false) {}
1.32 paf 46: SQL_Error(
1.29 paf 47: const char *atype,
48: const void *aproblem_source,
49: const char *acomment):
50: fdefined(true),
51: ftype(atype),
52: fproblem_source(aproblem_source),
53: fcomment(acomment) {}
1.32 paf 54: SQL_Error(const char *acomment):
1.29 paf 55: fdefined(true),
56: ftype(0),
57: fproblem_source(0),
58: fcomment(acomment) {}
1.32 paf 59: SQL_Error& operator =(const SQL_Error& src) {
1.29 paf 60: fdefined=src.fdefined;
61: ftype=src.ftype;
62: fproblem_source=src.fproblem_source;
63: fcomment=src.fcomment;
64: return *this;
65: }
66:
1.32 paf 67: bool defined() const { return fdefined; }
68: const char *type() const { return ftype; }
69: const void *problem_source() const { return fproblem_source; }
70: const char *comment() const { return fcomment; }
1.29 paf 71: };
72:
1.22 paf 73: /// service functions for SQL driver to use
74: class SQL_Driver_services {
75: public:
76: /// allocates some bytes on pool
77: virtual void *malloc(size_t size) =0;
78: /// allocates some bytes clearing them with zeros
79: virtual void *calloc(size_t size) =0;
80: /// prepare throw exception
1.32 paf 81: virtual void _throw(const SQL_Error& e) =0;
1.22 paf 82: /// throw C++ exception from prepared
83: virtual void propagate_exception() =0;
1.29 paf 84: /// helper func
1.33 paf 85: void _throw(const char *comment) { _throw(SQL_Error("sql.connect", 0, comment)); }
1.22 paf 86: public:
87: /// regretrully public, because can't make stack frames: "nowhere to return to"
88: jmp_buf mark;
89: };
90:
1.32 paf 91: /** events, occuring when SQL_Driver::query()-ing.
92:
93: when OK must return false.
94: must NOT throw exceptions, must store them to error & return true.
95: */
1.22 paf 96: class SQL_Driver_query_event_handlers {
97: public:
1.32 paf 98: virtual bool add_column(SQL_Error& error, void *ptr, size_t size) =0;
99: virtual bool before_rows(SQL_Error& error) =0;
100: virtual bool add_row(SQL_Error& error) =0;
101: virtual bool add_row_cell(SQL_Error& error, void *ptr, size_t size) =0;
1.22 paf 102: };
103:
104: /// SQL driver API
105: class SQL_Driver {
106: public:
107:
108: /// get api version
109: virtual int api_version() =0;
110: /// initialize driver by loading sql dynamic link library
111: virtual const char *initialize(char *dlopen_file_spec) =0;
112: /** connect to sql database using
113: @param used_only_to_connect_url
114: format is driver specific
115: WARNING: must be used only to connect, for buffer doesn't live long enough
116:
117: @returns true+'connection' on success. 'error' on failure
118: */
119: virtual void connect(char *used_only_in_connect_url_cstr,
120: SQL_Driver_services& services, void **connection) =0;
121: virtual void disconnect(void *connection) =0;
122: virtual void commit(
123: SQL_Driver_services& services, void *connection) =0;
124: virtual void rollback(
125: SQL_Driver_services& services, void *connection) =0;
126: /// @returns true to indicate that connection still alive
127: virtual bool ping(
128: SQL_Driver_services& services, void *connection) =0;
129: /// encodes the string in 'from' to an escaped SQL string
130: virtual unsigned int quote(
131: SQL_Driver_services& services, void *connection,
132: char *to, const char *from, unsigned int length) =0;
133: virtual void query(
134: SQL_Driver_services& services, void *connection,
135: const char *statement, unsigned long offset, unsigned long limit,
136: SQL_Driver_query_event_handlers& handlers) =0;
137: };
138:
139: typedef SQL_Driver *(*SQL_Driver_create_func)();
140:
141: #endif
E-mail: