segunda-feira, 10 de janeiro de 2011

Tutorial: Paginação em ajax, utilizando a classe Paging e o plugin Jquery Table Sorter

Como sei que paginação em php é (quase)sempre um problema, resolvi criar uma classe para fazer esse trabalho por mim de uma maneira bem simples e escalável, é a classe Paging, que já foi apresentada anteriormente nos posts: Paginação simples e rápida em PHP utilizando a classe Paging e Tutorial: Utilizando a classe Paging para criar uma paginação simples e rápida.

Na versão em que ela se encontra, os únicos dados que conseguimos paginar são resultados tabelados, ou seja gerar um grid de dados com paginação, mas a idéia é futuramente poder paginar vários tipos de dados, como conteúdo html e imagens, porém, como falta-me tempo não consegui implementar métodos para isso, se você quiser contribuir fique a vontade. Deixando o papo de lado, vamos a solução.

Criando paginação utilizando ajax

Arquivos necessários

Para este tutorial iremos utilizar a biblioteca Jquery e o plugin Jquery Table Sorter. Ambos já estão inseridos no arquivo compactado disponível para download abaixo, juntamente com a classe Paging e os demais arquivos necessários para criar a paginação em ajax.

Entendendo os arquivos

/css

Neste diretório você irá encontrar duas folhas de estilos, uma utilizada simplesmente para estilizar o arquivo index.html e a outra é a folha de estilização padrão baixada juntamente com o plugin Jquery Table Sorter.

/img

Neste diretório são encontradas apenas imagens utilizadas no plugin Jquery Table Sorter.

/lib

Aqui você encontrará dois subdiretórios: /js e /php, neles você encontrará o a biblioteca Jquery e o plugin Jquery Table Sorter, além da classe de paginação Paging e a classe Connection, utilizada pela classe Paging para fazer uma conexão com um banco de dados. Caso você tenha dúvidas de como implementar esta conexão de uma olhada neste tutorial. Você não vai precisar mexer em nada nestes arquivos, a não ser que queira inserir novos métodos.

produtos.sql

Utilizamos este sql apenas para este exemplo, mas você pode facilmente configurar nossa solução para a tabela que você quiser.

paging.js

Este arquivo é quem faz o trabalho de criar as chamadas em ajax, para fazermos uma paginação sem recarga de página, a não ser que você queira implementar alguma nova funcionalidade, não é preciso mudar nada nele.

index.php

Neste documento encontramos a marcação necessária para apresentarmos os elementos básicos de nossos dados paginados:
  1. Uma div para procurarmos registros (search)
  2. Uma div que irá mostrar os registros encontrados (grid)
  3. Uma ou mais divs para mostrar os controles da paginação (controls)
  4. As chamadas a estilos e scripts necessários para fazer o "show" acontecer.
No arquivo que você for implementar esta solução, você não precisa nomear os ids/classes das divs exatamente como neste exemplo (grid, controls e search), fique livre para nomeá-los como achar melhor.

Criando paginação em ajax configurando apenas dois arquivos

grid.php

Este é um dos dois arquivos que você precisará alterar para fazer a mágica acontecer, são apenas 6 linhas que teremos que alterar (em negrito):

require_once('lib/php/paging.class.php');
$paging = new Paging();
$searchfor = isset($_GET['searchfor']) ? $_GET['searchfor'] : '';
$paging->table('produtos');
$paging->where('id = "'.$searchfor.'" OR nome LIKE "%'.$searchfor.'%" OR tipo LIKE "%'.$searchfor.'%"');
$paging->labels('ID,Nome,Tipo');
$paging->fields('id,nome,tipo');
$paging->cols_width('10,100,40');
$paging->rowsperpage(10);
$paging->page(isset($_GET['p']) ? $_GET['p'] : 1);

