Re: [Gambas-user-fr] query_fill ?
Brought to you by:
gambas
From: Benoit M. <ga...@us...> - 2005-05-19 13:07:28
|
On Thursday 19 May 2005 14:43, Daniel wrote: > Benoit Minisini wrote: > >On Thursday 19 May 2005 11:03, Daniel wrote: > >>Benoit Minisini wrote: > >>>On Saturday 14 May 2005 17:58, Daniel wrote: > >>>>salut > >>>>je voudrais ecrire un petit driver pour firebird! > >>>>ou peut-on trouver de la doc sur les div. fonctions > >>>>ex: query_fill, query_do ... etc. > >>>>j'ai deja open_database -> ok > >>>> close_database -> ok > >>>> exec_query -> ok > >>>> query_init -> ok > >>>> query_release -> ok > >>>> query_fill -> alors la pas ok !!!!! > >>>>pour l'instant je ne sais pas ce que fait query_fill > >>>> > >>>>daniel > >>> > >>>Dans le driver postgresql, j'ai mis en commentaire ce que devait faire > >>>chaque fonction du driver. Les as-tu lu ? Peut-=EAtre que je n'ai pas = =E9t=E9 > >>>assez clair, auquel cas dis-le moi! :-) > >>> > >>>Cordialement, > >> > >>juste une petite question ! > >>faut-il convertir tous les fields en chaines de caractere ( les > >>numeriques )? (firebird retourne les fields numeriques en type int ou > >>foalt ... etc) > >>d'avance un grand merci > >> > >>daniel > > > >O=F9 ? Dans query_fill() ? > > > >Regarde le code source de query_fill() dans le driver postgresql: > > > >postgresql renvoie les donn=E9es sous forme textuelle, et une fonction e= st > >appel=E9e pour les convertir au format r=E9el en remplissant comme il co= nvient > >une structure GB_VARIANT... > > > >Tu peux reprendre le code quasi tel quel. Si tu r=E9cup=E8re les donn=E9= es au > > format r=E9el, il n'est pas n=E9cessaire d'effectuer de conversion avan= t de > > stocker la valeur dans le GB_VARIANT. > > justement firebird retour les datas sous forme int, foat,*char ... etc, > de plus firebird ne retour pas de result !!!!, (+- un cursor, qu'il faut > fetcher record par record) > donc il faut convertir ces data en text au moment du fetch puis passer > par la fonction "conv_data" dans query_fill. correct ? > > daniel > Non, au contraire! L'appel =E0 conv_data() dans ce cas n'est plus n=E9cessa= ire.=20 Enfin, pour =EAtre plus pr=E9cis, n'est plus n=E9cessaire ce qui prend une = cha=EEne=20 de caract=E8re en entr=E9e et retourne une valeur (int, double, char* ...) = en=20 sortie, puisque tu as d=E9j=E0 la valeur sous la main! Voici un example de conv_data() postgresql purg=E9. Compare avec l'original. J'ai mis en commentaire ce que j'ai retir=E9. J'ai gard=E9 les constantes d= e type=20 de postgresql, =E0 remplacer par celles de Firebird. C'est un peu du=20 pseudo-code, mais c'est pour que tu comprennes. static void conv_data(char *data, GB_VARIANT_VALUE *val, Oid type) { GB_VALUE conv; GB_DATE_SERIAL date; double sec; long len; bool bc; // A la place de data, il faudra passer la valeur retourn=E9e par Firebird switch (type) { case BOOLOID: val->_boolean.type =3D GB_T_BOOLEAN; //val->_boolean.value =3D conv_boolean(data); val->_boolean.value =3D boolean_value; break; /*case INT8OID:*/ case INT2OID: case INT4OID: //GB.NumberFromString(GB_NB_READ_INTEGER, data, strlen(data), &conv); val->_integer.type =3D GB_T_INTEGER; //val->_integer.value =3D ((GB_INTEGER *)&conv)->value; val->_integer.value =3D integer_value; break; case NUMERICOID: case FLOAT4OID: case FLOAT8OID: //GB.NumberFromString(GB_NB_READ_FLOAT, data, strlen(data), &conv); val->_float.type =3D GB_T_FLOAT; //val->_float.value =3D ((GB_FLOAT *)&conv)->value; val->_float.value =3D double_value; break; case ABSTIMEOID: case RELTIMEOID: case DATEOID: case TIMEOID: case TIMESTAMPOID: #ifdef DATETIMEOID case DATETIMEOID: #endif #ifdef TIMESTAMPTZOID case TIMESTAMPTZOID: #endif // L=E0 c'est plus compliqu=E9. // Il faut remplir la structure date avec les informations temporelle= s: // ann=E9e, mois, jour, heure, minutes, secondes, et m=EAme fraction = de // secondes! memset(&date, 0, sizeof(date)); =20 ... GB.MakeDate(&date, (GB_DATE *)&conv); val->_date.type =3D GB_T_DATE; val->_date.date =3D ((GB_DATE *)&conv)->value.date; val->_date.time =3D ((GB_DATE *)&conv)->value.time; break; case CHAROID: case BPCHAROID: case VARCHAROID: case TEXTOID: case NAMEOID: case BYTEAOID: case CASHOID: default: // C'est une cha=EEne de caract=E8re, il ne devrait rien avoir =E0 fa= ire... val->_string.type =3D GB_T_CSTRING; val->_string.value =3D data; break; } Est-ce que les choses sont plus claires maintenant ? :-) =2D-=20 Benoit Minisini mailto:ga...@us... |