PageRenderTime 39ms CodeModel.GetById 21ms app.highlight 11ms RepoModel.GetById 1ms app.codeStats 0ms

/db/CDbConnection.php

https://bitbucket.org/stden/yiiru
PHP | 850 lines | 467 code | 24 blank | 359 comment | 23 complexity | b36d9972a462594ce8a22162a07f7106 MD5 | raw file
  1<?php
  2/**
  3 * Файл класса CDbConnection
  4 *
  5 * @author Qiang Xue <qiang.xue@gmail.com>
  6 * @link http://www.yiiframework.com/
  7 * @copyright Copyright &copy; 2008-2011 Yii Software LLC
  8 * @license http://www.yiiframework.com/license/
  9 */
 10
 11/**
 12 * Класс CDbConnection представляет подключение БД.
 13 *
 14 * CDbConnection работает вместе с классами {@link CDbCommand}, {@link CDbDataReader}
 15 * и {@link CDbTransaction} для предоставления доступа к данным в разных СУБД с
 16 * использованием общего набора API. Это обертка для расширения PHP {@link http://www.php.net/manual/en/ref.pdo.php PDO}.
 17 *
 18 * Для установки соединения присвойте свойству {@link setActive active} значение true после
 19 * определения свойств {@link connectionString}, {@link username} и {@link password}.
 20 *
 21 * Следующий пример показывает, как создавать экземпляр соединения CDbConnection и устанавливать
 22 * реальное соединения с базой данных:
 23 * <pre>
 24 * $connection=new CDbConnection($dsn,$username,$password);
 25 * $connection->active=true;
 26 * </pre>
 27 *
 28 * После установки соединения БД можно выполнять SQL-выражения следующим образом:
 29 * <pre>
 30 * $command=$connection->createCommand($sqlStatement);
 31 * $command->execute();   // выполнение SQL-выражение без возврата данных (не запрос)
 32 * // выполнение SQL-запроса и получение результирующего набора
 33 * $reader=$command->query();
 34 *
 35 * // $row - это массив, представляющий строку данных
 36 * foreach($reader as $row) ...
 37 * </pre>
 38 *
 39 * Можно подготавливать SQL-выражения и связывать параметры с подготовленным SQL-выражением:
 40 * <pre>
 41 * $command=$connection->createCommand($sqlStatement);
 42 * $command->bindParam($name1,$value1);
 43 * $command->bindParam($name2,$value2);
 44 * $command->execute();
 45 * </pre>
 46 *
 47 * Для использования транзакций используется код, аналогичный следующему:
 48 * <pre>
 49 * $transaction=$connection->beginTransaction();
 50 * try
 51 * {
 52 *    $connection->createCommand($sql1)->execute();
 53 *    $connection->createCommand($sql2)->execute();
 54 *    //.... выполнение других SQL-выражений
 55 *    $transaction->commit();
 56 * }
 57 * catch(Exception $e)
 58 * {
 59 *    $transaction->rollBack();
 60 * }
 61 * </pre>
 62 *
 63 * Класс CDbConnection также предоставляет набор методов для поддержки установки и запроса
 64 * некоторых атрибутов СУБД, таких как {@link getNullConversion nullConversion}.
 65 *
 66 * Т.к. CDbConnection реализует интерфейс IApplicationComponent, то его можно использовать
 67 * в качестве компонента приложения и настроить в конфигурации приложения как показано ниже:
 68 * <pre>
 69 * array(
 70 *     'components'=>array(
 71 *         'db'=>array(
 72 *             'class'=>'CDbConnection',
 73 *             'connectionString'=>'sqlite:path/to/dbfile',
 74 *         ),
 75 *     ),
 76 * )
 77 * </pre>
 78 *
 79 * @property boolean $active установлено ли соединение БД
 80 * @property PDO $pdoInstance экземпляр PDO-класса; null, если соединение еще
 81 * не установлено
 82 * @property CDbTransaction $currentTransaction текущая активная транзакция;
 83 * null, если активных транзакций нет
 84 * @property CDbSchema $schema схема БД для данного соединения
 85 * @property CDbCommandBuilder $commandBuilder построитель команд для данного
 86 * соединения
 87 * @property string $lastInsertID идентификатор последней вставленной строки
 88 * или последнего значения, полученного из объекта последовательности
 89 * @property mixed $columnCase регистр имен столбцов
 90 * @property mixed $nullConversion значение того, как конвертируются значения
 91 * null и пустые строки
 92 * @property boolean $autoCommit будут ли запросы на обновление и добавление
 93 * записей БД автоматически подтверждаться
 94 * @property boolean $persistent является ли соединение постоянным или нет
 95 * @property string $driverName имя драйвера БД
 96 * @property string $clientVersion информация о версии драйвера БД
 97 * @property string $connectionStatus статус соединения
 98 * @property boolean $prefetch выполняет ли соединение предварительную выборку
 99 * (prefetching) данных
100 * @property string $serverInfo информация о сервере СУБД
101 * @property string $serverVersion информация о версии сервера СУБД
102 * @property integer $timeout настройки времени ожидания соединения
103 * @property array $attributes атрибуты (в виде имя => значение), явно
104 * установленные ранее для соединения БД
105 * @property array $stats массив, первый элемент которого показывает количество
106 * выполненных SQL-выражений, а второй - общее затраченное на выполнение
107 * SQL-выражений время
108 *
109 * @author Qiang Xue <qiang.xue@gmail.com>
110 * @version $Id: CDbConnection.php 3515 2011-12-28 12:29:24Z mdomba $
111 * @package system.db
112 * @since 1.0
113 */
114class CDbConnection extends CApplicationComponent
115{
116	/**
117	 * @var string источник данных (Data Source Name, DSN), содержит информацию, требуемую для подключения к БД.
118	 * @see http://www.php.net/manual/en/function.PDO-construct.php
119	 *
120	 * Примечание: если вы используете GBK или BIG5, то настоятельно рекомендуется обновить PHP
121	 * до версии, большей 5.3.6 и определять кодировку через DSN -
122	 * 'mysql:dbname=mydatabase;host=127.0.0.1;charset=GBK;'
123	 */
124	public $connectionString;
125	/**
126	 * @var string имя пользователя для установки соединения БД. По умолчанию - пустая строка
127	 */
128	public $username='';
129	/**
130	 * @var string пароль для установки соединения БД. По умолчанию - пустая строка
131	 */
132	public $password='';
133	/**
134	 * @var integer количество секунд, в течение которыхметаданные таблиц могут оставаться в кэше валидными.
135	 * Для индикации того, что кэширование схемы не используется, устанавливается значение 0 или отрицательное.
136	 * Если значение больше нуля и первичный кэш включен, то метаданные таблиц будут кэшироваться
137	 * @see schemaCachingExclude
138	 */
139	public $schemaCachingDuration=0;
140	/**
141	 * @var array список таблиц, метаданные которых НЕ должны кэшироваться. По умолчанию - пустой массив
142	 * @see schemaCachingDuration
143	 */
144	public $schemaCachingExclude=array();
145	/**
146	 * @var string идентификатор компонента приложения кэша, используемого для кэширования метаданных таблиц.
147	 * По умолчанию - 'cache' - основной компонент приложения кэша.
148	 * Для отключения кэширования метаданных таблиц необходимо установить данное свойство в значение false
149	 */
150	public $schemaCacheID='cache';
151	/**
152	 * @var integer количество секунд, в течение которых результат запроса в кэше остается валидным.
153	 * Для отключения кэширования необходимо установить значение, равным нулю или меньше нуля (поведение по умолчанию).
154	 *
155	 * Для включения кэширования данное свойство должно быть целым положительным числом и
156	 * свойство {@link queryCacheID} должно ссылаться на действительный компонент кэширования.
157	 *
158	 * Метод {@link cache()} предоставлен как простой способ установки данного свойства и
159	 * и свойства {@link queryCachingDependency} на лету
160	 *
161	 * @see cache
162	 * @see queryCachingDependency
163	 * @see queryCacheID
164	 * @since 1.1.7
165	 */
166	public $queryCachingDuration=0;
167	/**
168	 * @var CCacheDependency зависимость, используемая при сохранении результата запроса в кэш
169	 * @see queryCachingDuration
170	 * @since 1.1.7
171	 */
172	public $queryCachingDependency;
173	/**
174	 * @var integer количество SQL-выражений, которые должны быть кэшированы
175	 * в дальнейшем. Если значение равно 0, то даже если кэширование запросов
176	 * включено, запросы не будут кэшированы. Примечание: каждый раз после
177	 * выполнения SQL-выражения (выполняемом на сервере БД или запрошенном из
178	 * кэша запросов), данное свойство будет уменьшаться на единицу до нуля
179	 * @since 1.1.7
180	 */
181	public $queryCachingCount=0;
182	/**
183	 * @var string идентификатор компонента приложения кэша, используемый для
184	 * кэширования запросов. По умолчанию - 'cache' - основной компонент
185	 * приложения кэша. Для отключения кэширования запросов необходимо
186	 * установить данное свойство в значение false
187	 * @since 1.1.7
188	 */
189	public $queryCacheID='cache';
190	/**
191	 * @var boolean должно ли автоматически утанавливаться соединение при инициализации
192	 * компонента. По умолчанию - true. Примечание: свойство имеет значение только в случае,
193	 * когда объект класса CDbConnection используется в качестве компонента приложения
194	 */
195	public $autoConnect=true;
196	/**
197	 * @var string кодировка, используемая для соединения БД. Свойство
198	 * используется только для СУБД MySQL и PostgreSQL. По умолчанию - null,
199	 * т.е. используется кодировка, определенная в БД по умолчанию.
200	 *
201	 * Примечание: если используется GBK или BIG5, то настоятельно
202	 * рекомендуется обновить PHP до версии 5.3.6+ и установить кодировку через
203	 * DSN, например, так - 'mysql:dbname=mydatabase;host=127.0.0.1;charset=GBK;'
204	 */
205	public $charset;
206	/**
207	 * @var boolean включена ли эмуляция подготовки запроса. По умолчанию -
208	 * false, т.е. PDO будет использовать встроенную поддержку подготовки
209	 * запроса, если это возможно. Для некоторых СУБД (например, MySQL), может
210	 * понадобиться установить свойство в значение true, чтобы PDO мог
211	 * эмулировать поддержку подготовки запроса для обхода нестабильной
212	 * встроенной поддержки подготовки запроса. Примечание: свойство имеет
213	 * значение только для PHP версий 5.1.3 или выше. По умолчанию - null, т.е.
214	 * значение параметра ATTR_EMULATE_PREPARES расширения PDO не изменяется
215	 */
216	public $emulatePrepare;
217	/**
218	 * @var boolean журналировать ли значения, связываемые с подготовленным
219	 * SQL-выражением. По умолчанию - false. Во время разработки можно
220	 * установить значение true, чтобы журналировать значения параметров в
221	 * целях отладки. Нужно быть внимательным при установке данного свойства,
222	 * т.к. журналирование значений параметров может быть дорогим и оказывать
223	 * значительное влияние на производительность приложения
224	 */
225	public $enableParamLogging=false;
226	/**
227	 * @var boolean включено ли профилирование выполняемых SQL-выражений. По
228	 * умолчанию - false. В основном, профилирование включается во время
229	 * разработки для обнаружения узких мест в выполнении SQL-выражений
230	 */
231	public $enableProfiling=false;
232	/**
233	 * @var string префикс по умолчанию для имен таблиц. По умолчанию - null,
234	 * т.е. префикс не используется. При установке данного свойства, такая
235	 * метка как '{{tableName}}' в свойстве {@link CDbCommand::text} будет
236	 * заменена на строку 'prefixTableName', где 'prefix' - значение данного
237	 * свойства
238	 * @since 1.1.0
239	 */
240	public $tablePrefix;
241	/**
242	 * @var array список SQL-выражений, которые должны выполняться сразу после
243	 * установки соединения БД
244	 * @since 1.1.1
245	 */
246	public $initSQLs;
247	/**
248	 * @var array массив соответствий между PDO-драйверами и именами классов
249	 * схемы. Класс схемы БД может быть определен с использованием псевдонимов
250	 * путей
251	 * @since 1.1.6
252	 */
253	public $driverMap=array(
254		'pgsql'=>'CPgsqlSchema',    // PostgreSQL
255		'mysqli'=>'CMysqlSchema',   // MySQL
256		'mysql'=>'CMysqlSchema',    // MySQL
257		'sqlite'=>'CSqliteSchema',  // sqlite 3
258		'sqlite2'=>'CSqliteSchema', // sqlite 2
259		'mssql'=>'CMssqlSchema',    // Mssql driver on windows hosts
260		'dblib'=>'CMssqlSchema',    // dblib drivers on linux (and maybe others os) hosts
261		'sqlsrv'=>'CMssqlSchema',   // Mssql
262		'oci'=>'COciSchema',        // Oracle driver
263	);
264
265	/**
266	 * @var string специальный класс-обертка PDO
267	 * @since 1.1.8
268	 */
269	public $pdoClass = 'PDO';
270
271	private $_attributes=array();
272	private $_active=false;
273	private $_pdo;
274	private $_transaction;
275	private $_schema;
276
277
278	/**
279	 * Конструктор.
280	 * Примечание: соединение БД не устанавливается при создании экземпляра
281	 * соединения. Для установки соединения задайте свойству
282	 * {@link setActive active} значение true
283	 * @param string $dsn источник данных (The Data Source Name, DSN), содержит
284	 * информацию, требуемую для подключения к базе данных
285	 * @param string $username имя пользователя для строки DSN
286	 * @param string $password пароль для строки DSN
287	 * @see http://www.php.net/manual/en/function.PDO-construct.php
288	 */
289	public function __construct($dsn='',$username='',$password='')
290	{
291		$this->connectionString=$dsn;
292		$this->username=$username;
293		$this->password=$password;
294	}
295
296	/**
297	 * Закрывать соединение при сериализации
298	 * @return array
299	 */
300	public function __sleep()
301	{
302		$this->close();
303		return array_keys(get_object_vars($this));
304	}
305
306	/**
307	 * Возвращает список доступных PDO-драйверов
308	 * @return array список доступных PDO-драйверов
309	 * @see http://www.php.net/manual/en/function.PDO-getAvailableDrivers.php
310	 */
311	public static function getAvailableDrivers()
312	{
313		return PDO::getAvailableDrivers();
314	}
315
316	/**
317	 * Инициализирует компонент. Данный метод требуется интерфейсом
318	 * {@link IApplicationComponent} и вызывается приложением при использовании
319	 * CDbConnection в качестве компонента приложения. При переопределении
320	 * данного метода убедитесь, что вызывается родительская реализация, чтобы
321	 * компонент может быть отмечен как инициализированный
322	 */
323	public function init()
324	{
325		parent::init();
326		if($this->autoConnect)
327			$this->setActive(true);
328	}
329
330	/**
331	 * Установлено ли соединение БД
332	 * @return boolean установлено ли соединение БД
333	 */
334	public function getActive()
335	{
336		return $this->_active;
337	}
338
339	/**
340	 * Открывает или закрывает соединение БД
341	 * @param boolean $value открыто ли соединение БД
342	 * @throws CException вызывается, если попытка открытия соединение
343	 * завершилась с ошибкой
344	 */
345	public function setActive($value)
346	{
347		if($value!=$this->_active)
348		{
349			if($value)
350				$this->open();
351			else
352				$this->close();
353		}
354	}
355
356	/**
357	 * Устанавливает параметры кэширования запросов. Метод может быть
358	 * использован для включения и отключения кэширования запросов. Установка
359	 * параметра $duration в значение 0 отключает кэширование запросов. В ином
360	 * случае результат запроса нового SQL-выражения, выполняемого далее, будет
361	 * сохранен в кэше и будет оставаться валидным в течение установленного
362	 * срока. При повторном выполнении запроса результат запроса может быть
363	 * получен непосредственно из кэша без реального выполнения SQL-выражения
364	 * @param integer $duration время в секундах, в течение которого результаты
365	 * запросов в кэше могут оставаться валидными. Если установлено в значение
366	 * 0, то кэширование запросов отключено
367	 * @param CCacheDependency $dependency зависимость, используемая при
368	 * сохранении результатов запросов в кэш
369	 * @param integer $queryCount количество SQL-запросов для кэширования после
370	 * выполнения данного метода. По умолчанию - 1, т.е. следующий запрос будет
371	 * кэширован
372	 * @return CDbConnection экземпляр соединения БД
373	 * @since 1.1.7
374	 */
375	public function cache($duration, $dependency=null, $queryCount=1)
376	{
377		$this->queryCachingDuration=$duration;
378		$this->queryCachingDependency=$dependency;
379		$this->queryCachingCount=$queryCount;
380		return $this;
381	}
382
383	/**
384	 * Открывает соединение БД, если оно еще не открыто
385	 * @throws CException вызывается, если попытка открытия соединение
386	 * завершилась с ошибкой
387	 */
388	protected function open()
389	{
390		if($this->_pdo===null)
391		{
392			if(empty($this->connectionString))
393				throw new CDbException(Yii::t('yii','CDbConnection.connectionString cannot be empty.'));
394			try
395			{
396				Yii::trace('Opening DB connection','system.db.CDbConnection');
397				$this->_pdo=$this->createPdoInstance();
398				$this->initConnection($this->_pdo);
399				$this->_active=true;
400			}
401			catch(PDOException $e)
402			{
403				if(YII_DEBUG)
404				{
405					throw new CDbException(Yii::t('yii','CDbConnection failed to open the DB connection: {error}',
406						array('{error}'=>$e->getMessage())),(int)$e->getCode(),$e->errorInfo);
407				}
408				else
409				{
410					Yii::log($e->getMessage(),CLogger::LEVEL_ERROR,'exception.CDbException');
411					throw new CDbException(Yii::t('yii','CDbConnection failed to open the DB connection.'),(int)$e->getCode(),$e->errorInfo);
412				}
413			}
414		}
415	}
416
417	/**
418	 * Закрывает текущее активное соединение БД. Ничего не делает, если
419	 * соединение уже закрыто
420	 */
421	protected function close()
422	{
423		Yii::trace('Closing DB connection','system.db.CDbConnection');
424		$this->_pdo=null;
425		$this->_active=false;
426		$this->_schema=null;
427	}
428
429	/**
430	 * Создает экземпляр PDO-класса. Если в PDO-драйвере нет некоторого
431	 * функционала, можно использовать класс-адаптер для предоставления этого
432	 * функционала
433	 * @return PDO экземпляр PDO-класса
434	 */
435	protected function createPdoInstance()
436	{
437		$pdoClass=$this->pdoClass;
438		if(($pos=strpos($this->connectionString,':'))!==false)
439		{
440			$driver=strtolower(substr($this->connectionString,0,$pos));
441			if($driver==='mssql' || $driver==='dblib' || $driver==='sqlsrv')
442				$pdoClass='CMssqlPdoAdapter';
443		}
444		return new $pdoClass($this->connectionString,$this->username,
445									$this->password,$this->_attributes);
446	}
447
448	/**
449	 * Инициализирует открытое соединение БД. Метод вызывает сразу после
450	 * установки соединения. Реализация по умолчанию устанавливает кодировку
451	 * для соединений баз MySQL и PostgreSQL
452	 * @param PDO $pdo экземпляр PDO-класса
453	 */
454	protected function initConnection($pdo)
455	{
456		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
457		if($this->emulatePrepare!==null && constant('PDO::ATTR_EMULATE_PREPARES'))
458			$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,$this->emulatePrepare);
459		if($this->charset!==null)
460		{
461			$driver=strtolower($pdo->getAttribute(PDO::ATTR_DRIVER_NAME));
462			if(in_array($driver,array('pgsql','mysql','mysqli')))
463				$pdo->exec('SET NAMES '.$pdo->quote($this->charset));
464		}
465		if($this->initSQLs!==null)
466		{
467			foreach($this->initSQLs as $sql)
468				$pdo->exec($sql);
469		}
470	}
471
472	/**
473	 * Возвращает экземпляр PDO-класса
474	 * @return PDO экземпляр PDO-класса; null, если соединение еще не
475	 * установлено
476	 */
477	public function getPdoInstance()
478	{
479		return $this->_pdo;
480	}
481
482	/**
483	 * Создает команду для выполнения
484	 * @param mixed $query выполняемый запрос. Может быть строкой,
485	 * представляющей SQL-выражение, или массивом, представляющим разные части
486	 * SQL-выражения. За подробностями о передаче массива в качестве параметра
487	 * обратитесь к описанию метода {@link CDbCommand::__construct}. Если
488	 * данный параметр не передан, необходимо будет вызвать методы создания
489	 * запросов класса {@link CDbCommand}
490	 * @return CDbCommand команда БД
491	 */
492	public function createCommand($query=null)
493	{
494		$this->setActive(true);
495		return new CDbCommand($this,$query);
496	}
497
498	/**
499	 * Возвращает текущую активную транзакцию
500	 * @return CDbTransaction текущая активная транзакция; null, если активных
501	 * транзакций нет
502	 */
503	public function getCurrentTransaction()
504	{
505		if($this->_transaction!==null)
506		{
507			if($this->_transaction->getActive())
508				return $this->_transaction;
509		}
510		return null;
511	}
512
513	/**
514	 * Начинает транзакцию
515	 * @return CDbTransaction инициированная транзакция
516	 */
517	public function beginTransaction()
518	{
519		Yii::trace('Starting transaction','system.db.CDbConnection');
520		$this->setActive(true);
521		$this->_pdo->beginTransaction();
522		return $this->_transaction=new CDbTransaction($this);
523	}
524
525	/**
526	 * Возвращает схему БД для данного соединения
527	 * @return CDbSchema схема БД для данного соединения
528	 */
529	public function getSchema()
530	{
531		if($this->_schema!==null)
532			return $this->_schema;
533		else
534		{
535			$driver=$this->getDriverName();
536			if(isset($this->driverMap[$driver]))
537				return $this->_schema=Yii::createComponent($this->driverMap[$driver], $this);
538			else
539				throw new CDbException(Yii::t('yii','CDbConnection does not support reading schema for {driver} database.',
540					array('{driver}'=>$driver)));
541		}
542	}
543
544	/**
545	 * Возвращает построитель команд для данного соединения
546	 * @return CDbCommandBuilder построитель команд для данного соединения
547	 */
548	public function getCommandBuilder()
549	{
550		return $this->getSchema()->getCommandBuilder();
551	}
552
553	/**
554	 * Возвращает идентификатор последней вставленной строки или значение
555	 * последовательности
556	 * @param string $sequenceName имя объекта последовательности (требуется
557	 * некоторыми СУБД)
558	 * @return string идентификатор последней вставленной строки или последнего
559	 * значения, полученного из объекта последовательности
560	 * @see http://www.php.net/manual/en/function.PDO-lastInsertId.php
561	 */
562	public function getLastInsertID($sequenceName='')
563	{
564		$this->setActive(true);
565		return $this->_pdo->lastInsertId($sequenceName);
566	}
567
568	/**
569	 * Заключает в кавычки значение строки для использования в запросе
570	 * @param string $str заключаемая в кавычки строка
571	 * @return string заключённая в кавычки строка
572	 * @see http://www.php.net/manual/en/function.PDO-quote.php
573	 */
574	public function quoteValue($str)
575	{
576		if(is_int($str) || is_float($str))
577			return $str;
578
579		$this->setActive(true);
580		if(($value=$this->_pdo->quote($str))!==false)
581			return $value;
582		else  // the driver doesn't support quote (e.g. oci)
583			return "'" . addcslashes(str_replace("'", "''", $str), "\000\n\r\\\032") . "'";
584	}
585
586	/**
587	 * Заключает в кавычки имя таблицы для использования в запросе. Если имя
588	 * таблицы содержит префикс схемы, то данный префикс также будет заключен в кавычки
589	 * @param string $name имя таблицы
590	 * @return string заключенное в кавычки имя таблицы
591	 */
592	public function quoteTableName($name)
593	{
594		return $this->getSchema()->quoteTableName($name);
595	}
596
597	/**
598	 * Заключает в кавычки имя столбца для использования в запросе. Если имя
599	 * столбца содержит префикс , то данный префикс также будет заключен в кавычки
600	 * @param string $name имя столбца
601	 * @return string заключенное в кавычки имя столбца
602	 */
603	public function quoteColumnName($name)
604	{
605		return $this->getSchema()->quoteColumnName($name);
606	}
607
608	/**
609	 * Определяет тип PDO по переданному типу PHP
610	 * @param string $type тип PHP (полученный вызывом функции gettype())
611	 * @return integer соответствующий тип PDO
612	 */
613	public function getPdoType($type)
614	{
615		static $map=array
616		(
617			'boolean'=>PDO::PARAM_BOOL,
618			'integer'=>PDO::PARAM_INT,
619			'string'=>PDO::PARAM_STR,
620			'NULL'=>PDO::PARAM_NULL,
621		);
622		return isset($map[$type]) ? $map[$type] : PDO::PARAM_STR;
623	}
624
625	/**
626	 * Возвращает регистр имен столбцов
627	 * @return mixed регистр имен столбцов
628	 * @see http://www.php.net/manual/en/pdo.setattribute.php
629	 */
630	public function getColumnCase()
631	{
632		return $this->getAttribute(PDO::ATTR_CASE);
633	}
634
635	/**
636	 * Устанавливает регистр имен столбцов
637	 * @param mixed $value регистр имен столбцов
638	 * @see http://www.php.net/manual/en/pdo.setattribute.php
639	 */
640	public function setColumnCase($value)
641	{
642		$this->setAttribute(PDO::ATTR_CASE,$value);
643	}
644
645	/**
646	 * Возвращает значение того, как конвертируются значения null и пустые строки
647	 * @return mixed значение того, как конвертируются значения null и пустые строки
648	 * @see http://www.php.net/manual/en/pdo.setattribute.php
649	 */
650	public function getNullConversion()
651	{
652		return $this->getAttribute(PDO::ATTR_ORACLE_NULLS);
653	}
654
655	/**
656	 * Устанавливает значение того, как конвертируются значения null и пустые строки
657	 * @param mixed $value значение того, как конвертируются значения null и
658	 * пустые строки
659	 * @see http://www.php.net/manual/en/pdo.setattribute.php
660	 */
661	public function setNullConversion($value)
662	{
663		$this->setAttribute(PDO::ATTR_ORACLE_NULLS,$value);
664	}
665
666	/**
667	 * Возвращает флаг, показывающий, будут ли запросы на обновление и
668	 * добавление записей БД автоматически подтверждаться. Некоторые СУБД
669	 * (например, sqlite) могут не поддерживать данную функцию
670	 * @return boolean будут ли запросы на обновление и добавление записей БД
671	 * автоматически подтверждаться
672	 */
673	public function getAutoCommit()
674	{
675		return $this->getAttribute(PDO::ATTR_AUTOCOMMIT);
676	}
677
678	/**
679	 * Устанавливает флаг, показывающий, будут ли запросы на обновление и
680	 * добавление записей БД автоматически подтверждаться. Некоторые СУБД
681	 * (например, sqlite) могут не поддерживать данную функцию
682	 * @param boolean $value будут ли запросы на обновление и добавление
683	 * записей БД автоматически подтверждаться
684	 */
685	public function setAutoCommit($value)
686	{
687		$this->setAttribute(PDO::ATTR_AUTOCOMMIT,$value);
688	}
689
690	/**
691	 * Возвращает флаг, показывающий, является ли соединение постоянным или
692	 * нет. Некоторые СУБД (например, sqlite) могут не поддерживать данную
693	 * функцию
694	 * @return boolean является ли соединение постоянным или нет
695	 */
696	public function getPersistent()
697	{
698		return $this->getAttribute(PDO::ATTR_PERSISTENT);
699	}
700
701	/**
702	 * Устанавливает флаг, показывающий, является ли соединение постоянным или
703	 * нет. Некоторые СУБД (например, sqlite) могут не поддерживать данную
704	 * функцию
705	 * @param boolean $value является ли соединение постоянным или нет
706	 */
707	public function setPersistent($value)
708	{
709		return $this->setAttribute(PDO::ATTR_PERSISTENT,$value);
710	}
711
712	/**
713	 * Возвращает имя драйвера БД
714	 * @return string имя драйвера БД
715	 */
716	public function getDriverName()
717	{
718		if(($pos=strpos($this->connectionString, ':'))!==false)
719			return strtolower(substr($this->connectionString, 0, $pos));
720		// return $this->getAttribute(PDO::ATTR_DRIVER_NAME);
721	}
722
723	/**
724	 * Возвращает информацию о версии драйвера БД
725	 * @return string информация о версии драйвера БД
726	 */
727	public function getClientVersion()
728	{
729		return $this->getAttribute(PDO::ATTR_CLIENT_VERSION);
730	}
731
732	/**
733	 * Возвращает статус соединения. Некоторые СУБД (например, sqlite) могут не
734	 * поддерживать данную функцию
735	 * @return string статус соединения
736	 */
737	public function getConnectionStatus()
738	{
739		return $this->getAttribute(PDO::ATTR_CONNECTION_STATUS);
740	}
741
742	/**
743	 * Возвращает флаг, показывающий, выполняет ли соединение предварительную
744	 * выборку (prefetching) данных
745	 * @return boolean выполняет ли соединение предварительную выборку
746	 * (prefetching) данных
747	 */
748	public function getPrefetch()
749	{
750		return $this->getAttribute(PDO::ATTR_PREFETCH);
751	}
752
753	/**
754	 * Возвращает информацию о сервере СУБД
755	 * @return string информация о сервере СУБД
756	 */
757	public function getServerInfo()
758	{
759		return $this->getAttribute(PDO::ATTR_SERVER_INFO);
760	}
761
762	/**
763	 * Возвращает информацию о версии сервера СУБД
764	 * @return string информация о версии сервера СУБД
765	 */
766	public function getServerVersion()
767	{
768		return $this->getAttribute(PDO::ATTR_SERVER_VERSION);
769	}
770
771	/**
772	 * Возвращает настройки времени ожидания соединения
773	 * @return integer настройки времени ожидания соединения
774	 */
775	public function getTimeout()
776	{
777		return $this->getAttribute(PDO::ATTR_TIMEOUT);
778	}
779
780	/**
781	 * Получает информацию о определенном атрибуте соединения БД
782	 * @param integer $name запрашиваемый атрибут
783	 * @return mixed соответствующая информация атрибута
784	 * @see http://www.php.net/manual/en/function.PDO-getAttribute.php
785	 */
786	public function getAttribute($name)
787	{
788		$this->setActive(true);
789		return $this->_pdo->getAttribute($name);
790	}
791
792	/**
793	 * Устанавливает атрибут соединения БД
794	 * @param integer $name устанавливаемый атрибут
795	 * @param mixed $value значение атрибута
796	 * @see http://www.php.net/manual/en/function.PDO-setAttribute.php
797	 */
798	public function setAttribute($name,$value)
799	{
800		if($this->_pdo instanceof PDO)
801			$this->_pdo->setAttribute($name,$value);
802		else
803			$this->_attributes[$name]=$value;
804	}
805
806	/**
807	 * Возвращает атрибуты, явно установленные ранее для соединения БД
808	 * @return array атрибуты (в виед имя => значение), явно установленные
809	 * ранее для соединения БД
810	 * @see setAttributes
811	 * @since 1.1.7
812	 */
813	public function getAttributes()
814	{
815		return $this->_attributes;
816	}
817
818	/**
819	 * Устанавливает набор атрибутов для соединения БД
820	 * @param array $values устанавливаемые атрибуты (имя => значение)
821	 * @see setAttribute
822	 * @since 1.1.7
823	 */
824	public function setAttributes($values)
825	{
826		foreach($values as $name=>$value)
827			$this->_attributes[$name]=$value;
828	}
829
830	/**
831	 * Возвращает статистическую информацию о выполнении SQL-выражений.
832	 * Возвращаемые результаты включают количество выполненных SQL-выражений и
833	 * общее затраченное на выполнение время. Для использования данного метода,
834	 * необходимо установить параметр {@link enableProfiling} в значение true
835	 * @return array массив, первый элемент которого показывает количество
836	 * выполненных SQL-выражений, а второй - общее затраченное на выполнение
837	 * SQL-выражений время
838	 */
839	public function getStats()
840	{
841		$logger=Yii::getLogger();
842		$timings=$logger->getProfilingResults(null,'system.db.CDbCommand.query');
843		$count=count($timings);
844		$time=array_sum($timings);
845		$timings=$logger->getProfilingResults(null,'system.db.CDbCommand.execute');
846		$count+=count($timings);
847		$time+=array_sum($timings);
848		return array($count,$time);
849	}
850}