]> git.llucax.com Git - mecon/ai.git/blob - lib/AI/DBObject.php
aa51692193885c77efe99a969a48369b827b5803
[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 // +X2C Class 516 :AI_DBObject
31 /**
32  * Objecto con capacidad de guardarse, cargarse y borrarse de una base de datos.
33  *
34  * @package AI
35  * @access public
36  * @abstract
37  */
38 class AI_DBObject {
39     /**
40      * @var    array $conf
41      * @access public
42      */
43     var $conf = array();
44
45     // ~X2C
46
47     // +X2C Operation 519
48     /**
49      * @param  int $id Identificador del objeto a cargar.
50      * @param  string $confFile Archivo de configuración del objeto.
51      *
52      * @return void
53      * @access public
54      */
55     function AI_DBObject($id = 0, $confFile = '') // ~X2C
56     {
57         if ($confFile) {
58             $this->conf = parse_ini_file($confFile, true);
59         } else {
60             $this->conf = parse_ini_file(dirname(__FILE__) . get_class($this)
61                                 . '.ini', true);
62         }
63                 $id_field = $this->conf['id'];
64         $this->$id_field = $id;
65     }
66     // -X2C
67
68     // +X2C Operation 520
69     /**
70      * @param  mixed $db Base de datos o resultado a usar para cargar el objeto.
71      *
72      * @return PEAR_Error
73      * @access public
74      */
75     function cargar($db) // ~X2C
76     {
77         $id_field = $this->conf['id'];
78         $id = intval($this->$id_field);
79         if (is_a($db, 'db_result')) {
80             $result = $db;
81             $db     = $result->dbh;
82         // Si no es un resultado, hago el query.
83         } else {
84             $result = $db->query(
85                 "SELECT *
86                     FROM {$this->conf['base']}.{$this->conf['tabla']}
87                     WHERE $id_field = $id"
88             );
89             if (DB::isError($result)) {
90                 return $result;
91             }
92         }
93         // Obtengo la fila.
94         $row = $result->fetchRow(DB_FETCHMODE_ASSOC);
95         if (!$row) {
96             return new AI_Error(AI_ERROR_NO_RESULTADOS,
97                 "No hay más resultados en la DB [id=$id]");
98         }
99         // Asigno valores al objeto.
100         foreach ($row as $key => $val) {
101             $this->$key = $val;
102         }
103         return true;
104     }
105     // -X2C
106
107     // +X2C Operation 521
108     /**
109      * @param  DB $db Base de datos a usar para guardar el objeto.
110      * @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).
111      * @param  bool $nuevo Si es true, se fuerza a cargar el objeto en la base como si fuera nuevo.
112      *
113      * @return PEAR_Error
114      * @access public
115      */
116     function guardar($db, $datos, $nuevo = false) // ~X2C
117     {
118                 $id_field = $this->conf['id'];
119         $tabla    = $this->conf['tabla'];
120         $base     = $this->conf['base'];
121         $id       = intval($this->$id_field);
122         $where = '';
123         if ($id and !$nuevo) {
124             $accion = DB_AUTOQUERY_UPDATE;
125             $where  = "$id_field = $id";
126         } else {
127             $accion = DB_AUTOQUERY_INSERT;
128             // Si no tiene ID, le asigno uno nuevo.
129             if (!$id) {
130                 $id = $db->nextId($tabla);
131                 if (DB::isError($id)) {
132                     return $id;
133                 }
134                 $this->$id_field = $id;
135             }
136             $datos[$id_field] = $id;
137         }
138         $res = $db->autoExecute("$base.$tabla", $datos, $accion, $where);
139         if (DB::isError($res)) {
140             return $res;
141         }
142         return true;
143     }
144     // -X2C
145
146     // +X2C Operation 522
147     /**
148      * @param  DB $db Base de datos a usar para borrar el objeto.
149      *
150      * @return PEAR_Error
151      * @access public
152      */
153     function borrar($db) // ~X2C
154     {
155                 $id_field = $this->conf['id'];
156         $tabla = $this->conf['base'].'.'.$this->conf['tabla'];
157         $id = intval($this->$id_field);
158         if ($id) {
159             $res = $db->query(
160                 "DELETE FROM $tabla WHERE $id_field = $id");
161             if (DB::isError($res)) {
162                 return $res;
163             }
164             return true;
165         }
166         return PEAR::raiseError('No hay un identificador válido para borrar');
167     }
168     // -X2C
169
170     // +X2C Operation 523
171     /**
172      * @return AI_DBObject
173      * @access public
174      */
175     function __clone() // ~X2C
176     {
177         return $this;
178     }
179     // -X2C
180
181 } // -X2C Class :AI_DBObject
182
183 ?>