summaryrefslogtreecommitdiff
path: root/framework/Data/ActiveRecord/Vendor/TDbMetaDataCommon.php
blob: 74c9768908ca6a576d40f2e2e7df9b93b7b5eeb2 (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?php
/**
 * TDbMetaDataCommon class file.
 *
 * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
 * @link http://www.pradosoft.com/
 * @copyright Copyright &copy; 2005-2007 PradoSoft
 * @license http://www.pradosoft.com/license/
 * @version $Id$
 * @package System.Data.ActiveRecord.Vendor
 */

Prado::using('System.Data.ActiveRecord.Vendor.TDbMetaData');

/**
 * Common database command: insert, update, select and delete.
 *
 * Base class for database specific insert, update, select and delete command builder.
 *
 * @author Wei Zhuo <weizho[at]gmail[dot]com>
 * @version $Id$
 * @package System.Data.ActiveRecord.Vendor
 * @since 3.1
 */
abstract class TDbMetaDataCommon extends TDbMetaData
{
	/**
	 * SQL database command for finding the record by primary keys.
	 * @param TDbConnection database connection.
	 * @param array primary keys name value pairs.
	 * @return TDbCommand find by primary key command.
	 */
	public function getFindByPkCommand($conn,$keys)
	{
		$columns = $this->getSelectionColumns();
		$primaryKeys = $this->getPrimaryKeyCriteria();
		$table = $this->getTableName();
		$sql = "SELECT {$columns} FROM {$table} WHERE {$primaryKeys}";
		$command = $this->createBindedCommand($conn, $sql, $this->getPrimaryKeys(), $keys);
		return $command;
	}

	/**
	 * SQL database command for finding records using a criteria object.
	 * @param TDbConnection database connection.
	 * @param TActiveRecordCriteria criteria object
	 * @return TDbCommand find by criteria command.
	 */
	public function getFindByCriteriaCommand($conn, $criteria=null)
	{
		$columns = $this->getSelectionColumns();
		$conditions = $criteria!==null?$this->getSqlFromCriteria($conn,$criteria) : '';
		$table = $this->getTableName();
		$sql = "SELECT {$columns} FROM {$table} {$conditions}";
		return $this->createCriteriaBindedCommand($conn,$sql, $criteria);
	}

	/**
	 * Command to count the number of record matching the criteria.
	 * @param TDbConnection database connection.
	 * @param TActiveRecordCriteria criteria object
	 * @return TDbCommand count command.
	 * 	 */
	public function getCountRecordsCommand($conn, $criteria)
	{
		$columns = $this->getSelectionColumns();
		$conditions = $this->getSqlFromCriteria($conn,$criteria);
		$table = $this->getTableName();
		$sql = "SELECT count(*) FROM {$table} {$conditions}";
		return $this->createCriteriaBindedCommand($conn,$sql, $criteria);
	}

	abstract protected function getSqlFromCriteria($conn,TActiveRecordCriteria $criteria);

	/**
	 * Sql command with parameters binded.
	 * @param TDbConnection database connection.
	 * @param string sql query.
	 * @param array parameters to be bound
	 * @return TDbCommand sql command.
	 */
	public function getFindBySqlCommand($conn,$sql,$parameters)
	{
		$conn->setActive(true);
		$command = $conn->createCommand($sql);
		$this->bindParameterValues($conn,$command,$parameters);
		return $command;
	}

	/**
	 * SQL database command for insert a new record.
	 * @param TDbConnection database connection.
	 * @param TActiveRecord new record to be inserted.
	 * @return TDbCommand active record insert command
	 */
	public function getInsertCommand($conn, $record)
	{
		$columns = $this->getInsertableColumns($record);
		$fields = $this->getInsertColumNames($columns);
		$inserts = $this->getInsertColumnValues($columns);
		$table = $this->getTableName();
		$sql = "INSERT INTO {$table} ({$fields}) VALUES ({$inserts})";
		return $this->createBindedCommand($conn, $sql, array_keys($columns), $columns);
	}

	/**
	 * Update the record object's sequence values after insert.
	 * @param TDbConnection database connection.
	 * @param TActiveRecord record object.
	 */
	public function updatePostInsert($conn, $record)
	{
		foreach($this->getColumns() as $name => $column)
		{
			if($column->hasSequence())
				$record->{$name} = $conn->getLastInsertID($column->getSequenceName());
		}
	}

	/**
	 * SQL database command to update an active record.
	 * @param TDbConnection database connection.
	 * @param TActiveRecord record for update.
	 * @return TDbCommand update command.
	 */
	public function getUpdateCommand($conn,$record)
	{
		$primaryKeys = $this->getPrimaryKeyCriteria();
		$columns = $this->getUpdatableColumns($record);
		$updates = $this->getUpdateBindings($columns);
		$table = $this->getTableName();
		$sql = "UPDATE {$table} SET {$updates} WHERE {$primaryKeys}";
		$primaryKeyValues = $this->getObjectKeyValues($this->getPrimaryKeys(), $record);
		$values = array_merge($columns, $primaryKeyValues);
		return $this->createBindedCommand($conn, $sql, array_keys($values), $values);
	}

	/**
	 * SQL database command to delete an active record.
	 * @param TDbConnection database connection.
	 * @param TActiveRecord record for deletion.
	 * @return TDbCommand delete command.
	 */
	public function getDeleteCommand($conn,$record)
	{
		$primaryKeys = $this->getPrimaryKeyCriteria();
		$table = $this->getTableName();
		$sql = "DELETE FROM {$table} WHERE {$primaryKeys}";
		$keys = $this->getPrimaryKeys();
		$values = $this->getObjectKeyValues($keys, $record);
		return $this->createBindedCommand($conn,$sql, $keys, $values);
	}

	/**
	 * SQL command to delete records by primary keys.
	 * @param TDbConnection database connection.
	 * @param array list of primary keys
	 * @return TDbCommand delete command.
	 */
	public function getDeleteByPkCommand($conn,$keys)
	{
		$conn->setActive(true);
		$numKeys = count($this->getPrimaryKeys());
		if($numKeys===0)
			throw new TActiveRecordException('ar_no_primary_key_found',$this->getTableName());
		$table = $this->getTableName();
		if($numKeys===1)
			$criteria = $this->getDeleteInPkCriteria($conn,$keys);
		else
			$criteria = $this->getDeleteMultiplePkCriteria($conn,$keys);
		$sql = "DELETE FROM {$table} WHERE {$criteria}";
		$command = $conn->createCommand($sql);
		$command->prepare();
		return $command;
	}
}

?>