dbd/common.c

Sat, 13 Jun 2009 08:55:44 +0000

author
nrich@ii.net
date
Sat, 13 Jun 2009 08:55:44 +0000
changeset 31
999ef93f0dbc
parent 28
44b1d78b50f5
permissions
-rw-r--r--

* Add `columns' method for DB2 and Oracle statment handles
* Misc cleanup

17
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
1 #include <dbd/common.h>
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
2
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
3 const char *strlower(char *in) {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
4 char *s = in;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
5
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
6 while(*s) {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
7 *s= (*s <= 'Z' && *s >= 'A') ? (*s - 'A') + 'a' : *s;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
8 s++;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
9 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
10
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
11 return in;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
12 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
13
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
14 /*
28
44b1d78b50f5 Clean up comments.
nrich@ii.net
parents: 17
diff changeset
15 * replace '?' placeholders with {native_prefix}\d+ placeholders
44b1d78b50f5 Clean up comments.
nrich@ii.net
parents: 17
diff changeset
16 * to be compatible with native API
17
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
17 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
18 char *replace_placeholders(lua_State *L, char native_prefix, const char *sql) {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
19 size_t len = strlen(sql);
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
20 int num_placeholders = 0;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
21 int extra_space = 0;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
22 int i;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
23 char *newsql;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
24 int newpos = 1;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
25 int ph_num = 1;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
26 int in_quote = 0;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
27 char format_str[4];
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
28
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
29 format_str[0] = native_prefix;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
30 format_str[1] = '%';
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
31 format_str[2] = 'u';
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
32 format_str[3] = '\0';
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
33
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
34 /*
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
35 * dumb count of all '?'
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
36 * this will match more placeholders than necessesary
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
37 * but it's safer to allocate more placeholders at the
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
38 * cost of a few bytes than risk a buffer overflow
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
39 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
40 for (i = 1; i < len; i++) {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
41 if (sql[i] == '?') {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
42 num_placeholders++;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
43 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
44 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
45
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
46 /*
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
47 * this is MAX_PLACEHOLDER_SIZE-1 because the '?' is
31
999ef93f0dbc * Add `columns' method for DB2 and Oracle statment handles
nrich@ii.net
parents: 28
diff changeset
48 * replaced with '{native_prefix}'
17
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
49 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
50 extra_space = num_placeholders * (MAX_PLACEHOLDER_SIZE-1);
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
51
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
52 /*
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
53 * allocate a new string for the converted SQL statement
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
54 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
55 newsql = malloc(sizeof(char) * (len+extra_space+1));
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
56 memset(newsql, 0, sizeof(char) * (len+extra_space+1));
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
57
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
58 /*
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
59 * copy first char. In valid SQL this cannot be a placeholder
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
60 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
61 newsql[0] = sql[0];
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
62
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
63 /*
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
64 * only replace '?' not in a single quoted string
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
65 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
66 for (i = 1; i < len; i++) {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
67 /*
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
68 * don't change the quote flag if the ''' is preceded
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
69 * by a '\' to account for escaping
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
70 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
71 if (sql[i] == '\'' && sql[i-1] != '\\') {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
72 in_quote = !in_quote;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
73 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
74
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
75 if (sql[i] == '?' && !in_quote) {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
76 size_t n;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
77
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
78 if (ph_num > MAX_PLACEHOLDERS) {
28
44b1d78b50f5 Clean up comments.
nrich@ii.net
parents: 17
diff changeset
79 luaL_error(L, "Sorry, you are using more than %d placeholders. Use %c{num} format instead", MAX_PLACEHOLDERS, native_prefix);
17
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
80 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
81
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
82 n = snprintf(&newsql[newpos], MAX_PLACEHOLDER_SIZE, format_str, ph_num++);
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
83
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
84 newpos += n;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
85 } else {
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
86 newsql[newpos] = sql[i];
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
87 newpos++;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
88 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
89 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
90
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
91 /*
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
92 * terminate string on the last position
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
93 */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
94 newsql[newpos] = '\0';
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
95
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
96 /* fprintf(stderr, "[%s]\n", newsql); */
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
97 return newsql;
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
98 }
21c4feaeafe7 Added initial Oracle driver support - functionality is complete, but may be too buggy in its current state for any serious use.
nrich@ii.net
parents:
diff changeset
99

mercurial