PageRenderTime 57ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/aoliz/core/include/AloneDB.php

http://phpfor.googlecode.com/
PHP | 268 lines | 261 code | 7 blank | 0 comment | 3 complexity | 016a8367292259c7b57fdf45172d4f3b MD5 | raw file
  1. <?php
  2. class AloneDB{
  3. var $_rw_lnk = null;
  4. var $_ro_lnk = null;
  5. var $prefix = 'sdb_';
  6. function AloneDB(&$system){
  7. $this->system = $system;
  8. }
  9. function insert($table,$data){
  10. $rs = $this->exec('select * from '.$table.' where 0=1');
  11. if($this->exec($this->getInsertSQL($rs))){
  12. return $this->lastinsertid();
  13. }else{
  14. return false;
  15. }
  16. }
  17. function replace($table,$data,$whereFilter){
  18. }
  19. function update($table,$data,$whereFilter){
  20. }
  21. function &exec($sql , $skipModifiedMark = false,$db_lnk=null){
  22. if(!$skipModifiedMark && preg_match('/(?:(delete\s+from)|(insert\s+into)|(update))\s+([]0-9a-z_:"`.@[-]*)/is', $sql, $match)){
  23. $table = strtoupper(trim(str_replace('`','',str_replace('"','',str_replace("'",'',$match[4])))));
  24. $this->_modified($table);
  25. if($table=='SDB_GOODS'){
  26. $whereClause = $this->_whereClause($sql);
  27. if (strlen($whereClause) > 0){
  28. $modifi_sql = 'UPDATE `sdb_goods` SET last_modify='.time();
  29. $modifi_sql .= ' WHERE '.$whereClause;
  30. $this->exec($modifi_sql,1);
  31. }
  32. }
  33. }
  34. if(!is_resource($db_lnk)){
  35. if($this->_rw_lnk){
  36. $db_lnk = &$this->_rw_lnk;
  37. }else{
  38. $db_lnk = &$this->_rw_conn();
  39. }
  40. }
  41. if($this->prefix!='sdb_'){
  42. $sql = preg_replace('/([`\s\(,])(sdb_)([a-z\_]+)([`\s\.]{0,1})/is',"\${1}".$this->prefix."\\3\\4",$sql);
  43. }
  44. if($rs = mysql_query($sql,$db_lnk)){
  45. $db_result = array('rs'=>&$rs,'sql'=>$sql);
  46. return $db_result;
  47. }else{
  48. trigger_error($sql.':'.mysql_error($db_lnk),E_USER_WARNING);
  49. return false;
  50. }
  51. }
  52. function &select($sql){
  53. if($this->_rw_lnk){
  54. $db_lnk = &$this->_rw_lnk;
  55. }else{
  56. if($this->_ro_lnk){
  57. $db_lnk = &$this->_ro_lnk;
  58. }else{
  59. $db_lnk = &$this->_ro_conn();
  60. }
  61. }
  62. if($this->system->_co_depth>0){
  63. if (preg_match('/FROM\s+([]0-9a-z_:"`.@[-]*)/is', $sql, $tableName)){
  64. $this->system->checkExpries($tableName[1]);
  65. }
  66. }
  67. $rs = $this->exec($sql,true,$db_lnk);
  68. $data = array();
  69. while($row = mysql_fetch_assoc($rs['rs'])){
  70. $data[]=$row;
  71. }
  72. mysql_free_result($rs['rs']);
  73. return $data;
  74. }
  75. function &selectrow($sql){
  76. $row = &$this->selectlimit($sql,1,0);
  77. return $row[0];
  78. }
  79. function &selectlimit($sql,$limit=10,$offset=0){
  80. if ($offset >= 0 || $limit >= 0){
  81. $offset = ($offset >= 0) ? $offset . "," : '';
  82. $limit = ($limit >= 0) ? $limit : '18446744073709551615';
  83. $sql .= ' LIMIT ' . $offset . ' ' . $limit;
  84. }
  85. $data = &$this->select($sql);
  86. return $data;
  87. }
  88. function &_ro_conn(){
  89. if(defined('DB_SLAVE_HOST')){
  90. $this->_ro_lnk = &$this->_connect(DB_SLAVE_HOST,DB_SLAVE_USER,DB_SLAVE_PASSWORD,DB_SLAVE_NAME);
  91. }elseif($this->_rw_lnk){
  92. $this->_ro_lnk = &$this->_rw_lnk;
  93. }else{
  94. $this->_ro_lnk = &$this->_rw_conn();
  95. }
  96. return $this->_ro_lnk;
  97. }
  98. function &getRows($rs,$row=10){
  99. $i=0;
  100. $data = array();
  101. while(($row = mysql_fetch_assoc($rs['rs'])) && $i++<$row){
  102. $data[]=$row;
  103. }
  104. return $data;
  105. }
  106. function &_rw_conn(){
  107. $this->_rw_lnk = &$this->_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);
  108. return $this->_rw_lnk;
  109. }
  110. function &_connect($host,$user,$passwd,$dbname){
  111. if(constant('DB_PCONNECT')){
  112. $lnk = mysql_pconnect($host,$user,$passwd);
  113. }else{
  114. $lnk = mysql_connect($host,$user,$passwd);
  115. }
  116. if(!$lnk){
  117. trigger_error(__('???????:').mysql_error().E_USER_ERROR);
  118. }
  119. mysql_select_db( $dbname, $lnk );
  120. if(preg_match('/[0-9\.]+/is',mysql_get_server_info($lnk),$match)){
  121. $dbver = $match[0];
  122. if(version_compare($dbver,'4.1.1','<')){
  123. define('DB_OLDVERSION',1);
  124. $this->dbver = 3;
  125. }else{
  126. if(constant('DB_CHARSET')){
  127. mysql_query('SET NAMES \''.DB_CHARSET.'\'',$lnk);
  128. }
  129. if(!version_compare($dbver,'6','<')){
  130. $this->dbver = 6;
  131. }
  132. }
  133. }
  134. return $lnk;
  135. }
  136. /*--------------------------------*/
  137. function count($sql) {
  138. $sql = preg_replace(array(
  139. '/(.*\s)LIMIT .*/i',
  140. '/^select\s+(.+?)\bfrom\b/is'
  141. ),array(
  142. '\\1',
  143. 'select count(*) as c from'
  144. ),trim($sql));
  145. $row = $this->select($sql);
  146. return intval($row[0]['c']);
  147. }
  148. function GetUpdateSQL(&$rs, $data, $InsertIfNoResult = false,$insertData=null,$ignore=false) {
  149. if(!function_exists('db_get_update_sql')){
  150. require('core/db.tools.php');
  151. // require(CORE_INCLUDE_DIR.'/core/db.tools.php');
  152. }
  153. return db_get_update_sql($this,$rs, $data, $InsertIfNoResult,$insertData,$ignore);
  154. }
  155. function GetInsertSQL(&$rs, $data,$autoup=false) {
  156. if(!function_exists('db_get_insert_sql')){
  157. require(CORE_INCLUDE_DIR.'/core/db.tools.php');
  158. }
  159. return db_get_insert_sql($this,$rs, $data,$autoup);
  160. }
  161. function _modified($table){
  162. if(substr($table,-11)!='op_sessions' && $this->system->cache){
  163. $this->system->cache->setModified($table);
  164. }
  165. if($table=='SDB_GOODS' || $table=='SDB_GTASK'){
  166. register_shutdown_function_once(array('trading/goods','update_gtask'));
  167. }
  168. }
  169. /**
  170. * _whereClause
  171. *
  172. * @param mixed $queryString
  173. * @access protected
  174. * @return void
  175. */
  176. function _whereClause($queryString){
  177. preg_match('/\sWHERE\s(.*)/is', $queryString, $whereClause);
  178. $discard = false;
  179. if ($whereClause) {
  180. if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard));
  181. else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard));
  182. else preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard);
  183. } else
  184. $whereClause = array(false,false);
  185. if ($discard)
  186. $whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1]));
  187. return $whereClause[1];
  188. }
  189. function quote($string){
  190. if(!($result=mysql_real_escape_string($string))){
  191. $result=$string;
  192. }
  193. $string=addslashes($string);
  194. return "'" . $string . "'";
  195. }
  196. function lastinsertid(){
  197. $sql = 'SELECT LAST_INSERT_ID() AS lastinsertid';
  198. $rs = $this->exec($sql,true,$this->_rw_lnk);
  199. $row = mysql_fetch_assoc($rs['rs']);
  200. mysql_free_result($rs['rs']);
  201. return $row['lastinsertid'];
  202. }
  203. function &query($sql , $skipModifiedMark = false,$db_lnk=null){
  204. $rs = $this->exec($sql , $skipModifiedMark,$db_lnk);
  205. return $rs;
  206. }
  207. function affect_row(){
  208. return mysql_affected_rows();
  209. }
  210. function errorinfo(){
  211. return mysql_error();
  212. }
  213. function splitsql($sql){
  214. if(!function_exists('database_split_sql')){
  215. require(CORE_INCLUDE_DIR.'/core/db.split_sql.php');
  216. }
  217. return database_split_sql($sql,$this);
  218. }
  219. function selectPager($queryString,$pageStart=null,$pageLimit=null) {
  220. $_data['total'] = $this->count($queryString);
  221. $_data['page'] = ceil($_data['total']/$pageLimit);
  222. if($pageLimit==null) {
  223. $_data = &$this->select($queryString);
  224. } else {
  225. $_data['data'] = $this->selectLimit($queryString, $pageLimit, $pageStart*$pageLimit);
  226. }
  227. return $_data;
  228. }
  229. }