Módulo dab

Propaganda
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.
Download