예제 #1
0
 /**
  * Return request sql.
  *
  * @param \Zend\Db\Sql\SqlInterface $request
  *
  * @return string
  */
 public function printSql(\Zend\Db\Sql\SqlInterface $request)
 {
     return $request->getSqlString($this->tableGateway->getAdapter()->getPlatform());
 }
예제 #2
0
 public function getQueryAsSqlString(SqlInterface $query)
 {
     return $query->getSqlString($this->getPlatform());
 }
예제 #3
0
 public function execute(\Zend\Db\Sql\SqlInterface $query)
 {
     /* recycle? */
     if ($query instanceof Sql\Recycle) {
         /* get recycle target data */
         if ($target = $query->getSqlString()) {
             /* init */
             $count = $target->set->count();
             $saved = 0;
             /* table, primary, flag field exists? */
             if ($target->table && $target->primary && $target->flag) {
                 /* any data to save? */
                 if ($count > 0) {
                     /* select existing */
                     $select = $this->select()->from($target->table, array($target->primary, $target->flag))->where($target->where);
                     if ($existing = $this->fetchAll($select)) {
                         /* loop existing and update */
                         foreach ($existing as $row) {
                             /* all new record saved? */
                             if ($saved >= $count) {
                                 /* flag remaining records to unused */
                                 $update = $this->update()->table($target->table)->set(array($target->flag => $query::FLAG_UNUSED))->where(array($target->primary => $row[$target->primary]));
                                 $this->execute($update);
                             } else {
                                 /* overwrite existing record with new data */
                                 $update = $this->update()->table($target->table)->set(array_merge($target->set->item($saved)->pull(array_merge(array($target->primary, $target->flag), $target->exclude)), array($target->flag => $query::FLAG_USED)))->where(array($target->primary => $row[$target->primary]));
                                 if ($this->execute($update)) {
                                     /* assign new id to updated item */
                                     $target->set->item($saved)->push(array($target->primary => $row[$target->primary]));
                                 }
                                 /* increment saved */
                                 $saved++;
                             }
                             //all saved
                         }
                         //each existing
                     }
                     //fetch
                     /* any remaining unsaved records? */
                     if ($saved < $count) {
                         for ($index = $saved; $index < $count; $index++) {
                             /* insert remaining record */
                             $insert = $this->insert()->into($target->table)->values(array_merge($target->set->item($index)->pull(array_merge(array($target->primary, $target->flag), $target->exclude)), array($target->flag => $query::FLAG_USED)));
                             if ($id = $this->execute($insert)) {
                                 /* assign new id to set item */
                                 $target->set->item($index)->push(array($target->primary => $id));
                             }
                         }
                         //each remaining record
                     }
                     //remaining?
                     /* return! */
                     return $saved > 0;
                 } else {
                     /* flag related existing record to unused */
                     $update = $this->update()->table($target->table)->set(array($target->flag => $query::FLAG_UNUSED))->where($target->where);
                     return $this->execute($update);
                 }
                 //any data to save
             }
             //target primary check
         }
         //get data
         /* default return false */
         return false;
         /* store statement */
     } elseif ($query instanceof Sql\Store) {
         /* get store data */
         $target = $query->getSqlString();
         $values = $target->values;
         /* get id if any */
         $id = null;
         if (isset($values[$target->primary])) {
             $id = $values[$target->primary];
         }
         /* have id? update */
         if ($id) {
             /* unset id */
             unset($values[$target->primary]);
             /* generate update statement */
             $update = $this->update()->table($target->into)->set($values)->where(array($target->primary => $id));
             /* execute update! */
             if ($this->execute($update)) {
                 return $id;
             }
             /* no id, insert */
         } else {
             /* unset id if its an autoincrement */
             if ($target->auto == true) {
                 unset($values[$target->primary]);
             }
             /* generate insert */
             $insert = $this->insert()->into($target->into)->values($values);
             /* execute insert */
             return $this->execute($insert);
         }
         /* return false as default */
         return false;
         /* other normal statement */
     } else {
         /* prepare & execute */
         $statement = $this->_sql->prepareStatementForSqlObject($query);
         $result = $statement->execute();
         /* insert, return last generated value (auto increment) */
         if ($result && $query instanceof Sql\Insert) {
             /* oci8? */
             if ($this->_driver == self::DRIVER_OCI8) {
                 /* has ai field? */
                 if (($field = $query->hasAutoincrement()) !== false) {
                     if ($id = $query->{$field}) {
                         return $id;
                     }
                 }
             } else {
                 /* others - mysql */
                 if ($id = $this->_db->getDriver()->getLastGeneratedValue()) {
                     return $id;
                 }
             }
         }
         /* return result */
         return $result;
     }
     //recycle or not
 }