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