Annotation of parser3/src/sql/pa_sql_driver.h, revision 1.34.2.4
1.22 paf 1: /** @file
2: Parser: sql driver interface.
3:
1.34.2.2 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
1.34.2.3 paf 10: class X_SQL_Driver: public SQL_Driver {
1.22 paf 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.2.4! paf 29: static const char* IDENT_SQL_DRIVER_H="$Date: 2003/02/17 17:05:03 $";
1.22 paf 30:
31: #include <sys/types.h>
32:
1.34.2.1 paf 33: #define SQL_DRIVER_API_VERSION 0x0006
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;
1.34.2.2 paf 40: const char* ftype;
41: const char* fcomment;
1.29 paf 42: public:
1.32 paf 43: SQL_Error():
1.29 paf 44: fdefined(false) {}
1.32 paf 45: SQL_Error(
1.34.2.2 paf 46: const char* atype,
47: const char* acomment):
1.29 paf 48: fdefined(true),
49: ftype(atype),
50: fcomment(acomment) {}
1.34.2.2 paf 51: SQL_Error(const char* acomment):
1.29 paf 52: fdefined(true),
53: ftype(0),
54: fcomment(acomment) {}
1.32 paf 55: SQL_Error& operator =(const SQL_Error& src) {
1.29 paf 56: fdefined=src.fdefined;
57: ftype=src.ftype;
58: fcomment=src.fcomment;
59: return *this;
60: }
61:
1.32 paf 62: bool defined() const { return fdefined; }
1.34.2.2 paf 63: const char* type() const { return ftype; }
64: const char* comment() const { return fcomment; }
1.29 paf 65: };
66:
1.22 paf 67: /// service functions for SQL driver to use
68: class SQL_Driver_services {
69: public:
1.34.2.1 paf 70: /// allocates some bytes
1.22 paf 71: virtual void *malloc(size_t size) =0;
72: /// allocates some bytes clearing them with zeros
73: virtual void *calloc(size_t size) =0;
1.34.2.1 paf 74: /// reallocates bytes
75: virtual void *realloc(void *ptr, size_t size) =0;
1.22 paf 76: /// prepare throw exception
1.32 paf 77: virtual void _throw(const SQL_Error& e) =0;
1.22 paf 78: /// throw C++ exception from prepared
79: virtual void propagate_exception() =0;
1.29 paf 80: /// helper func
1.34.2.2 paf 81: void _throw(const char* comment) { _throw(SQL_Error("sql.connect", comment)); }
1.22 paf 82: public:
83: /// regretrully public, because can't make stack frames: "nowhere to return to"
84: jmp_buf mark;
85: };
86:
1.32 paf 87: /** events, occuring when SQL_Driver::query()-ing.
88:
89: when OK must return false.
90: must NOT throw exceptions, must store them to error & return true.
91: */
1.22 paf 92: class SQL_Driver_query_event_handlers {
93: public:
1.32 paf 94: virtual bool add_column(SQL_Error& error, void *ptr, size_t size) =0;
95: virtual bool before_rows(SQL_Error& error) =0;
96: virtual bool add_row(SQL_Error& error) =0;
97: virtual bool add_row_cell(SQL_Error& error, void *ptr, size_t size) =0;
1.22 paf 98: };
99:
100: /// SQL driver API
101: class SQL_Driver {
102: public:
103:
1.34.2.4! paf 104: /** allocated using our allocator,
! 105: @todo never freed
! 106: */
! 107: static void *operator new(size_t size) {
! 108: void *result=::malloc(size);
! 109: if(!result)
! 110: abort();
! 111:
! 112: return result;
! 113: }
1.22 paf 114: /// get api version
115: virtual int api_version() =0;
116: /// initialize driver by loading sql dynamic link library
1.34.2.2 paf 117: virtual const char* initialize(char *dlopen_file_spec) =0;
1.22 paf 118: /** connect to sql database using
119: @param used_only_to_connect_url
120: format is driver specific
121: WARNING: must be used only to connect, for buffer doesn't live long enough
122:
123: @returns true+'connection' on success. 'error' on failure
124: */
125: virtual void connect(char *used_only_in_connect_url_cstr,
126: SQL_Driver_services& services, void **connection) =0;
127: virtual void disconnect(void *connection) =0;
128: virtual void commit(
129: SQL_Driver_services& services, void *connection) =0;
130: virtual void rollback(
131: SQL_Driver_services& services, void *connection) =0;
132: /// @returns true to indicate that connection still alive
133: virtual bool ping(
134: SQL_Driver_services& services, void *connection) =0;
135: /// encodes the string in 'from' to an escaped SQL string
136: virtual unsigned int quote(
137: SQL_Driver_services& services, void *connection,
1.34.2.2 paf 138: char *to, const char* from, unsigned int length) =0;
1.22 paf 139: virtual void query(
140: SQL_Driver_services& services, void *connection,
1.34.2.2 paf 141: const char* statement, unsigned long offset, unsigned long limit,
1.22 paf 142: SQL_Driver_query_event_handlers& handlers) =0;
143: };
144:
145: typedef SQL_Driver *(*SQL_Driver_create_func)();
146:
147: #endif
E-mail: