sexta-feira, 18 de maio de 2012

to_ascii funcionando no PostgreSQL

Como certa vez disse o Fabrício Lakus Brito, "lower(to_ascii()) é o que há". Infelizmente essa função não funciona mais para bancos de dados com codificação UTF-8 na versão 8.3. Encontrei no blog Florian Helmberger’s blog a descrição da situação que enfrentamos:
In the process of fixing our code for an upcoming upgrade of one database version for one of our $-projects I encountered a strange behaviour. Initiual situation:
  • we're moving from PostgreSQL 8.1.3 to the 8.3.5
  • we're moving from database encoding LATIN1 to UTF8
  • in our code we're using the TO_ASCII function a few times.
And this combination produces some headaches.
A função to_ascii deixou de funcionar. A solução apresentada nesse blog (que já foi pega de uma outra pessoa) foi:

CREATE FUNCTION to_ascii(bytea, name) RETURNS text STRICT AS 'to_ascii_encname' LANGUAGE internal;

Daí eu uso a função assim:

SELECT to_ascii(convert_to('Übermeier', 'latin1'), 'latin1');

segunda-feira, 7 de maio de 2012

Múltiplas requisições AJAX


Precisava fazer várias requisições ajax a vários servidores. Não queria me preocupar com a ordem das requisições, mas pra possibilitar que todas fossem feitas ao mesmo tempo, precisava criar um objeto XmlHttp para cada uma delas (veja http://www.ibm.com/developerworks/web/library/wa-ajaxintro3/).

Uma solução que estou testando usa closures (veja http://jibbering.com/faq/notes/closures/), que é diferente do Closure Tools (https://developers.google.com/closure/compiler/). Ainda estou aprendendo a mexer com isso, e o resultado foi (atualização 7/2/2013: veja este post: Usando o ajaxStufff):


E o arquivo ajaxStufff.js:

function assoc(xmlHttp, postQueryString, onreadystatechange, action)
{
    return (function() {
        xmlHttp.onreadystatechange=onreadystatechange;
        xmlHttp.open("POST", action, true);
        xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlHttp.setRequestHeader("Content-length", postQueryString.length);
        xmlHttp.setRequestHeader("Connection", "close");
        xmlHttp.send(postQueryString);
    });
}

function obterXHR() {
    try
    {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    }
    catch(e)
    {
        // Internet Explorer
        try
        {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (e)
        {
            try
            {
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e)
            {
                alert("Seu navegador não suporta AJAX!");
                return false;
            }
        }
    }
    return xmlHttp;
}