42.4. Dados globais no PL/Tcl #

Às vezes é útil ter alguns dados globais mantidos entre duas chamadas para uma função, ou compartilhados entre funções diferentes. Isto é feito facilmente no PL/Tcl, mas existem algumas restrições que devem ser compreendidas.

Por razões de segurança, o PL/Tcl executa funções chamadas por qualquer função de banco de dados (identificador de autorização/role) em um interpretador Tcl separado para esta função de banco de dados. Isto evita interferência acidental ou maliciosa de um usuário no comportamento das funções PL/Tcl de outro usuário. Cada um desses interpretadores terá seus próprios valores para quaisquer variáveis Tcl globais. Assim, duas funções PL/Tcl vão compartilhar as mesmas variáveis globais se, e somente se, forem executadas pela mesma função de banco de dados. Em uma aplicação que uma única sessão executa o código sob múltiplas funções de banco de dados (via funções SECURITY DEFINER, uso de SET ROLE, etc.), talvez seja necessário executar etapas explícitas para garantir que as funções PL/Tcl possam compartilhar dados. Para fazer isto, é necessário que as funções que devem se comunicar pertençam ao mesmo usuário, e sejam marcadas como SECURITY DEFINER. É claro que se deve tomar cuidado para que estas funções não possam ser usadas para fazer algo não intencional.

Todas as funções PL/TclU usadas em uma sessão são executadas no mesmo interpretador Tcl, que obviamente é distinto do(s) interpretador(es) usado(s) para funções PL/Tcl. Portanto, os dados globais são automaticamente compartilhados entre funções PL/TclU. Isto não é considerado um risco de segurança, porque todas as funções PL/TclU são executadas no mesmo nível de confiança, ou seja, o de um superusuário do banco de dados.

Para ajudar a proteger as funções PL/Tcl contra interferências involuntárias umas nas outras, é disponibilizada uma matriz global para cada função através do comando upvar. O nome global dessa variável é o nome interno da função, e o nome local é GD. É recomendado que seja usado GD para os dados privados persistentes de uma função. Deve-se usar variáveis globais Tcl regulares apenas para valores que se pretende especificamente que sejam compartilhados entre múltiplas funções. (Note que as matrizes GD são globais apenas em um interpretador específico, portanto elas não contornam as restrições de segurança mencionadas acima.)

Um exemplo de uso de GD aparece no exemplo spi_execp mais adiante.