Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-07-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Question Funcion de Que Retorna una Cadena

Hola, tengo una consulta que hacerles abusando de su amable atension.

Tengo una duda acerca de una funcion que devuelve una cadena, en el documento que lleva por nombre DEVGUIDE.PDF de la documentacion de Interbase 6.5 mensiona un codigo para realizar un funcion UDF que devuleve una cadena es algo asi :

char *fn_lower(char *ups)
{
char *buffer = (char *) ib_util_malloc(256);
...
return (buffer);
}


y el codigo para interbase es:

DECLARE EXTERNAL FUNCTION lowers VARCHAR(256)
RETURNS CSTRING(256) FREE_IT
ENTRY POINT 'fn_lower' MODULE_NAME 'ib_udf.dll'


bueno la duda es como sabe Interbase cuanta memoria debe de liberar despues de la llamada al procedimiento fn_lower , mi idea es que talvez libera la memoria declarada en la variable de retorno RETURNS CSTRING(256) FREE_IT pero no estoy seguro de esto, osea en otras palabras ambos numeros deberian ser iguales ?.

Bueno esta es mi primer duda. buscando una respuesta encontre algo en FireBird, Ademas que fireBird es el manejador que quiero utilizar.

Bueno pues en codigo de ejemplo en la instalacion de Firebird utilizan algo como esto:

para el codigo de la libreria :

char* EXPORT fn_lower_c (ARG(char*, s))
ARGLIST(char *s) /* VARCHAR input */
{
char *buf;
short length = 0;
char *buffer = (char *)malloc(256);
length = (short)*s;
s += 2;
buf = buffer;
while (*s)
if (*s >= 'A' && *s <= 'Z')
*buf++ = *s++ - 'A' + 'a';
else
*buf++ = *s++;
*buf = '\0';
buffer [length] = '\0';
return buffer;
}

y para el codigo de la Base de Datos:

DECLARE EXTERNAL FUNCTION lower
VARCHAR (256)
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT 'fn_lower_c' MODULE_NAME 'udflib';
bueno aqui noto otra dos diferencias una es la funcion para solicitar memoria en el codigo de la Libreria osea char *buffer = (char *)malloc(256), ademas que la variable RETURNS CSTRING(80) FREE_IT no corresponde en tamaño con la memoria solicitada en la libreria.
osea en Libreria 256 != 80 en La base de Datos.

Con repecto a la forma de solicitar memoria osea la funcion ib_util_malloc se encutra en la libreria de Interbase IB_UTIL.H, IB_UTIL.LIB la cual es distribuida por interbase, esta se compila por ejemplo con Borland C++ 5.0

Busque esta Libreria o una similar en Firebird pero solo me encuentra la Cabecera osea ib_util.h , pero para el caso de el archivo lib solo encentro ib_util_ms.lib.

Bueno pues la pregunta en general cual seria la forma correcta de hacer una funcion de este tipo, me preocupa la liberacion adecuada de memoria para que el codigo sea estable.

Ademas que interbase argumenta en su documento de la version 6.5 que el codigo arriba mensionado es thread safe.

Seria correcto solo utilizar en (char *)malloc en FireBird y no tener problemas o que no sea thread safe.

Bueno pues esta es mi duda espero que no sea algo dificil y que yo me este ahogando en un vaso de agua. por su ayuda y atension muchas gracias.


Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:32:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi