domingo, 19 de fevereiro de 2012

CGI - Erro de ODBC 126 no Microsoft Access Driver

Programando em CGI no Sistema Windows Seven, e não podendo escolher o IIS (o Express e o Cassini não executam CGI), fizemos a opção pelo Tomcat. Tendo que usar o Microsoft Access devido aos custos com exportação de dados e conversão de tipos para o Mysql em aplicações legadas, optamos pelo servidor Tomcat 7. O Tomcat é mais compatível com a arquitetura CGI e ainda roda servlets JSP.

Diante de todos estes fatores, o acesso aos dados por ODBC tornou-se o mais viável. Mas ao tentar este acesso, o browser informou que não era possível acessar o ODBC via MIcrosoft Access Driver devido ao erro de sistema 126.

Em sistemas Microsoft isto é muito comum, pois cada atualização joga DLLs sobre as já existentes, provocando conflitos entre número de parâmetros e seus tipos de dados. E isto ocorre com o pacote de objetos que contém o ODBC. Com isto, a biblioteca odbcjt32.dll pode se tornar incompatível com o sistema da máquina (pasmem).

Resolvendo o problema no Windows XP e Seven

Vamos resolver o problema de forma que possa ser aplicado ao Windows XP e Seven.


    Como o Seven não vai deixar (em alguns casos) você copiar a biblioteca odbcjt32.dll para o C:\Windows\System32, crie um diretório C:\Meusystem com os arquivos:

     msjter40.dll
     odbcjt32.dll
     odbcji32.dll

Tire as bibliotecas odbcji32.dll e  msjter40.dll do C:\Windows\System32.
   
 No registro do Windows, na chave ODBCINST.INI, altere os parâmetros Driver e Setup do Microsoft Access Driver para este PATH (C:\Meusystem ):






segunda-feira, 13 de fevereiro de 2012

Lazarus Object Pascal - Programando em CGI

CGI é uma antiga forma de programar não proprietária em sua infra-estrutura, como é o ISAPI da Microsoft.

Vamos a algumas particularidades da programação em CGI que o tornam mais conveniente que o ISAPI em determinadas situações.

O ISAPI precisa ser preparado a base de objetos, forma de concepção de programação que exige planejamento anterior. Após o planejamento de métodos e propriedades que o objeto vai ter, é preciso utilizar ferramentas Microsoft de construção e dominar terminologias de construção que mudam de ano para ano e que provocam o advento de ferramentas cada vez mais complexas.

Se você desejar fazer uma aplicação simples de banco de dados e desejar ler um banco de dados em um arquivo TXT com uma certa estrutura, ou um XML, vai ter que dominar os aborrecidíssimos e instáveis objetos Microsoft, e que são portas para invasão, devido à não checagem de invasão de áreas de memória.

O Lazarus Pascal

O Lazarus Pascal, clone quase idêntico 100 % ao Delphi, possui componentes e capacidades já bem construídos em função das numerosas inconsistências do seu semelhante. Instale os dois pacotes do diretório:

<Diretório de Instalação>\Lazarus\Components\fpweb

Os pacotes a serem instalados são (nesta ordem):

weblaz.lpk
lazwebextra.lpk

Utilize a opção do menu:

Package => Open Package file (lpk)

Compile e Instale ambos, NA ORDEM QUE RECOMENDAMOS.

Se tudo correr bem, o Lazarus vai reiniciar.

Primeira versão - Utilizando o objeto TCustomCGIApplication


Inicie um novo projeto do tipo console.

program project1;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils, httpDefs, custcgi, custweb
  { you can add units after this };
Type

    TMyCGIApp = Class(TCustomCGIApplication)
    Protected
      function InitializeWebHandler: TWebHandler; override;
    end;
      TMyCGIHandler = class(TCGIHandler)
       public
         procedure HandleRequest(ARequest: TRequest; AResponse: TResponse); override;
       end;

{$R *.res}
Procedure TMyCGIHandler.HandleRequest(ARequest : Trequest; AResponse : TResponse);
begin

AResponse.Content := '<H1>Hello</H1>';
end;

function TMyCGIApp.InitializeWebHandler: TWebHandler;
begin
   Result := TMyCGIHandler.Create(self);
end;

begin
   With TMyCGIApp.Create(Nil) do
     try
       Initialize;
       Run;
     finally
       Free;
     end;
end.


Segunda versão - Usando fpweb e o WebModule

Utilize a opção de novo projeto do tipo CGI Application.

A unit gerada nem precisará ser mexida:


unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb, fphtml;

type

  { TFPWebModule1 }

  TFPWebModule1 = class(TFPWebModule)
    HTMLProducer1: THTMLEntityProducer;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  FPWebModule1: TFPWebModule1;

implementation

{$R *.lfm}

initialization
  RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
end.  

A única alteração virá como resultado da colocação de um componente THTMLEntityProducer da paleta fpweb.

Selecione o WebModule, e clique em sua propriedade Actions (que inicia com o valor 0 items). Aparece uma caixa de diálogo, onde você deverá pressionar o botão Add. Clicando na nova ação (action) aparecem as suas propriedades no Object Inspector. Clique então em Contents e coloque um trecho de HTML como abaixo:


<H1>HTMLEntityProducer</H1>
<P>Action 1</P>

Coloque o valor True na propriedade Default.

Compile e coloque o executável em um diretório com autorização de execução de cgis em um servidor web. Se você executar este programa pelo Lazarus, ele mostrará a mensagem:

Project <nome do projeto> raised Exception Class 'Exception' with message:
No REQUEST_METHOD passed from server.

Os fóruns de discussão da Internet não foram capazes de esclarecer os usuários do Lazarus de forma correta a respeito deste erro e nem do uso correto dos componentes fpweb. Foi preciso um enorme esforço para descobrir estas informações, sem documentação. Por isso estamos colocando esta ajuda para os "abandonados pelos técnicos".