blob: f2eb67ff8bbf72278c6251ce2cfc37c5cd1c1d53 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
<?php
/**
* TDbMetaData class file.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @link http://www.pradosoft.com/
* @copyright Copyright © 2005-2010 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System.Data.Common
*/
/**
* TDbMetaData is the base class for retrieving metadata information, such as
* table and columns information, from a database connection.
*
* Use the {@link getTableInfo} method to retrieve a table information.
*
* @author Wei Zhuo <weizho[at]gmail[dot]com>
* @version $Id$
* @package System.Data.Common
* @since 3.1
*/
abstract class TDbMetaData extends TComponent
{
private $_tableInfoCache=array();
private $_connection;
/**
* @param TDbConnection database connection.
*/
public function __construct($conn)
{
$this->_connection=$conn;
}
/**
* @return TDbConnection database connection.
*/
public function getDbConnection()
{
return $this->_connection;
}
/**
* Obtain database specific TDbMetaData class using the driver name of the database connection.
* @param TDbConnection database connection.
* @return TDbMetaData database specific TDbMetaData.
*/
public static function getInstance($conn)
{
$conn->setActive(true); //must be connected before retrieving driver name
$driver = $conn->getDriverName();
switch(strtolower($driver))
{
case 'pgsql':
Prado::using('System.Data.Common.Pgsql.TPgsqlMetaData');
return new TPgsqlMetaData($conn);
case 'mysqli':
case 'mysql':
Prado::using('System.Data.Common.Mysql.TMysqlMetaData');
return new TMysqlMetaData($conn);
case 'sqlite': //sqlite 3
case 'sqlite2': //sqlite 2
Prado::using('System.Data.Common.Sqlite.TSqliteMetaData');
return new TSqliteMetaData($conn);
case 'mssql': // Mssql driver on windows hosts
case 'dblib': // dblib drivers on linux (and maybe others os) hosts
Prado::using('System.Data.Common.Mssql.TMssqlMetaData');
return new TMssqlMetaData($conn);
case 'oci':
Prado::using('System.Data.Common.Oracle.TOracleMetaData');
return new TOracleMetaData($conn);
// case 'ibm':
// Prado::using('System.Data.Common.IbmDb2.TIbmDb2MetaData');
// return new TIbmDb2MetaData($conn);
default:
throw new TDbException('ar_invalid_database_driver',$driver);
}
}
/**
* Obtains table meta data information for the current connection and given table name.
* @param string table or view name
* @return TDbTableInfo table information.
*/
public function getTableInfo($tableName=null)
{
$key = $tableName===null?$this->getDbConnection()->getConnectionString():$tableName;
if(!isset($this->_tableInfoCache[$key]))
{
$class = $this->getTableInfoClass();
$tableInfo = $tableName===null ? new $class : $this->createTableInfo($tableName);
$this->_tableInfoCache[$key] = $tableInfo;
}
return $this->_tableInfoCache[$key];
}
/**
* Creates a command builder for a given table name.
* @param string table name.
* @return TDbCommandBuilder command builder instance for the given table.
*/
public function createCommandBuilder($tableName=null)
{
return $this->getTableInfo($tableName)->createCommandBuilder($this->getDbConnection());
}
/**
* This method should be implemented by decendent classes.
* @return TDbTableInfo driver dependent create builder.
*/
abstract protected function createTableInfo($tableName);
/**
* @return string TDbTableInfo class name.
*/
protected function getTableInfoClass()
{
return 'TDbTableInfo';
}
}
|