CodeIgniter installed
[living-lab-site.git] / system / database / DB_utility.php
diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php
new file mode 100755 (executable)
index 0000000..a5f174f
--- /dev/null
@@ -0,0 +1,414 @@
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * Code Igniter
+ *
+ * An open source application development framework for PHP 5.1.6 or newer
+ *
+ * @package            CodeIgniter
+ * @author             ExpressionEngine Dev Team
+ * @copyright  Copyright (c) 2008 - 2011, EllisLab, Inc.
+ * @license            http://codeigniter.com/user_guide/license.html
+ * @link               http://codeigniter.com
+ * @since              Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Database Utility Class
+ *
+ * @category   Database
+ * @author             ExpressionEngine Dev Team
+ * @link               http://codeigniter.com/user_guide/database/
+ */
+class CI_DB_utility extends CI_DB_forge {
+
+       var $db;
+       var $data_cache         = array();
+
+       /**
+        * Constructor
+        *
+        * Grabs the CI super object instance so we can access it.
+        *
+        */
+       function CI_DB_utility()
+       {
+               // Assign the main database object to $this->db
+               $CI =& get_instance();
+               $this->db =& $CI->db;
+
+               log_message('debug', "Database Utility Class Initialized");
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * List databases
+        *
+        * @access      public
+        * @return      bool
+        */
+       function list_databases()
+       {
+               // Is there a cached result?
+               if (isset($this->data_cache['db_names']))
+               {
+                       return $this->data_cache['db_names'];
+               }
+
+               $query = $this->db->query($this->_list_databases());
+               $dbs = array();
+               if ($query->num_rows() > 0)
+               {
+                       foreach ($query->result_array() as $row)
+                       {
+                               $dbs[] = current($row);
+                       }
+               }
+
+               $this->data_cache['db_names'] = $dbs;
+               return $this->data_cache['db_names'];
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Determine if a particular database exists
+        *
+        * @access      public
+        * @param       string
+        * @return      boolean
+        */
+       function database_exists($database_name)
+       {
+               // Some databases won't have access to the list_databases() function, so
+               // this is intended to allow them to override with their own functions as
+               // defined in $driver_utility.php
+               if (method_exists($this, '_database_exists'))
+               {
+                       return $this->_database_exists($database_name);
+               }
+               else
+               {
+                       return ( ! in_array($database_name, $this->list_databases())) ? FALSE : TRUE;
+               }
+       }
+
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Optimize Table
+        *
+        * @access      public
+        * @param       string  the table name
+        * @return      bool
+        */
+       function optimize_table($table_name)
+       {
+               $sql = $this->_optimize_table($table_name);
+
+               if (is_bool($sql))
+               {
+                               show_error('db_must_use_set');
+               }
+
+               $query = $this->db->query($sql);
+               $res = $query->result_array();
+
+               // Note: Due to a bug in current() that affects some versions
+               // of PHP we can not pass function call directly into it
+               return current($res);
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Optimize Database
+        *
+        * @access      public
+        * @return      array
+        */
+       function optimize_database()
+       {
+               $result = array();
+               foreach ($this->db->list_tables() as $table_name)
+               {
+                       $sql = $this->_optimize_table($table_name);
+
+                       if (is_bool($sql))
+                       {
+                               return $sql;
+                       }
+
+                       $query = $this->db->query($sql);
+
+                       // Build the result array...
+                       // Note: Due to a bug in current() that affects some versions
+                       // of PHP we can not pass function call directly into it
+                       $res = $query->result_array();
+                       $res = current($res);
+                       $key = str_replace($this->db->database.'.', '', current($res));
+                       $keys = array_keys($res);
+                       unset($res[$keys[0]]);
+
+                       $result[$key] = $res;
+               }
+
+               return $result;
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Repair Table
+        *
+        * @access      public
+        * @param       string  the table name
+        * @return      bool
+        */
+       function repair_table($table_name)
+       {
+               $sql = $this->_repair_table($table_name);
+
+               if (is_bool($sql))
+               {
+                       return $sql;
+               }
+
+               $query = $this->db->query($sql);
+
+               // Note: Due to a bug in current() that affects some versions
+               // of PHP we can not pass function call directly into it
+               $res = $query->result_array();
+               return current($res);
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Generate CSV from a query result object
+        *
+        * @access      public
+        * @param       object  The query result object
+        * @param       string  The delimiter - comma by default
+        * @param       string  The newline character - \n by default
+        * @param       string  The enclosure - double quote by default
+        * @return      string
+        */
+       function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
+       {
+               if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
+               {
+                       show_error('You must submit a valid result object');
+               }
+
+               $out = '';
+
+               // First generate the headings from the table column names
+               foreach ($query->list_fields() as $name)
+               {
+                       $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
+               }
+
+               $out = rtrim($out);
+               $out .= $newline;
+
+               // Next blast through the result array and build out the rows
+               foreach ($query->result_array() as $row)
+               {
+                       foreach ($row as $item)
+                       {
+                               $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
+                       }
+                       $out = rtrim($out);
+                       $out .= $newline;
+               }
+
+               return $out;
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Generate XML data from a query result object
+        *
+        * @access      public
+        * @param       object  The query result object
+        * @param       array   Any preferences
+        * @return      string
+        */
+       function xml_from_result($query, $params = array())
+       {
+               if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
+               {
+                       show_error('You must submit a valid result object');
+               }
+
+               // Set our default values
+               foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)
+               {
+                       if ( ! isset($params[$key]))
+                       {
+                               $params[$key] = $val;
+                       }
+               }
+
+               // Create variables for convenience
+               extract($params);
+
+               // Load the xml helper
+               $CI =& get_instance();
+               $CI->load->helper('xml');
+
+               // Generate the result
+               $xml = "<{$root}>".$newline;
+               foreach ($query->result_array() as $row)
+               {
+                       $xml .= $tab."<{$element}>".$newline;
+
+                       foreach ($row as $key => $val)
+                       {
+                               $xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;
+                       }
+                       $xml .= $tab."</{$element}>".$newline;
+               }
+               $xml .= "</$root>".$newline;
+
+               return $xml;
+       }
+
+       // --------------------------------------------------------------------
+
+       /**
+        * Database Backup
+        *
+        * @access      public
+        * @return      void
+        */
+       function backup($params = array())
+       {
+               // If the parameters have not been submitted as an
+               // array then we know that it is simply the table
+               // name, which is a valid short cut.
+               if (is_string($params))
+               {
+                       $params = array('tables' => $params);
+               }
+
+               // ------------------------------------------------------
+
+               // Set up our default preferences
+               $prefs = array(
+                                                       'tables'                => array(),
+                                                       'ignore'                => array(),
+                                                       'filename'              => '',
+                                                       'format'                => 'gzip', // gzip, zip, txt
+                                                       'add_drop'              => TRUE,
+                                                       'add_insert'    => TRUE,
+                                                       'newline'               => "\n"
+                                               );
+
+               // Did the user submit any preferences? If so set them....
+               if (count($params) > 0)
+               {
+                       foreach ($prefs as $key => $val)
+                       {
+                               if (isset($params[$key]))
+                               {
+                                       $prefs[$key] = $params[$key];
+                               }
+                       }
+               }
+
+               // ------------------------------------------------------
+
+               // Are we backing up a complete database or individual tables?
+               // If no table names were submitted we'll fetch the entire table list
+               if (count($prefs['tables']) == 0)
+               {
+                       $prefs['tables'] = $this->db->list_tables();
+               }
+
+               // ------------------------------------------------------
+
+               // Validate the format
+               if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))
+               {
+                       $prefs['format'] = 'txt';
+               }
+
+               // ------------------------------------------------------
+
+               // Is the encoder supported?  If not, we'll either issue an
+               // error or use plain text depending on the debug settings
+               if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))
+               OR ($prefs['format'] == 'zip'  AND ! @function_exists('gzcompress')))
+               {
+                       if ($this->db->db_debug)
+                       {
+                               return $this->db->display_error('db_unsuported_compression');
+                       }
+
+                       $prefs['format'] = 'txt';
+               }
+
+               // ------------------------------------------------------
+
+               // Set the filename if not provided - Only needed with Zip files
+               if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')
+               {
+                       $prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;
+                       $prefs['filename'] .= '_'.date('Y-m-d_H-i', time());
+               }
+
+               // ------------------------------------------------------
+
+               // Was a Gzip file requested?
+               if ($prefs['format'] == 'gzip')
+               {
+                       return gzencode($this->_backup($prefs));
+               }
+
+               // ------------------------------------------------------
+
+               // Was a text file requested?
+               if ($prefs['format'] == 'txt')
+               {
+                       return $this->_backup($prefs);
+               }
+
+               // ------------------------------------------------------
+
+               // Was a Zip file requested?
+               if ($prefs['format'] == 'zip')
+               {
+                       // If they included the .zip file extension we'll remove it
+                       if (preg_match("|.+?\.zip$|", $prefs['filename']))
+                       {
+                               $prefs['filename'] = str_replace('.zip', '', $prefs['filename']);
+                       }
+
+                       // Tack on the ".sql" file extension if needed
+                       if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))
+                       {
+                               $prefs['filename'] .= '.sql';
+                       }
+
+                       // Load the Zip class and output it
+
+                       $CI =& get_instance();
+                       $CI->load->library('zip');
+                       $CI->zip->add_data($prefs['filename'], $this->_backup($prefs));
+                       return $CI->zip->get_zip();
+               }
+
+       }
+
+}
+
+
+/* End of file DB_utility.php */
+/* Location: ./system/database/DB_utility.php */
\ No newline at end of file