Test Failed
Push — 1.0.0-dev ( c7a39c...6c2ad2 )
by nguereza
03:29
created

Database::setDatabaseConfigurationFromConfigFile()   F

Complexity

Conditions 14
Paths 5120

Size

Total Lines 27
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 14
eloc 21
c 0
b 0
f 0
nc 5120
nop 1
dl 0
loc 27
rs 2.1

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
    defined('ROOT_PATH') || exit('Access denied');
3
  /**
4
   * TNH Framework
5
   *
6
   * A simple PHP framework using HMVC architecture
7
   *
8
   * This content is released under the GNU GPL License (GPL)
9
   *
10
   * Copyright (C) 2017 Tony NGUEREZA
11
   *
12
   * This program is free software; you can redistribute it and/or
13
   * modify it under the terms of the GNU General Public License
14
   * as published by the Free Software Foundation; either version 3
15
   * of the License, or (at your option) any later version.
16
   *
17
   * This program is distributed in the hope that it will be useful,
18
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
   * GNU General Public License for more details.
21
   *
22
   * You should have received a copy of the GNU General Public License
23
   * along with this program; if not, write to the Free Software
24
   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25
  */
26
  class Database{
27
	
28
	/**
29
	 * The PDO instance
30
	 * @var object
31
	*/
32
    private $pdo                 = null;
33
    
34
	/**
35
	 * The database name used for the application
36
	 * @var string
37
	*/
38
	private $databaseName        = null;
39
    
40
	/**
41
	 * The SQL SELECT statment
42
	 * @var string
43
	*/
44
	private $select              = '*';
45
	
46
	/**
47
	 * The SQL FROM statment
48
	 * @var string
49
	*/
50
    private $from                = null;
51
	
52
	/**
53
	 * The SQL WHERE statment
54
	 * @var string
55
	*/
56
    private $where               = null;
57
	
58
	/**
59
	 * The SQL LIMIT statment
60
	 * @var string
61
	*/
62
    private $limit               = null;
63
	
64
	/**
65
	 * The SQL JOIN statment
66
	 * @var string
67
	*/
68
    private $join                = null;
69
	
70
	/**
71
	 * The SQL ORDER BY statment
72
	 * @var string
73
	*/
74
    private $orderBy             = null;
75
	
76
	/**
77
	 * The SQL GROUP BY statment
78
	 * @var string
79
	*/
80
    private $groupBy             = null;
81
	
82
	/**
83
	 * The SQL HAVING statment
84
	 * @var string
85
	*/
86
    private $having              = null;
87
	
88
	/**
89
	 * The number of rows returned by the last query
90
	 * @var int
91
	*/
92
    private $numRows             = 0;
93
	
94
	/**
95
	 * The last insert id for the primary key column that have auto increment or sequence
96
	 * @var mixed
97
	*/
98
    private $insertId            = null;
99
	
100
	/**
101
	 * The full SQL query statment after build for each command
102
	 * @var string
103
	*/
104
    private $query               = null;
105
	
106
	/**
107
	 * The error returned for the last query
108
	 * @var string
109
	*/
110
    private $error               = null;
111
	
112
	/**
113
	 * The result returned for the last query
114
	 * @var mixed
115
	*/
116
    private $result              = array();
117
	
118
	/**
119
	 * The prefix used in each database table
120
	 * @var string
121
	*/
122
    private $prefix              = null;
123
	
124
	/**
125
	 * The list of SQL valid operators
126
	 * @var array
127
	*/
128
    private $operatorList        = array('=','!=','<','>','<=','>=','<>');
129
    
130
	/**
131
	 * The cache default time to live in second. 0 means no need to use the cache feature
132
	 * @var int
133
	*/
134
	private $cacheTtl              = 0;
135
	
136
	/**
137
	 * The cache current time to live. 0 means no need to use the cache feature
138
	 * @var int
139
	*/
140
    private $temporaryCacheTtl   = 0;
141
	
142
	/**
143
	 * The number of executed query for the current request
144
	 * @var int
145
	*/
146
    private $queryCount          = 0;
147
	
148
	/**
149
	 * The default data to be used in the statments query INSERT, UPDATE
150
	 * @var array
151
	*/
152
    private $data                = array();
153
	
154
	/**
155
	 * The database configuration
156
	 * @var array
157
	*/
158
    private $config              = array();
159
	
160
	/**
161
	 * The logger instance
162
	 * @var Log
163
	 */
164
    private $logger              = null;
165
166
167
    /**
168
    * The cache instance
169
    * @var CacheInterface
170
    */
171
    private $cacheInstance       = null;
172
173
     /**
174
    * The benchmark instance
175
    * @var Benchmark
176
    */
177
    private $benchmarkInstance   = null;
178
179
180
    /**
181
     * Construct new database
182
     * @param array $overwriteConfig the config to overwrite with the config set in database.php
183
     */
184
    public function __construct($overwriteConfig = array()){
185
        //Set Log instance to use
186
        $this->setLoggerFromParamOrCreateNewInstance(null);
187
188
        //Set global configuration using the config file
189
        $this->setDatabaseConfigurationFromConfigFile($overwriteConfig);
190
        
191
    		$this->temporaryCacheTtl = $this->cacheTtl;
192
    }
193
194
    /**
195
     * This is used to connect to database
196
     * @return bool 
197
     */
198
    public function connect(){
199
      $config = $this->getDatabaseConfiguration();
200
      if(! empty($config)){
201
        try{
202
            $this->pdo = new PDO($this->getDsnFromDriver(), $config['username'], $config['password']);
203
            $this->pdo->exec("SET NAMES '" . $config['charset'] . "' COLLATE '" . $config['collation'] . "'");
204
            $this->pdo->exec("SET CHARACTER SET '" . $config['charset'] . "'");
205
            $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
206
            return true;
207
          }
208
          catch (PDOException $e){
209
            $this->logger->fatal($e->getMessage());
210
            show_error('Cannot connect to Database.');
211
            return false;
212
          }
213
      }
214
      else{
215
        show_error('Database configuration is not set.');
216
        return false;
217
      }
218
    }
219
220
    /**
221
     * Set the SQL FROM statment
222
     * @param  string|array $table the table name or array of table list
223
     * @return object        the current Database instance
224
     */
225
    public function from($table){
226
      if(is_array($table)){
227
        $froms = '';
228
        foreach($table as $key){
229
          $froms .= $this->prefix . $key . ', ';
230
        }
231
        $this->from = rtrim($froms, ', ');
232
      }
233
      else{
234
        $this->from = $this->prefix . $table;
235
      }
236
      return $this;
237
    }
238
239
    /**
240
     * Set the SQL SELECT statment
241
     * @param  string|array $fields the field name or array of field list
242
     * @return object        the current Database instance
243
     */
244
    public function select($fields){
245
      $select = (is_array($fields) ? implode(', ', $fields) : $fields);
246
      $this->select = ($this->select == '*' ? $select : $this->select . ', ' . $select);
247
      return $this;
248
    }
249
250
    /**
251
     * Set the SQL SELECT DISTINCT statment
252
     * @param  string $field the field name to distinct
253
     * @return object        the current Database instance
254
     */
255
    public function distinct($field){
256
      $distinct = ' DISTINCT ' . $field;
257
      $this->select = ($this->select == '*' ? $distinct : $this->select . ', ' . $distinct);
258
259
      return $this;
260
    }
261
262
    /**
263
     * Set the SQL function MAX in SELECT statment
264
     * @param  string $field the field name
265
     * @param  string $name  if is not null represent the alias used for this field in the result
266
     * @return object        the current Database instance
267
     */
268
    public function max($field, $name = null){
269
      $func = 'MAX(' . $field . ')' . (!is_null($name) ? ' AS ' . $name : '');
270
      $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func);
271
      return $this;
272
    }
273
274
    /**
275
     * Set the SQL function MIN in SELECT statment
276
     * @param  string $field the field name
277
     * @param  string $name  if is not null represent the alias used for this field in the result
278
     * @return object        the current Database instance
279
     */
280
    public function min($field, $name = null){
281
      $func = 'MIN(' . $field . ')' . (!is_null($name) ? ' AS ' . $name : '');
282
      $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func);
283
      return $this;
284
    }
285
286
    /**
287
     * Set the SQL function SUM in SELECT statment
288
     * @param  string $field the field name
289
     * @param  string $name  if is not null represent the alias used for this field in the result
290
     * @return object        the current Database instance
291
     */
292
    public function sum($field, $name = null){
293
      $func = 'SUM(' . $field . ')' . (!is_null($name) ? ' AS ' . $name : '');
294
      $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func);
295
      return $this;
296
    }
297
298
    /**
299
     * Set the SQL function COUNT in SELECT statment
300
     * @param  string $field the field name
301
     * @param  string $name  if is not null represent the alias used for this field in the result
302
     * @return object        the current Database instance
303
     */
304
    public function count($field = '*', $name = null){
305
      $func = 'COUNT(' . $field . ')' . (!is_null($name) ? ' AS ' . $name : '');
306
      $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func);
307
      return $this;
308
    }
309
310
    /**
311
     * Set the SQL function AVG in SELECT statment
312
     * @param  string $field the field name
313
     * @param  string $name  if is not null represent the alias used for this field in the result
314
     * @return object        the current Database instance
315
     */
316
    public function avg($field, $name = null){
317
      $func = 'AVG(' . $field . ')' . (!is_null($name) ? ' AS ' . $name : '');
318
      $this->select = ($this->select == '*' ? $func : $this->select . ', ' . $func);
319
      return $this;
320
    }
321
322
    /**
323
     * Set the SQL JOIN statment
324
     * @param  string $table  the join table name
325
     * @param  string $field1 the first field for join conditions	
326
     * @param  string $op     the join condition operator. If is null the default will be "="
327
     * @param  string $field2 the second field for join conditions
328
     * @param  string $type   the type of join (INNER, LEFT, RIGHT)
329
     * @return object        the current Database instance
330
     */
331
    public function join($table, $field1 = null, $op = null, $field2 = null, $type = ''){
332
      $on = $field1;
333
      $table = $this->prefix . $table;
334
      if(! is_null($op)){
335
        $on = (! in_array($op, $this->operatorList) ? $this->prefix . $field1 . ' = ' . $this->prefix . $op : $this->prefix . $field1 . ' ' . $op . ' ' . $this->prefix . $field2);
336
      }
337
      if (empty($this->join)){
338
        $this->join = ' ' . $type . 'JOIN' . ' ' . $table . ' ON ' . $on;
339
      }
340
      else{
341
        $this->join = $this->join . ' ' . $type . 'JOIN' . ' ' . $table . ' ON ' . $on;
342
      }
343
      return $this;
344
    }
345
346
    /**
347
     * Set the SQL INNER JOIN statment
348
     * @see  Database::join()
349
     * @return object        the current Database instance
350
     */
351
    public function innerJoin($table, $field1, $op = null, $field2 = ''){
352
      return $this->join($table, $field1, $op, $field2, 'INNER ');
353
    }
354
355
    /**
356
     * Set the SQL LEFT JOIN statment
357
     * @see  Database::join()
358
     * @return object        the current Database instance
359
     */
360
    public function leftJoin($table, $field1, $op = null, $field2 = ''){
361
      return $this->join($table, $field1, $op, $field2, 'LEFT ');
362
	}
363
364
	/**
365
     * Set the SQL RIGHT JOIN statment
366
     * @see  Database::join()
367
     * @return object        the current Database instance
368
     */
369
    public function rightJoin($table, $field1, $op = null, $field2 = ''){
370
      return $this->join($table, $field1, $op, $field2, 'RIGHT ');
371
    }
372
373
    /**
374
     * Set the SQL FULL OUTER JOIN statment
375
     * @see  Database::join()
376
     * @return object        the current Database instance
377
     */
378
    public function fullOuterJoin($table, $field1, $op = null, $field2 = ''){
379
    	return $this->join($table, $field1, $op, $field2, 'FULL OUTER ');
380
    }
381
382
    /**
383
     * Set the SQL LEFT OUTER JOIN statment
384
     * @see  Database::join()
385
     * @return object        the current Database instance
386
     */
387
    public function leftOuterJoin($table, $field1, $op = null, $field2 = ''){
388
      return $this->join($table, $field1, $op, $field2, 'LEFT OUTER ');
389
    }
390
391
    /**
392
     * Set the SQL RIGHT OUTER JOIN statment
393
     * @see  Database::join()
394
     * @return object        the current Database instance
395
     */
396
    public function rightOuterJoin($table, $field1, $op = null, $field2 = ''){
397
      return $this->join($table, $field1, $op, $field2, 'RIGHT OUTER ');
398
    }
399
400
    /**
401
     * Set the SQL WHERE CLAUSE for IS NULL
402
     * @param  string|array $field  the field name or array of field list
403
     * @param  string $andOr the separator type used 'AND', 'OR', etc.
404
     * @return object        the current Database instance
405
     */
406
    public function whereIsNull($field, $andOr = 'AND'){
407
      if(is_array($field)){
408
        foreach($field as $f){
409
        	$this->whereIsNull($f, $andOr);
410
        }
411
      }
412
      else{
413
        if (! $this->where){
414
          $this->where = $field.' IS NULL ';
415
        }
416
        else{
417
            $this->where = $this->where . ' '.$andOr.' ' . $field.' IS NULL ';
418
          }
419
      }
420
      return $this;
421
    }
422
423
    /**
424
     * Set the SQL WHERE CLAUSE for IS NOT NULL
425
     * @param  string|array $field  the field name or array of field list
426
     * @param  string $andOr the separator type used 'AND', 'OR', etc.
427
     * @return object        the current Database instance
428
     */
429
    public function whereIsNotNull($field, $andOr = 'AND'){
430
      if(is_array($field)){
431
        foreach($field as $f){
432
          $this->whereIsNotNull($f, $andOr);
433
        }
434
      }
435
      else{
436
        if (! $this->where){
437
          $this->where = $field.' IS NOT NULL ';
438
        }
439
        else{
440
            $this->where = $this->where . ' '.$andOr.' ' . $field.' IS NOT NULL ';
441
          }
442
      }
443
      return $this;
444
    }
445
446
    /**
447
     * Get the SQL WHERE clause using array column => value
448
     * @see Database::where
449
     *
450
     * @return string
451
     */
452
    protected function getWhereStrIfIsArray(array $where, $type = '', $andOr = 'AND', $escape = true){
453
        $_where = array();
454
        foreach ($where as $column => $data){
455
          if(is_null($data)){
456
            $data = '';
457
          }
458
          $_where[] = $type . $column . ' = ' . ($escape ? $this->escape($data) : $data);
459
        }
460
        $where = implode(' '.$andOr.' ', $_where);
461
        return $where;
462
    }
463
464
     /**
465
     * Get the SQL WHERE clause when operator argument is an array
466
     * @see Database::where
467
     *
468
     * @return string
469
     */
470
    protected function getWhereStrIfOperatorIsArray($where, array $op, $type = '', $escape = true){
471
       $x = explode('?', $where);
472
       $w = '';
473
        foreach($x as $k => $v){
474
          if(! empty($v)){
475
              if(isset($op[$k]) && is_null($op[$k])){
476
                $op[$k] = '';
477
              }
478
              $w .= $type . $v . (isset($op[$k]) ? ($escape ? $this->escape($op[$k]) : $op[$k]) : '');
479
          }
480
        }
481
        return $w;
482
    }
483
484
    /**
485
     * Get the default SQL WHERE clause using operator = or the operator argument
486
     * @see Database::where
487
     *
488
     * @return string
489
     */
490
    protected function getWhereStrForOperator($where, $op = null, $val = null, $type = '', $escape = true){
491
       $w = '';
492
       if (! in_array((string)$op, $this->operatorList)){
493
          if(is_null($op)){
494
            $op = '';
495
          }
496
          $w = $type . $where . ' = ' . ($escape ? $this->escape($op) : $op);
497
        }
498
        else{
499
          if(is_null($val)){
500
            $val = '';
501
          }
502
          $w = $type . $where . $op . ($escape ? $this->escape($val) : $val);
503
        }
504
        return $w;
505
      }
506
507
      /**
508
       * Set the $this->where property 
509
       * @param string $whereStr the WHERE clause string
510
       * @param  string  $andOr the separator type used 'AND', 'OR', etc.
511
       */
512
      protected function setWhereStr($whereStr, $andOr = 'AND'){
513
        if (empty($this->where)){
514
          $this->where = $whereStr;
515
        }
516
        else{
517
          if(substr($this->where, -1) == '('){
518
            $this->where = $this->where . ' ' . $whereStr;
519
          }
520
          else{
521
            $this->where = $this->where . ' '.$andOr.' ' . $whereStr;
522
          }
523
        }
524
      }
525
    
526
    /**
527
     * Set the SQL WHERE CLAUSE statment
528
     * @param  string|array  $where the where field or array of field list
529
     * @param  array|string  $op     the condition operator. If is null the default will be "="
530
     * @param  mixed  $val    the where value
531
     * @param  string  $type   the type used for this where clause (NOT, etc.)
532
     * @param  string  $andOr the separator type used 'AND', 'OR', etc.
533
     * @param  boolean $escape whether to escape or not the $val
534
     * @return object        the current Database instance
535
     */
536
    public function where($where, $op = null, $val = null, $type = '', $andOr = 'AND', $escape = true){
537
      $whereStr = '';
538
      if (is_array($where)){
539
        $whereStr = $this->getWhereStrIfIsArray($where, $type, $andOr, $escape);
540
      }
541
      else{
542
        if(is_array($op)){
543
          $whereStr = $this->getWhereStrIfOperatorIsArray($where, $op, $type, $escape);
544
        } else {
545
          $whereStr = $this->getWhereStrForOperator($where, $op, $val, $type, $escape = true);
546
        }
547
      }
548
      $this->setWhereStr($whereStr, $andOr);
549
      return $this;
550
    }
551
552
    /**
553
     * Set the SQL WHERE CLAUSE statment using OR
554
     * @see  Database::where()
555
     * @return object        the current Database instance
556
     */
557
    public function orWhere($where, $op = null, $val = null, $escape = true){
558
      return $this->where($where, $op, $val, '', 'OR', $escape);
559
    }
560
561
562
    /**
563
     * Set the SQL WHERE CLAUSE statment using AND and NOT
564
     * @see  Database::where()
565
     * @return object        the current Database instance
566
     */
567
    public function notWhere($where, $op = null, $val = null, $escape = true){
568
      return $this->where($where, $op, $val, 'NOT ', 'AND', $escape);
569
    }
570
571
    /**
572
     * Set the SQL WHERE CLAUSE statment using OR and NOT
573
     * @see  Database::where()
574
     * @return object        the current Database instance
575
     */
576
    public function orNotWhere($where, $op = null, $val = null, $escape = true){
577
    	return $this->where($where, $op, $val, 'NOT ', 'OR', $escape);
578
    }
579
580
    /**
581
     * Set the opened parenthesis for the complex SQL query
582
     * @param  string $type   the type of this grouped (NOT, etc.)
583
     * @param  string $andOr the multiple conditions separator (AND, OR, etc.)
584
     * @return object        the current Database instance
585
     */
586
    public function groupStart($type = '', $andOr = ' AND'){
587
      if (empty($this->where)){
588
        $this->where = $type . ' (';
589
      }
590
      else{
591
          if(substr($this->where, -1) == '('){
592
            $this->where .= $type . ' (';
593
          }
594
          else{
595
          	$this->where .= $andOr . ' ' . $type . ' (';
596
          }
597
      }
598
      return $this;
599
    }
600
601
    /**
602
     * Set the opened parenthesis for the complex SQL query using NOT type
603
     * @see  Database::groupStart()
604
     * @return object        the current Database instance
605
     */
606
    public function notGroupStart(){
607
      return $this->groupStart('NOT');
608
    }
609
610
    /**
611
     * Set the opened parenthesis for the complex SQL query using OR for separator
612
     * @see  Database::groupStart()
613
     * @return object        the current Database instance
614
     */
615
    public function orGroupStart(){
616
      return $this->groupStart('', ' OR');
617
    }
618
619
     /**
620
     * Set the opened parenthesis for the complex SQL query using OR for separator and NOT for type
621
     * @see  Database::groupStart()
622
     * @return object        the current Database instance
623
     */
624
    public function orNotGroupStart(){
625
      return $this->groupStart('NOT', ' OR');
626
    }
627
628
    /**
629
     * Close the parenthesis for the grouped SQL
630
     * @return object        the current Database instance
631
     */
632
    public function groupEnd(){
633
      $this->where .= ')';
634
      return $this;
635
    }
636
637
    /**
638
     * Set the SQL WHERE CLAUSE statment for IN
639
     * @param  string  $field  the field name for IN statment
640
     * @param  array   $keys   the list of values used
641
     * @param  string  $type   the condition separator type (NOT)
642
     * @param  string  $andOr the multiple conditions separator (OR, AND)
643
     * @param  boolean $escape whether to escape or not the values
644
     * @return object        the current Database instance
645
     */
646
    public function in($field, array $keys, $type = '', $andOr = 'AND', $escape = true){
647
      $_keys = array();
648
      foreach ($keys as $k => $v){
649
        if(is_null($v)){
650
          $v = '';
651
        }
652
        $_keys[] = (is_numeric($v) ? $v : ($escape ? $this->escape($v) : $v));
653
      }
654
      $keys = implode(', ', $_keys);
655
      $whereStr = $field . ' ' . $type . ' IN (' . $keys . ')';
656
      $this->setWhereStr($whereStr, $andOr);
657
      return $this;
658
    }
659
660
    /**
661
     * Set the SQL WHERE CLAUSE statment for NOT IN with AND separator
662
     * @see  Database::in()
663
     * @return object        the current Database instance
664
     */
665
    public function notIn($field, array $keys, $escape = true){
666
      return $this->in($field, $keys, 'NOT ', 'AND', $escape);
667
    }
668
669
    /**
670
     * Set the SQL WHERE CLAUSE statment for IN with OR separator
671
     * @see  Database::in()
672
     * @return object        the current Database instance
673
     */
674
    public function orIn($field, array $keys, $escape = true){
675
      return $this->in($field, $keys, '', 'OR', $escape);
676
    }
677
678
    /**
679
     * Set the SQL WHERE CLAUSE statment for NOT IN with OR separator
680
     * @see  Database::in()
681
     * @return object        the current Database instance
682
     */
683
    public function orNotIn($field, array $keys, $escape = true){
684
      return $this->in($field, $keys, 'NOT ', 'OR', $escape);
685
    }
686
687
    /**
688
     * Set the SQL WHERE CLAUSE statment for BETWEEN
689
     * @param  string  $field  the field used for the BETWEEN statment
690
     * @param  mixed  $value1 the BETWEEN begin value
691
     * @param  mixed  $value2 the BETWEEN end value
692
     * @param  string  $type   the condition separator type (NOT)
693
     * @param  string  $andOr the multiple conditions separator (OR, AND)
694
     * @param  boolean $escape whether to escape or not the values
695
     * @return object        the current Database instance
696
     */
697
    public function between($field, $value1, $value2, $type = '', $andOr = 'AND', $escape = true){
698
      if(is_null($value1)){
699
        $value1 = '';
700
      }
701
      if(is_null($value2)){
702
        $value2 = '';
703
      }
704
      $whereStr = $field . ' ' . $type . ' BETWEEN ' . ($escape ? $this->escape($value1) : $value1) . ' AND ' . ($escape ? $this->escape($value2) : $value2);
705
      $this->setWhereStr($whereStr, $andOr);
706
      return $this;
707
    }
708
709
    /**
710
     * Set the SQL WHERE CLAUSE statment for BETWEEN with NOT type and AND separator
711
     * @see  Database::between()
712
     * @return object        the current Database instance
713
     */
714
    public function notBetween($field, $value1, $value2, $escape = true){
715
      return $this->between($field, $value1, $value2, 'NOT ', 'AND', $escape);
716
    }
717
718
    /**
719
     * Set the SQL WHERE CLAUSE statment for BETWEEN with OR separator
720
     * @see  Database::between()
721
     * @return object        the current Database instance
722
     */
723
    public function orBetween($field, $value1, $value2, $escape = true){
724
      return $this->between($field, $value1, $value2, '', 'OR', $escape);
725
    }
726
727
    /**
728
     * Set the SQL WHERE CLAUSE statment for BETWEEN with NOT type and OR separator
729
     * @see  Database::between()
730
     * @return object        the current Database instance
731
     */
732
    public function orNotBetween($field, $value1, $value2, $escape = true){
733
      return $this->between($field, $value1, $value2, 'NOT ', 'OR', $escape);
734
    }
735
736
    /**
737
     * Set the SQL WHERE CLAUSE statment for LIKE
738
     * @param  string  $field  the field name used in LIKE statment
739
     * @param  string  $data   the LIKE value for this field including the '%', and '_' part
740
     * @param  string  $type   the condition separator type (NOT)
741
     * @param  string  $andOr the multiple conditions separator (OR, AND)
742
     * @param  boolean $escape whether to escape or not the values
743
     * @return object        the current Database instance
744
     */
745
    public function like($field, $data, $type = '', $andOr = 'AND', $escape = true){
746
      if(empty($data)){
747
        $data = '';
748
      }
749
      $like = $escape ? $this->escape($data) : $data;
750
      if (empty($this->where)){
751
        $this->where = $field . ' ' . $type . 'LIKE ' . $like;
752
      }
753
      else{
754
        if(substr($this->where, -1) == '('){
755
          $this->where = $this->where . ' ' . $field . ' ' . $type . 'LIKE ' . $like;
756
        }
757
        else{
758
          $this->where = $this->where . ' '.$andOr.' ' . $field . ' ' . $type . 'LIKE ' . $like;
759
        }
760
      }
761
      return $this;
762
    }
763
764
    /**
765
     * Set the SQL WHERE CLAUSE statment for LIKE with OR separator
766
     * @see  Database::like()
767
     * @return object        the current Database instance
768
     */
769
    public function orLike($field, $data, $escape = true){
770
      return $this->like($field, $data, '', 'OR', $escape);
771
    }
772
773
    /**
774
     * Set the SQL WHERE CLAUSE statment for LIKE with NOT type and AND separator
775
     * @see  Database::like()
776
     * @return object        the current Database instance
777
     */
778
    public function notLike($field, $data, $escape = true){
779
      return $this->like($field, $data, 'NOT ', 'AND', $escape);
780
    }
781
782
    /**
783
     * Set the SQL WHERE CLAUSE statment for LIKE with NOT type and OR separator
784
     * @see  Database::like()
785
     * @return object        the current Database instance
786
     */
787
    public function orNotLike($field, $data, $escape = true){
788
      return $this->like($field, $data, 'NOT ', 'OR', $escape);
789
    }
790
791
    /**
792
     * Set the SQL LIMIT statment
793
     * @param  int $limit    the limit offset. If $limitEnd is null this will be the limit count
794
     * like LIMIT n;
795
     * @param  int $limitEnd the limit count
796
     * @return object        the current Database instance
797
     */
798
    public function limit($limit, $limitEnd = null){
799
      if(empty($limit)){
800
        return;
801
      }
802
      if (! is_null($limitEnd)){
803
        $this->limit = $limit . ', ' . $limitEnd;
804
      }
805
      else{
806
        $this->limit = $limit;
807
      }
808
      return $this;
809
    }
810
811
    /**
812
     * Set the SQL ORDER BY CLAUSE statment
813
     * @param  string $orderBy   the field name used for order
814
     * @param  string $orderDir the order direction (ASC or DESC)
815
     * @return object        the current Database instance
816
     */
817
    public function orderBy($orderBy, $orderDir = ' ASC'){
818
      if (! empty($orderDir)){
819
        $this->orderBy = ! $this->orderBy ? ($orderBy . ' ' . strtoupper($orderDir)) : $this->orderBy . ', ' . $orderBy . ' ' . strtoupper($orderDir);
820
      }
821
      else{
822
        if(stristr($orderBy, ' ') || $orderBy == 'rand()'){
823
          $this->orderBy = ! $this->orderBy ? $orderBy : $this->orderBy . ', ' . $orderBy;
824
        }
825
        else{
826
          $this->orderBy = ! $this->orderBy ? ($orderBy . ' ASC') : $this->orderBy . ', ' . ($orderBy . ' ASC');
827
        }
828
      }
829
      return $this;
830
    }
831
832
    /**
833
     * Set the SQL GROUP BY CLAUSE statment
834
     * @param  string|array $field the field name used or array of field list
835
     * @return object        the current Database instance
836
     */
837
    public function groupBy($field){
838
      if(is_array($field)){
839
        $this->groupBy = implode(', ', $field);
840
      }
841
      else{
842
        $this->groupBy = $field;
843
      }
844
      return $this;
845
    }
846
847
    /**
848
     * Set the SQL HAVING CLAUSE statment
849
     * @param  string  $field  the field name used for HAVING statment
850
     * @param  string|array  $op     the operator used or array
851
     * @param  mixed  $val    the value for HAVING comparaison
852
     * @param  boolean $escape whether to escape or not the values
853
     * @return object        the current Database instance
854
     */
855
    public function having($field, $op = null, $val = null, $escape = true){
856
      if(is_array($op)){
857
        $x = explode('?', $field);
858
        $w = '';
859
        foreach($x as $k => $v){
860
  	      if(!empty($v)){
861
            if(isset($op[$k]) && is_null($op[$k])){
862
              $op[$k] = '';
863
            }
864
  	      	$w .= $v . (isset($op[$k]) ? ($escape ? $this->escape($op[$k]) : $op[$k]) : '');
865
  	      }
866
      	}
867
        $this->having = $w;
868
      }
869
      else if (! in_array($op, $this->operatorList)){
870
        if(is_null($op)){
871
          $op = '';
872
        }
873
        $this->having = $field . ' > ' . ($escape ? $this->escape($op) : $op);
874
      }
875
      else{
876
        if(is_null($val)){
877
          $val = '';
878
        }
879
        $this->having = $field . ' ' . $op . ' ' . ($escape ? $this->escape($val) : $val);
880
      }
881
      return $this;
882
    }
883
884
    /**
885
     * Return the number of rows returned by the current query
886
     * @return int
887
     */
888
    public function numRows(){
889
      return $this->numRows;
890
    }
891
892
    /**
893
     * Return the last insert id value
894
     * @return mixed
895
     */
896
    public function insertId(){
897
      return $this->insertId;
898
    }
899
900
    /**
901
     * Show an error got from the current query (SQL command synthax error, database driver returned error, etc.)
902
     */
903
    public function error(){
904
  		if($this->error){
905
  			show_error('Query: "' . $this->query . '" Error: ' . $this->error, 'Database Error');
906
  		}
907
    }
908
909
    /**
910
     * Get the result of one record rows returned by the current query
911
     * @param  boolean $returnSQLQueryOrResultType if is boolean and true will return the SQL query string.
912
     * If is string will determine the result type "array" or "object"
913
     * @return mixed       the query SQL string or the record result
914
     */
915
    public function get($returnSQLQueryOrResultType = false){
916
      $this->limit = 1;
917
      $query = $this->getAll(true);
918
      if($returnSQLQueryOrResultType === true){
919
        return $query;
920
      }
921
      else{
922
        return $this->query( $query, false, (($returnSQLQueryOrResultType == 'array') ? true : false) );
923
      }
924
    }
925
926
    /**
927
     * Get the result of record rows list returned by the current query
928
     * @param  boolean $returnSQLQueryOrResultType if is boolean and true will return the SQL query string.
929
     * If is string will determine the result type "array" or "object"
930
     * @return mixed       the query SQL string or the record result
931
     */
932
    public function getAll($returnSQLQueryOrResultType = false){
933
      $query = 'SELECT ' . $this->select . ' FROM ' . $this->from;
934
      if (! empty($this->join)){
935
        $query .= $this->join;
936
      }
937
	  
938
      if (! empty($this->where)){
939
        $query .= ' WHERE ' . $this->where;
940
      }
941
942
      if (! empty($this->groupBy)){
943
        $query .= ' GROUP BY ' . $this->groupBy;
944
      }
945
946
      if (! empty($this->having)){
947
        $query .= ' HAVING ' . $this->having;
948
      }
949
950
      if (! empty($this->orderBy)){
951
          $query .= ' ORDER BY ' . $this->orderBy;
952
      }
953
954
      if(! empty($this->limit)){
955
      	$query .= ' LIMIT ' . $this->limit;
956
      }
957
	  
958
	   if($returnSQLQueryOrResultType === true){
959
      	return $query;
960
      }
961
      else{
962
    	   return $this->query($query, true, (($returnSQLQueryOrResultType == 'array') ? true : false) );
963
      }
964
    }
965
966
    /**
967
     * Insert new record in the database
968
     * @param  array   $data   the record data if is empty will use the $this->data array.
969
     * @param  boolean $escape  whether to escape or not the values
970
     * @return mixed          the insert id of the new record or null
971
     */
972
    public function insert($data = array(), $escape = true){
973
      $column = array();
974
      $val = array();
975
      if(empty($data) && $this->getData()){
976
        $columns = array_keys($this->getData());
977
        $column = implode(',', $columns);
978
        $val = implode(', ', $this->getData());
979
      }
980
      else{
981
        $columns = array_keys($data);
982
        $column = implode(',', $columns);
983
        $val = implode(', ', ($escape ? array_map(array($this, 'escape'), $data) : $data));
984
      }
985
986
      $query = 'INSERT INTO ' . $this->from . ' (' . $column . ') VALUES (' . $val . ')';
987
      $query = $this->query($query);
988
989
      if ($query){
990
        if(! $this->pdo){
991
          $this->connect();
992
        }
993
        $this->insertId = $this->pdo->lastInsertId();
994
        return $this->insertId();
995
      }
996
      else{
997
		  return false;
998
      }
999
    }
1000
1001
    /**
1002
     * Update record in the database
1003
     * @param  array   $data   the record data if is empty will use the $this->data array.
1004
     * @param  boolean $escape  whether to escape or not the values
1005
     * @return mixed          the update status
1006
     */
1007
    public function update($data = array(), $escape = true){
1008
      $query = 'UPDATE ' . $this->from . ' SET ';
1009
      $values = array();
1010
      if(empty($data) && $this->getData()){
1011
        foreach ($this->getData() as $column => $val){
1012
          $values[] = $column . ' = ' . $val;
1013
        }
1014
      }
1015
      else{
1016
        foreach ($data as $column => $val){
1017
          $values[] = $column . '=' . ($escape ? $this->escape($val) : $val);
1018
        }
1019
      }
1020
      $query .= implode(', ', $values);
1021
      if (! empty($this->where)){
1022
        $query .= ' WHERE ' . $this->where;
1023
      }
1024
1025
      if (! empty($this->orderBy)){
1026
        $query .= ' ORDER BY ' . $this->orderBy;
1027
      }
1028
1029
      if (! empty($this->limit)){
1030
        $query .= ' LIMIT ' . $this->limit;
1031
      }
1032
      return $this->query($query);
1033
    }
1034
1035
    /**
1036
     * Delete the record in database
1037
     * @return mixed the delete status
1038
     */
1039
    public function delete(){
1040
    	$query = 'DELETE FROM ' . $this->from;
1041
1042
    	if (! empty($this->where)){
1043
    		$query .= ' WHERE ' . $this->where;
1044
      	}
1045
1046
    	if (! empty($this->orderBy)){
1047
    	  $query .= ' ORDER BY ' . $this->orderBy;
1048
      	}
1049
1050
    	if (! empty($this->limit)){
1051
    		$query .= ' LIMIT ' . $this->limit;
1052
      	}
1053
1054
    	if($query == 'DELETE FROM ' . $this->from && $this->config['driver'] != 'sqlite'){  
1055
    		$query = 'TRUNCATE TABLE ' . $this->from;
1056
      }
1057
    	return $this->query($query);
1058
    }
1059
1060
    /**
1061
     * Execute an SQL query
1062
     * @param  string  $query the query SQL string
1063
     * @param  boolean $all   whether to return all record or not
1064
     * @param  boolean $array return the result as array
1065
     * @return mixed         the query result
1066
     */
1067
    public function query($query, $all = true, $array = false){
1068
      $this->reset();
1069
      if(is_array($all)){
0 ignored issues
show
introduced by
The condition is_array($all) is always false.
Loading history...
1070
        $x = explode('?', $query);
1071
        $q = '';
1072
        foreach($x as $k => $v){
1073
          if(! empty($v)){
1074
            $q .= $v . (isset($all[$k]) ? $this->escape($all[$k]) : '');
1075
          }
1076
        }
1077
        $query = $q;
1078
      }
1079
1080
      $this->query = preg_replace('/\s\s+|\t\t+/', ' ', trim($query));
1081
      $sqlSELECTQuery = stristr($this->query, 'SELECT');
1082
      $this->logger->info('Execute SQL query ['.$this->query.'], return type: ' . ($array?'ARRAY':'OBJECT') .', return as list: ' . ($all ? 'YES':'NO'));
1083
      //cache expire time
1084
  	  $cacheExpire = $this->temporaryCacheTtl;
1085
  	  
1086
  	  //return to the initial cache time
1087
  	  $this->temporaryCacheTtl = $this->cacheTtl;
1088
  	  
1089
  	  //config for cache
1090
        $cacheEnable = get_config('cache_enable');
1091
  	  
1092
  	  //the database cache content
1093
        $cacheContent = null;
1094
  	  
1095
  	  //this database query cache key
1096
        $cacheKey = null;
1097
  	  
1098
  	  //the cache manager instance
1099
      $cacheInstance = null;
1100
  	  
1101
  	  //if can use cache feature for this query
1102
  	  $dbCacheStatus = $cacheEnable && $cacheExpire > 0;
1103
	  
1104
      if ($dbCacheStatus && $sqlSELECTQuery){
1105
        $this->logger->info('The cache is enabled for this query, try to get result from cache'); 
1106
        $cacheKey = md5($query . $all . $array);
1107
        if(is_object($this->cacheInstance)){
1108
          $cacheInstance = $this->cacheInstance;
1109
        }
1110
        else{
1111
          $obj = & get_instance();
1112
          $cacheInstance = $obj->cache;  
1113
        }
1114
        $cacheContent = $cacheInstance->get($cacheKey);        
1115
      }
1116
      else{
1117
		  $this->logger->info('The cache is not enabled for this query or is not the SELECT query, get the result directly from real database');
1118
      }
1119
1120
      if(! $this->pdo){
1121
        $this->connect();
1122
      }
1123
      
1124
      if (! $cacheContent && $sqlSELECTQuery){
1125
		    //for database query execution time
1126
        $benchmarkMarkerKey = md5($query . $all . $array);
1127
        $bench = null;
1128
        if(is_object($this->benchmarkInstance)){
1129
          $bench = $this->benchmarkInstance;
1130
        }
1131
        else{
1132
          $obj = & get_instance();
1133
          $bench = $obj->benchmark;  
1134
        }
1135
        $bench->mark('DATABASE_QUERY_START(' . $benchmarkMarkerKey . ')');
1136
        //Now execute the query
1137
		    $sqlQuery = $this->pdo->query($this->query);
1138
        
1139
    		//get response time for this query
1140
        $responseTime = $bench->elapsedTime('DATABASE_QUERY_START(' . $benchmarkMarkerKey . ')', 'DATABASE_QUERY_END(' . $benchmarkMarkerKey . ')');
1141
	     	//TODO use the configuration value for the high response time currently is 1 second
1142
        if($responseTime >= 1 ){
1143
            $this->logger->warning('High response time while processing database query [' .$query. ']. The response time is [' .$responseTime. '] sec.');
1144
        }
1145
        if ($sqlQuery){
1146
            //if need return all result like list of record
1147
            if ($all){
1148
    				    $this->result = ($array === false) ? $sqlQuery->fetchAll(PDO::FETCH_OBJ) : $sqlQuery->fetchAll(PDO::FETCH_ASSOC);
1149
    		    }
1150
            else{
1151
				        $this->result = ($array === false) ? $sqlQuery->fetch(PDO::FETCH_OBJ) : $sqlQuery->fetch(PDO::FETCH_ASSOC);
1152
            }
1153
            //Sqlite and pgsql always return 0 when using rowCount()
1154
            if(in_array($this->config['driver'], array('sqlite', 'pgsql'))){
1155
              $this->numRows = count($this->result);  
1156
            }
1157
            else{
1158
              $this->numRows = $sqlQuery->rowCount(); 
1159
            }
1160
1161
          if ($dbCacheStatus && $sqlSELECTQuery){
1162
              $this->logger->info('Save the result for query [' .$this->query. '] into cache for future use');
1163
              $cacheInstance->set($cacheKey, $this->result, $cacheExpire);
1164
          }
1165
        }
1166
        else{
1167
          $error = $this->pdo->errorInfo();
1168
          $this->error = isset($error[2]) ? $error[2] : '';
1169
          $this->logger->fatal('The database query execution got error: ' . stringfy_vars($error));
1170
          $this->error();
1171
        }
1172
      }
1173
      else if ((! $cacheContent && !$sqlSELECTQuery) || ($cacheContent && !$sqlSELECTQuery)){
1174
    		$queryStr = $this->pdo->query($this->query);
1175
    		if($queryStr){
1176
          //Sqlite and pgsql always return 0 when using rowCount()
1177
          if(in_array($this->config['driver'], array('sqlite', 'pgsql'))){
1178
            $this->result = 1; //to test the result for the query like UPDATE, INSERT, DELETE
1179
            $this->numRows = 1;  
1180
          }
1181
          else{
1182
              $this->result = $queryStr->rowCount() >= 0; //to test the result for the query like UPDATE, INSERT, DELETE
1183
              $this->numRows = $queryStr->rowCount(); 
1184
          }
1185
    		}
1186
        if (! $this->result){
1187
          $error = $this->pdo->errorInfo();
1188
          $this->error = isset($error[2]) ? $error[2] : '';
1189
          $this->logger->fatal('The database query execution got error: ' . stringfy_vars($error));
1190
          $this->error();
1191
        }
1192
      }
1193
      else{
1194
        $this->logger->info('The result for query [' .$this->query. '] already cached use it');
1195
        $this->result = $cacheContent;
1196
	     	$this->numRows = count($this->result);
1197
      }
1198
      $this->queryCount++;
1199
      if(! $this->result){
1200
        $this->logger->info('No result where found for the query [' . $query . ']');
1201
      }
1202
      return $this->result;
1203
    }
1204
1205
    /**
1206
     * Set database cache time to live
1207
     * @param integer $ttl the cache time to live in second
1208
     * @return object        the current Database instance
1209
     */
1210
    public function setCache($ttl = 0){
1211
      if($ttl > 0){
1212
        $this->cacheTtl = $ttl;
1213
		    $this->temporaryCacheTtl = $ttl;
1214
      }
1215
      return $this;
1216
    }
1217
	
1218
	/**
1219
	 * Enabled cache temporary for the current query not globally	
1220
	 * @param  integer $ttl the cache time to live in second
1221
	 * @return object        the current Database instance
1222
	 */
1223
	public function cached($ttl = 0){
1224
      if($ttl > 0){
1225
        $this->temporaryCacheTtl = $ttl;
1226
      }
1227
	  return $this;
1228
    }
1229
1230
    /**
1231
     * Escape the data before execute query useful for security.
1232
     * @param  mixed $data the data to be escaped
1233
     * @return mixed       the data after escaped
1234
     */
1235
    public function escape($data){
1236
      if(is_null($data)){
1237
        return null;
1238
      }
1239
      if(! $this->pdo){
1240
        $this->connect();
1241
      }
1242
      return $this->pdo->quote(trim($data));
1243
    }
1244
1245
    /**
1246
     * Return the number query executed count for the current request
1247
     * @return int
1248
     */
1249
    public function queryCount(){
1250
      return $this->queryCount;
1251
    }
1252
1253
    /**
1254
     * Return the current query SQL string
1255
     * @return string
1256
     */
1257
    public function getQuery(){
1258
      return $this->query;
1259
    }
1260
1261
    /**
1262
     * Return the application database name
1263
     * @return string
1264
     */
1265
    public function getDatabaseName(){
1266
      return $this->databaseName;
1267
    }
1268
1269
     /**
1270
     * Return the database configuration
1271
     * @return array
1272
     */
1273
    public  function getDatabaseConfiguration(){
1274
      return $this->config;
1275
    }
1276
1277
    /**
1278
     * set the database configuration
1279
     * @param array $config the configuration
1280
     */
1281
    public function setDatabaseConfiguration(array $config){
1282
      $this->config = array_merge($this->config, $config);
1283
      $this->prefix = $this->config['prefix'];
1284
      $this->databaseName = $this->config['database'];
1285
      $this->logger->info('The database configuration are listed below: ' . stringfy_vars(array_merge($this->config, array('password' => string_hidden($this->config['password'])))));
1286
      return $this;
1287
    }
1288
1289
    /**
1290
     * Return the PDO instance
1291
     * @return PDO
1292
     */
1293
    public function getPdo(){
1294
      return $this->pdo;
1295
    }
1296
1297
    /**
1298
     * Set the PDO instance
1299
     * @param PDO $pdo the pdo object
1300
     */
1301
    public function setPdo(PDO $pdo){
1302
      $this->pdo = $pdo;
1303
      return $this;
1304
    }
1305
1306
1307
    /**
1308
     * Return the Log instance
1309
     * @return Log
1310
     */
1311
    public function getLogger(){
1312
      return $this->logger;
1313
    }
1314
1315
    /**
1316
     * Set the log instance
1317
     * @param Log $logger the log object
1318
     */
1319
    public function setLogger($logger){
1320
      $this->logger = $logger;
1321
      return $this;
1322
    }
1323
1324
     /**
1325
     * Return the cache instance
1326
     * @return CacheInterface
1327
     */
1328
    public function getCacheInstance(){
1329
      return $this->cacheInstance;
1330
    }
1331
1332
    /**
1333
     * Set the cache instance
1334
     * @param CacheInterface $cache the cache object
1335
     */
1336
    public function setCacheInstance($cache){
1337
      $this->cacheInstance = $cache;
1338
      return $this;
1339
    }
1340
1341
    /**
1342
     * Return the benchmark instance
1343
     * @return Benchmark
1344
     */
1345
    public function getBenchmark(){
1346
      return $this->benchmarkInstance;
1347
    }
1348
1349
    /**
1350
     * Set the benchmark instance
1351
     * @param Benchmark $cache the cache object
1352
     */
1353
    public function setBenchmark($benchmark){
1354
      $this->benchmarkInstance = $benchmark;
1355
      return $this;
1356
    }
1357
1358
    /**
1359
     * Return the data to be used for insert, update, etc.
1360
     * @return array
1361
     */
1362
    public function getData(){
1363
      return $this->data;
1364
    }
1365
1366
    /**
1367
     * Set the data to be used for insert, update, etc.
1368
     * @param string $key the data key identified
1369
     * @param mixed $value the data value
1370
     * @param boolean $escape whether to escape or not the $value
1371
     * @return object        the current Database instance
1372
     */
1373
    public function setData($key, $value, $escape = true){
1374
      $this->data[$key] = $escape ? $this->escape($value) : $value;
1375
      return $this;
1376
    }
1377
1378
    /**
1379
     * Set the Log instance using argument or create new instance
1380
     * @param object $logger the Log instance if not null
1381
     */
1382
    protected function setLoggerFromParamOrCreateNewInstance(Log $logger = null){
1383
      if($logger !== null){
1384
        $this->logger = $logger;
1385
      }
1386
      else{
1387
          $this->logger =& class_loader('Log', 'classes');
1388
          $this->logger->setLogger('Library::Database');
1389
      }
1390
    }
1391
1392
   /**
1393
    * Setting the database configuration using the configuration file
1394
    * @param array $overwriteConfig the additional configuration to overwrite with the existing one
1395
    */
1396
    protected function setDatabaseConfigurationFromConfigFile(array $overwriteConfig = array()){
1397
        $db = array();
1398
        if(file_exists(CONFIG_PATH . 'database.php')){
1399
            //here don't use require_once because somewhere user can create database instance directly
1400
            require CONFIG_PATH . 'database.php';
1401
        }
1402
          
1403
        if(! empty($overwriteConfig)){
1404
          $db = array_merge($db, $overwriteConfig);
1405
        }
1406
        $config = array();
1407
        $config['driver']    = isset($db['driver']) ? $db['driver'] : 'mysql';
1408
        $config['username']  = isset($db['username']) ? $db['username'] : 'root';
1409
        $config['password']  = isset($db['password']) ? $db['password'] : '';
1410
        $config['database']  = isset($db['database']) ? $db['database'] : '';
1411
        $config['hostname']  = isset($db['hostname']) ? $db['hostname'] : 'localhost';
1412
        $config['charset']   = isset($db['charset']) ? $db['charset'] : 'utf8';
1413
        $config['collation'] = isset($db['collation']) ? $db['collation'] : 'utf8_general_ci';
1414
        $config['prefix']    = isset($db['prefix']) ? $db['prefix'] : '';
1415
        $port = '';
1416
        if(strstr($config['hostname'], ':')){
1417
          $p = explode(':', $config['hostname']);
1418
          $port = isset($p[1]) ? $p[1] : '';
1419
          $config['hostname'] = isset($p[0]) ? $p[0] : '';
1420
        }
1421
        $config['port']      = $port;
1422
        $this->setDatabaseConfiguration($config);  
1423
    }
1424
1425
    /**
1426
     * This method is used to get the PDO DSN string using th configured driver
1427
     * @return string the DSN string
1428
     */
1429
    protected function getDsnFromDriver(){
1430
      $config = $this->getDatabaseConfiguration();
1431
      if(! empty($config)){
1432
            $driverDsnMap = array(
1433
                                    'mysql' => 'mysql:host=' . $config['hostname'] . ';' 
1434
                                                . (($config['port']) != '' ? 'port=' . $config['port'] . ';' : '') 
1435
                                                . 'dbname=' . $config['database'],
1436
                                    'pgsql' => 'pgsql:host=' . $config['hostname'] . ';' 
1437
                                                . (($config['port']) != '' ? 'port=' . $config['port'] . ';' : '')
1438
                                                . 'dbname=' . $config['database'],
1439
                                    'sqlite' => 'sqlite:' . $config['database'],
1440
                                    'oracle' => 'oci:dbname=' . $config['hostname'] 
1441
                                                . (($config['port']) != '' ? ':' . $config['port'] : '')
1442
                                                . '/' . $config['database']
1443
                                  );
1444
            return isset($driverDsnMap[$config['driver']]) ? $driverDsnMap[$config['driver']] : '';
1445
      } 
1446
                            
1447
      return null;
1448
    }
1449
1450
1451
  /**
1452
   * Reset the database class attributs to the initail values before each query.
1453
   */
1454
  private function reset(){
1455
    $this->select   = '*';
1456
    $this->from     = null;
1457
    $this->where    = null;
1458
    $this->limit    = null;
1459
    $this->orderBy  = null;
1460
    $this->groupBy  = null;
1461
    $this->having   = null;
1462
    $this->join     = null;
1463
    $this->numRows  = 0;
1464
    $this->insertId = null;
1465
    $this->query    = null;
1466
    $this->error    = null;
1467
    $this->result   = array();
1468
    $this->data     = array();
1469
  }
1470
1471
  /**
1472
   * The class destructor
1473
   */
1474
  public function __destruct(){
1475
    $this->pdo = null;
1476
  }
1477
1478
}
1479