/** @override */ public function deleteItems(EarthIT_Schema_ResourceClass $rc, EarthIT_Storage_ItemFilter $filter) { $params = array(); $params['table'] = $this->sqlGenerator->rcTableExpression($rc); $filterSql = $filter->toSql('stuff', $this->dbObjectNamer, new EarthIT_DBC_ParamsBuilder($params)); $this->sqlRunner->doQuery("DELETE FROM {table} AS stuff\n" . "WHERE {$filterSql}", $params); }
public function updateItems(array $updatedFieldValues, EarthIT_Schema_ResourceClass $rc, EarthIT_Storage_ItemFilter $filter, array $options = array()) { $rcName = $rc->getName(); $matchedKeys = array(); if (isset($this->items[$rcName])) { foreach ($this->items[$rcName] as $k => $item) { if ($filter->matches($item)) { $matchedKeys[] = $k; } } } $updated = array(); foreach ($matchedKeys as $k) { $item = $this->items[$rcName][$k]; $item = $updatedFieldValues + $item; $id = EarthIT_Storage_Util::itemId($item, $rc); if ($id !== null and $id !== $k) { // TODO: Look at options to determine if updating is allowed // to overwrite other items unset($this->items[$rcName][$k]); $this->items[$rcName][$id] = $item; $k = $id; } $updated[$k] = $item; } return $updated; }
public function makeUpdateQueries(array $updates, EarthIT_Storage_ItemFilter $filter, EarthIT_Schema_ResourceClass $rc, array $options = array()) { if (count($updates) == 0) { throw new Exception("Not updating anything!"); // Maybe we could allow that? In which case this just becomes a search. // Would have to construct the query differently in that case. } // TODO: Mind the options. // This code was copied from _bulkPatchyQueries // and committed as soon as the unit test passed. // It's probably a bit of a mess. // Refactor it if you want to. $params = array(); $PB = new EarthIT_DBC_ParamsBuilder($params); $params['table'] = $this->rcTableExpression($rc); $conditions = $filter->toSql('stuff', $this->dbObjectNamer, $PB); $storableFields = EarthIT_Storage_Util::storableFields($rc); $outputColumnValueSqls = array(); $inputColumnValueSqls = array(); $columnParamNames = array(); $fieldsByColumnName = array(); $columnUpdates = array(); foreach ($storableFields as $fn => $f) { $columnName = $this->dbObjectNamer->getColumnName($rc, $f); $fieldColumnNames[$fn] = $columnName; $fieldsByColumnName[$columnName] = $f; $columnParamName = $PB->newParam('c_'); $columnParamNames[$columnName] = $columnParamName; $params[$columnParamName] = new EarthIT_DBC_SQLIdentifier($columnName); $columnValueParamName = $PB->newParam("v_"); $columnValueParamNames[$columnName] = $columnValueParamName; if (array_key_exists($fn, $updates)) { $params[$columnValueParamName] = $updates[$fn]; $columnUpdates[$columnName] = null; // Value never actually gets used kekeke } $columnValueSelectSql = $this->dbInternalToExternalValueSql($f, $rc, "{{$columnParamName}}"); if ($columnValueSelectSql !== "{{$columnParamName}}") { $columnValueSelectSql .= "AS {{$columnParamName}}"; } $outputColumnValueSqls[$columnName] = $columnValueSelectSql; $inputColumnValueSqls[$columnName] = $this->dbExternalToInternalValueSql($f, $rc, "{{$columnValueParamName}}"); } $sets = $this->encodeColumnValuePairs($columnUpdates, $columnParamNames, $columnValueParamNames, $rc, $fieldsByColumnName); $sql = "UPDATE {table} AS stuff\n" . "SET\n\t" . implode(",\n\t", $sets) . "\n" . "WHERE {$conditions}\n" . "RETURNING\n\t" . implode(",\n\t", $outputColumnValueSqls); $returnSaved = true; // TODO: Only if requested by options return array(new EarthIT_Storage_StorageQuery($sql, $params, $returnSaved)); }