if($_GET['load'] == 'controls'){

$paging->show_controls();

}else{

$paging->show_table();

}
  1. require_once('lib/php/paging.class.php'); - altere para o diretório onde você irá armazenar as classes paging.class.php e connection.class.php
  2. $paging->table('produtos'); - informe o nome da tabela que contém os dados que deverão ser paginados
  3. $paging->where... - caso você opte por inserir a função search ao grid, defina aqui quais campos e condições para que os dados sejam mostrados, a sintaxe vai ser sempre similar a mostra neste exemplo, basicamente serão apenas os campos buscados que irão mudar.
  4. $paging->labels('ID,Nome,Tipo'); - Aqui serão definidos os cabeçalhos do grid
  5. $paging->fields('id,nome,tipo'); - Aqui você deve informar quais as colunas da tabela, que você deseja mostrar
  6. $paging->cols_width('10,100,40'); - Esta linha é opcional, mas caso você venha a ter problemas com os tamanhos (width) das colunas do grid, você pode ajustá-las aqui, basta colocar os tamanhos separados por vírgula para as respectivas colunas.
Você pode configurar ainda mais sua paginação, confira todos os métodos disponíveis para a classe acessando o post: Paginação simples e rápida em PHP utilizando a classe Paging.

param.js

Este é o segundo e último arquivo que você terá que modificar, não tem muito o que explicar nele, pois esta tudo devidamente comentado, de qualquer forma vamos mostrar aqui apenas para você ver como é fácil:
Configurando os controles da paginação
  1. var controlsdivclass = '.paging'; - Informe aqui em quais divs você deseja mostrar os controles da paginação, você pode ter os mesmos controles em diferentes divs;
  2. var controlsscript = 'grid.php'; - Informe aqui qual arquivo irá processar os registros e criar os controles;
  3. var controlsclass = 'tablesorter'; - Classe utilizada para estilizar os controles
Configurando o grid
  1. var griddivid = '#grid'; - Informe a div onde será mostrado o grid
  2. var gridscript = 'grid.php'; -Informe aqui qual arquivo irá processar os registros e criar o grid;
  3. var controlsclass = 'tablesorter'; - Classe utilizada para estilizar o grid
  4. var gridheaders = {}; - objeto utilizado para passar instruções ao plugin Jquery Table Sorter, parametrizando os cabeçalhos da tabela individualmente, algo do tipo: 0:{sorter:false}, 1:{sorter:false}...
Outros parâmetros
  1. var consolediv = '#console'; - Div utilizada para mostrar mensagens de status da execução
  2. var loadmsg = 'Carregando...aguarde'; - mensagem ou caminho para um gif animado para ser mostrado enquanto os dados estão sendo carregados
  3. var searchid = '#searching'; - Id do input (text) que será utilizado para fazer o search dentro do grid.
Configurando corretamente, você terá um resultado semelhante ao abaixo. Tente fazer isso para suas tabelas, você verá como ficará fácil implementar paginação no seu site ou sistema.


Resultado final da paginação com classe Paging + Ajax (Jquery e Jquery Table Sorter)

Se você é um usuário já experiente em Jquery, deve estar se perguntando porque eu não criei este grid como um plugin jquery, já que seria bem mais fácil de configurá-lo ao invés de utilizar um arquivo para configuração, a verdade é que eu nunca criei um plugin jquery, pois até então nunca tive a necessidade, a idéia é que eu transforme este grid em um plugin mais tarde, assim que eu tiver tempo para isso, se você já tem experiência no assunto, gostou da solução, tiver idéias ou quiser contribuir, fique a vontade, eu adoraria transformar isto em um plugin, principalmente em um gratuito, já que o plugin para criar grids com jQuery oficial (jqGrid) que existe hoje é uma solução paga.

É isso então, espero que tenham apreciado, deixem seus comentários, sugestões ou dúvidas que terei prazer em atendê-los. Até a próxima!

sexta-feira, 17 de dezembro de 2010

Tutorial: MySQL no Autoit utilizando conector ODBC e UDF MySQL

