]>
jfr.im git - irc/rqf/shadowircd.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.
37 struct sqlite3
*rb_bandb
;
39 rsdb_error_cb
*error_cb
;
42 mlog(const char *errstr
, ...)
49 rb_vsnprintf(buf
, sizeof(buf
), errstr
, ap
);
58 rsdb_init(rsdb_error_cb
* ecb
)
60 const char *bandb_dpath
;
61 char dbpath
[PATH_MAX
];
65 /* try a path from the environment first, useful for basedir overrides */
66 bandb_dpath
= getenv("BANDB_DPATH");
68 if(bandb_dpath
!= NULL
)
69 rb_snprintf(dbpath
, sizeof(dbpath
), "%s/etc/ban.db", bandb_dpath
);
71 rb_strlcpy(dbpath
, DBPATH
, sizeof(dbpath
));
73 if(sqlite3_open(dbpath
, &rb_bandb
) != SQLITE_OK
)
75 rb_snprintf(errbuf
, sizeof(errbuf
), "Unable to open sqlite database: %s",
76 sqlite3_errmsg(rb_bandb
));
80 if(access(dbpath
, W_OK
))
82 rb_snprintf(errbuf
, sizeof(errbuf
), "Unable to open sqlite database for write: %s", strerror(errno
));
93 sqlite3_close(rb_bandb
);
97 rsdb_quote(const char *src
)
99 static char buf
[BUFSIZE
* 4];
102 /* cheap and dirty length check.. */
103 if(strlen(src
) >= (sizeof(buf
) / 2))
119 rsdb_callback_func(void *cbfunc
, int argc
, char **argv
, char **colnames
)
121 rsdb_callback cb
= (rsdb_callback
)((uintptr_t)cbfunc
);
122 (cb
) (argc
, (const char **)argv
);
127 rsdb_exec(rsdb_callback cb
, const char *format
, ...)
129 static char buf
[BUFSIZE
* 4];
135 va_start(args
, format
);
136 i
= rs_vsnprintf(buf
, sizeof(buf
), format
, args
);
141 mlog("fatal error: length problem with compiling sql");
144 if((i
= sqlite3_exec(rb_bandb
, buf
, (cb
? rsdb_callback_func
: NULL
), (void *)((uintptr_t)cb
), &errmsg
)))
149 for(j
= 0; j
< 5; j
++)
153 (rb_bandb
, buf
, (cb
? rsdb_callback_func
: NULL
), (void *)((uintptr_t)cb
), &errmsg
))
157 /* failed, fall through to default */
158 mlog("fatal error: problem with db file: %s", errmsg
);
162 mlog("fatal error: problem with db file: %s", errmsg
);
169 rsdb_exec_fetch(struct rsdb_table
*table
, const char *format
, ...)
171 static char buf
[BUFSIZE
* 4];
179 va_start(args
, format
);
180 retval
= rs_vsnprintf(buf
, sizeof(buf
), format
, args
);
183 if(retval
>= sizeof(buf
))
185 mlog("fatal error: length problem with compiling sql");
189 sqlite3_get_table(rb_bandb
, buf
, &data
, &table
->row_count
, &table
->col_count
, &errmsg
)))
196 for(i
= 0; i
< 5; i
++)
199 if(!sqlite3_get_table
200 (rb_bandb
, buf
, &data
, &table
->row_count
, &table
->col_count
,
211 mlog("fatal error: problem with db file: %s", errmsg
);
215 mlog("fatal error: problem with db file: %s", errmsg
);
220 /* we need to be able to free data afterward */
223 if(table
->row_count
== 0)
229 /* sqlite puts the column names as the first row */
230 pos
= table
->col_count
;
231 table
->row
= rb_malloc(sizeof(char **) * table
->row_count
);
232 for(i
= 0; i
< table
->row_count
; i
++)
234 table
->row
[i
] = rb_malloc(sizeof(char *) * table
->col_count
);
236 for(j
= 0; j
< table
->col_count
; j
++)
238 table
->row
[i
][j
] = data
[pos
++];
244 rsdb_exec_fetch_end(struct rsdb_table
*table
)
248 for(i
= 0; i
< table
->row_count
; i
++)
250 rb_free(table
->row
[i
]);
254 sqlite3_free_table((char **)table
->arg
);
258 rsdb_transaction(rsdb_transtype type
)
260 if(type
== RSDB_TRANS_START
)
261 rsdb_exec(NULL
, "BEGIN TRANSACTION");
262 else if(type
== RSDB_TRANS_END
)
263 rsdb_exec(NULL
, "COMMIT TRANSACTION");