]>
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.
31 * $Id: rsdb_sqlite3.c 26182 2008-11-11 02:52:41Z androsyn $
38 struct sqlite3
*rb_bandb
;
40 rsdb_error_cb
*error_cb
;
43 mlog(const char *errstr
, ...)
50 rb_vsnprintf(buf
, sizeof(buf
), errstr
, ap
);
59 rsdb_init(rsdb_error_cb
* ecb
)
61 const char *bandb_dbpath_env
;
62 char dbpath
[PATH_MAX
];
66 /* try a path from the environment first, useful for basedir overrides */
67 bandb_dbpath_env
= getenv("BANDB_DBPATH");
69 if(bandb_dbpath_env
!= NULL
)
70 rb_strlcpy(dbpath
, bandb_dbpath_env
, sizeof(dbpath
));
72 rb_strlcpy(dbpath
, DBPATH
, sizeof(dbpath
));
74 if(sqlite3_open(dbpath
, &rb_bandb
) != SQLITE_OK
)
76 rb_snprintf(errbuf
, sizeof(errbuf
), "Unable to open sqlite database: %s",
77 sqlite3_errmsg(rb_bandb
));
81 if(access(dbpath
, W_OK
))
83 rb_snprintf(errbuf
, sizeof(errbuf
), "Unable to open sqlite database for write: %s", strerror(errno
));
94 sqlite3_close(rb_bandb
);
98 rsdb_quote(const char *src
)
100 static char buf
[BUFSIZE
* 4];
103 /* cheap and dirty length check.. */
104 if(strlen(src
) >= (sizeof(buf
) / 2))
120 rsdb_callback_func(void *cbfunc
, int argc
, char **argv
, char **colnames
)
122 rsdb_callback cb
= (rsdb_callback
)((uintptr_t)cbfunc
);
123 (cb
) (argc
, (const char **)argv
);
128 rsdb_exec(rsdb_callback cb
, const char *format
, ...)
130 static char buf
[BUFSIZE
* 4];
136 va_start(args
, format
);
137 i
= rs_vsnprintf(buf
, sizeof(buf
), format
, args
);
142 mlog("fatal error: length problem with compiling sql");
145 if((i
= sqlite3_exec(rb_bandb
, buf
, (cb
? rsdb_callback_func
: NULL
), (void *)((uintptr_t)cb
), &errmsg
)))
150 for(j
= 0; j
< 5; j
++)
154 (rb_bandb
, buf
, (cb
? rsdb_callback_func
: NULL
), (void *)((uintptr_t)cb
), &errmsg
))
158 /* failed, fall through to default */
159 mlog("fatal error: problem with db file: %s", errmsg
);
163 mlog("fatal error: problem with db file: %s", errmsg
);
170 rsdb_exec_fetch(struct rsdb_table
*table
, const char *format
, ...)
172 static char buf
[BUFSIZE
* 4];
180 va_start(args
, format
);
181 retval
= rs_vsnprintf(buf
, sizeof(buf
), format
, args
);
184 if(retval
>= sizeof(buf
))
186 mlog("fatal error: length problem with compiling sql");
190 sqlite3_get_table(rb_bandb
, buf
, &data
, &table
->row_count
, &table
->col_count
, &errmsg
)))
197 for(i
= 0; i
< 5; i
++)
200 if(!sqlite3_get_table
201 (rb_bandb
, buf
, &data
, &table
->row_count
, &table
->col_count
,
212 mlog("fatal error: problem with db file: %s", errmsg
);
216 mlog("fatal error: problem with db file: %s", errmsg
);
221 /* we need to be able to free data afterward */
224 if(table
->row_count
== 0)
230 /* sqlite puts the column names as the first row */
231 pos
= table
->col_count
;
232 table
->row
= rb_malloc(sizeof(char **) * table
->row_count
);
233 for(i
= 0; i
< table
->row_count
; i
++)
235 table
->row
[i
] = rb_malloc(sizeof(char *) * table
->col_count
);
237 for(j
= 0; j
< table
->col_count
; j
++)
239 table
->row
[i
][j
] = data
[pos
++];
245 rsdb_exec_fetch_end(struct rsdb_table
*table
)
249 for(i
= 0; i
< table
->row_count
; i
++)
251 rb_free(table
->row
[i
]);
255 sqlite3_free_table((char **)table
->arg
);
259 rsdb_transaction(rsdb_transtype type
)
261 if(type
== RSDB_TRANS_START
)
262 rsdb_exec(NULL
, "BEGIN TRANSACTION");
263 else if(type
== RSDB_TRANS_END
)
264 rsdb_exec(NULL
, "COMMIT TRANSACTION");