_conn = @mysql_pconnect($host, $user, $password); if (!is_resource($this->_conn)) throw new Exception("Create connection failed!"); if (false === mysql_select_db($database, $this->_conn)) throw new Exception("Select database failed!"); if ($names != '') { $this->query(" SET NAMES '$names' "); } } public function getVersion($version) { if (!$this->_version) { $sql = "SHOW VARIABLES LIKE 'version';"; $res = $this->query($sql); if ($r = $this->fetch($res)) { // [Variable_name] => version, [Value] => 4.0.26-log $this->_version = $r->Value; } } return $this->_version; } public function insert($tableName, $data) { $sqlTableName = $this->_($tableName); if (!$sqlTableName) throw new Exception("Wrong table name!"); if (is_object($data)) $data = (array)$data; else if (!is_array($data)) throw new Exception("Wrong data type to insert."); $sqlFields = array(); $sqlValues = array(); foreach ($data as $fldName => $fldValue) { $sqlFields[] = "`{$fldName}`"; $sqlValues[] = $this->parseValue($fldValue); } $sqlFields = implode(", ", $sqlFields); $sqlValues = implode(", ", $sqlValues); $sql = "insert into `{$sqlTableName}` ({$sqlFields}) values ({$sqlValues}) "; $this->query($sql); return mysql_insert_id($this->_conn); } public function getById($tableName, $id) { $sqlTableName = $this->_($tableName); $sqlId = (int)$this->_($id); if (!$sqlTableName) throw new Exception("Wrong table name!"); if ($sqlId <= 0) throw new Exception("Wrong record id!"); $sql = "select t.* from `{$sqlTableName}` as t where t.`ID`='{$sqlId}' "; $res = $this->query($sql); if ($r = $this->fetch($res)) { return $r; } else throw new Exception("Nie naleziono rekordu nr '{$sqlId}'"); } public function parseValue($value) { $parsedValue = 'NULL'; if ('NOW()' == strtoupper($value)) { $parsedValue = 'NOW()'; } else if ('GeomFromText' == substr($value, 0, strlen('GeomFromText'))) { } else { $parsedValue = "'" . $this->_($value) . "'"; } return $parsedValue; } public function query($query) { $null = null; if (!$this->_conn) throw new Exception("Connection not exists!"); $res = mysql_query($query, $this->_conn); if (!$res) { $exception = new DataSourceException("Query error: " . mysql_error($this->_conn), mysql_errno($this->_conn)); $exception->setQuery($query); throw $exception; } return $res; } public function fetch($res) { if (!$res) return null; return mysql_fetch_object($res); } public function _($str) { //return $this->_pdo->quote($str);// TODO: PDO return mysql_real_escape_string($str, $this->_conn); } function fetch_row( $res ) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $ret = null; if ($res) $ret = mysql_fetch_row( $res ); return $ret; } function fetch_assoc( $res ) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $ret = null; if ($res) $ret = mysql_fetch_assoc( $res ); return $ret; } function fetch_array($res) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $ret = null; if ($res) $ret = mysql_fetch_array($res); return $ret; } function count( $res ) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); return mysql_num_rows( $res ); } function num_rows( $res ) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); return mysql_num_rows( $res ); } function insert_id() { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); return mysql_insert_id( $this->_conn ); } function show_tables($table=null) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); if(!empty($table)) $sql="show tables like '".$table."'"; else $sql="show tables"; $res = $this->query($sql); return $res; } function describe_table($table) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $sql='SHOW FIELDS FROM `'.$table.'`'; $res = $this->query($sql); return $res; } function describe_table_value($table) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $res = self::describe_table($table); while($h=self::fetch($res)) { $result[$h->Field]=$h; } return $result; } function show_index($table,$only_primary_flag=false) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $sql="show index from `".$table."`"; if($only_primary_flag) $sql.=" WHERE `Key_name` = 'PRIMARY' "; $res=self::query($sql); return $res; } function show_index_value($table) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $res=self::show_index($table,true); while($h=self::fetch($res)) { return $h->Column_name; } } function affected_rows($needed_in_psql_only=null) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); return mysql_affected_rows( $this->_conn ); } function error() { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); return "#".mysql_errno($this->_conn).": ".mysql_error($this->_conn); } function errno() { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); return mysql_errno($this->_conn); } /** * @returns int * 1 - changed but without add hist * 2 - changed and add hist * 0 - nothing to change * -1 - sql errors * -2 - error id not exists in DB * -3 - error ID not set * * TODO: sprawdzac czy w hist mozna odczytac aktualny stan, jesli nie to dodac caly rekord do HIST, jako 'procesy-fix-hist-data' */ public function UPDATE_OBJ($table, $sql_obj,$timestamp=null,$skip_author=null) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); $structure=self::describe_table_value($table); //todo to cache optimize $primary=self::show_index_value($table); //todo to cache optimize if (!isset($sql_obj->$primary) || $sql_obj->$primary <= 0) { return -3; } $id = $sql_obj->$primary; // check id record $id exists if (($curr_obj = $this->get_by_id( $table, $sql_obj->$primary )) == null) { return -2; } // check if enything changed $changed = false; $fields_to_change = get_object_vars($sql_obj); foreach ($fields_to_change as $k => $v) { if ($k == $primary) continue; if ($v == $curr_obj->$k) {// === ? unset($sql_obj->$k); } else { $changed = true; } } if ($changed == false) { return 0;// record not changed } $sql_arr = array(); // TODO: add admin columns if exists in table - search in session $admin_col = array(); $admin_col[] = 'A_RECORD_CREATE_DATE'; $admin_col[] = 'A_RECORD_CREATE_AUTHOR'; // ... $sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d-H:i'); // OFF - BUG w _HIST $sql_obj->A_RECORD_UPDATE_DATE = "FROM_UNIXTIME(".$this->get_current_time().")"; $sql_obj->A_RECORD_UPDATE_AUTHOR = User::getName(); foreach (get_object_vars($sql_obj) as $k => $v) { if(!empty($skip_author)) { if($k=='A_RECORD_UPDATE_AUTHOR') continue; if($k=='A_RECORD_UPDATE_DATE') continue; } if (strtoupper($v) == 'NOW()') { $v = 'NOW()'; } else if (strtoupper($v) == 'NULL') { $v = 'NULL'; } else if (substr($v, 0, strlen('GeomFromText')) == 'GeomFromText') { } else { $v = $this->_($v); $v = "'{$v}'"; } $sql_arr [] = "`{$k}`={$v}"; } $sql = "update `{$table}` set ".implode(",", $sql_arr)." where `ID`='{$id}' limit 1; "; $this->query($sql); $returnError = false; $skipDbErrorAddHist = false; if ($this->has_errors()) { $returnError = true; if (1146 == $this->errno()) { $skipDbErrorAddHist = true; } } $returnCode = 0; $affected = $this->affected_rows(); if ($affected || $skipDbErrorAddHist) { $returnCode = 1; $sql_obj->ID_USERS2 = $sql_obj->$primary; unset($sql_obj->$primary); $new_id = $this->ADD_NEW_OBJ("{$table}_HIST", $sql_obj); if ($new_id) { $returnCode += 1; } } if ($returnError) { return -1; } return $returnCode; } function ADD_NEW_OBJ( $table, $sql_obj,$dieonerror=null ) { throw new Exception("Unimplemented Data Source function '" . __FUNCTION__ . "'!"); //TODO to optimize: $structure=self::describe_table_value($table); $primary=self::show_index_value($table); $sql_arr = array(); // TODO: add admin columns if exists in table - search in session $admin_col = array(); $admin_col []= 'ID'; $admin_col []= 'A_RECORD_CREATE_DATE'; $admin_col []= 'A_RECORD_CREATE_AUTHOR'; $admin_col []= 'A_RECORD_UPDATE_DATE'; $admin_col []= 'A_RECORD_UPDATE_AUTHOR'; // ... $sql_arr["`ID`"] = "NULL";// add default value for ID, NULL in all inserts if (substr($table, 0, -5) == '_HIST') { $sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d-H:i'); $sql_obj->A_RECORD_UPDATE_AUTHOR = User::getName(); } else { $sql_obj->A_RECORD_CREATE_DATE = date('Y-m-d-H:i'); $sql_obj->A_RECORD_CREATE_AUTHOR = User::getName(); } foreach (get_object_vars($sql_obj) as $k => $v) { if($k==$primary) $v='0'; else if (strtoupper($v) == 'NOW()') { $v = 'NOW()'; } else if (strtoupper($v) == 'NULL' && substr($table, -5) != '_HIST') { $v = 'NULL'; } else if (substr($v, 0, strlen('GeomFromText')) == 'GeomFromText') { } else { $v = $this->_($v); $v = "'{$v}'"; } $sql_arr ["`{$k}`"] = $v; } $sql = "insert into `{$table}` (".implode(",", array_keys($sql_arr)).") values (".implode(",", array_values($sql_arr))."); "; //error_log($sql); $this->query($sql); if ($this->has_errors()) { if(!empty($dieonerror)) { echo'
db errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($this->get_errors());echo'
'; DEBUG_S(-3,'Bledne zapytanie sql',$sql,__FILE__,__FUNCTION__,__LINE__); } } $ret_id = $this->insert_id(); if (substr($table, -5) == '_HIST') { return $ret_id; } if ($ret_id) { $sql_obj->ID_USERS2 = $ret_id; unset($sql_obj->ID); $new_id_hist = $this->ADD_NEW_OBJ($table . '_HIST', $sql_obj); // error jesli nie udalo sie dodac rekordu do tabeli _HIST } return $ret_id; } }