Esempio n. 1
0
 public function setFieldDef($obj, $old, $new, $def = null, $after = null)
 {
     $obj = $this->_fmtObj($obj);
     sooh_dbErr::$maskSkipTheseError = array(sooh_dbErr::fieldNotExists => true, sooh_dbErr::fieldExists => true);
     $after = empty($after) ? '' : ' after ' . $after;
     if ($new == null) {
         $this->_query('alter table ' . $obj->fullname . ' drop ' . $old);
     } elseif ($old == null) {
         $this->_query('alter table ' . $obj->fullname . ' add ' . $new . ' ' . $def . $after);
     } else {
         $this->_query('alter table ' . $obj->fullname . ' change ' . $old . ' ' . $new . ' ' . $def . $after);
     }
 }
Esempio n. 2
0
 protected function _query($sql)
 {
     if ($sql == null) {
         if (empty($this->_lastCmd)) {
             throw new \ErrorException('empty sql given');
         }
         $orderby = array();
         $groupby = array();
         if (!empty($this->_lastCmd->orderby)) {
             $arr = explode(' ', trim($this->_lastCmd->orderby));
             $mx = count($arr);
             for ($i = 0; $i < $mx; $i += 2) {
                 $k = $arr[$i];
                 $v = $arr[$i + 1];
                 switch ($k) {
                     case 'rsort':
                         $orderby[] = $v . ' desc';
                         break;
                     case 'sort':
                         $orderby[] = $v;
                         break;
                     case 'groupby':
                     case 'group':
                         $groupby[] = $v;
                         break;
                     default:
                         $err = new \ErrorException('unsupport:' . $orderby);
                         sooh_trace::exception($err);
                         throw $err;
                 }
             }
         }
         $this->_lastCmd->dowhat = strtolower($this->_lastCmd->dowhat);
         switch ($this->_lastCmd->dowhat) {
             case 'select':
                 $sql = 'select ';
                 if (is_array($this->_lastCmd->fromAndSize) && $this->_lastCmd->fromAndSize[1] > 0) {
                     $sql .= ' top ' . $this->_lastCmd->fromAndSize[1] . ' ';
                     if ($this->_lastCmd->fromAndSize[0] !== 0) {
                         if (is_array($this->_lastCmd->pkey) && sizeof($this->_lastCmd->pkey) > 1) {
                             throw new \ErrorException("multi-pkey not support in mssql for limit");
                         }
                         if (is_array($this->_lastCmd->pkey)) {
                             $pkey = key($this->_lastCmd->pkey);
                             if (is_int($pkey)) {
                                 $pkey = current($this->_lastCmd->pkey);
                             }
                         } else {
                             if (empty($this->_lastCmd->pkey)) {
                                 $pkey = 'Id';
                             } else {
                                 if (is_string($this->_lastCmd->pkey)) {
                                     $pkey = $this->_lastCmd->pkey;
                                 } else {
                                     throw new \ErrorException("invalid pkey  in mssql found for limit");
                                 }
                             }
                         }
                         $limit = "{$pkey} NOT IN (SELECT TOP {$this->_lastCmd->fromAndSize[0]} {$pkey} FROM {$this->_lastCmd->tablenamefull} __WHERE__";
                         if (!empty($orderby)) {
                             $limit .= ' order by ' . implode(',', $orderby);
                         }
                         $limit .= ")";
                         //throw new \ErrorException('todo: 获取并缓存主键');//SELECT TOP 10 * FROM sql WHERE ( code NOT IN (SELECT TOP 20 code FROM TestTable ORDER BY id))
                     }
                 }
                 $sql .= $this->_fmtField($this->_lastCmd->field) . ' from ' . $this->_lastCmd->tablenamefull;
                 break;
             case 'addlog':
             case 'insert':
                 $sql = 'insert into ' . $this->_lastCmd->tablenamefull;
                 $sql .= " (" . implode(',', array_keys($this->_lastCmd->field)) . ") ";
                 $sql .= "values (";
                 foreach ($this->_lastCmd->field as $k => $v) {
                     $sql .= $this->_safe($k, $v) . ',';
                 }
                 $sql = substr($sql, 0, -1) . ")";
                 break;
             case 'update':
                 //update FE_temp.dbo.tb_user set tb_user.timeLastBought = tb_bought.lastBought
                 ////	from FE_temp.dbo.tb_user left join FE_temp.dbo.tb_bought on tb_bought.userIdentifier=tb_user.userIdentifier
                 $sql = 'update ' . $this->_lastCmd->tablenamefull . ' set ' . $this->_fmtField($this->_lastCmd->field);
                 break;
             case 'delete':
                 $sql = 'delete from ' . $this->_lastCmd->tablenamefull;
                 break;
             default:
                 throw new \ErrorException('unsupport sql cmd:' . $this->_lastCmd->dowhat);
         }
         if (!empty($limit)) {
             if (!empty($this->_lastCmd->where)) {
                 $where = substr(trim($this->_lastCmd->where), 5);
                 $limit = str_replace('__WHERE__', ' where ' . $where, $limit);
                 $sql .= ' where (' . $where . ') and (' . $limit . ')';
             } else {
                 $sql .= ' where ' . ($limit = str_replace('__WHERE__', '', $limit));
             }
         } elseif (!empty($this->_lastCmd->where)) {
             $sql .= ' ' . $this->_lastCmd->where;
         }
         if (!empty($this->_lastCmd->orderby)) {
             if (!empty($groupby)) {
                 $sort_group .= ' group by ' . implode(',', $groupby);
             }
             if (!empty($orderby)) {
                 $sort_group .= ' order by ' . implode(',', $orderby);
             }
             $sql .= ' ' . $sort_group;
         }
         $this->_lastCmd->resetForNext();
         $this->_lastCmd->strTrace = '[' . $this->_lastCmd->server . ']' . $sql;
     } else {
         if (is_string($sql)) {
             $this->_lastCmd->resetForNext();
             $this->_lastCmd->strTrace = '[' . $this->_lastCmd->server . ']' . $sql;
         } else {
             $err = new \ErrorException('sql gived is not a string');
             error_log($err->getMessage() . "\n" . $err->getTraceAsString());
             throw $err;
         }
     }
     sooh_broker::pushCmd($this->_lastCmd);
     $skip = sooh_dbErr::$maskSkipTheseError;
     sooh_dbErr::$maskSkipTheseError = array();
     //throw new \ErrorException($sql);
     $rs = sqlsrv_query($this->_connection, $sql);
     $this->_chkErr($skip);
     return $rs;
 }