Entre as UDF´s disponíveis para o Autoit, apenas uma nos permite conectar a um banco de dados, que é o SQLite. Felizmente ele disponibiliza meios de trabalharmos com COM Objects, o que torna possível o desenvolvimento de UDF´s para atender soluções específicas.

No Fórum oficial do Autoit temos um caso destes, no post MySQL UDFs o usuário cdkid disponibiliza uma UDF para trabalharmos com bancos de dados MySQL, apesar de ser antiga (última atualização em 2007) e um pouco limitada, ela funciona e entrega um resultado satisfatório.

No tópico é explicado como fazer a conexão e começar a trabalhar, porém, como é um pouco antigo, algumas coisas podem não funcionar (como aconteceu comigo) e pode ser preciso conferir alguns detalhes a mais, não explanados no fórum, por isso vamos a partir de agora, conferir como fazer para conectar o Autoit com o MySQL em detalhes.

Arquivos para conectar o Autoit e o MySQL

Antes de mais nada precisamos baixar a biblioteca (que você encontra no link logo abaixo) e também o driver ODBC, que fará o papel de intermediar a conexão entre as duas tecnologias:

Download 1: mysql.au3
Download 2: Driver ODBC

No link para baixar o driver ODBC, você deve escolher um dos arquivos em formato zip, apenas atente para optar pelo arquivo correto de acordo com a plataforma de seu computador ou servidor (32-bit ou 64-bit), para este exemplo nós baixamos o arquivo Windows (x86, 64-bit), ZIP Archive Connector-ODBC.

Instalando o Driver ODBC

Descompacte o arquivo na máquina em que você irá rodar sua aplicação, abra um prompt do DOS e digite o caminho completo até a pasta onde encontram-se os arquivos descompactados, seguido de /install.bat 0, conforme mostrado na figura abaixo:

Console ODBC Instalação

Após instalado o driver, clique em:

  1. Iniciar "Start"
  2. Ferramentas Administrativas "Administrative Tools"
  3. Fontes de dados(ODBC) "Data Sources(ODBC)"
  4. Clique em Adicionar "Add"
  5. Escolha MySQL ODBC Driver 3.51 e então clique em Finalizar "Finish"

Uma nova janela irá solicitar algumas informações sobre a nova conexão ODBC, preencha com os dados (alguns são opcionais) do banco que você deseja se conectar e por fim clique no botão Test. Se ele retornar uma mensagem positiva sua conexão já esta funcionando, caso contrário precisaremos trabalhar um pouco mais.

ODBC MySQL x Autoit configuração

Janela de configuração do ODBC

O teste deu ok! | O teste falhou, e agora?

Configurando o servidor MySQL para aceitar conexões externas

Se sua conexão ODBC não deu certo, pode ser que você precisa garantir o acesso da sua máquina de aplicação para o servidor do banco. Para fazer isso você vai ter que executar uma query no seu servidor MySQL atribuindo este acesso. Abaixo um exemplo:

GRANT ALL PRIVILEGIES ON database.table TO 'usuario'@'host' IDENTIFIED BY 'password'

Na query mostrada acima, nós temos algumas palavras destacadas em itálico, são elas que você deverá alterar, veja um exemplo de como deverá ficar no final:

GRANT ALL PRIVILEGIES ON *.* TO 'root'@'172.167.100.90' IDENTIFIED BY 'root@123'

Neste exemplo, foi definido acesso total para todos os bancos e todas as tabelas de nosso servidor MySQL, para o usuário root vindo do servidor 172.167.100.90 utilizando a senha root@123.

Você pode aplicar esta query via o prompt do mysql, no seu servidor de banco de dados ou por meio de um aplicativo terceiro, como o MySQL Administration ou PHPMyAdmin, caso tenha instalado. Fazendo isso, volte para a máquina onde você instalou o ODBC e teste novamente a conexão. Caso as falhas ainda persistam, tente recomeçar o tutorial desde o início novamente.

