24 |
|
|
25 |
#include "headers.h" |
#include "headers.h" |
26 |
|
|
27 |
|
#if defined(WITH_GSASL) |
28 |
|
|
29 |
struct anubis_db_type { |
struct anubis_db_type { |
30 |
char *db_id; |
char *db_id; |
31 |
anubis_db_open_t db_open; |
anubis_db_open_t db_open; |
32 |
anubis_db_close_t db_close; |
anubis_db_close_t db_close; |
33 |
anubis_db_io_t db_get_record; |
anubis_db_io_t db_get_record; |
34 |
anubis_db_io_t db_put_record; |
anubis_db_io_t db_put_record; |
35 |
|
anubis_db_delete_t db_delete; |
36 |
anubis_db_strerror_t db_strerror; |
anubis_db_strerror_t db_strerror; |
37 |
}; |
}; |
38 |
|
|
64 |
anubis_db_close_t _db_close, |
anubis_db_close_t _db_close, |
65 |
anubis_db_io_t _db_get, |
anubis_db_io_t _db_get, |
66 |
anubis_db_io_t _db_put, |
anubis_db_io_t _db_put, |
67 |
|
anubis_db_delete_t _db_delete, |
68 |
anubis_db_strerror_t _db_strerror) |
anubis_db_strerror_t _db_strerror) |
69 |
{ |
{ |
70 |
struct anubis_db_type *dbt = xmalloc(sizeof *dbt); |
struct anubis_db_type *dbt = xmalloc(sizeof *dbt); |
73 |
dbt->db_close = _db_close; |
dbt->db_close = _db_close; |
74 |
dbt->db_get_record = _db_get; |
dbt->db_get_record = _db_get; |
75 |
dbt->db_put_record = _db_put; |
dbt->db_put_record = _db_put; |
76 |
|
dbt->db_delete = _db_delete; |
77 |
dbt->db_strerror = _db_strerror; |
dbt->db_strerror = _db_strerror; |
78 |
if (!dbtab) |
if (!dbtab) |
79 |
dbtab = list_create(); |
dbtab = list_create(); |
83 |
|
|
84 |
|
|
85 |
int |
int |
86 |
anubis_db_open(char *dbid, char *arg, enum anubis_db_mode mode, void **dptr) |
anubis_db_open(char *arg, enum anubis_db_mode mode, void **dptr) |
87 |
{ |
{ |
88 |
struct anubis_db_instance *inst; |
struct anubis_db_instance *inst; |
89 |
struct anubis_db_type *dbt = anubis_db_locate(dbid); |
ANUBIS_URL *url; |
90 |
|
struct anubis_db_type *dbt; |
91 |
|
int rc; |
92 |
|
|
93 |
|
if (anubis_url_parse(&url, arg)) |
94 |
|
return EINVAL; |
95 |
|
|
96 |
|
dbt = anubis_db_locate(url->method); |
97 |
if (!dbt) |
if (!dbt) |
98 |
return ENOENT; |
return ENOENT; |
99 |
inst = xmalloc(sizeof *inst); |
inst = xmalloc(sizeof *inst); |
102 |
inst->mode = mode; |
inst->mode = mode; |
103 |
inst->error_code = 0; |
inst->error_code = 0; |
104 |
*dptr = inst; |
*dptr = inst; |
105 |
return dbt->db_open(&inst->db_handle, arg, mode); |
rc = dbt->db_open(&inst->db_handle, url, mode); |
106 |
|
anubis_url_destroy(&url); |
107 |
|
return rc; |
108 |
} |
} |
109 |
|
|
110 |
int |
int |
142 |
&inst->error_code); |
&inst->error_code); |
143 |
} |
} |
144 |
|
|
145 |
|
int |
146 |
|
anubis_db_delete_record(void *dptr, char *key) |
147 |
|
{ |
148 |
|
struct anubis_db_instance *inst = dptr; |
149 |
|
if (inst->mode == anubis_db_rdonly) { |
150 |
|
inst->error_code = 0; |
151 |
|
errno = EACCES; |
152 |
|
return 1; |
153 |
|
} |
154 |
|
return inst->db_type->db_delete(inst->db_handle, key, |
155 |
|
&inst->error_code); |
156 |
|
} |
157 |
|
|
158 |
const char * |
const char * |
159 |
anubis_db_strerror(void *dptr) |
anubis_db_strerror(void *dptr) |
160 |
{ |
{ |
177 |
free(rec->rc_file_name); |
free(rec->rc_file_name); |
178 |
memset(rec, 0, sizeof *rec); |
memset(rec, 0, sizeof *rec); |
179 |
} |
} |
180 |
|
|
181 |
|
#endif |