Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
36 kaklik 1
<?php
2
 
3
/**
4
  V4.80 8 Mar 2006  (c) 2000-2006 John Lim (jlim@natsoft.com.my). All rights reserved.
5
  Released under both BSD license and Lesser GPL library license. 
6
  Whenever there is any discrepancy between the two licenses, 
7
  the BSD license will take precedence.
8
 
9
  Set tabs to 4 for best viewing.
10
 
11
*/
12
 
13
// security - hide paths
14
if (!defined('ADODB_DIR')) die();
15
 
16
class ADODB2_oci8 extends ADODB_DataDict {
17
 
18
	var $databaseType = 'oci8';
19
	var $seqField = false;
20
	var $seqPrefix = 'SEQ_';
21
	var $dropTable = "DROP TABLE %s CASCADE CONSTRAINTS";
22
	var $trigPrefix = 'TRIG_';
23
	var $alterCol = ' MODIFY ';
24
	var $typeX = 'VARCHAR(4000)';
25
	var $typeXL = 'CLOB';
26
 
27
	function MetaType($t,$len=-1)
28
	{
29
		if (is_object($t)) {
30
			$fieldobj = $t;
31
			$t = $fieldobj->type;
32
			$len = $fieldobj->max_length;
33
		}
34
		switch (strtoupper($t)) {
35
	 	case 'VARCHAR':
36
	 	case 'VARCHAR2':
37
		case 'CHAR':
38
		case 'VARBINARY':
39
		case 'BINARY':
40
			if (isset($this) && $len <= $this->blobSize) return 'C';
41
			return 'X';
42
 
43
		case 'NCHAR':
44
		case 'NVARCHAR2':
45
		case 'NVARCHAR':
46
			if (isset($this) && $len <= $this->blobSize) return 'C2';
47
			return 'X2';
48
 
49
		case 'NCLOB':
50
		case 'CLOB':
51
			return 'XL';
52
 
53
		case 'LONG RAW':
54
		case 'LONG VARBINARY':
55
		case 'BLOB':
56
			return 'B';
57
 
58
		case 'DATE': 
59
			return 'T';
60
 
61
		case 'INT': 
62
		case 'SMALLINT':
63
		case 'INTEGER': 
64
			return 'I';
65
 
66
		default:
67
			return 'N';
68
		}
69
	}
70
 
71
 	function ActualType($meta)
72
	{
73
		switch($meta) {
74
		case 'C': return 'VARCHAR';
75
		case 'X': return $this->typeX;
76
		case 'XL': return $this->typeXL;
77
 
78
		case 'C2': return 'NVARCHAR';
79
		case 'X2': return 'NVARCHAR(2000)';
80
 
81
		case 'B': return 'BLOB';
82
 
83
		case 'D': 
84
		case 'T': return 'DATE';
85
		case 'L': return 'DECIMAL(1)';
86
		case 'I1': return 'DECIMAL(3)';
87
		case 'I2': return 'DECIMAL(5)';
88
		case 'I':
89
		case 'I4': return 'DECIMAL(10)';
90
 
91
		case 'I8': return 'DECIMAL(20)';
92
		case 'F': return 'DECIMAL';
93
		case 'N': return 'DECIMAL';
94
		default:
95
			return $meta;
96
		}	
97
	}
98
 
99
	function CreateDatabase($dbname, $options=false)
100
	{
101
		$options = $this->_Options($options);
102
		$password = isset($options['PASSWORD']) ? $options['PASSWORD'] : 'tiger';
103
		$tablespace = isset($options["TABLESPACE"]) ? " DEFAULT TABLESPACE ".$options["TABLESPACE"] : '';
104
		$sql[] = "CREATE USER ".$dbname." IDENTIFIED BY ".$password.$tablespace;
105
		$sql[] = "GRANT CREATE SESSION, CREATE TABLE,UNLIMITED TABLESPACE,CREATE SEQUENCE TO $dbname";
106
 
107
		return $sql;
108
	}
109
 
110
	function AddColumnSQL($tabname, $flds)
111
	{
112
		$f = array();
113
		list($lines,$pkey) = $this->_GenFields($flds);
114
		$s = "ALTER TABLE $tabname ADD (";
115
		foreach($lines as $v) {
116
			$f[] = "\n $v";
117
		}
118
 
119
		$s .= implode(', ',$f).')';
120
		$sql[] = $s;
121
		return $sql;
122
	}
123
 
124
	function AlterColumnSQL($tabname, $flds)
125
	{
126
		$f = array();
127
		list($lines,$pkey) = $this->_GenFields($flds);
128
		$s = "ALTER TABLE $tabname MODIFY(";
129
		foreach($lines as $v) {
130
			$f[] = "\n $v";
131
		}
132
		$s .= implode(', ',$f).')';
133
		$sql[] = $s;
134
		return $sql;
135
	}
136
 
137
	function DropColumnSQL($tabname, $flds)
138
	{
139
		if (!is_array($flds)) $flds = explode(',',$flds);
140
		foreach ($flds as $k => $v) $flds[$k] = $this->NameQuote($v);
141
 
142
		$sql = array();
143
		$s = "ALTER TABLE $tabname DROP(";
144
		$s .= implode(', ',$flds).') CASCADE CONSTRAINTS';
145
		$sql[] = $s;
146
		return $sql;
147
	}
148
 
149
	function _DropAutoIncrement($t)
150
	{
151
		if (strpos($t,'.') !== false) {
152
			$tarr = explode('.',$t);
153
			return "drop sequence ".$tarr[0].".seq_".$tarr[1];
154
		}
155
		return "drop sequence seq_".$t;
156
	}
157
 
158
	// return string must begin with space
159
	function _CreateSuffix($fname,$ftype,$fnotnull,$fdefault,$fautoinc,$fconstraint,$funsigned)
160
	{
161
		$suffix = '';
162
 
163
		if ($fdefault == "''" && $fnotnull) {// this is null in oracle
164
			$fnotnull = false;
165
			if ($this->debug) ADOConnection::outp("NOT NULL and DEFAULT='' illegal in Oracle");
166
		}
167
 
168
		if (strlen($fdefault)) $suffix .= " DEFAULT $fdefault";
169
		if ($fnotnull) $suffix .= ' NOT NULL';
170
 
171
		if ($fautoinc) $this->seqField = $fname;
172
		if ($fconstraint) $suffix .= ' '.$fconstraint;
173
 
174
		return $suffix;
175
	}
176
 
177
/*
178
CREATE or replace TRIGGER jaddress_insert
179
before insert on jaddress
180
for each row
181
begin
182
select seqaddress.nextval into :new.A_ID from dual;
183
end;
184
*/
185
	function _Triggers($tabname,$tableoptions)
186
	{
187
		if (!$this->seqField) return array();
188
 
189
		if ($this->schema) {
190
			$t = strpos($tabname,'.');
191
			if ($t !== false) $tab = substr($tabname,$t+1);
192
			else $tab = $tabname;
193
			$seqname = $this->schema.'.'.$this->seqPrefix.$tab;
194
			$trigname = $this->schema.'.'.$this->trigPrefix.$this->seqPrefix.$tab;
195
		} else {
196
			$seqname = $this->seqPrefix.$tabname;
197
			$trigname = $this->trigPrefix.$seqname;
198
		}
199
		if (isset($tableoptions['REPLACE'])) $sql[] = "DROP SEQUENCE $seqname";
200
		$seqCache = '';
201
		if (isset($tableoptions['SEQUENCE_CACHE'])){$seqCache = $tableoptions['SEQUENCE_CACHE'];}
202
		$seqIncr = '';
203
		if (isset($tableoptions['SEQUENCE_INCREMENT'])){$seqIncr = ' INCREMENT BY '.$tableoptions['SEQUENCE_INCREMENT'];}
204
		$seqStart = '';
205
		if (isset($tableoptions['SEQUENCE_START'])){$seqIncr = ' START WITH '.$tableoptions['SEQUENCE_START'];}
206
		$sql[] = "CREATE SEQUENCE $seqname $seqStart $seqIncr $seqCache";
207
		$sql[] = "CREATE OR REPLACE TRIGGER $trigname BEFORE insert ON $tabname FOR EACH ROW WHEN (NEW.$this->seqField IS NULL OR NEW.$this->seqField = 0) BEGIN select $seqname.nextval into :new.$this->seqField from dual; END;";
208
 
209
		$this->seqField = false;
210
		return $sql;
211
	}
212
 
213
	/*
214
	CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
215
		[table_options] [select_statement]
216
		create_definition:
217
		col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
218
		[PRIMARY KEY] [reference_definition]
219
		or PRIMARY KEY (index_col_name,...)
220
		or KEY [index_name] (index_col_name,...)
221
		or INDEX [index_name] (index_col_name,...)
222
		or UNIQUE [INDEX] [index_name] (index_col_name,...)
223
		or FULLTEXT [INDEX] [index_name] (index_col_name,...)
224
		or [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...)
225
		[reference_definition]
226
		or CHECK (expr)
227
	*/
228
 
229
 
230
 
231
	function _IndexSQL($idxname, $tabname, $flds,$idxoptions)
232
	{
233
		$sql = array();
234
 
235
		if ( isset($idxoptions['REPLACE']) || isset($idxoptions['DROP']) ) {
236
			$sql[] = sprintf ($this->dropIndex, $idxname, $tabname);
237
			if ( isset($idxoptions['DROP']) )
238
				return $sql;
239
		}
240
 
241
		if ( empty ($flds) ) {
242
			return $sql;
243
		}
244
 
245
		if (isset($idxoptions['BITMAP'])) {
246
			$unique = ' BITMAP'; 
247
		} elseif (isset($idxoptions['UNIQUE'])) {
248
			$unique = ' UNIQUE';
249
		} else {
250
			$unique = '';
251
		}
252
 
253
		if ( is_array($flds) )
254
			$flds = implode(', ',$flds);
255
		$s = 'CREATE' . $unique . ' INDEX ' . $idxname . ' ON ' . $tabname . ' (' . $flds . ')';
256
 
257
		if ( isset($idxoptions[$this->upperName]) )
258
			$s .= $idxoptions[$this->upperName];
259
 
260
		if (isset($idxoptions['oci8']))
261
			$s .= $idxoptions['oci8'];
262
 
263
 
264
		$sql[] = $s;
265
 
266
		return $sql;
267
	}
268
 
269
	function GetCommentSQL($table,$col)
270
	{
271
		$table = $this->connection->qstr($table);
272
		$col = $this->connection->qstr($col);	
273
		return "select comments from USER_COL_COMMENTS where TABLE_NAME=$table and COLUMN_NAME=$col";
274
	}
275
 
276
	function SetCommentSQL($table,$col,$cmt)
277
	{
278
		$cmt = $this->connection->qstr($cmt);
279
		return  "COMMENT ON COLUMN $table.$col IS $cmt";
280
	}
281
}
282
?>