Reindented server/core/resultset.c

This commit is contained in:
Johan Wikman
2015-11-30 16:13:32 +02:00
parent 6c401b9085
commit 0aa38cad4c
2 changed files with 349 additions and 299 deletions

View File

@ -104,7 +104,9 @@ resultset_add_column(RESULTSET *set, char *name, int len, RESULT_COL_TYPE type)
RESULT_COLUMN *newcol, *ptr; RESULT_COLUMN *newcol, *ptr;
if ((newcol = (RESULT_COLUMN *)malloc(sizeof(RESULT_COLUMN))) == NULL) if ((newcol = (RESULT_COLUMN *)malloc(sizeof(RESULT_COLUMN))) == NULL)
{
return 0; return 0;
}
if ((newcol->name = strdup(name)) == NULL) if ((newcol->name = strdup(name)) == NULL)
{ {
free(newcol); free(newcol);
@ -115,12 +117,16 @@ RESULT_COLUMN *newcol, *ptr;
newcol->next = NULL; newcol->next = NULL;
if (set->column == NULL) if (set->column == NULL)
{
set->column = newcol; set->column = newcol;
}
else else
{ {
ptr = set->column; ptr = set->column;
while (ptr->next) while (ptr->next)
{
ptr = ptr->next; ptr = ptr->next;
}
ptr->next = newcol; ptr->next = newcol;
} }
set->n_cols++; set->n_cols++;
@ -153,7 +159,9 @@ RESULT_ROW *row;
int i; int i;
if ((row = (RESULT_ROW *)malloc(sizeof(RESULT_ROW))) == NULL) if ((row = (RESULT_ROW *)malloc(sizeof(RESULT_ROW))) == NULL)
{
return NULL; return NULL;
}
row->n_cols = set->n_cols; row->n_cols = set->n_cols;
if ((row->cols = (char **)malloc(row->n_cols * sizeof(char *))) == NULL) if ((row->cols = (char **)malloc(row->n_cols * sizeof(char *))) == NULL)
{ {
@ -162,7 +170,9 @@ int i;
} }
for (i = 0; i < set->n_cols; i++) for (i = 0; i < set->n_cols; i++)
{
row->cols[i] = NULL; row->cols[i] = NULL;
}
return row; return row;
} }
@ -180,8 +190,12 @@ resultset_free_row(RESULT_ROW *row)
int i; int i;
for (i = 0; i < row->n_cols; i++) for (i = 0; i < row->n_cols; i++)
{
if (row->cols[i]) if (row->cols[i])
{
free(row->cols[i]); free(row->cols[i]);
}
}
free(row->cols); free(row->cols);
free(row); free(row);
} }
@ -200,15 +214,21 @@ int
resultset_row_set(RESULT_ROW *row, int col, char *value) resultset_row_set(RESULT_ROW *row, int col, char *value)
{ {
if (col < 0 || col >= row->n_cols) if (col < 0 || col >= row->n_cols)
{
return 0; return 0;
}
if (value) if (value)
{ {
if ((row->cols[col] = strdup(value)) == NULL) if ((row->cols[col] = strdup(value)) == NULL)
{
return 0; return 0;
}
return 1; return 1;
} }
else if (row->cols[col]) else if (row->cols[col])
{
free(row->cols[col]); free(row->cols[col]);
}
row->cols[col] = NULL; row->cols[col] = NULL;
return 1; return 1;
} }
@ -259,7 +279,9 @@ GWBUF *pkt;
uint8_t *ptr; uint8_t *ptr;
if ((pkt = gwbuf_alloc(5)) == NULL) if ((pkt = gwbuf_alloc(5)) == NULL)
{
return 0; return 0;
}
ptr = GWBUF_DATA(pkt); ptr = GWBUF_DATA(pkt);
*ptr++ = 0x01; // Payload length *ptr++ = 0x01; // Payload length
*ptr++ = 0x00; *ptr++ = 0x00;
@ -288,7 +310,9 @@ uint8_t *ptr;
int plen; int plen;
if ((pkt = gwbuf_alloc(26 + strlen(name))) == NULL) if ((pkt = gwbuf_alloc(26 + strlen(name))) == NULL)
{
return 0; return 0;
}
ptr = GWBUF_DATA(pkt); ptr = GWBUF_DATA(pkt);
plen = 22 + strlen(name); plen = 22 + strlen(name);
*ptr++ = plen & 0xff; *ptr++ = plen & 0xff;
@ -304,7 +328,9 @@ int plen;
*ptr++ = 0; // Table name length *ptr++ = 0; // Table name length
*ptr++ = strlen(name); // Column name length; *ptr++ = strlen(name); // Column name length;
while (*name) while (*name)
{
*ptr++ = *name++; // Copy the column name *ptr++ = *name++; // Copy the column name
}
*ptr++ = 0; // Orginal column name *ptr++ = 0; // Orginal column name
*ptr++ = 0x0c; // Length of next fields always 12 *ptr++ = 0x0c; // Length of next fields always 12
*ptr++ = 0x3f; // Character set *ptr++ = 0x3f; // Character set
@ -316,9 +342,13 @@ int plen;
*ptr++ = type; *ptr++ = type;
*ptr++ = 0x81; // Two bytes of flags *ptr++ = 0x81; // Two bytes of flags
if (type == 0xfd) if (type == 0xfd)
{
*ptr++ = 0x1f; *ptr++ = 0x1f;
}
else else
{
*ptr++ = 0x00; *ptr++ = 0x00;
}
*ptr++= 0; *ptr++= 0;
*ptr++= 0; *ptr++= 0;
*ptr++= 0; *ptr++= 0;
@ -340,7 +370,9 @@ GWBUF *pkt;
uint8_t *ptr; uint8_t *ptr;
if ((pkt = gwbuf_alloc(9)) == NULL) if ((pkt = gwbuf_alloc(9)) == NULL)
{
return 0; return 0;
}
ptr = GWBUF_DATA(pkt); ptr = GWBUF_DATA(pkt);
*ptr++ = 0x05; *ptr++ = 0x05;
*ptr++ = 0x00; *ptr++ = 0x00;
@ -374,12 +406,16 @@ uint8_t *ptr;
for (i = 0; i < row->n_cols; i++) for (i = 0; i < row->n_cols; i++)
{ {
if (row->cols[i]) if (row->cols[i])
{
len += strlen(row->cols[i]); len += strlen(row->cols[i]);
}
len++; len++;
} }
if ((pkt = gwbuf_alloc(len)) == NULL) if ((pkt = gwbuf_alloc(len)) == NULL)
{
return 0; return 0;
}
ptr = GWBUF_DATA(pkt); ptr = GWBUF_DATA(pkt);
len -= 4; len -= 4;
*ptr++ = len & 0xff; *ptr++ = len & 0xff;
@ -416,7 +452,9 @@ value_is_numeric(char *value)
while (*value) while (*value)
{ {
if (!isdigit(*value)) if (!isdigit(*value))
{
return 0; return 0;
}
value++; value++;
} }
return 1; return 1;
@ -437,30 +475,38 @@ RESULT_COLUMN *col;
RESULT_ROW *row; RESULT_ROW *row;
int rowno = 0; int rowno = 0;
dcb_printf(dcb, "[ "); dcb_printf(dcb, "[ ");
while ((row = (*set->fetchrow)(set, set->userdata)) != NULL) while ((row = (*set->fetchrow)(set, set->userdata)) != NULL)
{ {
int i = 0; int i = 0;
if (rowno++ > 0) if (rowno++ > 0)
{
dcb_printf(dcb, ",\n"); dcb_printf(dcb, ",\n");
}
dcb_printf(dcb, "{ "); dcb_printf(dcb, "{ ");
col = set->column; col = set->column;
while (col) while (col)
{ {
dcb_printf(dcb, "\"%s\" : ", col->name); dcb_printf(dcb, "\"%s\" : ", col->name);
if (row->cols[i] && value_is_numeric(row->cols[i])) if (row->cols[i] && value_is_numeric(row->cols[i]))
{
dcb_printf(dcb, "%s", row->cols[i]); dcb_printf(dcb, "%s", row->cols[i]);
}
else if (row->cols[i]) else if (row->cols[i])
{
dcb_printf(dcb, "\"%s\"", row->cols[i]); dcb_printf(dcb, "\"%s\"", row->cols[i]);
}
else else
{
dcb_printf(dcb, "NULL"); dcb_printf(dcb, "NULL");
}
i++; i++;
col = col->next; col = col->next;
if (col) if (col)
{
dcb_printf(dcb, ", "); dcb_printf(dcb, ", ");
} }
}
resultset_free_row(row); resultset_free_row(row);
dcb_printf(dcb, "}"); dcb_printf(dcb, "}");
} }

