annotate src/lib-sql/sql-api.c @ 10410:b757dab45756 HEAD

Removed MEMBER() macro. Require C99 style struct initializer.
author Timo Sirainen <tss@iki.fi>
date Fri, 04 Dec 2009 13:52:35 -0600
parents 551c273f4844
children 615eef3139c2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
1 /* Copyright (c) 2004-2009 Dovecot authors, see the included COPYING file */
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
4 #include "array.h"
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "sql-api-private.h"
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
7 #include <stdlib.h>
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
8
6478
1e07f47e5e1e Added sql_db_module_register for module_contexts users.
Timo Sirainen <tss@iki.fi>
parents: 6476
diff changeset
9 struct sql_db_module_register sql_db_module_register = { 0 };
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
10 ARRAY_TYPE(sql_drivers) sql_drivers;
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
11
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
12 void sql_drivers_init(void)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
13 {
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
14 i_array_init(&sql_drivers, 8);
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
15 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
16
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
17 void sql_drivers_deinit(void)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
18 {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
19 array_free(&sql_drivers);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
20 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
21
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
22 void sql_driver_register(const struct sql_db *driver)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
23 {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
24 array_append(&sql_drivers, &driver, 1);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
25 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
26
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
27 void sql_driver_unregister(const struct sql_db *driver)
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
28 {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
29 const struct sql_db *const *drivers;
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
30 unsigned int i, count;
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
31
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
32 drivers = array_get(&sql_drivers, &count);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
33 for (i = 0; i < count; i++) {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
34 if (drivers[i] == driver) {
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
35 array_delete(&sql_drivers, i, 1);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
36 break;
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
37 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
38 }
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
39 }
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
40
2757
b0e039ad5717 warning fix when not compiled with any sql drivers
Timo Sirainen <tss@iki.fi>
parents: 2754
diff changeset
41 struct sql_db *sql_init(const char *db_driver,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
42 const char *connect_string ATTR_UNUSED)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 {
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
44 const struct sql_db *const *drivers;
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
45 unsigned int i, count;
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
46 struct sql_db *db;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
47
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
48 drivers = array_get(&sql_drivers, &count);
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3919
diff changeset
49 for (i = 0; i < count; i++) {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
50 if (strcmp(db_driver, drivers[i]->name) == 0) {
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
51 db = drivers[i]->v.init(connect_string);
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
52 i_array_init(&db->module_contexts, 5);
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
53 return db;
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
54 }
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
55 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 i_fatal("Unknown database driver '%s'", db_driver);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
60 void sql_deinit(struct sql_db **_db)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
62 struct sql_db *db = *_db;
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
63
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
64 *_db = NULL;
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
65 db->v.deinit(db);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67
3421
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
68 enum sql_db_flags sql_get_flags(struct sql_db *db)
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
69 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
70 return db->v.get_flags(db);
3421
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
71 }
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
72
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
73 int sql_connect(struct sql_db *db)
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
74 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
75 return db->v.connect(db);
3421
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
76 }
c624ffa9e6f0 Added sql_connect() to do explicit connecting. sql_init() no longer does.
Timo Sirainen <tss@iki.fi>
parents: 3163
diff changeset
77
4458
3e196acd60b7 sql_escape_string() should return const char *, not char *.
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
78 const char *sql_escape_string(struct sql_db *db, const char *string)
4294
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
79 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
80 return db->v.escape_string(db, string);
4294
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
81 }
1a98cb709395 Added sql_escape_string()
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
82
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 void sql_exec(struct sql_db *db, const char *query)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
85 db->v.exec(db, query);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
88 #undef sql_query
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 void sql_query(struct sql_db *db, const char *query,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 sql_query_callback_t *callback, void *context)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
92 db->v.query(db, query, callback, context);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
95 struct sql_result *sql_query_s(struct sql_db *db, const char *query)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
96 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
97 return db->v.query_s(db, query);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
98 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
99
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
100 void sql_result_ref(struct sql_result *result)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
101 {
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
102 result->refcount++;
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
103 }
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
104
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
105 void sql_result_unref(struct sql_result *result)
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
106 {
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
107 i_assert(result->refcount > 0);
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
108 if (--result->refcount > 0)
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
109 return;
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
110
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
111 i_free(result->map);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
112 result->v.free(result);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
113 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
114
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
115 static const struct sql_field_def *
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
116 sql_field_def_find(const struct sql_field_def *fields, const char *name)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
117 {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
118 unsigned int i;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
119
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
120 for (i = 0; fields[i].name != NULL; i++) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
121 if (strcasecmp(fields[i].name, name) == 0)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
122 return &fields[i];
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
123 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
124 return NULL;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
125 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
126
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
127 static void
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
128 sql_result_build_map(struct sql_result *result,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
129 const struct sql_field_def *fields, size_t dest_size)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
130 {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
131 const struct sql_field_def *def;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
132 const char *name;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
133 unsigned int i, count, field_size = 0;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
134
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
135 count = sql_result_get_fields_count(result);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
136
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
137 result->map_size = count;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
138 result->map = i_new(struct sql_field_map, result->map_size);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
139 for (i = 0; i < count; i++) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
140 name = sql_result_get_field_name(result, i);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
141 def = sql_field_def_find(fields, name);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
142 if (def != NULL) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
143 result->map[i].type = def->type;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
144 result->map[i].offset = def->offset;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
145 switch (def->type) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
146 case SQL_TYPE_STR:
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
147 field_size = sizeof(const char *);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
148 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
149 case SQL_TYPE_UINT:
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
150 field_size = sizeof(unsigned int);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
151 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
152 case SQL_TYPE_ULLONG:
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
153 field_size = sizeof(unsigned long long);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
154 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
155 case SQL_TYPE_BOOL:
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
156 field_size = sizeof(bool);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
157 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
158 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
159 i_assert(def->offset + field_size <= dest_size);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
160 } else {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
161 result->map[i].offset = (size_t)-1;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
162 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
163 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
164 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
165
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
166 void sql_result_setup_fetch(struct sql_result *result,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
167 const struct sql_field_def *fields,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
168 void *dest, size_t dest_size)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
169 {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
170 if (result->map == NULL)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
171 sql_result_build_map(result, fields, dest_size);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
172 result->fetch_dest = dest;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
173 result->fetch_dest_size = dest_size;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
174 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
175
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
176 static void sql_result_fetch(struct sql_result *result)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
177 {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
178 unsigned int i, count;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
179 const char *value;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
180 void *ptr;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
181
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
182 memset(result->fetch_dest, 0, result->fetch_dest_size);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
183 count = result->map_size;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
184 for (i = 0; i < count; i++) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
185 if (result->map[i].offset == (size_t)-1)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
186 continue;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
187
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
188 value = sql_result_get_field_value(result, i);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
189 ptr = STRUCT_MEMBER_P(result->fetch_dest,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
190 result->map[i].offset);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
191
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
192 switch (result->map[i].type) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
193 case SQL_TYPE_STR: {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
194 *((const char **)ptr) = value;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
195 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
196 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
197 case SQL_TYPE_UINT: {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
198 if (value != NULL) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
199 *((unsigned int *)ptr) =
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
200 strtoul(value, NULL, 10);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
201 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
202 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
203 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
204 case SQL_TYPE_ULLONG: {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
205 if (value != NULL) {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
206 *((unsigned long long *)ptr) =
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
207 strtoull(value, NULL, 10);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
208 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
209 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
210 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
211 case SQL_TYPE_BOOL: {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
212 if (value != NULL && (*value == 't' || *value == '1'))
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
213 *((bool *)ptr) = TRUE;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
214 break;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
215 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
216 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
217 }
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
218 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
219
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 int sql_result_next_row(struct sql_result *result)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
222 int ret;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
223
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
224 if ((ret = result->v.next_row(result)) <= 0)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
225 return ret;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
226
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
227 if (result->fetch_dest != NULL)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
228 sql_result_fetch(result);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
229 return 1;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 unsigned int sql_result_get_fields_count(struct sql_result *result)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
234 return result->v.get_fields_count(result);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 const char *sql_result_get_field_name(struct sql_result *result,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 unsigned int idx)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
240 return result->v.get_field_name(result, idx);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 int sql_result_find_field(struct sql_result *result, const char *field_name)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
245 return result->v.find_field(result, field_name);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 const char *sql_result_get_field_value(struct sql_result *result,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 unsigned int idx)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
251 return result->v.get_field_value(result, idx);
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
252 }
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
253
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
254 const unsigned char *
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
255 sql_result_get_field_value_binary(struct sql_result *result,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
256 unsigned int idx, size_t *size_r)
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
257 {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
258 return result->v.get_field_value_binary(result, idx, size_r);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 const char *sql_result_find_field_value(struct sql_result *result,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 const char *field_name)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
264 return result->v.find_field_value(result, field_name);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 const char *const *sql_result_get_values(struct sql_result *result)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
269 return result->v.get_values(result);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 const char *sql_result_get_error(struct sql_result *result)
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
274 return result->v.get_error(result);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
277 static void
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
278 sql_result_not_connected_free(struct sql_result *result ATTR_UNUSED)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
279 {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
280 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
281
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 static int
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
283 sql_result_not_connected_next_row(struct sql_result *result ATTR_UNUSED)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 return -1;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 static const char *
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
289 sql_result_not_connected_get_error(struct sql_result *result ATTR_UNUSED)
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 {
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 return "Not connected to database";
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 }
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
294 struct sql_transaction_context *sql_transaction_begin(struct sql_db *db)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
295 {
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
296 return db->v.transaction_begin(db);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
297 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
298
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
299 #undef sql_transaction_commit
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
300 void sql_transaction_commit(struct sql_transaction_context **_ctx,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
301 sql_commit_callback_t *callback, void *context)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
302 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
303 struct sql_transaction_context *ctx = *_ctx;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
304
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
305 *_ctx = NULL;
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
306 ctx->db->v.transaction_commit(ctx, callback, context);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
307 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
308
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
309 int sql_transaction_commit_s(struct sql_transaction_context **_ctx,
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
310 const char **error_r)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
311 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
312 struct sql_transaction_context *ctx = *_ctx;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
313
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
314 *_ctx = NULL;
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
315 return ctx->db->v.transaction_commit_s(ctx, error_r);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
316 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
317
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
318 void sql_transaction_rollback(struct sql_transaction_context **_ctx)
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
319 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
320 struct sql_transaction_context *ctx = *_ctx;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
321
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3736
diff changeset
322 *_ctx = NULL;
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
323 ctx->db->v.transaction_rollback(ctx);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
324 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
325
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
326 void sql_update(struct sql_transaction_context *ctx, const char *query)
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
327 {
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
328 sql_update_get_rows(ctx, query, NULL);
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
329 }
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
330
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
331 void sql_update_get_rows(struct sql_transaction_context *ctx, const char *query,
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
332 unsigned int *affected_rows)
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
333 {
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
334 ctx->db->v.update(ctx, query, affected_rows);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
335 }
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
336
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 struct sql_result sql_not_connected_result = {
10410
b757dab45756 Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
338 .v = {
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
339 sql_result_not_connected_free,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
340 sql_result_not_connected_next_row,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
341 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
342 sql_result_not_connected_get_error
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
343 }
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 };