Latest activity:

Conversión de columnas PostgreSQL en entidades HTML

Una tarea útil en la localización de hipergate es la conversión de los campos Unicode de la base de datos en entidades HTML y viceversa. Esto facilita la exportación de caracteres no ASCII sobre ficheros con codificación Latin1.

Estas dos funciones sirven para convertir una columna con caracteres UTF-8 a entidades numéricas HTML en codificación Unicode-16
/* Convert a single character encoded as UTF-8 to an HTML entity */

CREATE FUNCTION k_utf8_to_ent (bytea) RETURNS VARCHAR AS ‘
DECLARE
mbs  INTEGER;
ret  VARCHAR(8);
BEGIN
mbs := octet_length($1);

IF mbs=1 THEN
ret:=””||to_hex(get_byte($1,0))||”;”;
ELSIF mbs=2 THEN
ret:=””|| to_hex(((get_byte($1,0)&31)*64)
+(get_byte($1,1)&63))||”;”;
ELSIF mbs=3 THEN
ret:=””|| to_hex(((get_byte($1,0)&15)*64*64)
+((get_byte($1,1)&63)*64)+(get_byte($1,2)&63))||”;”;
END IF;

RETURN ret;
END;
‘ LANGUAGE ‘plpgsql’;

/* Convert a string encoded as UTF-8 to an HTML entity */

CREATE FUNCTION k_utf8_to_html (VARCHAR) RETURNS VARCHAR AS ‘
DECLARE
len  INTEGER;
ret  VARCHAR(1024);
utf  VARCHAR(8);
BEGIN
CREATE CAST (text as bytea) WITHOUT FUNCTION;
len := char_length($1);
ret := ””;
FOR i IN 1 .. len LOOP
SELECT k_utf8_to_ent(CAST(substring($1 from i for 1) AS bytea))
INTO utf;
ret:=ret||utf;
END LOOP;
DROP CAST (text as bytea);
RETURN ret;
END;
‘ LANGUAGE ‘plpgsql’;

Tags: none

Creación de fuentes de datos JNDI

Es posible utilizar la fuente de datos estándar de hipergate com.knowgate.dataobjs.DBBind a través de JNDI ya que DBBind implementa, de hecho, el interfaz javax.sql.DataSource.

Para ello, lo primero es situar el driver JDBC en el directorio /lib de Tomcat en lugar del habitual /webapps/hipergate/WEB-INF/lib. Esto es preciso para que el cargador de Tomcat encuentre la clase del driver.

A continuación en la sección <Host> de conf/server.xml agregar:
<Context path=”/hipergate” docBase=”hipergate” crossContext=”true” reloadable=”true” debug=”1″>
<Resource name=”jdbc/DBBind” factory=”org.apache.naming.factory.BeanFactory” auth=”Container” type=”com.knowgate.dataobjs.DBBind” />
</Context>

Y en /WEB-INF/web.xml agregar

<resource-ref>
<description>
Resource reference to a factory for com.knowgate.jdc.JDCConnection
instances that may be used for talking to a particular
database that is configured in the Context
configurartion for the web application.
</description>
<res-ref-name>
jdbc/DBBind
</res-ref-name>
<res-type>
com.knowgate.dataobjs.DBBind
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>

Desde una JSP se accede al nuevo DataSource mediante:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup(“java:comp/env”);
DBBind oBind = (DBBind) envCtx.lookup(“jdbc/DBBind”);
Connection oConn = oBind.getConnection();
/* your data access code… */
oConn.close();
oBind.close();

Tags: none

Búsquedas insensibles a acentos y mayúsculas

Una de las dudas frecuentes es cómo convertir las búsquedas por defecto de hipergate basadas en cláusulas SQL LIKE estándar en búsquedas insensible a mayúsculas y acentos.

La manera de hacerlo depende, en general del SGBDR utilizado, ya que no existe un estándar comunmente aceptado para las búsquedas por aproximación.

En PostgreSQL lo mejor es procesar primero el parámetro de entrada con la función com.knowgate.misc.Gadgets.accentsToPosixRegEx() que reemplaza todas las vocales por una expresión regular. Por ejemplo, “Lozáno” será convertido en “L[oóòöôoooøõo]z[aáàäâaÃ¥aaaã]n[oóòöôoooøõo]“. Luego hay que emplear el operador ~* en vez de LIKE.

Es decir, en PostgreSQL la expresión:

SELECT * FROM k_contacts WHERE tx_surname LIKE ‘%Lozáno%’

deberá ser reemplazada por

SELECT * FROM k_contacts WHERE tx_surname ~* ‘.*L[oóòöôoooøõo]z[aáàäâaÃ¥aaaã]n[oóòöôoooøõo].*’

En SQL Server, las búsquedas son sensible o insensibles a mayúsculas en función del COLLATION que se haya especificado para la base de datos, pero, a diferencia de PostgreSQL no existe un operador para buscar expresiones regulares en el SQL nativo de la base de datos.

Un posible atajo es emplear una función externa VBScript. Para ello primero hay que ir a la configuración de superficie y activar el soporte de métodos OLE externos. A continuación crear una función Transact-SQL que llame al método Test del objeto RegExp de VBScript.

CREATE FUNCTION dbo.fn_regex(@pattern varchar(255), @matchstring varchar(8000)) RETURNS int AS
BEGIN
declare @obj int
declare @res int
declare @match bit
set @match=0
exec @res=sp_OACreate ‘VBScript.RegExp’,@obj OUT
IF (@res <> 0) BEGIN
RETURN NULL
END

exec @res=sp_OASetProperty @obj, ‘Pattern’, @pattern

IF (@res <> 0) BEGIN
RETURN NULL
END

exec @res=sp_OASetProperty @obj, ‘IgnoreCase’, 1

IF (@res <> 0) BEGIN
RETURN NULL
END

exec @res=sp_OAMethod @obj, ‘Test’,@match OUT, @matchstring

IF (@res <> 0) BEGIN
RETURN NULL
END

exec @res=sp_OADestroy @obj

return @match
END

Así pues, con esta función la sentencia:

SELECT * FROM k_contacts WHERE tx_surname LIKE ‘%Lozáno%’

quedaría como

SELECT * FROM k_contacts WHERE fn_regexp(‘.*L[oóòöôoooøõo]z[aáàäâaÃ¥aaaã]n[oóòöôoooøõo].*’,tx_surname)

Tags: none

New Hipergate project website

The new Hipergate project website has been created

Tags: none