Reindented server/core/resultset.c
This commit is contained in:
@ -51,7 +51,7 @@ static int mysql_send_row(DCB *, RESULT_ROW *, int);
|
||||
RESULTSET *
|
||||
resultset_create(RESULT_ROW_CB func, void *data)
|
||||
{
|
||||
RESULTSET *rval;
|
||||
RESULTSET *rval;
|
||||
|
||||
if ((rval = (RESULTSET *)malloc(sizeof(RESULTSET))) != NULL)
|
||||
{
|
||||
@ -71,7 +71,7 @@ RESULTSET *rval;
|
||||
void
|
||||
resultset_free(RESULTSET *resultset)
|
||||
{
|
||||
RESULT_COLUMN *col;
|
||||
RESULT_COLUMN *col;
|
||||
|
||||
if (resultset != NULL)
|
||||
{
|
||||
@ -101,10 +101,12 @@ RESULT_COLUMN *col;
|
||||
int
|
||||
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)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ((newcol->name = strdup(name)) == NULL)
|
||||
{
|
||||
free(newcol);
|
||||
@ -115,12 +117,16 @@ RESULT_COLUMN *newcol, *ptr;
|
||||
newcol->next = NULL;
|
||||
|
||||
if (set->column == NULL)
|
||||
{
|
||||
set->column = newcol;
|
||||
}
|
||||
else
|
||||
{
|
||||
ptr = set->column;
|
||||
while (ptr->next)
|
||||
{
|
||||
ptr = ptr->next;
|
||||
}
|
||||
ptr->next = newcol;
|
||||
}
|
||||
set->n_cols++;
|
||||
@ -149,11 +155,13 @@ resultset_column_free(RESULT_COLUMN *col)
|
||||
RESULT_ROW *
|
||||
resultset_make_row(RESULTSET *set)
|
||||
{
|
||||
RESULT_ROW *row;
|
||||
int i;
|
||||
RESULT_ROW *row;
|
||||
int i;
|
||||
|
||||
if ((row = (RESULT_ROW *)malloc(sizeof(RESULT_ROW))) == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
row->n_cols = set->n_cols;
|
||||
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++)
|
||||
{
|
||||
row->cols[i] = NULL;
|
||||
}
|
||||
return row;
|
||||
}
|
||||
|
||||
@ -177,11 +187,15 @@ int i;
|
||||
void
|
||||
resultset_free_row(RESULT_ROW *row)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < row->n_cols; i++)
|
||||
{
|
||||
if (row->cols[i])
|
||||
{
|
||||
free(row->cols[i]);
|
||||
}
|
||||
}
|
||||
free(row->cols);
|
||||
free(row);
|
||||
}
|
||||
@ -200,15 +214,21 @@ int
|
||||
resultset_row_set(RESULT_ROW *row, int col, char *value)
|
||||
{
|
||||
if (col < 0 || col >= row->n_cols)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (value)
|
||||
{
|
||||
if ((row->cols[col] = strdup(value)) == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
else if (row->cols[col])
|
||||
{
|
||||
free(row->cols[col]);
|
||||
}
|
||||
row->cols[col] = NULL;
|
||||
return 1;
|
||||
}
|
||||
@ -224,9 +244,9 @@ resultset_row_set(RESULT_ROW *row, int col, char *value)
|
||||
void
|
||||
resultset_stream_mysql(RESULTSET *set, DCB *dcb)
|
||||
{
|
||||
RESULT_COLUMN *col;
|
||||
RESULT_ROW *row;
|
||||
uint8_t seqno = 2;
|
||||
RESULT_COLUMN *col;
|
||||
RESULT_ROW *row;
|
||||
uint8_t seqno = 2;
|
||||
|
||||
mysql_send_fieldcount(dcb, set->n_cols);
|
||||
|
||||
@ -255,11 +275,13 @@ uint8_t seqno = 2;
|
||||
static int
|
||||
mysql_send_fieldcount(DCB *dcb, int count)
|
||||
{
|
||||
GWBUF *pkt;
|
||||
uint8_t *ptr;
|
||||
GWBUF *pkt;
|
||||
uint8_t *ptr;
|
||||
|
||||
if ((pkt = gwbuf_alloc(5)) == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ptr = GWBUF_DATA(pkt);
|
||||
*ptr++ = 0x01; // Payload length
|
||||
*ptr++ = 0x00;
|
||||
@ -283,12 +305,14 @@ uint8_t *ptr;
|
||||
static int
|
||||
mysql_send_columndef(DCB *dcb, char *name, int type, int len, uint8_t seqno)
|
||||
{
|
||||
GWBUF *pkt;
|
||||
uint8_t *ptr;
|
||||
int plen;
|
||||
GWBUF *pkt;
|
||||
uint8_t *ptr;
|
||||
int plen;
|
||||
|
||||
if ((pkt = gwbuf_alloc(26 + strlen(name))) == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ptr = GWBUF_DATA(pkt);
|
||||
plen = 22 + strlen(name);
|
||||
*ptr++ = plen & 0xff;
|
||||
@ -304,7 +328,9 @@ int plen;
|
||||
*ptr++ = 0; // Table name length
|
||||
*ptr++ = strlen(name); // Column name length;
|
||||
while (*name)
|
||||
{
|
||||
*ptr++ = *name++; // Copy the column name
|
||||
}
|
||||
*ptr++ = 0; // Orginal column name
|
||||
*ptr++ = 0x0c; // Length of next fields always 12
|
||||
*ptr++ = 0x3f; // Character set
|
||||
@ -316,9 +342,13 @@ int plen;
|
||||
*ptr++ = type;
|
||||
*ptr++ = 0x81; // Two bytes of flags
|
||||
if (type == 0xfd)
|
||||
{
|
||||
*ptr++ = 0x1f;
|
||||
}
|
||||
else
|
||||
{
|
||||
*ptr++ = 0x00;
|
||||
}
|
||||
*ptr++= 0;
|
||||
*ptr++= 0;
|
||||
*ptr++= 0;
|
||||
@ -336,11 +366,13 @@ int plen;
|
||||
static int
|
||||
mysql_send_eof(DCB *dcb, int seqno)
|
||||
{
|
||||
GWBUF *pkt;
|
||||
uint8_t *ptr;
|
||||
GWBUF *pkt;
|
||||
uint8_t *ptr;
|
||||
|
||||
if ((pkt = gwbuf_alloc(9)) == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ptr = GWBUF_DATA(pkt);
|
||||
*ptr++ = 0x05;
|
||||
*ptr++ = 0x00;
|
||||
@ -367,19 +399,23 @@ uint8_t *ptr;
|
||||
static int
|
||||
mysql_send_row(DCB *dcb, RESULT_ROW *row, int seqno)
|
||||
{
|
||||
GWBUF *pkt;
|
||||
int i, len = 4;
|
||||
uint8_t *ptr;
|
||||
GWBUF *pkt;
|
||||
int i, len = 4;
|
||||
uint8_t *ptr;
|
||||
|
||||
for (i = 0; i < row->n_cols; i++)
|
||||
{
|
||||
if (row->cols[i])
|
||||
{
|
||||
len += strlen(row->cols[i]);
|
||||
}
|
||||
len++;
|
||||
}
|
||||
|
||||
if ((pkt = gwbuf_alloc(len)) == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ptr = GWBUF_DATA(pkt);
|
||||
len -= 4;
|
||||
*ptr++ = len & 0xff;
|
||||
@ -416,7 +452,9 @@ value_is_numeric(char *value)
|
||||
while (*value)
|
||||
{
|
||||
if (!isdigit(*value))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
value++;
|
||||
}
|
||||
return 1;
|
||||
@ -433,34 +471,42 @@ value_is_numeric(char *value)
|
||||
void
|
||||
resultset_stream_json(RESULTSET *set, DCB *dcb)
|
||||
{
|
||||
RESULT_COLUMN *col;
|
||||
RESULT_ROW *row;
|
||||
int rowno = 0;
|
||||
|
||||
RESULT_COLUMN *col;
|
||||
RESULT_ROW *row;
|
||||
int rowno = 0;
|
||||
|
||||
dcb_printf(dcb, "[ ");
|
||||
while ((row = (*set->fetchrow)(set, set->userdata)) != NULL)
|
||||
{
|
||||
int i = 0;
|
||||
if (rowno++ > 0)
|
||||
{
|
||||
dcb_printf(dcb, ",\n");
|
||||
}
|
||||
dcb_printf(dcb, "{ ");
|
||||
col = set->column;
|
||||
while (col)
|
||||
{
|
||||
|
||||
dcb_printf(dcb, "\"%s\" : ", col->name);
|
||||
if (row->cols[i] && value_is_numeric(row->cols[i]))
|
||||
{
|
||||
dcb_printf(dcb, "%s", row->cols[i]);
|
||||
}
|
||||
else if (row->cols[i])
|
||||
{
|
||||
dcb_printf(dcb, "\"%s\"", row->cols[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
dcb_printf(dcb, "NULL");
|
||||
}
|
||||
i++;
|
||||
col = col->next;
|
||||
if (col)
|
||||
{
|
||||
dcb_printf(dcb, ", ");
|
||||
}
|
||||
}
|
||||
resultset_free_row(row);
|
||||
dcb_printf(dcb, "}");
|
||||
}
|
||||
|
@ -35,7 +35,8 @@
|
||||
/**
|
||||
* Column types
|
||||
*/
|
||||
typedef enum {
|
||||
typedef enum
|
||||
{
|
||||
COL_TYPE_VARCHAR = 0x0f,
|
||||
COL_TYPE_VARSTRING = 0xfd
|
||||
} RESULT_COL_TYPE;
|
||||
@ -44,7 +45,8 @@ typedef enum {
|
||||
* The result set column definition. Each result set has an order linked
|
||||
* list of column definitions.
|
||||
*/
|
||||
typedef struct resultcolumn {
|
||||
typedef struct resultcolumn
|
||||
{
|
||||
char *name; /*< Column name */
|
||||
int len; /*< Column length */
|
||||
RESULT_COL_TYPE type; /*< Column type */
|
||||
@ -54,7 +56,8 @@ typedef struct resultcolumn {
|
||||
/**
|
||||
* A representation of a row within a result set.
|
||||
*/
|
||||
typedef struct resultrow {
|
||||
typedef struct resultrow
|
||||
{
|
||||
int n_cols; /*< No. of columns in row */
|
||||
char **cols; /*< The columns themselves */
|
||||
} RESULT_ROW;
|
||||
@ -85,4 +88,5 @@ extern void resultset_free_row(RESULT_ROW *);
|
||||
extern int resultset_row_set(RESULT_ROW *, int, char *);
|
||||
extern void resultset_stream_mysql(RESULTSET *, DCB *);
|
||||
extern void resultset_stream_json(RESULTSET *, DCB *);
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user