Error: Función agregar_usuario() en toba_instancia

Buenas tardes, tengo una operación en la que un usuario se auto-registra.
En el controlador de esa operación, se llama a la siguiente función:


...
toba::instancia()->agregar_usuario(
     $datos['nro_documento'],
     $datos['ayn'],
     $datos['clave'],
     array( 'email' => $datos['mail'] )
);
...

El problema es que la función lanza una excepción, cuyo mensaje del motor es el siguiente:

SQLSTATE[42P01]: Undefined table: 7 ERROR: no existe la relación «apex_usuario» LINE 1: INSERT INTO apex_usuario ( usuario, nombre, autentificacion,... ^

Evidentemente la conexión con la instancia se realiza correctamente, y la tabla apex_usuario existe, ya que el sistema permite loguearse correctamente a los usuarios que ya existen.
En la traza de la ejecución, se involucran las clases toba_instancia, toba_modelo_instancia y por último toba_db, con su método sentencia_ejecutar(), que recibe correctamente los parámetros enviados (usuario, clave, mail, etc).

Si en la linea previa a la llamada a toba::instancia()->agregar_usuario() agrego:

var_dump(toba::instancia()->get_db());

Puedo ver (entre todos los otros valores), los siguientes:

["profile":protected]=> string(9) "localhost" ["usuario":protected]=> string(8) "postgres" ["clave":protected]=> string(8) "postgres" ["base":protected]=> string(8) "toba_2_7" ["puerto":protected]=> string(4) "5432"

Pero si, dentro de la clase toba_modelo_instancia, antes de la ejecución de la consulta, agrego lo siguiente:


ei_arbol($this->get_db()->get_lista_tablas_bd()); //veo las tablas de la base
$this->get_db()->sentencia_ejecutar($id, $atributos);

Me retorna un listado de todas mis tablas de la base de negocio. Es decir, no se conecta a la base de la instancia.

En toba.conf están correctamente definidas las variables de entorno TOBA_DIR, TOBA_PROYECTO y TOBA_INSTANCIA.
En el archivo bases.ini también están correctamente definidos los parámetros de conexión a la base de negocios y a la instancia de toba.

Versión de Toba: 2.7.2
Versión de PostgreSQL: 9.4.5
Versióbn de PHP: 5.3.4

Alguna idea de porqué no se encuentra apex_usuario?
Gracias.

Dando vueltas sobre este tema, encontré como solucionarlo. Aunque todavía no entiendo porque falla.

Esto NO FUNCIONA (da el error de no encontrar la tabla apex_usuario)


...
$persona = toba::consulta_php('co_personas')->get_personas($nro_documento);
toba::instancia()->agregar_usuario(
     $datos['nro_documento'],
     $datos['ayn'],
     $datos['clave'],
     array( 'email' => $datos['mail'] )
);
...

Mientras que esto SI FUNCIONA:


...
toba::instancia()->agregar_usuario(
     $datos['nro_documento'],
     $datos['ayn'],
     $datos['clave'],
     array( 'email' => $datos['mail'] )
);
...

Es decir, la llamada previa a una consulta PHP hacer que se rompa.
Lo esperable, es que la llamada a toba::instancia()->agregar_usuario() obtenga una nueva conexión con la instancia, y no que intente obtener la tabla apex_usuario de mi base de negocios (como aparentemente intenta hacerlo).

Queda planteado el problema.
Saludos.

Hola Marcelo,

disculpa la demora, lo mire al pasar un dia tarde y me quedo colgado el post. Te hago un par de consultas para ver si puedo identificar el problema

  • La fuente de datos del proyecto esta apuntando a la misma base que la de Toba o son distintas?.
  • Tenes una fuente de datos para la instancia de toba en el proyecto?
  • Tenes alguna extension de comandos de consola?

Con respecto a tu ultima apreciacion, Toba reutilza las conexiones abiertas en la medida de lo posible (misma bd) ya que todo el setup es costoso desde el punto de vista de procesamiento.
Si tenes la base de negocio separada, tiene que abrir una nueva conexion si o si por lo que no deberias estar viendo este inconveniente.
Lo unico que se me ocurre (ya que este acceso es por el modelo) es que este recibiendo la conexion equivocada al momento de instanciar la instancia (valga la redundancia) pero para eso necesito un poco mas de info, a ver si puedo reproducir tu caso.

Saludos

Hola Richard, respondiendo a tus consultas:

La fuente de datos del proyecto esta apuntando a la misma base que la de Toba o son distintas?.
El proyecto tiene solo una fuente de datos definida, que es la base de negocio de la aplicación, y es una base distinta a la de la instancia de toba.
Tenes una fuente de datos para la instancia de toba en el proyecto?
No hay una fuente de datos definida en el proyecto que apunte a la instancia de toba
Tenes alguna extension de comandos de consola?
No, no tengo ninguna extensión.

Como mencionaba anteriormente, si llamo a:

toba::instancia()->agregar_usuario($datos_usuario)

funciona perfectamente. El usuario, cuyos datos paso como parámetro, se agrega a la instancia de toba, en la tabla apex_usuario

En cambio, si una linea antes, agrego la llamada a la función

toba::consulta_php('co_personas')->get_personas($nro_documento);

Ya no funciona. En este caso, me devuelve el mensaje

SQLSTATE[42P01]: Undefined table: 7 ERROR: no existe la relación «apex_usuario» LINE 1: INSERT INTO apex_usuario ( usuario, nombre, autentificacion,... ^

En la función toba::consulta_php(‘co_personas’)->get_personas(), defino una variable $sql (con el select a la tabla) y luego:

return toba::db()->consultar($sql);

Claro, que la única fuente de datos definida en el proyecto está indicada como “Fuente de Datos predet.” en las propiedades del proyecto.

Saludos y gracias!