..:: MX Studio Fóruns ::..: Utilizar PostgreSQL com Lumine - ..:: MX Studio Fóruns ::..

Jump to content

Publicidade




Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Utilizar PostgreSQL com Lumine

#1 User is offline   Tiago Hiller 

  • Group: Membros
  • Posts: 6
  • Joined: 20-May 11

Posted 04 October 2011 - 09:51 AM

Caros,
Venho através deste buscar informações de como utilizar o banco de dados PostgreSQL com o Lumine.
Minha dúvida é o seguinte:
Tenho a tabela Log, que fica no esquema seguranca, com uma sequence atribuída no default do campo idlog.
Para eu acessar a tabela, no $_tablename eu atribuí da seguinte maneira: $_tablename = "seguranca.Log". Essa atribuição me garante que eu posso acessar os dados, contudo não há o retorno do valor gerado para o campo idlog.
Vi que há possibilidade de atribuir o nome da sequence através do método _addField, mas mesmo havendo configurado não há retorno do valor gerado para o campo.
Em que parte do processo estou errando?

Desde já grato.
0

#2 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1265
  • Joined: 15-January 04

Posted 04 October 2011 - 09:58 AM

Olá Tiago

Lumine não tem um suporte bacana a esquemas do PostgreSQL no momento.
Se for possível, sugiro a você colocar a tabela no mesmo esquema que as outras.

Aqui na empresa usamos somente o esquema public sem problemas, com mais de 60 entidades.

@braços e fique com Deus!
0

#3 User is offline   Tiago Hiller 

  • Group: Membros
  • Posts: 6
  • Joined: 20-May 11

Posted 05 October 2011 - 12:03 PM

Hugo,
Venho através deste propor um "workaround" não muito elegante para recuperar os metadados e valores de sequence no PostgreSQL.
Para isto, parte-se do pressuposto que toda declaração de tabela deve ter o nome do esquema ao qual a mesma pertence (nome_do_esquema.nome_da_tabela).
Espero que seja válido.

Desde já grato.

Segue:

lib/Dialect/PostgreSQL.php
public function getLastId( $campo ) {
		
		$obj = Lumine::factory($this->getTablename());
		$field = $obj->_getFieldByColumn($campo);

		$obj->destroy();

                $tablename = $this->getTablename();

                if (preg_match("/./", $tablename)) {
                    $definition = preg_split("/[\s]*[.][\s]*/", $tablename);
                    $schema = $definition[0];
                    $tablename = $definition[1];
                }
                
		// se nao tiver sequence
		if(empty($field['options']['sequence'])){
			$sql = "SELECT currval( s2.nspname || '.' || t2.relname ) AS id
					FROM pg_depend AS d
					JOIN pg_class AS t1 ON t1.oid = d.refobjid
					JOIN pg_class AS t2 ON t2.oid = d.objid
					JOIN pg_namespace AS s1 ON s1.oid = t1.relnamespace
					JOIN pg_namespace AS s2 ON s2.oid = t2.relnamespace
					JOIN pg_attribute AS a ON a.attrelid = d.refobjid AND a.attnum = d.refobjsubid
					WHERE t1.relkind = 'r'
					AND t2.relkind = 'S'
					AND t1.relname = '".$tablename."'
					AND attname = '".$campo."'" .
                                        ((isset($schema) and strlen($schema) > 0) ? " AND s2.nspname='$schema'" : "");
		} else {
			$sql = "SELECT currval('".$field['options']['sequence']."') as id";
			
		}
...


lib/Connection/PostgreSQL.php
public function describe($tablename)
	{
            if (preg_match("/./", $tablename)) {
                $definition = preg_split("/[\s]*[.][\s]*/", $tablename);
                $schema = $definition[0];
                $tablename = $definition[1];
            } 

		$sql = "
			SELECT 
				f.attname AS name,
				pg_catalog.format_type(f.atttypid,f.atttypmod) AS type,
			
				CASE
					WHEN t.typlen < 0 THEN CASE WHEN f.atttypmod > 0 THEN f.atttypmod - 4 ELSE NULL END
					ELSE t.typlen
				END as length,
				
			
				CASE
				WHEN p.contype = 'p'
					THEN 't'
					ELSE 'f'
				END AS primarykey,
			
				CASE
				WHEN f.atthasdef = 't'
					THEN d.adsrc
				END AS default,
			
				f.attnotnull AS notnull,
				
				f.attnum AS number,
				f.attnum,
				
				CASE
				WHEN p.contype = 'u'
					THEN 't'
					ELSE 'f'
				END AS uniquekey,
				
				CASE
				WHEN fk.contype = 'f'
					THEN g.relname
				END AS foreignkey,
			
				CASE
				WHEN fk.contype = 'f'
					THEN fk.confkey
				END AS foreignkey_fieldnum
			
				FROM pg_attribute f
				JOIN pg_class c ON c.oid = f.attrelid
				JOIN pg_type t ON t.oid = f.atttypid
				LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum
				LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
				LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY ( p.conkey ) AND p.contype IN ('p')
				LEFT JOIN pg_constraint fk ON fk.conrelid = c.oid AND f.attnum = ANY ( fk.conkey ) AND fk.contype IN ('f')
				LEFT JOIN pg_class AS g ON fk.confrelid = g.oid
				WHERE c.relkind = 'r'::char
					AND c.relname = '$tablename'
                                        AND f.attnum > 0 "
                                . ((isset($schema) and strlen($schema) > 0) ? " AND n.nspname='$schema'" : "") .
				"ORDER BY number";
...

0

#4 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1265
  • Joined: 15-January 04

Posted 05 October 2011 - 02:00 PM

Não achei tão ruim a forma como você fez.
Só alterei um pouco a expressão regular para pegar o schema.tablename.

As alterações estão comitadas no SVN

Estou terminando também outras coisas, e quando houverem mais testes (e peço sua ajuda nisso) colocarei uma versão release.

@braços e fique com Deus!
0

#5 User is offline   Marcony 

  • Group: Membros
  • Posts: 12
  • Joined: 13-May 11

Posted 22 November 2011 - 03:42 PM

View Posthufersil, on 05 October 2011 - 02:00 PM, said:

Não achei tão ruim a forma como você fez.
Só alterei um pouco a expressão regular para pegar o schema.tablename.

As alterações estão comitadas no SVN

Estou terminando também outras coisas, e quando houverem mais testes (e peço sua ajuda nisso) colocarei uma versão release.

@braços e fique com Deus!



Hugo, mudou alguma coisa ao executar a eng. reversa no Lumine ?
Diz no changelog que o Lumine suporta os schemas do postgresql.. Mas aqui pra mim ainda tá do mesmo jeito que a ultima versão.

E essa 1.5.10 não tá disponível pra DL ainda não ?
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic



Publicidade




1 User(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)