Fuente de Datos
Una fuente de datos encapsula un mecanismo de entrada/salida de datos, típicamente una base relacional Esta clase contiene ventanas antes y despues de la conexión de la fuente y permite acceder al objeto db que es el que tiene el API de consultas/comandos. Esto no quiere decir que el lenguaje con el que se accede se abstrae o compatibiliza, el lenguaje sigue siendo SQL y la construcción de SQL compatible sigue quedando a cargo de los desarrolladores.
Definición
Un proyecto puede tener asociada varias fuentes de datos, cada una representando a una base de datos distinta. Para administrar estas fuentes existe una sección en el Editor dentro de la configuración, allí se puede detallar cómo está formada:
Identificador: es el nombre con el que esta fuente puede ser referenciada desde Toba.
Base: Identificador con el que se conoce la base en el archivo
instalacion/bases.ini
Subclase: La fuente de datos puede tener una extensión para aprovechar las ventanas de pre y post conexión, ver el API
En esta misma pantalla también se pueden definir cuestiones relacionadas con el esquema de seguridad:
Especificar si la fuente tendrá auditoría de datos.
Especificar si se realizará un parseo de los mensajes de error del motor, para brindar una salida más entendible al usuario final.
Conexiones por perfil
Por razones de seguridad es posible asociar un par usuario/clave de
conexión a la base dependendiendo de los perfiles del usuario
actualmente logueado. Para ello definir una entrada
conexiones_perfiles
en el archivo bases.ini
[instancia proyecto fuente]
...
base = tal
conexiones_perfiles = conexiones.ini
En el archivo .ini referido es necesario armar una sección por
combinación de perfiles que se quiere impactar. Para hacer referencia a
la ausencia de grupos usar el id no_autenticado
:
[no_autenticado]
usuario = ..
clave = ..
[alumno]
usuario = ..
clave = ..
[docente]
usuario = ..
clave = ..
Programación
Acceso
Para acceder al objeto que representa una fuente de datos dada:
toba::fuente($id=null)
Para acceder al objeto que representa la conexión:
toba::db($id=null)
En ambos caso si no se brinda el $id se utiliza la llamada fuente prederminada que se configura en las propiedades básicas del proyecto en el editor.
Consultas y Comandos
Consulta de una SQL, lo que se retorna es un arreglo PHP asociativo (también llamado formato RecordSet):
<?php $sql = "SELECT id, nombre FROM tabla..." $rs = toba::db()->consultar($sql); if (! empty($rs)) { foreach ($rs as $fila) { echo "{$fila['id']} es {$fila['nombre']} "; } } else { echo "No hay datos!" } //--- Si la consulta falla (por ej. no existe la tabla), tira una excepcion toba_error_db ?>
Ejecución de comandos dentro de una transacción, el ejecutar retorna la cantidad de registros afectados:
<?php $sql = "UPDATE tabla SET nombre = id"; toba::db()->abrir_transaccion(); $cant = toba::db()->ejecutar($sql); .... toba::db()->cerrar_transaccion(); echo "Se modificaron $cant registros"; //--- Si el ejecutar falla (por ej. una restricción de clave foránea), tira una excepcion toba_error_db ?>
Shortcuts
Existe una serie de funciones globales que permiten ingresar comandos de una forma más rápida. En general la mejor convención sería utilizar un conjunto u otro de métodos en forma consistente, si el grupo decide utilizar los shortcuts que lo haga en forma consistente.
Uso desde dentro de Toba
Cuando lo que se está programando no es un proyecto, el consumo es así:
Núcleo: utilizar
toba_instancia::instancia()->get_db()
. Esto casi no es necesario porque todas las consultas estan dentro deinfo_instancia
. No utilizarconsultar_fuente
NItoba::get_db()
excepto para componetes (usan fuentes).Modelo: utilizar
contexto_info::get_db()
. Esto devuelve la base seteada concontexto_info::set_db()
. No utilizarconsultar_fuente
NItoba::get_db()
, esto no es así en el segmento administrativo, donde la base se le pide a la instalacion