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