Siguiendo con mi intento de mejorar TmySQL, he notado que al pasar a array una consulta, todos los datos vienen como cadena de caracteres, por lo que he intentado modificar este comportamiento.
mi idea es que previo a pasar los datos del result, obtener el tipo de dato de la columna, para eso uso un ciclo for y la funcion SQL2ClipType que retornara un caracter segun sea el caso si la columna es de tipo [C]har, [N]um, [D]ate, [M]emo, [L]ogic, la idea es agregar ese dato a un arreglo char para por ejemplo si la tabla tiene las siguiente columnas: CHAR, NUMERIC, DATE, LOGICAL, MEMO, tendria en la variable szTypeFields el contenido "CNDLM", esto para ser usado luego
Cade señalar que este funcion proviene de dolphin. solo intento mejorarla.
Code: Select all
HB_FUNC( MYSQL_QUERY2ARRAY )
{
MYSQL *mysql = (MYSQL *) hb_MYSQL_par( 1 );
if( mysql )
{
PHB_ITEM itemReturn = hb_itemArrayNew( 0 );
if( mysql_real_query( mysql, (const char *) hb_parc( 2 ), (unsigned long) hb_parclen( 2 ) ) == MYSQL_QUERY_SUCCESS )
{
MYSQL_RES *mresult = mysql_store_result( mysql );
if( mresult )
{
PHB_ITEM pBlock = hb_param( 3, HB_IT_BLOCK ) ? hb_param( 3, HB_IT_BLOCK ) : NULL;
PHB_ITEM itemRow = hb_itemNew( NULL );
PHB_ITEM Count = hb_itemNew( NULL );
PHB_ITEM Rec = hb_itemNew( NULL );
unsigned int uiNumFields, uiX;
HB_LONGLONG llNumRows, llRec;
MYSQL_FIELD *mField;
MYSQL_ROW mrow;
const char *szTypeField;
char szTypeFields[]="";
char letra;
uiNumFields = mysql_num_fields( mresult );
for( uiX = 0; uiX < uiNumFields; uiX++ ) //aca obtengo los tip
{
mField = mysql_fetch_field_direct( mresult, uiX );
szTypeField = SQL2ClipType( ( long ) mField->type ); //aca obtengo que tipo de datos xbase es c/columna
hb_xstrcat( szTypeFields, szTypeField, 0); //aca lo acumulo en un arrelo char
}
//OutStr( szTypeFields ); //CNDLM example
llRec = 0;
llNumRows = mysql_num_rows( mresult );
mysql_data_seek( mresult, 0 );
while( ( mrow = mysql_fetch_row( mresult ) ) != NULL ) //aca el ciclo para pasar el result a array
{
if( mrow )
{
hb_arrayNew( itemRow, uiNumFields );
for( uiX = 0; uiX < uiNumFields; uiX++ ) // ciclo para recorrer cada columna del result
{
//mi idea es obtener el tipo de dato xbase acumulado anteriormente
//y convertir el dato segun el tipo
//pero me falto conocimiento. :-)
/*
letra = szTypeFields[ uiX + 1 ];
switch ( letra )
{
case 'C':
//hb_arraySetC( itemRow, uiX + 1, mrow[ uiX ] );
break;
case 'N':
//hb_arraySetNI( itemRow, uiX + 1, mrow[ uiX ] );
break;
case 'D':
//hb_arraySetDS( itemRow, uiX + 1, mrow[ uiX ] );
break;
case 'L':
//hb_arraySetL( itemRow, uiX + 1, mrow[ uiX ] );
break;
}
*/
//este es el codigo que pasa el valor al array (ver que todo lo pasa como cadena de caracteres)
if( mrow[ uiX ] == NULL )
{
hb_arraySetC( itemRow, uiX + 1, NULL );
}
else
{
hb_arraySetC( itemRow, uiX + 1, mrow[ uiX ] );
}
} //end for
hb_arrayAddForward( itemReturn, itemRow );
hb_itemPutNLL( Rec, llRec++ );
hb_itemPutNLL( Count, llNumRows );
if( pBlock )
{
hb_evalBlock( pBlock, itemRow, Rec, Count, NULL );
}
}
} //end while
mysql_free_result( mresult );
hb_itemRelease( itemRow );
hb_itemRelease( Count );
hb_itemRelease( Rec );
}
}
hb_itemReturnRelease( itemReturn );
}
else
{
hb_errRT_BASE( EG_ARG, 2020, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
}