156 #define DB_COMMON_KEY_DOMAIN (1 << 0)
157 #define DB_COMMON_KEY_USER (1 << 1)
158 #define DB_COMMON_VALUE_DOMAIN (1 << 2)
159 #define DB_COMMON_VALUE_USER (1 << 3)
160 #define DB_COMMON_KEY_PARTIAL (1 << 4)
180 return ((
void *) ctx);
194 for (cp = format; *cp; ++cp)
235 if (ctx->
nparts < *cp -
'0')
243 msg_fatal(
"db_common_parse: %s: Invalid %s template: %s",
244 ctx->
dict->
name, query ?
"query" :
"result", format);
255 const char *myname =
"db_common_parse_domain";
257 domainlist =
cfg_get_str(parser,
"domain",
"", 0, 0);
268 msg_fatal(
"%s: %s: domain match list creation using '%s' failed",
269 myname, parser->
name, domainlist);
300 const char *key,
VSTRING *result,
303 const char *myname =
"db_common_expand";
305 const char *vdomain = 0;
306 const char *kdomain = 0;
307 const char *domain = 0;
322 msg_warn(
"table \"%s:%s\": empty lookup result for: \"%s\""
325 msg_warn(
"table \"%s:%s\": empty query string"
332 if ((vdomain = strrchr(value,
'@')) != 0)
341 if ((kdomain = strrchr(key,
'@')) != 0)
350 msg_warn(
"%s: %s: lookup key '%s' skipped after query", myname,
357 if ((vdomain = strrchr(value,
'@')) != 0)
366 parts =
argv_split(key ? kdomain : vdomain,
".");
382 for (i = 0; i < ctx->
nparts; i++)
383 if (*parts->
argv[parts->
argc - i - 1] == 0) {
391 #define QUOTE_VAL(d, q, v, buf) do { \
395 vstring_strcat(buf, v); \
403 for (cp = format; *cp; cp++) {
418 vuser =
mystrndup(value, vdomain - value - 1);
425 if (!(ctx->
flags & dflag))
426 msg_panic(
"%s: %s: %s: bad query/result template context",
429 msg_panic(
"%s: %s: %s: expanding domain-less key or value",
445 kuser =
mystrndup(key, kdomain - key - 1);
452 vuser =
mystrndup(value, vdomain - value - 1);
461 msg_panic(
"%s: %s: %s: bad query/result template context",
463 if ((domain = key ? kdomain : vdomain) == 0)
464 msg_panic(
"%s: %s: %s: expanding domain-less key or value",
488 || ctx->
nparts < *cp -
'0')
489 msg_panic(
"%s: %s: %s: bad query/result template context",
492 msg_panic(
"%s: %s: %s: key has too few domain labels",
495 parts->
argv[parts->
argc - (*cp -
'0')], result);
499 msg_fatal(
"%s: %s: invalid %s template '%s'", myname,
500 ctx->
dict->
name, key ?
"result" :
"query",
527 if ((domain = strrchr(addr,
'@')) != NULL)
529 if (domain == NULL || domain == addr + 1)
532 return (ctx->
domain->error);
541 const char *myname =
"db_common_sql_build_query";
545 char *additional_conditions;
550 if ((table =
cfg_get_str(parser,
"table", NULL, 1, 0)) == 0)
551 msg_fatal(
"%s: 'table' parameter not defined", myname);
553 if ((select_field =
cfg_get_str(parser,
"select_field", NULL, 1, 0)) == 0)
554 msg_fatal(
"%s: 'select_field' parameter not defined", myname);
556 if ((where_field =
cfg_get_str(parser,
"where_field", NULL, 1, 0)) == 0)
557 msg_fatal(
"%s: 'where_field' parameter not defined", myname);
559 additional_conditions =
cfg_get_str(parser,
"additional_conditions",
563 select_field, table, where_field,
564 additional_conditions);
569 myfree(additional_conditions);
#define DB_COMMON_KEY_DOMAIN
#define MATCH_FLAG_RETURN
void * db_common_alloc(DICT *dict)
ARGV * argv_free(ARGV *argvp)
NORETURN msg_panic(const char *fmt,...)
void db_common_sql_build_query(VSTRING *query, CFG_PARSER *parser)
#define QUOTE_VAL(d, q, v, buf)
void db_common_free_ctx(void *ctxPtr)
#define VSTRING_TERMINATE(vp)
#define string_list_init(o, f, p)
int db_common_dict_partial(void *ctxPtr)
#define VSTRING_ADDCH(vp, ch)
int match_list_match(MATCH_LIST *list,...)
void db_common_parse_domain(CFG_PARSER *parser, void *ctxPtr)
#define DB_COMMON_VALUE_DOMAIN
int db_common_expand(void *ctxArg, const char *format, const char *value, const char *key, VSTRING *result, db_quote_callback_t quote_func)
void msg_warn(const char *fmt,...)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
int db_common_check_domain(void *ctxPtr, const char *addr)
NORETURN msg_fatal(const char *fmt,...)
char * cfg_get_str(const CFG_PARSER *parser, const char *name, const char *defval, int min, int max)
char * mystrndup(const char *str, ssize_t len)
ARGV * argv_split(const char *, const char *)
int db_common_parse(DICT *dict, void **ctxPtr, const char *format, int query)
void(* db_quote_callback_t)(DICT *, const char *, VSTRING *)
#define DB_COMMON_KEY_USER
#define DB_COMMON_KEY_PARTIAL
void * mymalloc(ssize_t len)
#define DB_COMMON_VALUE_USER