2 require_once("db_common.php");
\r
3 /*! Implementation of DataWrapper for Oracle
\r
5 class OracleDBDataWrapper extends DBDataWrapper{
\r
6 private $last_id=""; //id of previously inserted record
\r
7 private $insert_operation=false; //flag of insert operation
\r
9 public function query($sql){
\r
10 LogMaster::log($sql);
\r
11 $stm = oci_parse($this->connection,$sql);
\r
12 if ($stm===false) throw new Exception("Oracle - sql parsing failed\n".oci_error($this->connection));
\r
14 $out = array(0=>null);
\r
15 if($this->insert_operation){
\r
16 oci_bind_by_name($stm,":outID",$out[0],999);
\r
17 $this->insert_operation=false;
\r
21 $mode = ($this->is_record_transaction() || $this->is_global_transaction())?OCI_DEFAULT:OCI_COMMIT_ON_SUCCESS;
\r
22 $res=oci_execute($stm,$mode);
\r
23 if ($res===false) throw new Exception("Oracle - sql execution failed\n".oci_error($this->connection));
\r
25 $this->last_id=$out[0];
\r
30 public function get_next($res){
\r
31 $data = oci_fetch_assoc($res);
\r
32 if (array_key_exists("VALUE",$data))
\r
33 $data["value"]=$data["VALUE"];
\r
37 protected function get_new_id(){
\r
39 Oracle doesn't support identity or auto-increment fields
\r
40 Insert SQL returns new ID value, which stored in last_id field
\r
42 return $this->last_id;
\r
45 protected function insert_query($data,$request){
\r
46 $sql = parent::insert_query($data,$request);
\r
47 $this->insert_operation=true;
\r
48 return $sql." returning ".$this->config->id["db_name"]." into :outID";
\r
51 protected function select_query($select,$from,$where,$sort,$start,$count){
\r
52 $sql="SELECT ".$select." FROM ".$from;
\r
53 if ($where) $sql.=" WHERE ".$where;
\r
54 if ($sort) $sql.=" ORDER BY ".$sort;
\r
55 if ($start || $count)
\r
56 $sql="SELECT * FROM ( select /*+ FIRST_ROWS(".$count.")*/dhx_table.*, ROWNUM rnum FROM (".$sql.") dhx_table where ROWNUM <= ".($count+$start)." ) where rnum >".$start;
\r
60 public function escape($data){
\r
62 as far as I can see the only way to escape data is by using oci_bind_by_name
\r
63 while it is neat solution in common case, it conflicts with existing SQL building logic
\r
64 fallback to simple escaping
\r
66 return str_replace("'","''",$data);
\r
69 public function begin_transaction(){
\r
70 //auto-start of transaction
\r
72 public function commit_transaction(){
\r
73 oci_commit($this->connection);
\r
75 public function rollback_transaction(){
\r
76 oci_rollback($this->connection);
\r