Added string builder overload to db_value
This commit is contained in:
267
src/db_value.c
267
src/db_value.c
@@ -20,159 +20,158 @@ 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));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch(type) {
|
if (type == TYPE_STRING)
|
||||||
case TYPE_BOOL:
|
{
|
||||||
{
|
|
||||||
sprintf(buf, "%s", va_arg(args, int) == 0 ? "FALSE" : "TRUE");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TYPE_INT8:
|
|
||||||
{
|
|
||||||
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) {
|
||||||
tmp_len = strlen(tmp_str);
|
tmp_len = strlen(tmp_str);
|
||||||
} else {
|
} else {
|
||||||
tmp_len = va_arg(args, size_t);
|
tmp_len = va_arg(args, size_t);
|
||||||
}
|
}
|
||||||
__attribute__((fallthrough));
|
}
|
||||||
}
|
if (type == TYPE_BLOB || type == TYPE_STRING) {
|
||||||
case TYPE_BLOB:
|
if (tmp_str == 0) {
|
||||||
{
|
tmp_str = (char *)va_arg(args, void *);
|
||||||
if (tmp_str == 0) {
|
|
||||||
tmp_str = (char *)va_arg(args, void *);
|
|
||||||
tmp_len = va_arg(args, size_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tmp_str == 0) {
|
|
||||||
if (strmemcpy("NULL", 4, &esc_str, &esc_len) != 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sql = mysql_init(NULL);
|
|
||||||
if (sql == 0) {
|
|
||||||
fprintf(stderr, "[%d]mysql_init: (%d) %s\n", __LINE__, errno, strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
esc_str = (char *)malloc(tmp_len * 2 + 1 + 2);
|
|
||||||
if (esc_str == 0) {
|
|
||||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
|
||||||
mysql_close(sql);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
esc_str[0] = '\'';
|
|
||||||
esc_len = mysql_real_escape_string(sql, esc_str + 1, tmp_str, tmp_len);
|
|
||||||
esc_str[esc_len + 1] = '\'';
|
|
||||||
esc_str[esc_len + 2] = '\0';
|
|
||||||
esc_len += 2;
|
|
||||||
mysql_close(sql);
|
|
||||||
|
|
||||||
tmp_str = esc_str;
|
|
||||||
esc_str = (char *)realloc(esc_str, esc_len + 1);
|
|
||||||
if (esc_str == 0) {
|
|
||||||
fprintf(stderr, "[%d]realloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TYPE_RAW:
|
|
||||||
{
|
|
||||||
tmp_str = va_arg(args, char *);
|
|
||||||
tmp_len = va_arg(args, size_t);
|
tmp_len = va_arg(args, size_t);
|
||||||
|
}
|
||||||
|
|
||||||
if (strmemcpy(tmp_str, tmp_len, &esc_str, &esc_len) != 0) {
|
if (tmp_str == 0) {
|
||||||
return 0;
|
strbld_str(sb, "NULL", 4);
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sql = mysql_init(NULL);
|
||||||
|
if (sql == 0) {
|
||||||
|
fprintf(stderr, "[%d]mysql_init: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
esc_str = (char *)malloc(tmp_len * 2 + 1 + 2);
|
||||||
|
if (esc_str == 0) {
|
||||||
|
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||||
|
mysql_close(sql);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
esc_str[0] = '\'';
|
||||||
|
esc_len = mysql_real_escape_string(sql, esc_str + 1, tmp_str, tmp_len);
|
||||||
|
esc_str[esc_len + 1] = '\'';
|
||||||
|
esc_str[esc_len + 2] = '\0';
|
||||||
|
esc_len += 2;
|
||||||
|
mysql_close(sql);
|
||||||
|
|
||||||
|
strbld_str(sb, esc_str, esc_len);
|
||||||
|
|
||||||
|
free(esc_str);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(buf, 0, 32);
|
||||||
|
switch(type) {
|
||||||
|
case TYPE_BOOL:
|
||||||
|
{
|
||||||
|
nchar = sprintf(buf, "%s", va_arg(args, int) == 0 ? "FALSE" : "TRUE");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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__
|
||||||
|
|||||||
Reference in New Issue
Block a user