Data ABstraction (DAB) Uma camada simples para gerar strings SQL. Módulo dab O módulo possui um submódulo para a definição dos schemas da base de dados. Abaixo do módulo dab.schemas ficam os schemas das base de dados que poderão ser usadas. Um schema possui as informações da base de dados que ele representa e a infomação das tabelas. Exemplo de um schema para a base de dados chat: ______________________________________________ module "dab.schemas.chat" database = { source = "dabtest", username = "root", password = "root", name = "mysql", host = "localhost", } schemas = { msg = { table = "T_Chat_Msg", fields = { msgID = "F_MsgID", text = "F_MsgText", room = "F_MsgRoomID", to = "F_MsgTo", from = "F_MsgFrom", date = "F_MsgDate", }, }, room = { table = "T_Chat_Room", fields ={ roomID = "_RoomID", name = "F_RoomName", }, max = "F_RoomMax", private = "F_RoomPrivate", date = "F_RoomDate", }, room_user = { table = "T_Chat_RoomUser", fields = { roomID = "F_RoomID", userID = "F_UserID", }, }, user = { table = "T_Chat_User", fields = { userID = "F_UserID", nickname = "F_UserNickname", expires = "F_UserExpires", }, }, } ______________________________________________ Uso: Inicialmente, carregamos o módulo dab. require "dab" -- aqui instanciamos a base de dados do chat • local db = dab:new("chat") Função new(self, schemaName) Descrição: Coloca para uso um banco de dados específico. Parâmetros: self : objeto DAB schemaName : string com o identificador do schema (base de dados) que será usado. Retorno: objeto Database (contém a conexão e todo o schema da base) ou false + o erro. -- aqui dizemos que user irá trabalhar sobre a tabela user. • local user= db:open("user") -- também podemos trabalhar com mais de uma tabela • local roomAndUsers = db:open({"room", "room_user", "user"}) Função open(self, tbl) Descrição: Coloca para uso uma tabela, ou mais, da base de dados. Parâmetros: self : objeto Database tbl : string com o identificador da tabela configurado no schema ou, se houver a necessidade de utilizar mais de uma tabela, uma tabela lua com os identificadores das tabelas que serão usadas. Retorno: objeto Tabela ou false + o erro. -- inserimos uma linha na base. • user:insert({ fields = { nickname = "tox", expires = "2007-10-05 09:30:25"}}) Função insert(self, tbl.fields) Descrição: Insere uma linha na base de dados. Parâmetros: self : objeto Tabela tbl.fields : tabela lua com os campos e valores que serão inseridos Retorno: true, nil e a string sql ou false, mensagem e string sql -- atualizamos uma linha na base. • user:update({ fields = { name = "toshiro" }, where = "|name| = 'tox'" }) Função update(self, tbl) Descrição: Atualiza uma linha na base de dados. Parâmetros: self : objeto Tabela tbl.fields : tabela lua com os campos e valores que serão inseridos. tbl.where : string sql com a condicional. o nome dos campos devem ser colocados entre '|' (na função será utilizada a função replace(self, stringSql) para substituir pelo nome real do campo). Retorno: true, nil e a string sql ou false, mensagem e string sql -- deletamos uma linha da base. • user:delete({ where = " |nome| = 'toshiro' and |idade| = 25 " }) Função delete(self, tbl) Descrição: Apaga uma linha na base de dado Parâmetros: self : objeto Tabela tbl.where : string sql com a condicional. O nome dos campos devem ser colocados entre '|' (na função será utilizada a função replace(self, stringSql) para substituir pelo nome real do campo). Retorno: true, nil e a string sql ou false, mensagem e string sql -- aqui fizemos um select da tabela. • result = user:select({ fields = "|name|" , where = "|userID| > 5", orderBy = "|userID| asc" }) for i, v in pairs(result) do print(i,v.text) end Função select(self, tbl) Descrição: Captura uma ou mais linhas na base de dados. O select pode ser simples (consulta em uma tabela) ou complexo, cruzando os dados de varias tabelas. Parâmetros: self : objeto Tabela tbl.where : string sql com a condicional. Parâmetros opcionais: tbl.fields : string com os campos da tabela que serão retornados tbl.orderBy: string sql com a ordenação desejada. tbl.goupBy: string sql com a agrupação desejada. tbl.from: string sql com os identificadores das tabelas que serão utilizadas, caso seja mais de uma. OBS:Todos os identificadores dos campos devem ser colocados entre '|' (na função será utilizada a função replacePipe(self, sql) para substituir pelo nome real do campo). Retorno: tabela lua com as informações desejadas. OBS: no lugar dos nomes dos campos originais, retornará os identificadores. Funções auxiliares Função replacePipe(self, sql) Descrição: Substitui os campos entre '|' com o nome real da base. Parâmetros: self Objeto Tabela sql String sql com os nomes dos campos entre '|'. Retorno: Retorna a string sql com os nomes dos campos originais no lugar dos identificadores. -- percorremos cada linha da resposta da query para fazer as sustituições • replaceRow((obj, {T_Chat_User.F_UserID = 1, T_Chat_User.F_UserNickname = 'vero'}) Função replaceRow(self, row) Descrição: Percorre cada linha da resposta de query para fazer a substituição dos campos com o nome real da base pelos identificadores [chama a função replaceName(self, tbl_field) para fazer esta substituição]. Parâmetros: self Objeto Tabela row tabela (referente a uma linha do retorno da query) com os nomes reais dos campos. Retorno: Retorna uma tabela com os nomes dos campos originais substituídos pelos identificadores entre '|'. -- substituimos o nome real da tabela e dos campos pelo seus identificadores, entre '|'. • replaceName(obj, "T_Chat_User.F_UserID") Função replaceName(self, tbl_field) Descrição: Substitui o nome real da tabela e dos campos pelos seus identificadores. Parâmetros: self Objeto Tabela tbl_field string com o nome real do campo Retorno: Retorna uma string com o identificador da tabela concatenado com o identificador do campo, entre '|'. -- colocamos os valores da consulta entre ' '. • validate(obj, "vero") Função validate(self, v) Descrição: Coloca os valores da consulta entre ' '. Parâmetros: self Objeto Tabela v valor Retorno: O valor entre ' ' ou uma mensagem de erro.