Переглянути джерело

mysql: added JSON conversion

ncannasse 6 роки тому
батько
коміт
0cdf04384d
1 змінених файлів з 11 додано та 3 видалено
  1. 11 3
      libs/mysql/mysql.c

+ 11 - 3
libs/mysql/mysql.c

@@ -46,6 +46,7 @@ typedef enum {
 	CONV_BINARY,
 	CONV_DATE,
 	CONV_DATETIME,
+	CONV_JSON,
 	CONV_BOOL
 } CONV;
 
@@ -64,6 +65,7 @@ typedef struct {
 } connection;
 
 static vclosure *conv_string = NULL;
+static vclosure *conv_json = NULL;
 static vclosure *conv_bytes = NULL;
 static vclosure *conv_date = NULL;
 
@@ -119,6 +121,11 @@ HL_PRIM vdynamic *HL_NAME(result_next)( result *r ) {
 			arg.v.ptr = row[i];
 			value = hl_dyn_call(conv_string, pargs, 1);
 			break;
+		case CONV_JSON:
+			arg.t = &hlt_bytes;
+			arg.v.ptr = row[i];
+			value = hl_dyn_call(conv_json, pargs, 1);
+			break;
 		case CONV_BOOL:
 			hl_dyn_seti(obj, r->fields_ids[i], &hlt_bool, (int)(*row[i] != '0'));
 			break;
@@ -225,7 +232,7 @@ static CONV convert_type( enum enum_field_types t, int flags, unsigned int lengt
 	case 246: // 5.0 MYSQL_NEW_DECIMAL
 		return CONV_FLOAT;
 	case 245: // JSON
-		return CONV_STRING;
+		return CONV_JSON;
 	case FIELD_TYPE_BLOB:
 	case FIELD_TYPE_TINY_BLOB:
 	case FIELD_TYPE_MEDIUM_BLOB:
@@ -342,10 +349,11 @@ HL_PRIM connection *HL_NAME(connect_wrap)( cnx_params *p ) {
 	return c;
 }
 
-HL_PRIM void HL_NAME(set_conv_funs)( vclosure *fstring, vclosure *fbytes, vclosure *fdate ) {
+HL_PRIM void HL_NAME(set_conv_funs)( vclosure *fstring, vclosure *fbytes, vclosure *fdate, vclosure *fjson ) {
 	conv_string = fstring;
 	conv_bytes = fbytes;
 	conv_date = fdate;
+	conv_json = fjson;
 }
 
 // ---------------------------------------------------------------
@@ -368,6 +376,6 @@ DEFINE_PRIM(_BYTES, result_get, _RESULT _I32);
 DEFINE_PRIM(_I32, result_get_int, _RESULT _I32);
 DEFINE_PRIM(_F64, result_get_float, _RESULT _I32);
 
-DEFINE_PRIM(_VOID, set_conv_funs, _DYN _DYN _DYN);
+DEFINE_PRIM(_VOID, set_conv_funs, _DYN _DYN _DYN _DYN);
 
 /* ************************************************************************ */