X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FManaged_DataObject.php;h=0857bb11f6c277612b69f809c749c93acd61400a;hb=a2d8305e2159f60df979898983b5fe4ccf166a16;hp=68de8922ce20f2cc217cf29089004e1e086f519c;hpb=e94017a552a9487d35f160c75f98d00ff2d5c236;p=quix0rs-gnu-social.git diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index 68de8922ce..0857bb11f6 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -409,8 +409,61 @@ abstract class Managed_DataObject extends Memcached_DataObject throw new Exception('Empty ID for object! (not inserted yet?).'); } - // FIXME: How about forcing to return an int? Or will that overflow eventually? - return $this->id; + return intval($this->id); + } + + /** + * WARNING: Only use this on Profile and Notice. We should probably do + * this with traits/"implements" or whatever, but that's over the top + * right now, I'm just throwing this in here to avoid code duplication + * in Profile and Notice classes. + */ + public function getAliases() + { + return array_keys($this->getAliasesWithIDs()); + } + + public function getAliasesWithIDs() + { + $aliases = array(); + $aliases[$this->getUri()] = $this->getID(); + + try { + $aliases[$this->getUrl()] = $this->getID(); + } catch (InvalidUrlException $e) { + // getUrl failed because no valid URL could be returned, just ignore it + } + + if (common_config('fix', 'fancyurls')) { + /** + * Here we add some hacky hotfixes for remote lookups that have been taught the + * (at least now) wrong URI but it's still obviously the same user. Such as: + * - https://site.example/user/1 even if the client requests https://site.example/index.php/user/1 + * - https://site.example/user/1 even if the client requests https://site.example//index.php/user/1 + * - https://site.example/index.php/user/1 even if the client requests https://site.example/user/1 + * - https://site.example/index.php/user/1 even if the client requests https://site.example///index.php/user/1 + */ + foreach ($aliases as $alias=>$id) { + try { + // get a "fancy url" version of the alias, even without index.php/ + $alt_url = common_fake_local_fancy_url($alias); + // store this as well so remote sites can be sure we really are the same profile + $aliases[$alt_url] = $id; + } catch (Exception $e) { + // Apparently we couldn't rewrite that, the $alias was as the function wanted it to be + } + + try { + // get a non-"fancy url" version of the alias, i.e. add index.php/ + $alt_url = common_fake_local_nonfancy_url($alias); + // store this as well so remote sites can be sure we really are the same profile + $aliases[$alt_url] = $id; + } catch (Exception $e) { + // Apparently we couldn't rewrite that, the $alias was as the function wanted it to be + } + } + } + return $aliases; } // 'update' won't write key columns, so we have to do it ourselves. @@ -420,12 +473,16 @@ abstract class Managed_DataObject extends Memcached_DataObject * @param DB_DataObject &$orig Must be "instanceof" $this * @param string $pid Primary ID column (no escaping is done on column name!) */ - public function updateWithKeys(Managed_DataObject $orig, $pid='id') + public function updateWithKeys(Managed_DataObject $orig, $pid=null) { if (!$orig instanceof $this) { throw new ServerException('Tried updating a DataObject with a different class than itself.'); } + if ($this->N <1) { + throw new ServerException('DataObject must be the result of a query (N>=1) before updateWithKeys()'); + } + // do it in a transaction $this->query('BEGIN'); @@ -452,11 +509,23 @@ abstract class Managed_DataObject extends Memcached_DataObject return true; } - $qry = sprintf('UPDATE %1$s SET %2$s WHERE %3$s = %4$s', + if ($pid === null) { + $schema = static::schemaDef(); + $pid = $schema['primary key']; + unset($schema); + } + $pidWhere = array(); + foreach((array)$pid as $pidCol) { + $pidWhere[] = sprintf('%1$s = %2$s', $pidCol, $this->_quote($orig->$pidCol)); + } + if (empty($pidWhere)) { + throw new ServerException('No primary ID column(s) set for updateWithKeys'); + } + + $qry = sprintf('UPDATE %1$s SET %2$s WHERE %3$s', common_database_tablename($this->tableName()), implode(', ', $parts), - $pid, - $this->_quote($orig->$pid)); + implode(' AND ', $pidWhere)); $result = $this->query($qry); if ($result === false) { @@ -500,4 +569,26 @@ abstract class Managed_DataObject extends Memcached_DataObject $object->getID(), common_date_iso8601($created)); } + + protected function onInsert() + { + // NOOP by default + } + + protected function onUpdate($dataObject=false) + { + // NOOP by default + } + + public function insert() + { + $this->onInsert(); + return parent::insert(); + } + + public function update($dataObject=false) + { + $this->onUpdate($dataObject); + return parent::update($dataObject); + } }