Annotation of parser3/src/sql/pa_sql_driver.h, revision 1.40
1.22 paf 1: /** @file
2: Parser: sql driver interface.
3:
1.38 paf 4: Copyright (c) 2001-2004 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.40 ! paf 29: static const char * const IDENT_SQL_DRIVER_H="$Date: 2004/03/05 10:01:50 $";
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;
1.39 paf 80: /// transcoder.
81: /// WARNING: can store pointers to charset names to speedup name-to-instance resolving
82: /// so do NOT pass pointers to local vars and change those vars after that
1.37 paf 83: virtual void transcode(const char* src, size_t src_length,
84: const char*& dst, size_t& dst_length,
85: const char* charset_from_name,
86: const char* charset_to_name
87: ) =0;
1.22 paf 88: /// prepare throw exception
1.32 paf 89: virtual void _throw(const SQL_Error& e) =0;
1.22 paf 90: /// throw C++ exception from prepared
91: virtual void propagate_exception() =0;
1.29 paf 92: /// helper func
1.35 paf 93: void _throw(const char* comment) { _throw(SQL_Error("sql.connect", comment)); }
1.22 paf 94: public:
95: /// regretrully public, because can't make stack frames: "nowhere to return to"
96: jmp_buf mark;
97: };
98:
1.32 paf 99: /** events, occuring when SQL_Driver::query()-ing.
100:
101: when OK must return false.
102: must NOT throw exceptions, must store them to error & return true.
103: */
1.22 paf 104: class SQL_Driver_query_event_handlers {
105: public:
1.35 paf 106: virtual bool add_column(SQL_Error& error, const char* str, size_t length) =0;
1.32 paf 107: virtual bool before_rows(SQL_Error& error) =0;
108: virtual bool add_row(SQL_Error& error) =0;
1.35 paf 109: virtual bool add_row_cell(SQL_Error& error, const char* str, size_t length) =0;
1.22 paf 110: };
111:
112: /// SQL driver API
113: class SQL_Driver {
114: public:
115:
1.35 paf 116: /** allocated using our allocator,
117: @todo never freed
118: */
119: static void *operator new(size_t size) {
120: void *result=::malloc(size);
121: if(!result)
122: abort();
123:
124: return result;
125: }
1.22 paf 126: /// get api version
127: virtual int api_version() =0;
128: /// initialize driver by loading sql dynamic link library
1.35 paf 129: virtual const char* initialize(char *dlopen_file_spec) =0;
1.22 paf 130: /** connect to sql database using
1.40 ! paf 131: @param url_cstr
1.22 paf 132: format is driver specific
133:
134: @returns true+'connection' on success. 'error' on failure
135: */
1.40 ! paf 136: virtual void connect(char *url_cstr,
1.22 paf 137: SQL_Driver_services& services, void **connection) =0;
138: virtual void disconnect(void *connection) =0;
1.37 paf 139: virtual void commit(void *connection) =0;
140: virtual void rollback(void *connection) =0;
1.22 paf 141: /// @returns true to indicate that connection still alive
1.37 paf 142: virtual bool ping(void *connection) =0;
1.22 paf 143: /// encodes the string in 'from' to an escaped SQL string
1.37 paf 144: virtual const char* quote(void *connection,
1.35 paf 145: const char* str, unsigned int length) =0;
1.37 paf 146: virtual void query(void *connection,
1.35 paf 147: const char* statement, unsigned long offset, unsigned long limit,
1.22 paf 148: SQL_Driver_query_event_handlers& handlers) =0;
149: };
150:
151: typedef SQL_Driver *(*SQL_Driver_create_func)();
152:
153: #endif
E-mail: