| // +--------------------------------------------------------------------+ // // $Id$ // /** * Objecto con capacidad de guardarse, cargarse y borrarse de una base de datos. * * @package AI * @access public * @abstract */ class AI_DBObject { /** * @var array $conf * @access public */ var $conf = array(); /** * @param int $id Identificador del objeto a cargar. * @param string $confFile Archivo de configuración del objeto. * * @return void * @access public */ function AI_DBObject($id = 0, $confFile = '') { if ($confFile) { $this->conf = parse_ini_file($confFile, true); } else { $this->conf = parse_ini_file(dirname(__FILE__) . get_class($this) . '.ini', true); } $id_field = $this->conf['id']; $this->$id_field = $id; } /** * @param mixed $db Base de datos o resultado a usar para cargar el objeto. * * @return PEAR_Error * @access public */ function cargar($db) { $id_field = $this->conf['id']; $id = intval($this->$id_field); if (is_a($db, 'db_result')) { $result = $db; $db = $result->dbh; // Si no es un resultado, hago el query. } else { $result = $db->query( "SELECT * FROM {$this->conf['base']}.{$this->conf['tabla']} WHERE $id_field = $id" ); if (DB::isError($result)) { return $result; } } // Obtengo la fila. $row = $result->fetchRow(DB_FETCHMODE_ASSOC); if (!$row) { return new AI_Error(AI_ERROR_NO_RESULTADOS, "No hay más resultados en la DB [id=$id]"); } // Asigno valores al objeto. foreach ($row as $key => $val) { $this->$key = $val; } return true; } /** * @param DB $db Base de datos a usar para guardar el objeto. * @param array $datos Array con los datos a guardar en la DB (donde la * clave es el campo y el valor el contenido a * guardar). * @param bool $nuevo Si es true, se fuerza a cargar el objeto en la base * como si fuera nuevo. * * @return PEAR_Error * @access public */ function guardar($db, $datos, $nuevo = false) { $id_field = $this->conf['id']; $tabla = $this->conf['tabla']; $base = $this->conf['base']; $id = intval($this->$id_field); $where = ''; if ($id and !$nuevo) { $accion = DB_AUTOQUERY_UPDATE; $where = "$id_field = $id"; } else { $accion = DB_AUTOQUERY_INSERT; // Si no tiene ID, le asigno uno nuevo. if (!$id) { $id = $db->nextId($tabla); if (DB::isError($id)) { return $id; } $this->$id_field = $id; } $datos[$id_field] = $id; } $res = $db->autoExecute("$base.$tabla", $datos, $accion, $where); if (DB::isError($res)) { return $res; } return true; } /** * @param DB $db Base de datos a usar para borrar el objeto. * * @return PEAR_Error * @access public */ function borrar($db) { $id_field = $this->conf['id']; $tabla = $this->conf['base'].'.'.$this->conf['tabla']; $id = intval($this->$id_field); if ($id) { $res = $db->query( "DELETE FROM $tabla WHERE $id_field = $id"); if (DB::isError($res)) { return $res; } return true; } return PEAR::raiseError('No hay un identificador válido para borrar'); } /** * @return AI_DBObject * @access public */ function __clone() { return $this; } } ?>