static void
esql_mysac_row_init(Esql_Row *r, MYSAC_ROW *row)
{
   MYSAC_RES *res;
   MYSAC_ROWS *rows;
   struct mysac_list_head *l;
   Eina_Value *sval;
   unsigned int i, cols;

   res = r->res->backend.res;
   rows = res->cr;
   l = res->data.next;
   cols = res->nb_cols;

   sval = &(r->value);
   eina_value_struct_setup(sval, r->res->desc);
   for (i = 0; i < cols; i++, l = l->next, rows = mysac_container_of(l, MYSAC_ROWS, link))
     {
        Eina_Value val;
        const Eina_Value_Struct_Member *m = r->res->desc->members + i;

        switch (res->cols[i].type)
          {
           case MYSQL_TYPE_TIME:
             eina_value_setup(&val, EINA_VALUE_TYPE_DOUBLE);
             eina_value_set(&val, (double)row[i].tv.tv_sec + (double)((double)row[i].tv.tv_usec / (double) 1000000));
             break;

           case MYSQL_TYPE_YEAR:
           case MYSQL_TYPE_TIMESTAMP:
           case MYSQL_TYPE_DATETIME:
           case MYSQL_TYPE_DATE:
             eina_value_setup(&val, EINA_VALUE_TYPE_TIMESTAMP);
             eina_value_set(&val, (long)mktime(row[i].tm));
             break;

           case MYSQL_TYPE_STRING:
           case MYSQL_TYPE_VARCHAR:
           case MYSQL_TYPE_VAR_STRING:
             eina_value_setup(&val, EINA_VALUE_TYPE_STRING);
             eina_value_set(&val, row[i].string);
             //cell->len = rows->lengths[i];
             break;

           case MYSQL_TYPE_TINY_BLOB:
           case MYSQL_TYPE_MEDIUM_BLOB:
           case MYSQL_TYPE_LONG_BLOB:
           case MYSQL_TYPE_BLOB:
             {
                Eina_Value_Blob blob;

                blob.ops = NULL;
                blob.memory = row[i].string;
                blob.size = rows->lengths[i];
                eina_value_setup(&val, EINA_VALUE_TYPE_BLOB);
                eina_value_set(&val, blob);
                break;
             }

           case MYSQL_TYPE_TINY:
             eina_value_setup(&val, EINA_VALUE_TYPE_CHAR);
             eina_value_set(&val, row[i].stiny);
             break;

           case MYSQL_TYPE_SHORT:
             eina_value_setup(&val, EINA_VALUE_TYPE_SHORT);
             eina_value_set(&val, row[i].ssmall);
             break;

           case MYSQL_TYPE_LONG:
           case MYSQL_TYPE_INT24:
             eina_value_setup(&val, EINA_VALUE_TYPE_LONG);
             eina_value_set(&val, row[i].sint);
             break;

           case MYSQL_TYPE_DECIMAL:
           case MYSQL_TYPE_NEWDECIMAL:
           case MYSQL_TYPE_LONGLONG:
             eina_value_setup(&val, EINA_VALUE_TYPE_INT64);
             eina_value_set(&val, row[i].sbigint);
             break;

           case MYSQL_TYPE_FLOAT:
             eina_value_setup(&val, EINA_VALUE_TYPE_FLOAT);
             eina_value_set(&val, row[i].mfloat);
             break;

           case MYSQL_TYPE_DOUBLE:
             eina_value_setup(&val, EINA_VALUE_TYPE_DOUBLE);
             eina_value_set(&val, row[i].mdouble);
             break;

           default:
             ERR("FIXME: Got unknown column type %u!", res->cols[i].type);
             break;
          }
        eina_value_struct_member_value_set(sval, m, &val);
        eina_value_flush(&val);
     }
}
Beispiel #2
0
static void
esql_mysac_row_init(Esql_Row *r)
{
   MYSAC_RES *res;
   MYSAC_ROW *row;
   MYSAC_ROWS *rows;
   struct mysac_list_head *l;
   Esql_Cell *cell;
   int i, cols;

   res = r->res->backend.res;
   rows = res->cr;
   l = res->data.next;
   row = r->backend.row;
   cols = res->nb_cols;
   for (i = 0; i < cols; i++, l = l->next, rows = mysac_container_of(l, MYSAC_ROWS, link))
     {
        cell = calloc(1, sizeof(Esql_Cell));
        EINA_SAFETY_ON_NULL_RETURN(cell);
        cell->row = r;
        cell->colname = res->cols[i].name;
        switch (res->cols[i].type)
          {
           case MYSQL_TYPE_TIME:
             cell->type = ESQL_CELL_TYPE_TIME;
             memcpy(&cell->value.tv, &row[i].tv, sizeof(struct timeval));
             break;

           case MYSQL_TYPE_YEAR:
           case MYSQL_TYPE_TIMESTAMP:
           case MYSQL_TYPE_DATETIME:
           case MYSQL_TYPE_DATE:
             cell->type = ESQL_CELL_TYPE_TIMESTAMP;
             memcpy(&cell->value.tm, row[i].tm, sizeof(struct tm));
             break;

           case MYSQL_TYPE_STRING:
           case MYSQL_TYPE_VARCHAR:
           case MYSQL_TYPE_VAR_STRING:
             cell->type = ESQL_CELL_TYPE_STRING;
             cell->value.string = row[i].string;
             cell->len = rows->lengths[i];
             break;

           case MYSQL_TYPE_TINY_BLOB:
           case MYSQL_TYPE_MEDIUM_BLOB:
           case MYSQL_TYPE_LONG_BLOB:
           case MYSQL_TYPE_BLOB:
             cell->type = ESQL_CELL_TYPE_BLOB;
             cell->value.blob = (unsigned char*)row[i].string;
             cell->len = rows->lengths[i];
             break;

           case MYSQL_TYPE_TINY:
             cell->type = ESQL_CELL_TYPE_TINYINT;
             cell->value.c = row[i].stiny;
             break;

           case MYSQL_TYPE_SHORT:
             cell->type = ESQL_CELL_TYPE_SHORT;
             cell->value.s = row[i].ssmall;
             break;

           case MYSQL_TYPE_LONG:
           case MYSQL_TYPE_INT24:
             cell->type = ESQL_CELL_TYPE_LONG;
             cell->value.i = row[i].sint;
             break;

           case MYSQL_TYPE_LONGLONG:
             cell->type = ESQL_CELL_TYPE_LONGLONG;
             cell->value.l = row[i].sbigint;
             break;

           case MYSQL_TYPE_FLOAT:
             cell->type = ESQL_CELL_TYPE_FLOAT;
             cell->value.f = row[i].mfloat;
             break;

           case MYSQL_TYPE_DOUBLE:
             cell->type = ESQL_CELL_TYPE_DOUBLE;
             cell->value.d = row[i].mdouble;
             break;

           default:
             ERR("FIXME: Got unknown column type %u!", res->cols[i].type);
             break;
          }
        r->cells = eina_inlist_append(r->cells, EINA_INLIST_GET(cell));
     }
}