Re: different data types between clist and mysql.



thanks.

now i have another question. i use treeview to store data, and when i get a
cell data with gtk_tree_model_get(model, &iter2, 1, &s, -1),the data type of
what i get is always a string.How to convert string into MYSQL_TYPE before i
write it back into mysql.

On Wed, Apr 21, 2010 at 4:05 AM, Shawn Bakhtiar <shashaness hotmail com>wrote:


Ran into same problem.

I use a structure like

_IsiField {

 int type,
 int pos,
 int ....

}

Then create my own list with

_IsiList {

 GList Fields;
 GList rows;

}


Every time retrieve a set of values, I have a routing which sets type to a
G_TYPE, which corresponds to the MYSQL_TYPE


Here is what I do:

GList *
 isi_database_fetch_fields(IsiDatabase *self)
{

   MYSQL_FIELD *field;
   IsiFields *l;
   GList *gl = NULL;
   guint column = 0;

    /* Sanity Check */
   g_return_val_if_fail(self != NULL, NULL);
   g_return_val_if_fail(self->priv != NULL, NULL);
   g_return_val_if_fail(self->priv->dispose_has_run != TRUE, NULL);
   g_return_val_if_fail(self->priv->res != NULL, NULL);

   /* Rewind the feild set */
   mysql_field_seek(self->priv->res,0L);


   while((field = mysql_fetch_field(self->priv->res)))
   {
       /* Initialize a new IsiFields structure */
       //l = (IsiFields*) g_new0(IsiFields, 1);
       l = g_new0(IsiFields, 1);

   /* Set the values */
   l->alias = g_strdup(field->name);
   l->name = g_strdup(field->org_name);
   l->length = field->length;

   /* always make fields visable */

   l->hidden = FALSE;
       l->sortable = FALSE;
   l->pos = column++;


   switch (field->type){

       /* Integer types */
       case MYSQL_TYPE_TINY:
       case MYSQL_TYPE_SHORT:
       case MYSQL_TYPE_INT24:

           /* Check for signage */
           if (field->flags & UNSIGNED_FLAG)
               l->type = G_TYPE_UINT;
           else
               l->type = G_TYPE_INT;

           break;


       /* Long types */
       case MYSQL_TYPE_LONG:
       case MYSQL_TYPE_LONGLONG:

           /* Check for signage */
           if (field->flags & UNSIGNED_FLAG)
               l->type = G_TYPE_ULONG;
           else
               l->type = G_TYPE_LONG;
           break;


       /* Decimal types */
       case MYSQL_TYPE_DECIMAL:
       case MYSQL_TYPE_NEWDECIMAL:
       case MYSQL_TYPE_FLOAT:
       case MYSQL_TYPE_DOUBLE:
           l->type = G_TYPE_DOUBLE;
           break;

       /* Bit types */
       case MYSQL_TYPE_BIT:
           l->type = G_TYPE_BOOLEAN;
           break;

       /* ENUM types */
       case MYSQL_TYPE_ENUM:
           l->type = G_TYPE_ENUM;
           break;

       /* All other types */
       default:
       case MYSQL_TYPE_STRING:
       case MYSQL_TYPE_VAR_STRING:
       case MYSQL_TYPE_BLOB:
       case MYSQL_TYPE_SET:
       case MYSQL_TYPE_TIMESTAMP:
       case MYSQL_TYPE_DATE:
       case MYSQL_TYPE_TIME:
       case MYSQL_TYPE_DATETIME:
       case MYSQL_TYPE_YEAR:
       case MYSQL_TYPE_GEOMETRY:
       case MYSQL_TYPE_NULL:

           if(l->length <= 1){
               l->type = G_TYPE_CHAR;
           }else{
               l->type = G_TYPE_STRING;
           }
           break;
   }


       /*DEBUG*/
       //g_print("%s %d %d \n", l->alias,l->type,l->length);

       /* Save pointer to list */
       gl = g_list_append(gl,(gpointer)l);

   }

return gl;}



now convert the row data to a GList and you have two GLists in your one
lists, one with the field header info, the other with the data.


and create the liststore like this:

GtkTreeModel *
isi_display_liststore_create(IsiDisplay *self, GList *fields)
{
  guint num_fields, i;
  IsiFields *l;
  GtkTreeModel *model;
  GType *types;
  guint search_col_adj = 0;

    /* Sanity Check */
   g_return_val_if_fail(self != NULL, NULL);
   g_return_val_if_fail(self->priv != NULL, NULL);
   g_return_val_if_fail(self->priv->dispose_has_run != TRUE, NULL);

  /* Get the number of fields */
  if(fields != NULL){

       num_fields = g_list_length(fields);

   /* Initialize values based on number of columns */
   types = (GType*) g_new0( GType, num_fields);

   for(i=0;i<num_fields;i++){

       l = (IsiFields*)g_list_nth_data(fields,i);
       types[i] = l->type;


   }


       /* create the model store for data input */
   model =  (GtkTreeModel*) gtk_list_store_newv(num_fields,types);

   g_free(types);



   for(i=0;i<num_fields;i++){

       l = (IsiFields*)g_list_nth_data(fields,i);

       /* Setup sorting functions for the modle */
       switch(l->type){
           case G_TYPE_INT:
               l->sortable=TRUE;
               gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
l->pos, sort_by_int,(gpointer) l->pos, NULL);
               break;
           case G_TYPE_UINT:
               l->sortable=TRUE;
               gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
l->pos, sort_by_uint,(gpointer) l->pos, NULL);
               break;
           case G_TYPE_LONG:
               l->sortable=TRUE;
               gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
l->pos, sort_by_long,(gpointer) l->pos, NULL);
               break;
           case G_TYPE_ULONG:
               l->sortable=TRUE;
               gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
l->pos, sort_by_ulong,(gpointer) l->pos, NULL);
               break;
           case G_TYPE_DOUBLE:
               l->sortable=TRUE;
               gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
l->pos, sort_by_double,(gpointer) l->pos, NULL);
               break;
           case G_TYPE_STRING:
               l->sortable=TRUE;
               gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(model),
l->pos, sort_by_string,(gpointer) l->pos, NULL);
               break;
       }

   }


   return model;
   }



return NULL;}



Hope this helps,
Shawn



 EMAILING FOR THE GREATER GOOD
Join me

Subject: Re: different data types between clist and mysql.
From: ebassi gmail com
To: gtk-app-devel-list gnome org
Date: Tue, 20 Apr 2010 15:49:20 +0100

On Tue, 2010-04-20 at 21:15 +0800, Arthur 1989 wrote:
Hello, I used *clist* to display data iI fetch from mysql server,but
when
writing data back into the table of database, I got this question: the
data
type of clist is always *gchar **, while there are quite a lot of other
data
types in mysql. What can I do to get this question solved? Any tips
will be
appreciated.

CList is *beyond* deprecation - you should not be using it.

look at GtkListStore and GtkTreeView; there's also a tutorial here:

  http://scentric.net/tutorial

ciao,
 Emmanuele.

--
W: http://www.emmanuelebassi.name
B: http://blogs.gnome.org/ebassi

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list




-- 
---------------------
Best regards



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]