Skip to content

Latest commit

 

History

History
142 lines (105 loc) · 4.91 KB

README.md

File metadata and controls

142 lines (105 loc) · 4.91 KB

LibGerenciadorDb

LibGerenciadorDb é uma biblioteca que desenvolvi especialmente para facilitar as operações de Insert, Delete, Update e Select no banco de dados PostgreSQL. Também fornece mapeamento de DataSet em objetos da linguagem, fazendo com que seja possível interagir com o banco de dados rapidamente e criar DAOs com facilidade.

IMPORTANTE

Devido a limitações na arquitetura do projeto, esse será descontinuado. Vou refazer do zero, mais robusto e com interação mais ampla e eficaz com o banco de dados. Um dos grandes problemas dessa versão é que, alguns SQL que são gerados dinamicamente, não utilizam prepared statement, deixando a aplicação vulnerável a SQL injection e erros de execução.

Aviso

Essa biblioteca ainda está em desenvolvimento. É utilizada em alguns projetos que estou fazendo, sendo assim, é possível que haja bugs ou algumas implementações faltando.

Exemplo

Neste exemplo, é possível observar a utilização do TFdRTDao<TColaborador>, que será responsável por lidar com todo o acesso direto ao banco de dados e mapeamento de entidades, que nesse caso é o TColaborador.

uses
  uRepo;

type

  [TDbTable('public.colaborador')]
  TColaborador = class

    { nome colunas colaborador }
    const clIdColaborador      = 'IdColaborador';
    const clDsColaborador      = 'DsColaborador';
    const clLogin              = 'Login';
    const clObservacao         = 'Observacao';
    const clStAtivo            = 'StAtivo';
    const clDtCadastro         = 'DtCadastro';
    const clTotalDiasPrevistos = 'TotalDiasPrevistos';
	
	const constUqNmUsuario = 'uq_colaborador_nmusuario';

    private
      [TDbSeqId]
      [TDbField(clIdColaborador)]
      fId : Integer;

      [TDbField(clDsColaborador)]
      fDescricao : String;

      [TDbField(clLogin)]
      fLogin : String;

      [TDbField(clObservacao)]
      fObservacao : String;

      [TDbField(clStAtivo)]
      fStAtivo : Boolean;

      [TDbField(clDtCadastro)]
      fDataCadastro : TDateTime;

      [TDbField(clTotalDiasPrevistos)]
      fTotalDiasPrevistos : Integer;

    public
      property Id : Integer read fId;
      property Descricao : String read fDescricao write fDescricao;
      property Login : String read fLogin write fLogin;
      property Observacao : String read fObservacao write fObservacao;
      property StAtivo : Boolean read fStAtivo write fStAtivo;
      property DataCadastro : TDateTime read fDataCadastro write fDataCadastro;
      property TotalDiasPrevistos : Integer read fTotalDiasPrevistos write fTotalDiasPrevistos;


  end;

  TDAOColaborador = class(TFdRTDao<TColaborador>) end;

  TGerenciadorColaborador = class(TInterfacedObject, IDbErrorHandler)
    private
      fDaoColaborador : TDAOColaborador;
      procedure HandleException(exception: EFDDBEngineException);

    protected
      property DaoColaborador : TDAOColaborador read fDaoColaborador;

    public
      constructor Create(var fdConnection: TFDConnection);

      function LocalizarPorLogin(const nome: String; out colaborador: TColaborador): Boolean;
      procedure AtualizarColaboradorPorId(const idColaborador: Integer; alteracoes: TDictionary<String, Variant>);
      function LocalizarTodos(out colaboradores: TList<TColaborador>): Boolean;
      procedure ExcluirColaboradorPorId(idcolaborador: Integer);
      function CriarColaborador(colaborador: TColaborador): Boolean;
  end;

var
  GerenciadorColaborador : TGerenciadorColaborador;

implementation

constructor TGerenciadorColaborador.Create(var fdConnection: TFDConnection);
begin
  fDaoColaborador := TDAOColaborador.Create(fdConnection);
  fDaoColaborador.ErrorHandler := Self;
end;

function TGerenciadorColaborador.LocalizarTodos(out colaboradores: TList<TColaborador>): Boolean;
begin
  Result := DaoColaborador.FindAll(colaboradores);
end;

procedure TGerenciadorColaborador.AtualizarColaboradorPorId(const idColaborador: Integer;
                                                            alteracoes: TDictionary<String, Variant>);
begin
  DaoColaborador.Update(TColaborador.clIdColaborador, idColaborador, alteracoes);
end;

procedure TGerenciadorColaborador.ExcluirColaboradorPorId(idcolaborador: Integer);
begin
  DaoColaborador.Delete(TColaborador.clIdColaborador, idcolaborador);
end;

function TGerenciadorColaborador.LocalizarPorLogin(const nome: String;
                                                    out colaborador: TColaborador): Boolean;
begin
  Result := DaoColaborador.FindUnique(nome, TColaborador.clLogin, colaborador);
end;

procedure TGerenciadorColaborador.HandleException(exception: EFDDBEngineException);
var
  ConstraintName : String;
begin
  if exception.Kind = ekUKViolated then
  begin
    ConstraintName := exception[0].ObjName;
    {colaborador}
    if SameText(ConstraintName, TColaborador.constUqNmUsuario) then
      TFrmValidacaoSimples.MostrarValidacao('Operação não permitida!', 'Já existe um colaborador com este login! Verifique.', '')
  end;
end;