Annotation of parser3/src/sql/pa_sql_driver.h, revision 1.42.8.1
1.22 paf 1: /** @file
2: Parser: sql driver interface.
3:
1.42.8.1! paf 4: Copyright (c) 2001-2005 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.42.8.1! paf 29: static const char * const IDENT_SQL_DRIVER_H="$Date: 2004/06/22 14:17:22 $";
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.41 paf 35: /*
36: 1..8 not logged
37: 9 introducing placeholders
38: */
39: #define SQL_DRIVER_API_VERSION 9
1.29 paf 40: #define SQL_DRIVER_CREATE create /* used in driver implementation */
41: #define SQL_DRIVER_CREATE_NAME "create" /* could not figure out how to # it :( */
42:
43: /// fields are freed elsewhere
1.32 paf 44: class SQL_Error {
1.29 paf 45: bool fdefined;
1.35 paf 46: const char* ftype;
47: const char* fcomment;
1.29 paf 48: public:
1.32 paf 49: SQL_Error():
1.29 paf 50: fdefined(false) {}
1.32 paf 51: SQL_Error(
1.35 paf 52: const char* atype,
53: const char* acomment):
1.29 paf 54: fdefined(true),
55: ftype(atype),
56: fcomment(acomment) {}
1.35 paf 57: SQL_Error(const char* acomment):
1.29 paf 58: fdefined(true),
59: ftype(0),
60: fcomment(acomment) {}
1.32 paf 61: SQL_Error& operator =(const SQL_Error& src) {
1.29 paf 62: fdefined=src.fdefined;
63: ftype=src.ftype;
64: fcomment=src.fcomment;
65: return *this;
66: }
67:
1.32 paf 68: bool defined() const { return fdefined; }
1.35 paf 69: const char* type() const { return ftype; }
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:
1.35 paf 76: /// allocates some bytes
1.22 paf 77: virtual void *malloc(size_t size) =0;
1.35 paf 78: /// allocates some bytes, user promises: no pointers inside
79: virtual void *malloc_atomic(size_t size) =0;
80: /// reallocates bytes
81: virtual void *realloc(void *ptr, size_t size) =0;
1.37 paf 82: /// $request:charset
83: virtual const char* request_charset() =0;
1.39 paf 84: /// transcoder.
85: /// WARNING: can store pointers to charset names to speedup name-to-instance resolving
86: /// so do NOT pass pointers to local vars and change those vars after that
1.37 paf 87: virtual void transcode(const char* src, size_t src_length,
88: const char*& dst, size_t& dst_length,
89: const char* charset_from_name,
90: const char* charset_to_name
91: ) =0;
1.22 paf 92: /// prepare throw exception
1.32 paf 93: virtual void _throw(const SQL_Error& e) =0;
1.22 paf 94: /// throw C++ exception from prepared
95: virtual void propagate_exception() =0;
1.29 paf 96: /// helper func
1.35 paf 97: void _throw(const char* comment) { _throw(SQL_Error("sql.connect", comment)); }
1.22 paf 98: public:
99: /// regretrully public, because can't make stack frames: "nowhere to return to"
100: jmp_buf mark;
101: };
102:
1.32 paf 103: /** events, occuring when SQL_Driver::query()-ing.
104:
105: when OK must return false.
106: must NOT throw exceptions, must store them to error & return true.
107: */
1.22 paf 108: class SQL_Driver_query_event_handlers {
109: public:
1.35 paf 110: virtual bool add_column(SQL_Error& error, const char* str, size_t length) =0;
1.32 paf 111: virtual bool before_rows(SQL_Error& error) =0;
112: virtual bool add_row(SQL_Error& error) =0;
1.35 paf 113: virtual bool add_row_cell(SQL_Error& error, const char* str, size_t length) =0;
1.22 paf 114: };
115:
116: /// SQL driver API
117: class SQL_Driver {
118: public:
119:
1.42 paf 120: /// @todo can be optimized to contain type information,
121: /// to pass IN and OUT int/double NOT in string format
1.41 paf 122: struct Placeholder {
123: const char* name;
124: const char* value;
125: bool is_null;
126: bool were_updated;
127: };
128:
1.35 paf 129: /** allocated using our allocator,
130: @todo never freed
131: */
132: static void *operator new(size_t size) {
133: void *result=::malloc(size);
134: if(!result)
135: abort();
136:
137: return result;
138: }
1.22 paf 139: /// get api version
140: virtual int api_version() =0;
141: /// initialize driver by loading sql dynamic link library
1.35 paf 142: virtual const char* initialize(char *dlopen_file_spec) =0;
1.22 paf 143: /** connect to sql database using
1.40 paf 144: @param url_cstr
1.22 paf 145: format is driver specific
146:
147: @returns true+'connection' on success. 'error' on failure
148: */
1.40 paf 149: virtual void connect(char *url_cstr,
1.22 paf 150: SQL_Driver_services& services, void **connection) =0;
151: virtual void disconnect(void *connection) =0;
1.37 paf 152: virtual void commit(void *connection) =0;
153: virtual void rollback(void *connection) =0;
1.22 paf 154: /// @returns true to indicate that connection still alive
1.37 paf 155: virtual bool ping(void *connection) =0;
1.22 paf 156: /// encodes the string in 'from' to an escaped SQL string
1.37 paf 157: virtual const char* quote(void *connection,
1.35 paf 158: const char* str, unsigned int length) =0;
1.37 paf 159: virtual void query(void *connection,
1.41 paf 160: const char* statement,
161: size_t placeholders_count, Placeholder* placeholders,
162: unsigned long offset, unsigned long limit,
1.22 paf 163: SQL_Driver_query_event_handlers& handlers) =0;
164: };
165:
166: typedef SQL_Driver *(*SQL_Driver_create_func)();
167:
168: #endif
E-mail: