]> git.llucax.com Git - mecon/ai.git/blob - lib/AI/DBObject.php
Se cambian los die(expr) por trigger_error(expr, E_USER_ERROR) para poder interceptar...
[mecon/ai.git] / lib / AI / DBObject.php
1 <?php
2 // vim: set binary expandtab tabstop=4 shiftwidth=4:
3 // +--------------------------------------------------------------------+
4 // |                      Ministerio de Economía                        |
5 // |                  AI (Administrador de Intranet)                    |
6 // +--------------------------------------------------------------------+
7 // | This file is part of AI.                                           |
8 // |                                                                    |
9 // | AI is free software; you can redistribute it and/or modify         |
10 // | it under the terms of the GNU General Public License as published  |
11 // | by the Free Software Foundation; either version 2 of the License,  |
12 // | or (at your option) any later version.                             |
13 // |                                                                    |
14 // | AI is distributed in the hope that it will be useful, but          |
15 // | WITHOUT ANY WARRANTY; without even the implied warranty of         |
16 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU   |
17 // | General Public License for more details.                           |
18 // |                                                                    |
19 // | You should have received a copy of the GNU General Public License  |
20 // | along with Hooks; if not, write to the Free Software Foundation,   |
21 // | Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA      |
22 // +--------------------------------------------------------------------+
23 // | Creado: Fri Jul 18 16:05:22 2003                                   |
24 // | Autor:  Leandro Lucarella <llucar@mecon.gov.ar>                    |
25 // +--------------------------------------------------------------------+
26 //
27 // $Id$
28 //
29
30 /**
31  * Objecto con capacidad de guardarse, cargarse y borrarse de una base de datos.
32  *
33  * @package AI
34  * @access public
35  * @abstract
36  */
37 class AI_DBObject {
38     /**
39      * @var    array $conf
40      * @access public
41      */
42     var $conf = array();
43
44     /**
45      * @param  int $id Identificador del objeto a cargar.
46      * @param  string $confFile Archivo de configuración del objeto.
47      *
48      * @return void
49      * @access public
50      */
51     function AI_DBObject($id = 0, $confFile = '')
52     {
53         if ($confFile) {
54             $this->conf = parse_ini_file($confFile, true);
55         } else {
56             $this->conf = parse_ini_file(dirname(__FILE__) . get_class($this)
57                                 . '.ini', true);
58         }
59                 $id_field = $this->conf['id'];
60         $this->$id_field = $id;
61     }
62
63     /**
64      * @param  mixed $db Base de datos o resultado a usar para cargar el objeto.
65      *
66      * @return PEAR_Error
67      * @access public
68      */
69     function cargar($db)
70     {
71         $id_field = $this->conf['id'];
72         $id = intval($this->$id_field);
73         if (is_a($db, 'db_result')) {
74             $result = $db;
75             $db     = $result->dbh;
76         // Si no es un resultado, hago el query.
77         } else {
78             $result = $db->query(
79                 "SELECT *
80                     FROM {$this->conf['base']}.{$this->conf['tabla']}
81                     WHERE $id_field = $id"
82             );
83             if (DB::isError($result)) {
84                 return $result;
85             }
86         }
87         // Obtengo la fila.
88         $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
89         if (!$row) {
90             return new AI_Error(AI_ERROR_NO_RESULTADOS,
91                 "No hay más resultados en la DB [id=$id]");
92         }
93         // Asigno valores al objeto.
94         foreach ($row as $key => $val) {
95             $this->$key = $val;
96         }
97         return true;
98     }
99
100     /**
101      * @param  DB $db Base de datos a usar para guardar el objeto.
102      * @param  array $datos Array con los datos a guardar en la DB (donde la
103      *                      clave es el campo y el valor el contenido a
104      *                      guardar).
105      * @param  bool $nuevo Si es true, se fuerza a cargar el objeto en la base
106      *                     como si fuera nuevo.
107      *
108      * @return PEAR_Error
109      * @access public
110      */
111     function guardar($db, $datos, $nuevo = false)
112     {
113                 $id_field = $this->conf['id'];
114         $tabla    = $this->conf['tabla'];
115         $base     = $this->conf['base'];
116         $id       = intval($this->$id_field);
117         $where = '';
118         if ($id and !$nuevo) {
119             $accion = DB_AUTOQUERY_UPDATE;
120             $where  = "$id_field = $id";
121         } else {
122             $accion = DB_AUTOQUERY_INSERT;
123             // Si no tiene ID, le asigno uno nuevo.
124             if (!$id) {
125                 $id = $db->nextId($tabla);
126                 if (DB::isError($id)) {
127                     return $id;
128                 }
129                 $this->$id_field = $id;
130             }
131             $datos[$id_field] = $id;
132         }
133         $res = $db->autoExecute("$base.$tabla", $datos, $accion, $where);
134         if (DB::isError($res)) {
135             return $res;
136         }
137         return true;
138     }
139
140     /**
141      * @param  DB $db Base de datos a usar para borrar el objeto.
142      *
143      * @return PEAR_Error
144      * @access public
145      */
146     function borrar($db)
147     {
148                 $id_field = $this->conf['id'];
149         $tabla = $this->conf['base'].'.'.$this->conf['tabla'];
150         $id = intval($this->$id_field);
151         if ($id) {
152             $res = $db->query(
153                 "DELETE FROM $tabla WHERE $id_field = $id");
154             if (DB::isError($res)) {
155                 return $res;
156             }
157             return true;
158         }
159         return PEAR::raiseError('No hay un identificador válido para borrar');
160     }
161
162     /**
163      * @return AI_DBObject
164      * @access public
165      */
166     function __clone()
167     {
168         return $this;
169     }
170
171 }
172
173 ?>