Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/*** sfMessageSource_Database class file.** This program is free software; you can redistribute it and/or modify* it under the terms of the BSD License.** Copyright(c) 2004 by Qiang Xue. All rights reserved.** To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}* The latest version of PRADO can be obtained from:* {@link http://prado.sourceforge.net/}** @author Wei Zhuo <weizhuo[at]gmail[dot]com>* @version $Id: sfMessageSource_Database.class.php 17749 2009-04-29 11:54:22Z fabien $* @package symfony* @subpackage i18n*//*** sfMessageSource_Database class.** This is the base class for database based message sources like MySQL or SQLite.** @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>* @version v1.0, last update on Fri Dec 24 16:18:44 EST 2004* @package symfony* @subpackage i18n*/abstract class sfMessageSource_Database extends sfMessageSource{/*** For a given DSN (database connection string), return some information about the DSN.** This function comes from PEAR's DB package.** @param string $dsn DSN format, similar to PEAR's DB* @return array DSN information.*/protected function parseDSN($dsn){if (is_array($dsn)){return $dsn;}$parsed = array('phptype' => false,'dbsyntax' => false,'username' => false,'password' => false,'protocol' => false,'hostspec' => false,'port' => false,'socket' => false,'database' => false);// Find phptype and dbsyntaxif (($pos = strpos($dsn, '://')) !== false){$str = substr($dsn, 0, $pos);$dsn = substr($dsn, $pos + 3);}else{$str = $dsn;$dsn = NULL;}// Get phptype and dbsyntax// $str => phptype(dbsyntax)if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)){$parsed['phptype'] = $arr[1];$parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2];}else{$parsed['phptype'] = $str;$parsed['dbsyntax'] = $str;}if (empty($dsn)){return $parsed;}// Get (if found): username and password// $dsn => username:password@protocol+hostspec/databaseif (($at = strrpos($dsn,'@')) !== false){$str = substr($dsn, 0, $at);$dsn = substr($dsn, $at + 1);if (($pos = strpos($str, ':')) !== false){$parsed['username'] = rawurldecode(substr($str, 0, $pos));$parsed['password'] = rawurldecode(substr($str, $pos + 1));}else{$parsed['username'] = rawurldecode($str);}}// Find protocol and hostspec// $dsn => proto(proto_opts)/databaseif (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)){$proto = $match[1];$proto_opts = (!empty($match[2])) ? $match[2] : false;$dsn = $match[3];// $dsn => protocol+hostspec/database (old format)}else{if (strpos($dsn, '+') !== false){list($proto, $dsn) = explode('+', $dsn, 2);}if (strpos($dsn, '/') !== false){list($proto_opts, $dsn) = explode('/', $dsn, 2);}else{$proto_opts = $dsn;$dsn = null;}}// process the different protocol options$parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';$proto_opts = rawurldecode($proto_opts);if ($parsed['protocol'] == 'tcp'){if (strpos($proto_opts, ':') !== false){list($parsed['hostspec'], $parsed['port']) = explode(':', $proto_opts);}else{$parsed['hostspec'] = $proto_opts;}}else if ($parsed['protocol'] == 'unix'){$parsed['socket'] = $proto_opts;}// Get dabase if any// $dsn => databaseif (!empty($dsn)){// /databaseif (($pos = strpos($dsn, '?')) === false){$parsed['database'] = $dsn;// /database?param1=value1¶m2=value2}else{$parsed['database'] = substr($dsn, 0, $pos);$dsn = substr($dsn, $pos + 1);if (strpos($dsn, '&') !== false){$opts = explode('&', $dsn);}else{ // database?param1=value1$opts = array($dsn);}foreach ($opts as $opt){list($key, $value) = explode('=', $opt);if (!isset($parsed[$key])){ // don't allow params overwrite$parsed[$key] = rawurldecode($value);}}}}return $parsed;}/*** Gets all the variants of a particular catalogue.** @param string $catalogue catalogue name* @return array list of all variants for this catalogue.*/public function getCatalogueList($catalogue){$variants = explode('_', $this->culture);$catalogues = array($catalogue);$variant = null;for ($i = 0, $max = count($variants); $i < $max; $i++){if (strlen($variants[$i]) > 0){$variant .= $variant ? '_'.$variants[$i] : $variants[$i];$catalogues[] = $catalogue.'.'.$variant;}}return array_reverse($catalogues);}public function getId(){return md5($this->source);}}