View File

@ -35,7 +35,8 @@
/** /**
* Column types * Column types
*/ */
typedef enum { typedef enum
{
COL_TYPE_VARCHAR = 0x0f, COL_TYPE_VARCHAR = 0x0f,
COL_TYPE_VARSTRING = 0xfd COL_TYPE_VARSTRING = 0xfd
} RESULT_COL_TYPE; } RESULT_COL_TYPE;
@ -44,7 +45,8 @@ typedef enum {
* The result set column definition. Each result set has an order linked * The result set column definition. Each result set has an order linked
* list of column definitions. * list of column definitions.
*/ */
typedef struct resultcolumn { typedef struct resultcolumn
{
char *name; /*< Column name */ char *name; /*< Column name */
int len; /*< Column length */ int len; /*< Column length */
RESULT_COL_TYPE type; /*< Column type */ RESULT_COL_TYPE type; /*< Column type */
@ -54,7 +56,8 @@ typedef struct resultcolumn {
/** /**
* A representation of a row within a result set. * A representation of a row within a result set.
*/ */
typedef struct resultrow { typedef struct resultrow
{
int n_cols; /*< No. of columns in row */ int n_cols; /*< No. of columns in row */
char **cols; /*< The columns themselves */ char **cols; /*< The columns themselves */
} RESULT_ROW; } RESULT_ROW;
@ -85,4 +88,5 @@ extern void resultset_free_row(RESULT_ROW *);
extern int resultset_row_set(RESULT_ROW *, int, char *); extern int resultset_row_set(RESULT_ROW *, int, char *);
extern void resultset_stream_mysql(RESULTSET *, DCB *); extern void resultset_stream_mysql(RESULTSET *, DCB *);
extern void resultset_stream_json(RESULTSET *, DCB *); extern void resultset_stream_json(RESULTSET *, DCB *);
#endif #endif