]>
jfr.im git - solanum.git/blob - bandb/rsdb_sqlite3.c
2 * Contains the code for the sqlite database backend.
4 * Copyright (C) 2003-2006 Lee Hardy <leeh@leeh.co.uk>
5 * Copyright (C) 2003-2006 ircd-ratbox development team
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
11 * 1.Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the following disclaimer.
13 * 2.Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3.The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
23 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
28 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
36 struct sqlite3
*rb_bandb
;
38 rsdb_error_cb
*error_cb
;
41 mlog(const char *errstr
, ...)
48 vsnprintf(buf
, sizeof(buf
), errstr
, ap
);
57 rsdb_init(rsdb_error_cb
* ecb
)
59 const char *bandb_dbpath_env
;
60 char dbpath
[PATH_MAX
];
64 /* try a path from the environment first, useful for basedir overrides */
65 bandb_dbpath_env
= getenv("BANDB_DBPATH");
67 if(bandb_dbpath_env
!= NULL
)
68 rb_strlcpy(dbpath
, bandb_dbpath_env
, sizeof(dbpath
));
70 rb_strlcpy(dbpath
, DBPATH
, sizeof(dbpath
));
72 if(sqlite3_open(dbpath
, &rb_bandb
) != SQLITE_OK
)
74 snprintf(errbuf
, sizeof(errbuf
), "Unable to open sqlite database: %s",
75 sqlite3_errmsg(rb_bandb
));
79 if(access(dbpath
, W_OK
))
81 snprintf(errbuf
, sizeof(errbuf
), "Unable to open sqlite database for write: %s", strerror(errno
));
92 sqlite3_close(rb_bandb
);
96 rsdb_quote(const char *src
)
98 static char buf
[BUFSIZE
* 4];
101 /* cheap and dirty length check.. */
102 if(strlen(src
) >= (sizeof(buf
) / 2))
118 rsdb_callback_func(void *cbfunc
, int argc
, char **argv
, char **colnames
)
120 rsdb_callback cb
= (rsdb_callback
)((uintptr_t)cbfunc
);
121 (cb
) (argc
, (const char **)(void *)argv
);
126 rsdb_exec(rsdb_callback cb
, const char *format
, ...)
128 static char buf
[BUFSIZE
* 4];
134 va_start(args
, format
);
135 i
= rs_vsnprintf(buf
, sizeof(buf
), format
, args
);
140 mlog("fatal error: length problem with compiling sql");
143 if((i
= sqlite3_exec(rb_bandb
, buf
, (cb
? rsdb_callback_func
: NULL
), (void *)((uintptr_t)cb
), &errmsg
)))
148 for(j
= 0; j
< 5; j
++)
152 (rb_bandb
, buf
, (cb
? rsdb_callback_func
: NULL
), (void *)((uintptr_t)cb
), &errmsg
))
156 /* failed, fall through to default */
157 mlog("fatal error: problem with db file: %s", errmsg
);
161 mlog("fatal error: problem with db file: %s", errmsg
);
168 rsdb_exec_fetch(struct rsdb_table
*table
, const char *format
, ...)
170 static char buf
[BUFSIZE
* 4];
178 va_start(args
, format
);
179 retval
= rs_vsnprintf(buf
, sizeof(buf
), format
, args
);
182 if(retval
>= sizeof(buf
))
184 mlog("fatal error: length problem with compiling sql");
188 sqlite3_get_table(rb_bandb
, buf
, &data
, &table
->row_count
, &table
->col_count
, &errmsg
)))
195 for(i
= 0; i
< 5; i
++)
198 if(!sqlite3_get_table
199 (rb_bandb
, buf
, &data
, &table
->row_count
, &table
->col_count
,
210 mlog("fatal error: problem with db file: %s", errmsg
);
214 mlog("fatal error: problem with db file: %s", errmsg
);
219 /* we need to be able to free data afterward */
222 if(table
->row_count
== 0)
228 /* sqlite puts the column names as the first row */
229 pos
= table
->col_count
;
230 table
->row
= rb_malloc(sizeof(char **) * table
->row_count
);
231 for(i
= 0; i
< table
->row_count
; i
++)
233 table
->row
[i
] = rb_malloc(sizeof(char *) * table
->col_count
);
235 for(j
= 0; j
< table
->col_count
; j
++)
237 table
->row
[i
][j
] = data
[pos
++];
243 rsdb_exec_fetch_end(struct rsdb_table
*table
)
247 for(i
= 0; i
< table
->row_count
; i
++)
249 rb_free(table
->row
[i
]);
253 sqlite3_free_table((char **)table
->arg
);
257 rsdb_transaction(rsdb_transtype type
)
259 if(type
== RSDB_TRANS_START
)
260 rsdb_exec(NULL
, "BEGIN TRANSACTION");
261 else if(type
== RSDB_TRANS_END
)
262 rsdb_exec(NULL
, "COMMIT TRANSACTION");