PageRenderTime 29ms CodeModel.GetById 21ms app.highlight 5ms RepoModel.GetById 0ms app.codeStats 0ms

/system/database/DB_utility.php

https://bitbucket.org/sarahman/mschool-project
PHP | 414 lines | 206 code | 71 blank | 137 comment | 32 complexity | 26f399aed42dc404f0b9e83fe4b3191b MD5 | raw file
  1<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2/**
  3 * Code Igniter
  4 *
  5 * An open source application development framework for PHP 5.1.6 or newer
  6 *
  7 * @package		CodeIgniter
  8 * @author		ExpressionEngine Dev Team
  9 * @copyright	Copyright (c) 2008 - 2011, EllisLab, Inc.
 10 * @license		http://codeigniter.com/user_guide/license.html
 11 * @link		http://codeigniter.com
 12 * @since		Version 1.0
 13 * @filesource
 14 */
 15
 16// ------------------------------------------------------------------------
 17
 18/**
 19 * Database Utility Class
 20 *
 21 * @category	Database
 22 * @author		ExpressionEngine Dev Team
 23 * @link		http://codeigniter.com/user_guide/database/
 24 */
 25class CI_DB_utility extends CI_DB_forge {
 26
 27	var $db;
 28	var $data_cache		= array();
 29
 30	/**
 31	 * Constructor
 32	 *
 33	 * Grabs the CI super object instance so we can access it.
 34	 *
 35	 */
 36	function CI_DB_utility()
 37	{
 38		// Assign the main database object to $this->db
 39		$CI =& get_instance();
 40		$this->db =& $CI->db;
 41
 42		log_message('debug', "Database Utility Class Initialized");
 43	}
 44
 45	// --------------------------------------------------------------------
 46
 47	/**
 48	 * List databases
 49	 *
 50	 * @access	public
 51	 * @return	bool
 52	 */
 53	function list_databases()
 54	{
 55		// Is there a cached result?
 56		if (isset($this->data_cache['db_names']))
 57		{
 58			return $this->data_cache['db_names'];
 59		}
 60
 61		$query = $this->db->query($this->_list_databases());
 62		$dbs = array();
 63		if ($query->num_rows() > 0)
 64		{
 65			foreach ($query->result_array() as $row)
 66			{
 67				$dbs[] = current($row);
 68			}
 69		}
 70
 71		$this->data_cache['db_names'] = $dbs;
 72		return $this->data_cache['db_names'];
 73	}
 74
 75	// --------------------------------------------------------------------
 76
 77	/**
 78	 * Determine if a particular database exists
 79	 *
 80	 * @access	public
 81	 * @param	string
 82	 * @return	boolean
 83	 */
 84	function database_exists($database_name)
 85	{
 86		// Some databases won't have access to the list_databases() function, so
 87		// this is intended to allow them to override with their own functions as
 88		// defined in $driver_utility.php
 89		if (method_exists($this, '_database_exists'))
 90		{
 91			return $this->_database_exists($database_name);
 92		}
 93		else
 94		{
 95			return ( ! in_array($database_name, $this->list_databases())) ? FALSE : TRUE;
 96		}
 97	}
 98
 99
100	// --------------------------------------------------------------------
101
102	/**
103	 * Optimize Table
104	 *
105	 * @access	public
106	 * @param	string	the table name
107	 * @return	bool
108	 */
109	function optimize_table($table_name)
110	{
111		$sql = $this->_optimize_table($table_name);
112
113		if (is_bool($sql))
114		{
115				show_error('db_must_use_set');
116		}
117
118		$query = $this->db->query($sql);
119		$res = $query->result_array();
120
121		// Note: Due to a bug in current() that affects some versions
122		// of PHP we can not pass function call directly into it
123		return current($res);
124	}
125
126	// --------------------------------------------------------------------
127
128	/**
129	 * Optimize Database
130	 *
131	 * @access	public
132	 * @return	array
133	 */
134	function optimize_database()
135	{
136		$result = array();
137		foreach ($this->db->list_tables() as $table_name)
138		{
139			$sql = $this->_optimize_table($table_name);
140
141			if (is_bool($sql))
142			{
143				return $sql;
144			}
145
146			$query = $this->db->query($sql);
147
148			// Build the result array...
149			// Note: Due to a bug in current() that affects some versions
150			// of PHP we can not pass function call directly into it
151			$res = $query->result_array();
152			$res = current($res);
153			$key = str_replace($this->db->database.'.', '', current($res));
154			$keys = array_keys($res);
155			unset($res[$keys[0]]);
156
157			$result[$key] = $res;
158		}
159
160		return $result;
161	}
162
163	// --------------------------------------------------------------------
164
165	/**
166	 * Repair Table
167	 *
168	 * @access	public
169	 * @param	string	the table name
170	 * @return	bool
171	 */
172	function repair_table($table_name)
173	{
174		$sql = $this->_repair_table($table_name);
175
176		if (is_bool($sql))
177		{
178			return $sql;
179		}
180
181		$query = $this->db->query($sql);
182
183		// Note: Due to a bug in current() that affects some versions
184		// of PHP we can not pass function call directly into it
185		$res = $query->result_array();
186		return current($res);
187	}
188
189	// --------------------------------------------------------------------
190
191	/**
192	 * Generate CSV from a query result object
193	 *
194	 * @access	public
195	 * @param	object	The query result object
196	 * @param	string	The delimiter - comma by default
197	 * @param	string	The newline character - \n by default
198	 * @param	string	The enclosure - double quote by default
199	 * @return	string
200	 */
201	function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
202	{
203		if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
204		{
205			show_error('You must submit a valid result object');
206		}
207
208		$out = '';
209
210		// First generate the headings from the table column names
211		foreach ($query->list_fields() as $name)
212		{
213			$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
214		}
215
216		$out = rtrim($out);
217		$out .= $newline;
218
219		// Next blast through the result array and build out the rows
220		foreach ($query->result_array() as $row)
221		{
222			foreach ($row as $item)
223			{
224				$out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
225			}
226			$out = rtrim($out);
227			$out .= $newline;
228		}
229
230		return $out;
231	}
232
233	// --------------------------------------------------------------------
234
235	/**
236	 * Generate XML data from a query result object
237	 *
238	 * @access	public
239	 * @param	object	The query result object
240	 * @param	array	Any preferences
241	 * @return	string
242	 */
243	function xml_from_result($query, $params = array())
244	{
245		if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
246		{
247			show_error('You must submit a valid result object');
248		}
249
250		// Set our default values
251		foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)
252		{
253			if ( ! isset($params[$key]))
254			{
255				$params[$key] = $val;
256			}
257		}
258
259		// Create variables for convenience
260		extract($params);
261
262		// Load the xml helper
263		$CI =& get_instance();
264		$CI->load->helper('xml');
265
266		// Generate the result
267		$xml = "<{$root}>".$newline;
268		foreach ($query->result_array() as $row)
269		{
270			$xml .= $tab."<{$element}>".$newline;
271
272			foreach ($row as $key => $val)
273			{
274				$xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;
275			}
276			$xml .= $tab."</{$element}>".$newline;
277		}
278		$xml .= "</$root>".$newline;
279
280		return $xml;
281	}
282
283	// --------------------------------------------------------------------
284
285	/**
286	 * Database Backup
287	 *
288	 * @access	public
289	 * @return	void
290	 */
291	function backup($params = array())
292	{
293		// If the parameters have not been submitted as an
294		// array then we know that it is simply the table
295		// name, which is a valid short cut.
296		if (is_string($params))
297		{
298			$params = array('tables' => $params);
299		}
300
301		// ------------------------------------------------------
302
303		// Set up our default preferences
304		$prefs = array(
305							'tables'		=> array(),
306							'ignore'		=> array(),
307							'filename'		=> '',
308							'format'		=> 'gzip', // gzip, zip, txt
309							'add_drop'		=> TRUE,
310							'add_insert'	=> TRUE,
311							'newline'		=> "\n"
312						);
313
314		// Did the user submit any preferences? If so set them....
315		if (count($params) > 0)
316		{
317			foreach ($prefs as $key => $val)
318			{
319				if (isset($params[$key]))
320				{
321					$prefs[$key] = $params[$key];
322				}
323			}
324		}
325
326		// ------------------------------------------------------
327
328		// Are we backing up a complete database or individual tables?
329		// If no table names were submitted we'll fetch the entire table list
330		if (count($prefs['tables']) == 0)
331		{
332			$prefs['tables'] = $this->db->list_tables();
333		}
334
335		// ------------------------------------------------------
336
337		// Validate the format
338		if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))
339		{
340			$prefs['format'] = 'txt';
341		}
342
343		// ------------------------------------------------------
344
345		// Is the encoder supported?  If not, we'll either issue an
346		// error or use plain text depending on the debug settings
347		if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))
348		OR ($prefs['format'] == 'zip'  AND ! @function_exists('gzcompress')))
349		{
350			if ($this->db->db_debug)
351			{
352				return $this->db->display_error('db_unsuported_compression');
353			}
354
355			$prefs['format'] = 'txt';
356		}
357
358		// ------------------------------------------------------
359
360		// Set the filename if not provided - Only needed with Zip files
361		if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')
362		{
363			$prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;
364			$prefs['filename'] .= '_'.date('Y-m-d_H-i', time());
365		}
366
367		// ------------------------------------------------------
368
369		// Was a Gzip file requested?
370		if ($prefs['format'] == 'gzip')
371		{
372			return gzencode($this->_backup($prefs));
373		}
374
375		// ------------------------------------------------------
376
377		// Was a text file requested?
378		if ($prefs['format'] == 'txt')
379		{
380			return $this->_backup($prefs);
381		}
382
383		// ------------------------------------------------------
384
385		// Was a Zip file requested?
386		if ($prefs['format'] == 'zip')
387		{
388			// If they included the .zip file extension we'll remove it
389			if (preg_match("|.+?\.zip$|", $prefs['filename']))
390			{
391				$prefs['filename'] = str_replace('.zip', '', $prefs['filename']);
392			}
393
394			// Tack on the ".sql" file extension if needed
395			if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))
396			{
397				$prefs['filename'] .= '.sql';
398			}
399
400			// Load the Zip class and output it
401
402			$CI =& get_instance();
403			$CI->load->library('zip');
404			$CI->zip->add_data($prefs['filename'], $this->_backup($prefs));
405			return $CI->zip->get_zip();
406		}
407
408	}
409
410}
411
412
413/* End of file DB_utility.php */
414/* Location: ./system/database/DB_utility.php */