dbd/postgresql/statement.c

Sun, 13 Jun 2010 13:20:03 +0000

author
nrich@ii.net
date
Sun, 13 Jun 2010 13:20:03 +0000
changeset 38
627506d80e5b
parent 33
6c64c45e7d8f
permissions
-rw-r--r--

Fix bug in statemnt dealloc in psql driver

1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
1 #include "dbd_postgresql.h"
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
2
33
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
3 #define BOOLOID 16
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
4 #define INT2OID 21
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
5 #define INT4OID 23
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
6 #define INT8OID 20
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
7 #define FLOAT4OID 700
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
8 #define FLOAT8OID 701
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
9
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
10 static lua_push_type_t postgresql_to_lua_push(unsigned int postgresql_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
11 lua_push_type_t lua_type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
12
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
13 switch(postgresql_type) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
14 case INT2OID:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
15 case INT4OID:
20
5ab0b30f8fbd Bugfix: the type return by 'select count(...)' was being pushed as a string because of missing psql => lua type mapping.
nrich@ii.net
parents: 17
diff changeset
16 case INT8OID:
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
17 lua_type = LUA_PUSH_INTEGER;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
18 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
19
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
20 case FLOAT4OID:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
21 case FLOAT8OID:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
22 lua_type = LUA_PUSH_NUMBER;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
23 break;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
24
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
25 case BOOLOID:
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
26 lua_type = LUA_PUSH_BOOLEAN;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
27 break;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
28
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
29 default:
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
30 lua_type = LUA_PUSH_STRING;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
31 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
32
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
33 return lua_type;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
34 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
35
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
36 static int deallocate(statement_t *statement) {
38
627506d80e5b Fix bug in statemnt dealloc in psql driver
nrich@ii.net
parents: 33
diff changeset
37 char command[IDLEN+13];
33
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
38 PGresult *result;
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
39 ExecStatusType status;
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
40
38
627506d80e5b Fix bug in statemnt dealloc in psql driver
nrich@ii.net
parents: 33
diff changeset
41 snprintf(command, IDLEN+13, "DEALLOCATE \"%s\"", statement->name);
33
6c64c45e7d8f * Fix MySQL date/time types
nrich@ii.net
parents: 32
diff changeset
42 result = PQexec(statement->postgresql, command);
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
43
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
44 if (!result)
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
45 return 1;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
46
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
47 status = PQresultStatus(result);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
48 PQclear(result);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
49
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
50 if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK)
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
51 return 1;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
52
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
53 return 0;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
54 }
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
55
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
56
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
57 /*
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
58 * num_affected_rows = statement:affected()
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
59 */
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
60 static int statement_affected(lua_State *L) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
61 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_STATEMENT);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
62
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
63 if (!statement->result) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
64 luaL_error(L, DBI_ERR_INVALID_STATEMENT);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
65 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
66
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
67 lua_pushinteger(L, atoi(PQcmdTuples(statement->result)));
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
68
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
69 return 1;
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
70 }
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
71
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
72 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
73 * success = statement:close()
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
74 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
75 static int statement_close(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
76 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
77
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
78 if (statement->result) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
79 /*
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
80 * Deallocate prepared statement on the
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
81 * server side
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
82 */
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
83 deallocate(statement);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
84
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
85 PQclear(statement->result);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
86 statement->result = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
87 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
88
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
89 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
90 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
91
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
92 /*
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
93 * column_names = statement:columns()
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
94 */
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
95 static int statement_columns(lua_State *L) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
96 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_STATEMENT);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
97
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
98 int i;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
99 int num_columns;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
100 int d = 1;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
101
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
102 if (!statement->result) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
103 luaL_error(L, DBI_ERR_INVALID_STATEMENT);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
104 return 0;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
105 }
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
106
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
107 num_columns = PQnfields(statement->result);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
108 lua_newtable(L);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
109 for (i = 0; i < num_columns; i++) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
110 const char *name = PQfname(statement->result, i);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
111
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
112 LUA_PUSH_ARRAY_STRING(d, name);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
113 }
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
114
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
115 return 1;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
116 }
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
117
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
118 /*
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
119 * success = statement:execute(...)
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
120 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
121 static int statement_execute(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
122 int n = lua_gettop(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
123 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
124 int num_bind_params = n - 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
125 ExecStatusType status;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
126 int p;
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
127 const char *errstr = NULL;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
128
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 8
diff changeset
129 const char **params;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
130 PGresult *result = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
131
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
132 statement->tuple = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
133
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
134 params = malloc(num_bind_params * sizeof(params));
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
135 memset(params, 0, num_bind_params * sizeof(params));
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
136
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
137 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
138 * convert and copy parameters into a string array
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
139 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
140 for (p = 2; p <= n; p++) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
141 int i = p - 2;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
142 int type = lua_type(L, p);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
143 char err[64];
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
144
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
145 switch(type) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
146 case LUA_TNIL:
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
147 params[i] = NULL;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
148 break;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
149 case LUA_TBOOLEAN:
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
150 /*
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
151 * boolean values in postgresql can either be
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
152 * t/f or 1/0. Pass integer values rather than
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
153 * strings to maintain semantic compatibility
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
154 * with other DBD drivers that pass booleans
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
155 * as integers.
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
156 */
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
157 params[i] = lua_toboolean(L, p) ? "1" : "0";
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
158 break;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
159 case LUA_TNUMBER:
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
160 case LUA_TSTRING:
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
161 params[i] = lua_tostring(L, p);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
162 break;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
163 default:
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
164 snprintf(err, sizeof(err)-1, DBI_ERR_BINDING_TYPE_ERR, lua_typename(L, type));
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
165 errstr = err;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
166 goto cleanup;
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
167 }
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
168 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
169
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
170 result = PQexecPrepared(
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
171 statement->postgresql,
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
172 statement->name,
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
173 num_bind_params,
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
174 (const char **)params,
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
175 NULL,
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
176 NULL,
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
177 0
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
178 );
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
179
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
180 cleanup:
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
181 free(params);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
182
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
183 if (errstr) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
184 lua_pushboolean(L, 0);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
185 lua_pushfstring(L, DBI_ERR_BINDING_PARAMS, errstr);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
186 return 2;
10
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
187 }
3aa8a37a3dd8 Added new typechecks and errors
nrich@ii.net
parents: 9
diff changeset
188
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
189 if (!result) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
190 lua_pushboolean(L, 0);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
191 lua_pushfstring(L, DBI_ERR_ALLOC_RESULT, PQerrorMessage(statement->postgresql));
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
192 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
193 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
194
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
195 status = PQresultStatus(result);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
196 if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
197 lua_pushboolean(L, 0);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
198 lua_pushfstring(L, DBI_ERR_BINDING_EXEC, PQresultErrorMessage(result));
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
199 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
200 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
201
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
202 statement->result = result;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
203
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
204 lua_pushboolean(L, 1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
205 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
206 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
207
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
208 /*
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
209 * can only be called after an execute
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
210 */
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
211 static int statement_fetch_impl(lua_State *L, statement_t *statement, int named_columns) {
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
212 int tuple = statement->tuple++;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
213 int i;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
214 int num_columns;
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
215 int d = 1;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
216
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
217 if (!statement->result) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
218 luaL_error(L, DBI_ERR_FETCH_INVALID);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
219 return 0;
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
220 }
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
221
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
222 if (PQresultStatus(statement->result) != PGRES_TUPLES_OK) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
223 lua_pushnil(L);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
224 return 1;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
225 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
226
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
227 if (tuple >= PQntuples(statement->result)) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
228 lua_pushnil(L); /* no more results */
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
229 return 1;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
230 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
231
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
232 num_columns = PQnfields(statement->result);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
233 lua_newtable(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
234 for (i = 0; i < num_columns; i++) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
235 const char *name = PQfname(statement->result, i);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
236
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
237 if (PQgetisnull(statement->result, tuple, i)) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
238 if (named_columns) {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
239 LUA_PUSH_ATTRIB_NIL(name);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
240 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
241 LUA_PUSH_ARRAY_NIL(d);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
242 }
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
243 } else {
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
244 const char *value = PQgetvalue(statement->result, tuple, i);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
245 lua_push_type_t lua_push = postgresql_to_lua_push(PQftype(statement->result, i));
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
246
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
247 /*
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
248 * data is returned as strings from PSQL
9
06eb2850703f Bugfix: fix connection in DBD.SQLite3.New
nrich@ii.net
parents: 8
diff changeset
249 * convert them here into Lua types
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
250 */
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
251
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
252 if (lua_push == LUA_PUSH_NIL) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
253 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
254 LUA_PUSH_ATTRIB_NIL(name);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
255 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
256 LUA_PUSH_ARRAY_NIL(d);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
257 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
258 } else if (lua_push == LUA_PUSH_INTEGER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
259 int val = atoi(value);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
260
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
261 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
262 LUA_PUSH_ATTRIB_INT(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
263 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
264 LUA_PUSH_ARRAY_INT(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
265 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
266 } else if (lua_push == LUA_PUSH_NUMBER) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
267 double val = strtod(value, NULL);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
268
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
269 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
270 LUA_PUSH_ATTRIB_FLOAT(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
271 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
272 LUA_PUSH_ARRAY_FLOAT(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
273 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
274 } else if (lua_push == LUA_PUSH_STRING) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
275 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
276 LUA_PUSH_ATTRIB_STRING(name, value);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
277 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
278 LUA_PUSH_ARRAY_STRING(d, value);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
279 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
280 } else if (lua_push == LUA_PUSH_BOOLEAN) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
281 /*
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
282 * booleans are returned as a string
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
283 * either 't' or 'f'
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
284 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
285 int val = value[0] == 't' ? 1 : 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
286
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
287 if (named_columns) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
288 LUA_PUSH_ATTRIB_BOOL(name, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
289 } else {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
290 LUA_PUSH_ARRAY_BOOL(d, val);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
291 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
292 } else {
4
c50b0e6f25d6 Clean up error messages for consistency.
nrich@ii.net
parents: 3
diff changeset
293 luaL_error(L, DBI_ERR_UNKNOWN_PUSH);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
294 }
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
295 }
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
296 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
297
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
298 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
299 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
300
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
301
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
302 static int next_iterator(lua_State *L) {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
303 statement_t *statement = (statement_t *)luaL_checkudata(L, lua_upvalueindex(1), DBD_POSTGRESQL_STATEMENT);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
304 int named_columns = lua_toboolean(L, lua_upvalueindex(2));
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
305
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
306 return statement_fetch_impl(L, statement, named_columns);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
307 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
308
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
309 /*
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
310 * table = statement:fetch(named_indexes)
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
311 */
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
312 static int statement_fetch(lua_State *L) {
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
313 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_STATEMENT);
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
314 int named_columns = lua_toboolean(L, 2);
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
315
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
316 return statement_fetch_impl(L, statement, named_columns);
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
317 }
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
318
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
319 /*
21
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
320 * num_rows = statement:rowcount()
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
321 */
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
322 static int statement_rowcount(lua_State *L) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
323 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_STATEMENT);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
324
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
325 if (!statement->result) {
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
326 luaL_error(L, DBI_ERR_INVALID_STATEMENT);
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
327 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
328
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
329 lua_pushinteger(L, PQntuples(statement->result));
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
330
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
331 return 1;
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
332 }
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
333
7956401a0c5e Added the statement:affected() and statement:rowcount() methods.
nrich@ii.net
parents: 20
diff changeset
334 /*
12
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
335 * iterfunc = statement:rows(named_indexes)
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
336 */
014ba3ab3903 Renamed statement:fetch() to statement:rows(), and statement:row() to statement:fetch(). The API reads better this way.
nrich@ii.net
parents: 11
diff changeset
337 static int statement_rows(lua_State *L) {
11
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
338 if (lua_gettop(L) == 1) {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
339 lua_pushvalue(L, 1);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
340 lua_pushboolean(L, 0);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
341 } else {
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
342 lua_pushvalue(L, 1);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
343 lua_pushboolean(L, lua_toboolean(L, 2));
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
344 }
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
345
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
346 lua_pushcclosure(L, next_iterator, 2);
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
347 return 1;
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
348 }
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
349
b3e05e361f46 Bugfix: PSQL array returns were not being indexed properly.
nrich@ii.net
parents: 10
diff changeset
350 /*
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
351 * __gc
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
352 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
353 static int statement_gc(lua_State *L) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
354 /* always free the handle */
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
355 statement_close(L);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
356
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
357 return 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
358 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
359
32
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
360 /*
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
361 * __tostring
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
362 */
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
363 static int statement_tostring(lua_State *L) {
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
364 statement_t *statement = (statement_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_STATEMENT);
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
365
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
366 lua_pushfstring(L, "%s: %p", DBD_POSTGRESQL_STATEMENT, statement);
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
367
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
368 return 1;
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
369 }
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
370
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
371 int dbd_postgresql_statement_create(lua_State *L, connection_t *conn, const char *sql_query) {
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
372 statement_t *statement = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
373 ExecStatusType status;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
374 PGresult *result = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
375 char *new_sql;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
376 char name[IDLEN];
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
377
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
378 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
379 * convert SQL string into a PSQL API compatible SQL statement
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
380 */
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: 12
diff changeset
381 new_sql = replace_placeholders(L, '$', sql_query);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
382
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
383 snprintf(name, IDLEN, "dbd-postgresql-%017u", ++conn->statement_id);
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
384
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
385 result = PQprepare(conn->postgresql, name, new_sql, 0, NULL);
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
386
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
387 /*
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
388 * free converted statement after use
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
389 */
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
390 free(new_sql);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
391
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
392 if (!result) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
393 lua_pushnil(L);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
394 lua_pushfstring(L, DBI_ERR_ALLOC_STATEMENT, PQerrorMessage(statement->postgresql));
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
395 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
396 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
397
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
398 status = PQresultStatus(result);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
399 if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
400 const char *err_string = PQresultErrorMessage(result);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
401 PQclear(result);
3
b61020ca4753 Cleanup and 'assert' error handling.
nrich@ii.net
parents: 2
diff changeset
402
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
403 lua_pushnil(L);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
404 lua_pushfstring(L, DBI_ERR_PREP_STATEMENT, err_string);
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
405 return 2;
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
406 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
407
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
408 PQclear(result);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
409
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
410 statement = (statement_t *)lua_newuserdata(L, sizeof(statement_t));
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
411 statement->postgresql = conn->postgresql;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
412 statement->result = NULL;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
413 statement->tuple = 0;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
414 strncpy(statement->name, name, IDLEN-1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
415 statement->name[IDLEN-1] = '\0';
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
416
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
417 luaL_getmetatable(L, DBD_POSTGRESQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
418 lua_setmetatable(L, -2);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
419
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
420 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
421 }
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
422
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
423 int dbd_postgresql_statement(lua_State *L) {
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
424 static const luaL_Reg statement_methods[] = {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
425 {"affected", statement_affected},
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
426 {"close", statement_close},
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
427 {"columns", statement_columns},
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
428 {"execute", statement_execute},
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
429 {"fetch", statement_fetch},
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
430 {"rowcount", statement_rowcount},
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
431 {"rows", statement_rows},
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
432 {NULL, NULL}
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
433 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
434
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
435 static const luaL_Reg statement_class_methods[] = {
30
8599f34c139b Add 'columns' method to statement handles to retrieve column names from a result set
nrich@ii.net
parents: 21
diff changeset
436 {NULL, NULL}
2
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
437 };
c4f02fc67e5a Cleanup and commenting
nrich@ii.net
parents: 1
diff changeset
438
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
439 luaL_newmetatable(L, DBD_POSTGRESQL_STATEMENT);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
440 luaL_register(L, 0, statement_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
441 lua_pushvalue(L,-1);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
442 lua_setfield(L, -2, "__index");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
443
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
444 lua_pushcfunction(L, statement_gc);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
445 lua_setfield(L, -2, "__gc");
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
446
32
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
447 lua_pushcfunction(L, statement_tostring);
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
448 lua_setfield(L, -2, "__tostring");
03ed0ca09837 Add __tostring method to connection and statement objects.
nrich@ii.net
parents: 30
diff changeset
449
1
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
450 luaL_register(L, DBD_POSTGRESQL_STATEMENT, statement_class_methods);
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
451
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
452 return 1;
408291a6eb3e Initial import.
nrich@ii.net
parents:
diff changeset
453 }

mercurial