-------------------------------------------------------------------------------
$Id$
-----------------------------------------------------------------------------*/
/**
* Indica que las condiciones deben concatenarse con OR.
*/
define('MECON_DBO_OR', 'OR');
/**
* Indica que las condiciones deben concatenarse con AND.
*/
define('MECON_DBO_AND', 'AND');
/**
* @example DBO.php
* Ejemplo de uso de DBO. Por ahora el ejemplo sólo implementa las funciones
* para consulta.
*/
// +X2C Class 16 :MECON_DBO
/**
* Interfaz genérica para objetos que pueden ser guardados y/o operan con bases de datos.
Utilizando esta interfaz se pueden hacer objetos genericos que manejen DBO, como por ejemplo tablas para listarlos. La forma común de recorrer una serie de resultados de una búsqueda de DBO puede verse en el método buscar().
*
* @access public
* @abstract
*/
class MECON_DBO {
// ~X2C
// +X2C Operation 17
/**
* Carga el objeto desde una base de datos.
Si hay un error, devuelve un PEAR_Error, si no devuelve la cantidad de objetos encontrados y carga el primero (si hay al menos un resultado).
En el caso típico, se setea la propiedad que es la clave de la base de datos (siendo el resto nulas). Por ejemplo:
@code
class miDBO extends MECON_DBO {
// Definición...
}
$db = DB::connect('mi DSN');
$miDBO = new MiDBO();
$miDBO->id = 5;
$e =$miDBO->cargar($db);
if (PEAR::isError($e)) {
echo 'Hubo un error: ' . $e->getMessage();
} elseif (!$e) {
echo 'No existe en la base de datos.';
} elseif ($e == 1) {
var_dump($miDBO);
} else {
echo "Se encontraron $e elementos!';
}
@endcode
@see buscar()
@internal
En el caso general, se hace un SELECT con un WHERE basado en los atributos no nulos concatenados con AND.
*
* @param mixed $db DB o DB_Result a usar para la carga.
*
* @return mixed
* @access public
* @abstract
*/
function cargar($db = null) // ~X2C
{
trigger_error('Not implemented!', E_USER_WARNING);
}
// -X2C
// +X2C Operation 18
/**
* Guarda el objeto en una base de datos.
Si alguna clave es null, generalmente se guarda un objeto nuevo autoincrementando la clave en null. Si todas las claves son distintas de null y existe un objeto con las mismas claves, se modifica del existente los campos que el objeto no tenga en null; si no existe da error a menos que se use el indicador \$nuevo, en cuyo caso se agrega como nuevo. Si hay un error, devuelve un PEAR_Error. Si se guardan los datos bien, devuelve true.
Por ejemplo:
@code
class miDBO extends MECON_DBO {
// Definición...
}
$db = DB::connect('mi DSN');
$miDBO = new MiDBO();
$miDBO->id = 5;
$miDBO->nombre = 'Petete';
$miDBO->edad = 65;
// Crea una nueva entrada en la DB.
$e =$miDBO->guardar($db, true);
if ($e === true) {
echo 'Se guardó bien.';
} else {
echo 'Hubo un error: ' . $e->getMessage();
}
// Cambia la edad del objeto recién guardado.
$miDBO->edad = 56;
$e =$miDBO->guardar($db);
if ($e === true) {
echo 'Se actualizó bien.';
} else {
echo 'Hubo un error: '. $e->getMessage();
}
@endcode
@internal
En el caso general, se hace un UPDATE con un WHERE basado en la(s) clave(s) concatenadas con AND, y un SET con los atributos no nulos.
*
* @param DB $db Base de datos a usar para guardar el objeto.
* @param bool $nuevo Indica si debe forzarse a guardar una entrada nueva en la DB. Se usa típicamente en bases cuya clave es externa y no puede especificarse un elemento nuevo con \c null en la clave.
*
* @return mixed
* @access public
* @abstract
*/
function guardar($db = null, $nuevo = false) // ~X2C
{
trigger_error('Not implemented!', E_USER_WARNING);
}
// -X2C
// +X2C Operation 19
/**
* Borra el objeto de una base de datos.
Si hay un error, devuelve un PEAR_Error. Si no, devuelve la cantidad de objetos borrados de la base de datos.
Por ejemplo:
@code
class miDBO extends MECON_DBO {
// Definición...
}
$db = DB::connect('mi DSN');
$miDBO = new MiDBO();
$miDBO->id = 5;
$e =$miDBO->borrar($db);
if (PEAR::isError($e)) {
echo 'Hubo un error: ' . $e->getMessage();
} elseif (!$e) {
echo 'No estaba en la base de datos.';
} elseif ($e == 1) {
echo 'Se borró de la base de datos';
} else {
echo "Se borraron $e elementos!';
}
@endcode
@internal
En el caso general, se hace un DELETE con un WHERE basado en los atributos no nulos concatenados con AND.
*
* @param DB $db Base de datos de donde borrar el objeto.
*
* @return mixed
* @access public
* @abstract
*/
function borrar($db = null) // ~X2C
{
trigger_error('Not implemented!', E_USER_WARNING);
}
// -X2C
// +X2C Operation 20
/**
* Busca un objeto en una base de datos.
Si hay un error, devuelve un PEAR_Error. Si no, devuelve un DB_Result con los resultados de la búsqueda.
Por ejemplo:
@code
class miDBO extends MECON_DBO {
// Definición...
}
$db = DB::connect('mi DSN');
$miDBO = new MiDBO();
$miDBO->nombre = 'rez';
$res = $miDBO->buscar($db, MECON_DBO_AND, 'nombre ASC');
if (PEAR::isError($res)) {
echo 'Hubo un error.';
} else {
echo 'Se encontraron ' . $res->numRows() . ' elementos.';
while (($miDBO->cargar($res) = $e) === true) {
var_dump($miDBO);
}
if (PEAR::isError($e)) {
echo 'Hubo un error: ' . $e->getMessage();
}
}
@endcode
@see cargar()
@example DBO.php
@internal
Es similar a cargar, ya que se hace un SELECT con un WHERE basado en los atributos no nulos pero puede concatenarse con AND u OR y se busca con LIKE para que dea más general.
*
* @param DB $db Base de datos a utilizar en la búsqueda.
* @param int $operador Indica que operador se usa para la búsqueda. Puede ser MECON_DBO_AND o MECON_DBO_OR.
* @param mixed $orden Campos por los cuales ordenar. El formato es campo (ASC|DESC) (siedo ASC si se lo ordena de forma ascendente y DESC si se lo ordena de forma descendente). Puede pasarse un string o un array con varios strings con este formato para ordenarlo por más de un campo a la vez.
*
* @return mixed
* @access public
* @abstract
*/
function buscar($db = null, $operador = MECON_DBO_OR, $orden = '') // ~X2C
{
trigger_error('Not implemented!', E_USER_WARNING);
}
// -X2C
} // -X2C Class :MECON_DBO
?>