Criando uma aplicação Autoit/MySQL

Agora que você já garantiu a conexão basta você começar a desenvolver seu aplicativo, basta incluir a UDF do MySQL no início da seu script. Como um primeiro teste você pode apenas ler alguns registros de uma tabela qualquer e mostrar em tela, para fazer isso siga o exemplo abaixo, apenas adaptando para um banco e tabela existente no seu servidor de banco de dados:

;Conectar em uma base
$o_sql = _MySQLConnect('root', 'root@123', 'ambiente', '172.167.100.90')

;Realiza uma query
$o_query = _Query('SELECT hostname FROM servidores')

With $o_query

While NOT .EOF

;Mostra os resultados em tela
MsgBox(0, 'Hostnames', .Fields('hostname').value)

WEnd

EndWith

;Tenta encerrar a conexão com o banco
_MySQLEnd($o_sql)

Uma pequena contribuição

Durante o desenvolvimento de aplicações MySQL/Autoit eu tive uma grande necessidade que era conseguir descobrir se uma determinada query SELECT iria retornar algum resultado, pois se você tentar acessar os valores de um atributo retornado de uma query e esta não te retorne nada, você terá um erro de execução. Portanto criei essa pequena função que faz o trabalho de contar quantas linhas uma query retornará, tornando seu aplicativo menos suscetível a falhas.

;Conta quantas linhas uma query SELECT irá retornar
Func _CountRows($o_sql, $s_query)

;Customiza a query para retornar um COUNT, ao invés dos campos
$s_res = StringRegExpReplace ($s_query, '(SELECT [\w]{1,255})((, | )[\w]{1,255}(,|)){0,10} FROM', 'SELECT COUNT(*) as ct FROM')

;Se conseguir criar a nova query, testa o resultado
If $s_res <> $s_query Then

$o_query = _Query($o_sql, $s_res)

Return $o_query.Fields('ct').value

Else

Return 0

EndIf

EndFunc

Finalizando

Espero que tenham apreciado o post, dúvidas deixem um comentário que retornarei assim que possível. Para finalziar vou deixar um apelo: Se alguém tiver acesso aos atributos e métodos do MySQL COM Object, por favor compartilhe, seria muito interessante implementar mais algumas funções a esta biblioteca.

Antes de finalizar, não posso deixar de agradecer ao meu amigo Padilha, por insistir em descobrir como conectar o Autoit com MySQL, sem sua ajuda minha vida seria bem mais penosa. Obrigado!

Abraço!

quarta-feira, 15 de dezembro de 2010

Biblioteca de funções CMD (DOS) para Autoit

Em várias ocasiões, precisei criar ferramentas com o Autoit, que de alguma maneira precisavam executar comandos DOS e retornar o resultado para minha aplicação. Como na época não achei nada que fizesse algo semelhante, resolvi escrever minhas próprias funções, o que resultou na biblioteca CMD.au3, que estou disponibilizando logo abaixo para download.

Para os mais curiosos, estas funções não tem nenhum segredo, não utilizam nenhum COM Object ou DLL, são na verdade uma combinação de funções nativas do Autoit que executam um comando DOS e retornam em buffer o resultado do comando. Para finalizar utilizo várias regras de expressões regulares para conseguir a informação de que preciso.

Se alguém conhecer alguma DLL ou COM Object que trabalhe diretamente com linha de comando e que possa fazer um trabalho semelhante ao desta biblioteca, por favor me avise, pois eu gostaria muito de reescrever esta biblioteca com algum destes recursos, apesar de que a versão atual já ajuda e muito no atendimento de minhas necessidades do dia a dia e quem sabe ela possa te ajudar também.

O que vou precisar?

Para utilizar esta biblioteca, você vai precisar fazer o download dos dois arquivos abaixo, o primeiro é a biblioteca em si e o outro arquivo é um biblioteca com TRIM functions, para eliminar espaços em branco dentro de strings. Esta última não é de autoria minha, você pode conferir o tópico no fórum do Autoit que fala sobre ela: New String TRIM() functions

