5 include_once (
"./Services/Database/classes/class.ilDB.php");
31 if(!isset(
$GLOBALS[
'_MDB2_dsninfo_default'][
'charset']) or
32 $GLOBALS[
'_MDB2_dsninfo_default'][
'charset'] !=
'utf8')
34 $GLOBALS[
'_MDB2_dsninfo_default'][
'charset'] =
'utf8';
37 return array(
'phptype' =>
'oci8',
59 $query =
'SELECT * FROM v$version';
78 "ACCESS",
"ADD",
"ALL",
"ALTER",
"AND",
"ANY",
"AS",
"ASC",
79 "AUDIT",
"BETWEEN",
"BY",
"CHAR",
"CHECK",
"CLUSTER",
"COLUMN",
80 "COMMENT",
"COMPRESS",
"CONNECT",
"CREATE",
"CURRENT",
"DATE",
81 "DECIMAL",
"DEFAULT",
"DELETE",
"DESC",
"DISTINCT",
"DROP",
"ELSE",
82 "EXCLUSIVE",
"EXISTS",
"FILE",
"FLOAT",
"FOR",
"FROM",
"GRANT",
"GROUP",
83 "HAVING",
"IDENTIFIED",
"IMMEDIATE",
"IN",
"INCREMENT",
"INDEX",
"INITIAL",
84 "INSERT",
"INTEGER",
"INTERSECT",
"INTO",
"IS",
"LEVEL",
"LIKE",
"LOCK",
"LONG",
85 "MAXEXTENTS",
"MINUS",
"MLSLABEL",
"MODE",
"MODIFY",
"NOAUDIT",
"NOCOMPRESS",
"NOT",
86 "NOWAIT",
"NULL",
"NUMBER",
"OF",
"OFFLINE",
"ON",
"ONLINE",
"OPTION",
87 "OR",
"ORDER",
"PCTFREE",
"PRIOR",
"PRIVILEGES",
"PUBLIC",
"RAW",
"RENAME",
88 "RESOURCE",
"REVOKE",
"ROW",
"ROWID",
"ROWNUM",
"ROWS",
"SELECT",
"SESSION",
"SET",
89 "SHARE",
"SIZE",
"SMALLINT",
"START",
"SUCCESSFUL",
"SYNONYM",
"SYSDATE",
"TABLE",
90 "THEN",
"TO",
"TRIGGER",
"UID",
"UNION",
"UNIQUE",
"UPDATE",
"USER",
"VALIDATE",
91 "VALUES",
"VARCHAR",
"VARCHAR2",
"VIEW",
"WHENEVER",
"WHERE",
"WITH"
101 array(
"use_transactions" =>
true));
109 $GLOBALS[
'_MDB2_dsninfo_default'][
'charset'] =
'utf8';
110 $this->
query(
"ALTER SESSION SET nls_length_semantics='CHAR'");
111 $this->
query(
"ALTER SESSION SET NLS_SORT = binary_ci");
131 return "LOCALTIMESTAMP";
141 return "TO_DATE('19700101000000','YYYYMMDDHH24MISS') ".
142 "+ NUMTODSINTERVAL(".$a_expr.
", 'SECOND')";
146 return "to_char(TO_DATE('19700101000000','YYYYMMDDHH24MISS') ".
147 "+ NUMTODSINTERVAL(".$a_expr.
", 'SECOND'), 'yyyy-mm-dd hh24:mi:ss')";
158 return "ROUND((sysdate - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400))";
166 return $a_table.
"_".$a_constraint;
192 function replace($a_table, $a_pk_columns, $a_other_columns)
194 $a_columns = array_merge($a_pk_columns, $a_other_columns);
196 $field_values = array();
197 $placeholders = array();
202 $val_field = array();
205 foreach ($a_columns as $k => $col)
207 if($col[0] ==
'clob' or $col[0] ==
'blob')
209 $val_field[] = $this->
quote($col[1],
'text').
" ".$k;
213 $val_field[] = $this->
quote($col[1], $col[0]).
" ".$k;
216 $placeholders[] =
"%s";
217 $placeholders2[] =
":$k";
221 if ($col[0] ==
'integer' && !is_null($col[1]))
223 $col[1] = (int) $col[1];
227 $field_values[$k] = $col[1];
228 if ($col[0] ==
"blob" || $col[0] ==
"clob")
239 foreach ($a_pk_columns as $k => $col)
241 $abpk[] =
"a.".$k.
" = b.".$k;
242 $delwhere[] = $k.
" = ".$this->
quote($col[1], $col[0]);
244 foreach ($a_other_columns as $k => $col)
246 $aboc[] =
"a.".$k.
" = b.".$k;
250 $this->
manipulate(
"DELETE FROM ".$a_table.
" WHERE ".
251 implode ($delwhere,
" AND ")
253 $this->
insert($a_table, $a_columns);
256 $this->
handleError($r,
"replace, delete/insert(".$a_table.
")");
260 $q =
"MERGE INTO ".$a_table.
" a ".
261 "USING (SELECT ".implode($val_field,
", ").
" ".
262 "FROM DUAL) b ON (".implode($abpk,
" AND ").
") ".
263 "WHEN MATCHED THEN UPDATE SET ".implode($aboc,
", ").
" ".
264 "WHEN NOT MATCHED THEN INSERT (".implode($a,
",").
") VALUES (".implode($b,
",").
")";
277 public function locate($a_needle,$a_string,$a_start_pos = 1)
279 $locate =
' INSTR( ';
280 $locate .= (
'SUBSTR('.$a_string.
',0,'.self::CLOB_BUFFER_SIZE.
')');
282 $locate .= $a_needle;
284 $locate .= $a_start_pos;
300 public function like($a_col, $a_type, $a_value =
"?", $case_insensitive =
true)
302 if($a_type ==
'text')
304 return parent::like($a_col,$a_type,$a_value,$case_insensitive);
307 if (!in_array($a_type, array(
"text",
"clob",
"blob")))
309 $this->
raisePearError(
"Like: Invalid column type '".$a_type.
"'.", $this->error_class->FATAL);
313 if ($case_insensitive)
315 return "UPPER(SUBSTR(".$a_col.
",0,".self::CLOB_BUFFER_SIZE.
")) LIKE(UPPER(?))";
319 return "SUBSTR(".$a_col .
",0,".self::CLOB_BUFFER_SIZE.
") LIKE(?)";
324 if ($case_insensitive)
326 return " UPPER(SUBSTR(".$a_col.
",0,".self::CLOB_BUFFER_SIZE.
")) LIKE(UPPER(".$this->
quote($a_value,
'text').
"))";
330 return " SUBSTR(".$a_col.
",0,".self::CLOB_BUFFER_SIZE.
") LIKE(".$this->
quote($a_value,
'text').
")";
341 public function concat($a_values, $a_allow_null =
true)
343 if(count($a_values) <= 2)
349 foreach($a_values as $field_info)
355 array($concat_value,$concat_type),
356 array($field_info[0],$field_info[1])),
363 $concat_value = $field_info[0];
364 $concat_type = $field_info[1];
367 return $concat_value;
384 function in($a_field, $a_values, $negate =
false, $a_type =
"")
386 if(count($a_values) <= self::LIMIT_EXPRESSIONS_IN_LIST)
388 return parent::in($a_field,$a_values,$negate,$a_type);
392 $concat = $negate ?
' AND ' :
' OR ';
403 $spliced = array_splice($a_values, 0, self::LIMIT_EXPRESSIONS_IN_LIST);
429 foreach($a_tables as $table)
431 $lock =
'LOCK TABLE ';
433 $lock .= ($table[
'name'].
' ');
435 switch($table[
'type'])
438 $lock .=
' IN SHARE MODE ';
442 $lock .=
' IN EXCLUSIVE MODE ';
450 $this->db->beginTransaction();
451 foreach($locks as $lock)
453 $this->db->query($lock);
454 $ilLog->write(__METHOD__.
': '.$lock);
478 $query =
"ALTER TABLE ".$a_table.
" DROP PRIMARY KEY DROP INDEX";