Added string builder overload to db_value

This commit is contained in:
2020-10-06 13:20:53 +01:00
parent 44ad06a819
commit 33e70adf88
2 changed files with 136 additions and 134 deletions

View File

@@ -20,83 +20,45 @@ char *db_value(char **str, size_t *len, e_column_type type, uint32_t n_args, ...
return ret; return ret;
} }
char *db_value_va(char **str, size_t *len, e_column_type type, uint32_t n_args, va_list args) char *db_value_va(char **str, size_t *len, e_column_type type, uint32_t n_args, va_list args)
{
str_builder *sb;
if ((sb = strbld_create()) == 0) {
return 0;
}
db_value_sbva(sb, type, n_args, args);
if (strbld_finalize_or_destroy(&sb, str, len) != 0) {
return 0;
}
return *str;
}
void db_value_sb(str_builder *sb, e_column_type type, uint32_t n_args, ...)
{
va_list args;
va_start(args, n_args);
db_value_sbva(sb, type, n_args, args);
va_end(args);
}
void db_value_sbva(str_builder *sb, e_column_type type, uint32_t n_args, va_list args)
{ {
char buf[32], *tmp_str = 0, *esc_str = 0; char buf[32], *tmp_str = 0, *esc_str = 0;
size_t tmp_len = 0, esc_len = 0; size_t tmp_len = 0, esc_len = 0;
MYSQL *sql; MYSQL *sql;
int nchar;
if (n_args == 0) { if (n_args == 0) {
return 0; return;
} }
memset(buf, 0, 32); if (type == TYPE_RAW) {
strbld_str(sb, va_arg(args, char *), va_arg(args, size_t));
switch(type) { return;
case TYPE_BOOL:
{
sprintf(buf, "%s", va_arg(args, int) == 0 ? "FALSE" : "TRUE");
break;
} }
case TYPE_INT8: if (type == TYPE_STRING)
{
vsprintf(buf, "%"PRIi8, args);
break;
}
case TYPE_UINT8:
{
vsprintf(buf, "%"PRIu8, args);
break;
}
case TYPE_INT16:
{
vsprintf(buf, "%"PRIi16, args);
break;
}
case TYPE_UINT16:
{
vsprintf(buf, "%"PRIu16, args);
break;
}
case TYPE_INT32:
{
vsprintf(buf, "%"PRIi32, args);
break;
}
case TYPE_TIMESTAMP:
case TYPE_UINT32:
{
vsprintf(buf, "%"PRIu32, args);
break;
}
case TYPE_INT64:
{
vsprintf(buf, "%"PRIi64, args);
break;
}
case TYPE_UINT64:
{
vsprintf(buf, "%"PRIu64, args);
break;
}
case TYPE_FLOAT:
{
vsprintf(buf, "%f", args);
break;
}
case TYPE_DOUBLE:
{
vsprintf(buf, "%lf", args);
break;
}
case TYPE_STRING:
{ {
tmp_str = va_arg(args, char *); tmp_str = va_arg(args, char *);
if (n_args == 1) { if (n_args == 1) {
@@ -104,36 +66,31 @@ char *db_value_va(char **str, size_t *len, e_column_type type, uint32_t n_args,
} else { } else {
tmp_len = va_arg(args, size_t); tmp_len = va_arg(args, size_t);
} }
__attribute__((fallthrough));
} }
case TYPE_BLOB: if (type == TYPE_BLOB || type == TYPE_STRING) {
{
if (tmp_str == 0) { if (tmp_str == 0) {
tmp_str = (char *)va_arg(args, void *); tmp_str = (char *)va_arg(args, void *);
tmp_len = va_arg(args, size_t); tmp_len = va_arg(args, size_t);
} }
if (tmp_str == 0) { if (tmp_str == 0) {
if (strmemcpy("NULL", 4, &esc_str, &esc_len) != 0) { strbld_str(sb, "NULL", 4);
return 0; return;
}
break;
} }
sql = mysql_init(NULL); sql = mysql_init(NULL);
if (sql == 0) { if (sql == 0) {
fprintf(stderr, "[%d]mysql_init: (%d) %s\n", __LINE__, errno, strerror(errno)); fprintf(stderr, "[%d]mysql_init: (%d) %s\n", __LINE__, errno, strerror(errno));
return 0; return;
} }
esc_str = (char *)malloc(tmp_len * 2 + 1 + 2); esc_str = (char *)malloc(tmp_len * 2 + 1 + 2);
if (esc_str == 0) { if (esc_str == 0) {
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
mysql_close(sql); mysql_close(sql);
return 0; return;
} }
esc_str[0] = '\''; esc_str[0] = '\'';
esc_len = mysql_real_escape_string(sql, esc_str + 1, tmp_str, tmp_len); esc_len = mysql_real_escape_string(sql, esc_str + 1, tmp_str, tmp_len);
esc_str[esc_len + 1] = '\''; esc_str[esc_len + 1] = '\'';
@@ -141,38 +98,80 @@ char *db_value_va(char **str, size_t *len, e_column_type type, uint32_t n_args,
esc_len += 2; esc_len += 2;
mysql_close(sql); mysql_close(sql);
tmp_str = esc_str; strbld_str(sb, esc_str, esc_len);
esc_str = (char *)realloc(esc_str, esc_len + 1);
if (esc_str == 0) { free(esc_str);
fprintf(stderr, "[%d]realloc: (%d) %s\n", __LINE__, errno, strerror(errno)); return;
return 0;
} }
break; memset(buf, 0, 32);
} switch(type) {
case TYPE_BOOL:
case TYPE_RAW:
{ {
tmp_str = va_arg(args, char *); nchar = sprintf(buf, "%s", va_arg(args, int) == 0 ? "FALSE" : "TRUE");
tmp_len = va_arg(args, size_t); break;
if (strmemcpy(tmp_str, tmp_len, &esc_str, &esc_len) != 0) {
return 0;
} }
case TYPE_INT8:
{
nchar = vsprintf(buf, "%"PRIi8, args);
break;
}
case TYPE_UINT8:
{
nchar = vsprintf(buf, "%"PRIu8, args);
break;
}
case TYPE_INT16:
{
nchar = vsprintf(buf, "%"PRIi16, args);
break;
}
case TYPE_UINT16:
{
nchar = vsprintf(buf, "%"PRIu16, args);
break;
}
case TYPE_INT32:
{
nchar = vsprintf(buf, "%"PRIi32, args);
break;
}
case TYPE_TIMESTAMP:
case TYPE_UINT32:
{
nchar = vsprintf(buf, "%"PRIu32, args);
break;
}
case TYPE_INT64:
{
nchar = vsprintf(buf, "%"PRIi64, args);
break;
}
case TYPE_UINT64:
{
nchar = vsprintf(buf, "%"PRIu64, args);
break;
}
case TYPE_FLOAT:
{
nchar = vsprintf(buf, "%f", args);
break;
}
case TYPE_DOUBLE:
{
nchar = vsprintf(buf, "%lf", args);
break;
}
default:
{
break; break;
} }
} }
strbld_str(sb, buf, (size_t)nchar);
if (esc_str == 0) {
if (strmemcpy(buf, strlen(buf), &esc_str, &esc_len) != 0) {
return 0;
}
}
if (str != 0) {
*str = esc_str;
*len = esc_len;
}
return esc_str;
} }

View File

@@ -6,8 +6,11 @@
#include <stdarg.h> #include <stdarg.h>
#include "db_column.h" #include "db_column.h"
#include "strext.h"
char *db_value(char **str, size_t *len, e_column_type type, uint32_t n_args, ...); char *db_value(char **str, size_t *len, e_column_type type, uint32_t n_args, ...);
char *db_value_va(char **str, size_t *len, e_column_type type, uint32_t n_args, va_list args); char *db_value_va(char **str, size_t *len, e_column_type type, uint32_t n_args, va_list args);
void db_value_sb(str_builder *sb, e_column_type type, uint32_t n_args, ...);
void db_value_sbva(str_builder *sb, e_column_type type, uint32_t n_args, va_list args);
#endif // H__DB_VALUE__ #endif // H__DB_VALUE__