Download 1: Cmd.au3
Download 2: TRIM Functions

Além disso, a nossa biblioteca depende de algumas UDF´s para que possa ser executada, para estas basta dar um include no seu script, pois são nativas do Autoit:

  • Constants
  • Process
  • Array

Funções Cmd

Todo o código esta comentado e os nomes das funções, em sua maioria, são auto explicativos. De qualquer forma vou explicar um pouco sobre cada uma delas, assim fica mais fácil você entender o que poderá ser feito com cada uma e então decidir se elas atendem ou não suas necessidades.

_Cmd_GetBuffer($s_Command, [$b_GetDataFromClip = False])

O que faz?

Executa um comando DOS e retorna em um array, o buffer com o resultado. São retornados dois índices neste array, um deles com o buffer normal e o outro com o buffer de erros (caso houver)

Parâmetros

  • s_Command - O comando DOS que deseja executar
  • b_GetDataFromClip - [Opcional] Caso seja True, vai utilizar a Área de Transferência do Windows para ler o retorno do comando, ao invés do output Stdout que é o padrão. Você deve utilizar a Área de Transferência (ou Clipboard), caso seu aplicativo esteja travando quando utilizado o output padrão, isso pode acontecer por exemplo, em comandos que acabam solicitando algum input do usuário após o envio do comando, neste caso o Stdout fica na espera e não retorna nada para sua aplicação.

_Cmd_BufferTrim($s_Buffered, [$i_ReturnType = 0])

O que faz?

Remove os espaços em branco dentro de uma string e então retorna, ou uma nova string devidamente formatada ou um array com cada linha do buffer.

Parâmetros

  • s_Buffer - A string com o buffer do comando executado
  • i_ReturnType - [Opcional] Pode ser 0 "zero" para retornar a string inteira ou 1 "um" para retornar um array com as linhas da string.

_Cmd_GetSessionId($s_Usuario, [$s_Server = "localhost"])

O que faz?

Retorna um Integer com o ID de sessão de um usuário em um determinado servidor.

Parâmetros

  • s_Usuario - O nome do usuário do qual deseja descobrir o ID de sessão
  • s_Server - [Opcional] O servidor que se encontra o usuário.

_Cmd_GetUsers([$s_Server = "localhost"])

O que faz?

Retorna um array com uma lista de usuários de um servidor.

Parâmetros

  • s_Server - [Opcional] O servidor que deseja recuperar a lista de usuários.

_Cmd_ProcessExists($s_Process, [$i_Session = 0, [$s_User = "", [$s_RemServer = "", [$s_RemUser = "", [$s_RemPass = ""]]]]])

O que faz?

Retorna um boolean caso um processo informado exista em um determinado servidor. Este servidor pode ser um servidor remoto caso sejam passados os devidos parâmetros.

Parâmetros

  • s_Process - O nome do processo que deseja verificar.
  • i_Session - [Opcional] O número da sessão do usuário que deseja verificar, caso esse valor seja omitido, ele verificará a sessão 0, que costuma ser a sessão principal ou console.
  • s_User - [Opcional] Caso informado, a função irá verificar se determinado usuário esta executando o processo informado.
  • s_RemServer - [Opcional] Informa um servidor remoto para verificar a existência do processo.
  • s_RemUser - [Opcional] Caso seja informado um servidor remoto, você deve passar um usuário existente neste servidor para que o comando possa ser executado.
  • s_RemPass - [Opcional] A senha do usuário no servidor remoto.

_Cmd_ProcessClose($s_Process, [$i_Session = 0, [$b_Force = False, [$s_RemServer = "", [$s_RemUser = "", [$s_RemPass = ""]]]]])

O que faz?

Tenta fechar um processo em um determinado servidor e retorna um boolean com o resultado. Este servidor pode ser um servidor remoto caso sejam passados os devidos parâmetros.

