40
47
* @param string $table tabla
41
48
* @param string $schema schema
44
51
abstract public function describe($table, $schema=NULL);
49
56
* @param string $connection nombre de conexion en databases.ini
51
58
public function __construct($connection)
53
60
$this->_connection = $connection;
57
* Obtiene instancia de query en funcion de la conexion
64
* Obtiene instancia de adaptador en funcion de la conexion (utiliza Singleton)
59
66
* @param string $connection conexion a base de datos en databases.ini
60
67
* @return DbAdapter
61
68
* @throw KumbiaException
63
public static function factory($connection=NULL)
70
public static function factory($connection = NULL)
65
// carga la conexion por defecto
72
// Carga la conexion por defecto
66
73
if (!$connection) {
67
74
$connection = Config::get('config.application.database');
70
// lee la configuracion de base de datos
71
$databases = Config::read('databases');
73
if(!isset($databases[$connection])) {
74
throw new KumbiaException("No existe la conexion $connection en databases.ini");
77
$database = $databases[$connection];
79
// genera el nombre de clase
80
$Class = ucfirst($database['type']) . 'Db';
82
// si no existe la clase la carga
83
if(!class_exists($Class, FALSE)) {
85
require CORE_PATH . "libs/ActiveRecord/db_pool/adapters/{$database['type']}_db.php";
88
return new $Class($connection);
92
* Genera el objeto pdo para la conexion
98
return DbPool::factory($this->_connection);
77
// Si no existe el Singleton
78
if(!isset(self::$_adapters[$connection])) {
79
// Lee la configuracion de base de datos
80
$databases = Config::read('databases');
82
if(!isset($databases[$connection])) {
83
throw new KumbiaException("No existe la conexion $connection en databases.ini");
86
$database = $databases[$connection];
88
// Genera el nombre de clase
89
$Class = ucfirst($database['type']) . 'Db';
91
// Si no existe la clase la carga
92
if(!class_exists($Class, FALSE)) {
94
require CORE_PATH . "libs/ActiveRecord/db_pool/adapters/{$database['type']}_db.php";
97
// Instancia el adaptador
98
self::$_adapters[$connection] = new $Class($connection);
101
// Retorna el adaptador
102
return self::$_adapters[$connection];
102
106
* Genera la consulta sql concreta
104
108
* @param DbQuery $dbQuery
110
* @throw KumbiaException
107
112
public function query($dbQuery)
109
114
$sqlArray = $dbQuery->getSqlArray();
111
// verifica si se indico una table
116
// Verifica si se indico una table
112
117
if(!isset($sqlArray['table'])) {
113
118
throw new KumbiaException("Debe indicar una tabla para efectuar la consulta");
116
if(isset($sqlArray['select'])) {
117
return $this->_select($sqlArray);
119
} elseif(isset($sqlArray['insert'])) {
120
return $this->_insert($sqlArray);
122
} elseif(isset($sqlArray['update'])) {
123
return $this->_update($sqlArray);
125
} elseif(isset($sqlArray['delete'])) {
126
return $this->_delete($sqlArray);
121
if(isset($sqlArray['command'])) {
122
return $this->{"_{$sqlArray['command']}"}($sqlArray);
125
throw new KumbiaException("Debe indicar un comando de consulta SQL");
158
157
* @param array $sqlArray
161
160
protected function _insert($sqlArray)
163
// alias para manejar mas facil
164
$insert = $sqlArray['insert'];
167
if(is_array($insert['columns'])) {
168
// obtiene la conexion pdo
174
foreach($insert['columns'] as $k => $v) {
176
//$values[] = $pdo->quote($v);
180
$columns = implode(', ', $columns);
181
$values = implode(', ', $values);
183
$columns = $insert['columns'];
184
$values = $insert['values'];
187
// verifica si esta definido el eschema
162
// Obtiene las columns
163
$columns = implode(', ', array_keys($sqlArray['data']));
164
// Parámetros enlazados para SQL PS
165
$values = implode(', ', array_keys($sqlArray['bind']));
167
// Verifica si esta definido el eschema
188
168
if(isset($sqlArray['schema'])) {
189
169
$source = "{$sqlArray['schema']}.{$sqlArray['table']}";
191
171
$source = $sqlArray['table'];
194
173
return "INSERT INTO $source ($columns) VALUES ($values)";
200
179
* @param array $sqlArray
203
182
protected function _update($sqlArray)
206
if(is_array($sqlArray['update'])) {
207
// obtiene la conexion pdo
212
foreach($sqlArray['update'] as $k => $v) {
213
$values[] = "$k=" . $pdo->quote($v);
216
$values = implode(', ', $values);
218
$values = $sqlArray['update'];
184
// Construye la pareja clave, valor para SQL PS
186
foreach(array_keys($sqlArray['data']) as $k) {
187
$values[] = "$k = :$k";
189
$values = implode(', ', $values);
221
// verifica si esta definido el eschema
191
// Verifica si esta definido el eschema
222
192
if(isset($sqlArray['schema'])) {
223
193
$source = "{$sqlArray['schema']}.{$sqlArray['table']}";
252
222
* @param array $sqlArray array de condiciones
253
223
* @param string $sql consulta sql donde se unira las clausulas
256
226
protected function _joinClausules($sqlArray, $sql)
259
229
if(isset($sqlArray['join'])) {
260
230
foreach($sqlArray['join'] as $join) {
261
231
$sql .= " INNER JOIN {$join['table']} ON ({$join['conditions']})";
265
// para left outer join
235
// Para left outer join
266
236
if(isset($sqlArray['leftJoin'])) {
267
237
foreach($sqlArray['leftJoin'] as $join) {
268
238
$sql .= " LEFT OUTER JOIN {$join['table']} ON ({$join['conditions']})";
272
// para right outer join
242
// Para right outer join
273
243
if(isset($sqlArray['rightJoin'])) {
274
244
foreach($sqlArray['rightJoin'] as $join) {
275
245
$sql .= " RIGHT OUTER JOIN {$join['table']} ON ({$join['conditions']})";
280
250
if(isset($sqlArray['fullJoin'])) {
281
251
foreach($sqlArray['fullJoin'] as $join) {
282
252
$sql .= " FULL JOIN {$join['table']} ON ({$join['conditions']})";