RR
Trabalhando com Generators do Firbird.
Quero primeira mente agradece ao Pablo por disponibilizar o Acesso ao Firebird.
Vou aqui colocar alguma alterações que já tinha trabalhado e aplicado junto a minha aplicação.
Bem vamos lá, alem da conexão com bando Firebird tive um grande necessidade de usar generators para as minhas tabelas em vez de MAX/Serial
sendo assim implementei por conta própria umas pequenas alterações no framework.
Segue elas:
Na Classe Trecord.php foi implementado o seguinte codigo:
E dentro do Methodo store da Classe TRecord acrecentei o seguinte código logo após o IDPOLICY=='serial'
Na classe a onde fazemos a chamada da tabela que referencia ao banco segue algumas alterações
Exemplo do meu arquivo: Tab_Armacao.class.php
Vou aqui colocar alguma alterações que já tinha trabalhado e aplicado junto a minha aplicação.
Bem vamos lá, alem da conexão com bando Firebird tive um grande necessidade de usar generators para as minhas tabelas em vez de MAX/Serial
sendo assim implementei por conta própria umas pequenas alterações no framework.
Segue elas:
Na Classe Trecord.php foi implementado o seguinte codigo:
public function getNameGenerator()
{
// get the Active Record class name
$class = get_class($this);
// returns the PRIMARY KEY Active Record class constant
return constant("{$class}::GENERATOR");
}
/**
* Returns the LAST Object ID from database
* @return An Integer containing the LAST Object ID from database
* @exception Exception if there's no active transaction opened
*/
public function getGenerator()
{
$pk = $this->getPrimaryKey();
// get the connection of the active transaction
if ($conn = TTransaction::get())
{
// instancia instrução de SELECT
$sql='select gen_id('.$this->getNameGenerator().',1) from rdb$database';
$result= $conn->Query($sql);
// retorna os dados do banco
$row = $result->fetch();
return $row[0];
}
else
{
// if there's no active transaction opened
throw new Exception(AdiantiCoreTranslator::translate('No active transactions') . ': ' . __METHOD__ .' '. $this->getEntity());
}
}
E dentro do Methodo store da Classe TRecord acrecentei o seguinte código logo após o IDPOLICY=='serial'
if ((defined("{$class}::IDPOLICY")) AND (constant("{$class}::IDPOLICY") == 'serial'))
{
unset($this->$pk);
}
else if ((defined("{$class}::IDPOLICY")) AND (constant("{$class}::IDPOLICY") == 'generator'))
{
$this->$pk = $this->getGenerator();
}
else
{
$this->$pk = $this->getLastID() +1;
}
Na classe a onde fazemos a chamada da tabela que referencia ao banco segue algumas alterações
Exemplo do meu arquivo: Tab_Armacao.class.php
- <?php
- class Tab_Armacao extends \Adianti\Database\TRecord {
- const TABLENAME = 'ARMACAO';
- const PRIMARYKEY = 'ID_ARMACAO'; // nome do campo primary key lembrando que a nomenclatura deve obedecer ao do banco:
- // se for maiusculo "ID" se for minusculo "id"
- //Observação importante no caso do banco Firebird Utilizamos Geralmene Generators para Criar a sequencia do Primary key
- //Nesta situação implementei junto ao IDPOLICY a opção do "generetor" como podem ver abaixo.
- //Feito isto precisei especificar o nome do generator no banco que neste caso é ID_ARMACAO mas poderia ser SEQ_ARMACAO
- //Outra observação referente ao banco Firebird é que todos os campos são retornados em Maiusculo e não minusculo
- //sabendo disso fique atento ao recuperar dados no banco.
- const IDPOLICY = 'generator'; // Max/Serial/generator
- const GENERATOR = 'ID_ARMACAO';
- }
- Espero ter ajudado aqueles que necessitam trabalhar com generator, que saber passa ser também uma uma implementação do Framework.
- Obrigados a todos e boa sorte.
- Segue também anexo o arquivo TRecord.php alterado.