Parâmetros

  • s_Process - O nome do processo que deseja fechar.
  • i_Session - [Opcional] O número da sessão do usuário que deseja verificar, caso esse valor seja omitido, ele verificará a sessão 0, que costuma ser a sessão principal ou console.
  • b_Force - [Opcional] Caso seja True, o processo será fechado a força. O padrão é False, onde ele irá aguardar o fechamento normal da aplicação.
  • s_RemServer - [Opcional] Informa um servidor remoto para fechar o processo.
  • s_RemUser - [Opcional] Caso seja informado um servidor remoto, você deve passar um usuário existente neste servidor para que o comando possa ser executado.
  • s_RemPass - [Opcional] A senha do usuário no servidor remoto.

_Cmd_Logoff($s_Session, [$s_Server = "localhost"])

O que faz?

Efetua o logoff de um usuário (da sessão informada) em um determinado servidor.

Parâmetros

  • s_Session - O nome ou ID da sessão que deseja fazer logoff
  • s_Server - [Opcional] O servidor que se encontra o usuário.

Finalizando

É isso, espero que tenham apreciado, dúvidas e sugestões é só comentar. Caso você sinta necessidade de ter exemplos, basta abrir o fonte da biblioteca e analisar as funções, acredito que é de fácil entendimento, senão é só gritar aí ;).

quinta-feira, 9 de dezembro de 2010

Ferramentas para o Autoit

No post anterior Automatizando tarefas com Autoit, eu fiz uma grande propaganda sobre a linguagem e sobre como você pode criar scripts para automatizar tarefas em ambientes Windows, também falei que existiam várias ferramentas para ajudar no desenvolvimento, mas acabei deixando de falar sobre elas ou ao menos citá-las, coisa que farei neste post. :)

SciTE4AutoIt3

Scite é um editor de texto baseado no componente Scintilla, para quem não conhece, este é o mesmo componente utilizado em projetos como o Notepad++, além de muitos outros.
Eu não sei como é escrever uma aplicação Autoit sem o SciTE4AutoIt3, pois eu sempre o utilizei e jamais trabalharia sem ele, considerando as inúmeras facilidades que ele proporciona:
  • Highlight de sintaxe
  • Função auto-completar
  • Função expandir ou recolher código
  • Função Intellisense, que mostra quais parâmetros você precisa passar para uma função.
Além disso, ele traz vários atalhos para outras ferramentas do Autoit: Compilador, Autoit Window Info, Koda Form Designer, Code Wizard entre outras.

Scite4Autoit3
Imagem da área de trabalho do Scite, detalhe na imagem para o menu Tools e os atalhos para acessos a outras ferramentas.

Koda Form Designer

Outra ferramenta interessante, principalmente para quem quiser trabalhar com GUI´s no Autoit, o Koda Form Designer permite a criação de interface gráficas como janelas e formulários de maneira simples e intuitiva: clique e arraste. Basicamente ele faz a mesma coisa que um Delphi faz, mas gerando código Autoit.

Koda Form Designer
O Koda Form Designer permite criar GUI´s inteiras apenas arrastando componentes, depois é só gerar o código, criar a lógica e compilar.


Autoit Window Info

É comum trabalhar-mos com a manipulação de janelas no Autoit, muitas vezes precisamos saber se elas existem, ou precisamos que um click do mouse seja enviado para algum ponto dela, ou que algum conteúdo precise ser digitado em algum campo, enfim precisamos ter as informações corretas para podermos manipulá-las da melhor maneira possível.
A proposta desta ferramenta é trazer essas informações de maneira simples e rápida, para isso basta você posicionar o cursor do mouse sobre uma janela e um pequeno console mostrará todos os dados que o Window Info Tool for capaz de obter. Veja abaixo, algumas informações que podemos encontrar:
  • Título da janela
  • Textos
  • Textos ocultos
  • Coordenadas X e Y de onde ela se encontra
  • Controls, Handlers e classes para manipulação com o Autoit

