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 <shashan...@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: eba...@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
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to