Autoit Window Info

Atente para as informações que conseguimos obter de uma janela utilizando a ferramenta.

Todas essas ferramentas contribuem em muito com o desenvolvimento de scripts e aplicações com o Autoit, se você desenvolve ou pretende começar a desenvolver com a linguagem, não deixe de aproveitar as facilidades que elas oferecem e otimize o tempo de desenvolvimento.

quinta-feira, 2 de dezembro de 2010

Automatizando tarefas com Autoit

Autoit V3

Conheci o Autoit a pouco mais de um ano, como sou fã de linguagens "direto ao ponto", de resultados rápidos, me identifiquei na mesma hora.

Se você não sabe do que se trata, sem problemas, eu explico: "Autoit é uma linguagem do tipo script, com uma sintaxe muito parecida com o BASIC e que permite automatizar tarefas em ambientes Windows. Você pode simular ações com o mouse e teclado, manipular janelas, arquivos, registro do Windows, conectar em um banco de dados, interagir com o Internet Explorer e com os elementos de uma página (utilizando conceitos de DOM)."

Isso é apenas uma pequena amostra do que a linguagem é capaz, pois ela ainda permite criar GUIs (Interfaces Gráficas) inteiras, ou seja, você pode criar um sistema desktop sem problemas.

Exemplo de interface GUI com Autoit
Exemplo de interface GUI com o Autoit extraído do site oficial

Além de ser uma linguagem completa, com uma vasta biblioteca de funções e inúmeras UDF´s (Bibliotecas homologadas criadas por usuários), o Autoit permite trabalhar com COM Objects e acessar DLL´s, ou seja, é difícil pensar em algo que ela não consiga fazer.

Não vou ser um daqueles fanáticos que nega até a morte a existência de problemas em seus objetos de adoração, ela possui algumas limitações e alguns bugs, por exemplo, eu não aconselharia criar um sistema de grande porte utilizando esta linguagem, até porque não é o foco e por exceção do SQLite, existem dificuldades em criar conexões com banco de dados conhecidos como: MySQL, SQL Server, Postgree, Oracle e etc. Apesar de existir uma UDF para se trabalhar com SQL e algumas outras não homologadas para trabalhar com alguns SGDBs conhecidos. Mas naquilo que o Autoit se propõe a fazer, o SQLite é mais do que suficiente para atender a maioria das necessidades.

Também já encontrei bugs em algumas funções mas nada que não possa ser contornado repensando um pouco seus scripts.

Se você se interessar e resolver mergulhar neste novo oceano de oportunidades que o Autoit lhe traz, descobrirá que ele também pode ser utilizado pelas forças do mal, você mesmo se sentirá inclinado pelo lado negro da força, quando descobrir que você pode perfeitamente criar keyloggers, vírus, worms entre outras pragas com algumas poucas linhas de código, nunca foi tão fácil destruir um PC.

Claro que apesar de algumas pessoas utilizarem para este fim, esta prática não é aconselhada e muito menos estimulada pelos desenvolvedores da linguagem e mesmo trabalhando a mais de um ano com ela, nunca parei para criar nada semelhante, eu teria apenas o trabalho de ter que consertar o estrago criado.

Para finalizar, se você esta querendo automatizar aquela tarefa repetitiva do dia a dia, ou quer deixar seus personagens de MMORPGS capinando ou matando monstros para aumentar de nível para depois vendê-los no ebay, ou quer criar uma ferramenta que monitore aplicações cruciais em um ambiente do qual você é administrador ou até mesmo deseja criar um pequeno aplicativo, sem ter que ficar se preocupando com inúmeros protocolos de linguagens burocráticas, então o Autoit é para você. Com uma comunidade ativa na internet, um fórum recheado de dicas, documentação eficiente, várias ferramentas para agilizar o desenvolvimento e compilador próprio, programar utilizando esta linguagem se torna algo extremamente divertido e eficiênte.