From 0429a52c6e8bf135b03a86398c1aee95ddebea88 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 9 Mar 2011 18:00:24 -0800 Subject: [PATCH] Update to use new Managed_dataobject --- .../ExtendedProfile/ExtendedProfilePlugin.php | 2 - plugins/ExtendedProfile/Profile_detail.php | 193 ++++++------------ plugins/ExtendedProfile/extendedprofile.php | 4 +- .../profiledetailsettingsaction.php | 17 +- 4 files changed, 80 insertions(+), 136 deletions(-) diff --git a/plugins/ExtendedProfile/ExtendedProfilePlugin.php b/plugins/ExtendedProfile/ExtendedProfilePlugin.php index 3f541c0008..933b43cad7 100644 --- a/plugins/ExtendedProfile/ExtendedProfilePlugin.php +++ b/plugins/ExtendedProfile/ExtendedProfilePlugin.php @@ -95,8 +95,6 @@ class ExtendedProfilePlugin extends Plugin $schema = Schema::get(); $schema->ensureTable('profile_detail', Profile_detail::schemaDef()); - // @hack until key definition support is merged - Profile_detail::fixIndexes($schema); return true; } diff --git a/plugins/ExtendedProfile/Profile_detail.php b/plugins/ExtendedProfile/Profile_detail.php index 4b193e54ee..ebbeb86054 100644 --- a/plugins/ExtendedProfile/Profile_detail.php +++ b/plugins/ExtendedProfile/Profile_detail.php @@ -23,7 +23,7 @@ if (!defined('STATUSNET')) { /** * DataObject class to store extended profile fields. Allows for storing - * multiple values per a "field" (field property is not unique). + * multiple values per a "field_name" (field_name property is not unique). * * Example: * @@ -36,166 +36,105 @@ if (!defined('STATUSNET')) { * Profile_detail objects, each named 'phone_number' like this: * * $phone1 = new Profile_detail(); - * $phone1->field = 'phone_number'; + * $phone1->field_name = 'phone_number'; * $phone1->rel = 'home'; - * $phone1->field_index = 1; * $phone1->value = '510-384-1992'; + * $phone1->value_index = 1; * * $phone1 = new Profile_detail(); - * $phone1->field = 'phone_number'; + * $phone1->field_name = 'phone_number'; * $phone1->rel = 'mobile'; - * $phone1->field_index = 2; * $phone1->value = '510-719-1139'; + * $phone1->value_index = 2; * * $phone1 = new Profile_detail(); - * $phone1->field = 'phone_number'; + * $phone1->field_name = 'phone_number'; * $phone1->rel = 'work'; - * $phone1->field_index = 3; - * $phone1->value = '415-231-1121'; + * $phone1->field_value = '415-231-1121'; + * $phone1->value_index = 3; * */ -class Profile_detail extends Memcached_DataObject +class Profile_detail extends Managed_DataObject { public $__table = 'profile_detail'; public $id; - - public $profile_id; + public $profile_id; // profile this is for public $rel; // detail for some field types; eg "home", "mobile", "work" for phones or "aim", "irc", "xmpp" for IM - public $field; - + public $field_name; // name public $value; // primary text value - public $field_index; // relative ordering of multiple values in the same field - + public $value_index; // relative ordering of multiple values in the same field public $ref_profile; // for people types, allows pointing to a known profile in the system - public $created; public $modified; - public /*static*/ function staticGet($k, $v=null) + /** + * Get an instance by key + * + * This is a utility method to get a single instance with a given key value. + * + * @param string $k Key to use to lookup + * @param mixed $v Value to lookup + * + * @return User_greeting_count object found, or null for no hits + * + */ + + function staticGet($k, $v=null) { - return parent::staticGet(__CLASS__, $k, $v); + return Memcached_DataObject::staticGet('Profile_detail', $k, $v); } /** - * return table definition for DB_DataObject + * Get an instance by compound key * - * DB_DataObject needs to know something about the table to manipulate - * instances. This method provides all the DB_DataObject needs to know. + * This is a utility method to get a single instance with a given set of + * key-value pairs. Usually used for the primary key for a compound key; thus + * the name. + * + * @param array $kv array of key-value mappings + * + * @return Bookmark object found, or null for no hits * - * @return array array of column definitions */ - function table() + function pkeyGet($kv) { - return array('id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, - - 'profile_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, - 'field' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, - 'field_index' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, - - 'value' => DB_DATAOBJECT_STR, - 'rel' => DB_DATAOBJECT_STR, - 'ref_profile' => DB_DATAOBJECT_INT, - - 'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL, - 'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL); + return Memcached_DataObject::pkeyGet('Profile_detail', $kv); } - /** - * Database schema setup - * - * @see Schema - * @see ColumnDef - * - * @return boolean hook value; true means continue processing, false means stop. - */ - static function schemaDef() { - return array(new ColumnDef('id', 'integer', - null, false, 'PRI'), - - // @fixme need a unique index on these three - new ColumnDef('profile_id', 'integer', - null, false), - new ColumnDef('field', 'varchar', - 16, false), - new ColumnDef('field_index', 'integer', - null, false), - - new ColumnDef('value', 'text', - null, true), - new ColumnDef('rel', 'varchar', - 16, true), - new ColumnDef('ref_profile', 'integer', - null, true), - - new ColumnDef('created', 'datetime', - null, false), - new ColumnDef('modified', 'datetime', - null, false)); - } - - /** - * Temporary hack to set up the compound index, since we can't do - * it yet through regular Schema interface. (Coming for 1.0...) - * - * @param Schema $schema - * @return void - */ - static function fixIndexes($schema) - { - try { - // @fixme this won't be a unique index... SIGH - $schema->createIndex('profile_detail', array('profile_id', 'field', 'field_index')); - } catch (Exception $e) { - common_log(LOG_ERR, __METHOD__ . ': ' . $e->getMessage()); - } - } - - /** - * Return key definitions for DB_DataObject - * - * DB_DataObject needs to know about keys that the table has; this function - * defines them. - * - * @return array key definitions - */ - - function keys() - { - return array_keys($this->keyTypes()); - } - - /** - * Return key definitions for Memcached_DataObject - * - * Our caching system uses the same key definitions, but uses a different - * method to get them. - * - * @return array key definitions - */ - - function keyTypes() - { - // @fixme keys - // need a sane key for reverse lookup too - return array('id' => 'K'); - } - - /** - * Get the sequence key - * - * Returns the first serial column defined in the table, if any. - * - * @access private - * @return array (column,use_native,sequence_name) - */ - - function sequenceKey() - { - return array('id', true); + return array( + 'description' + => 'Additional profile details for the ExtendedProfile plugin', + 'fields' => array( + 'id' => array('type' => 'serial', 'not null' => true), + 'profile_id' => array('type' => 'int', 'not null' => true), + 'field_name' => array( + 'type' => 'varchar', + 'length' => 16, + 'not null' => true + ), + 'value_index' => array('type' => 'int'), + 'field_value' => array('type' => 'text'), + 'rel' => array('type' => 'varchar', 'length' => 16), + 'rel_profile' => array('type' => 'int'), + 'created' => array( + 'type' => 'datetime', + 'not null' => true + ), + 'modified' => array( + 'type' => 'timestamp', + 'not null' => true + ), + ), + 'primary key' => array('id'), + 'unique keys' => array( + 'profile_detial_profile_id_field_name_value_index' + => array('profile_id', 'field_name', 'value_index'), + ) + ); } } diff --git a/plugins/ExtendedProfile/extendedprofile.php b/plugins/ExtendedProfile/extendedprofile.php index 61a66b4b43..5731c808ae 100644 --- a/plugins/ExtendedProfile/extendedprofile.php +++ b/plugins/ExtendedProfile/extendedprofile.php @@ -53,7 +53,7 @@ class ExtendedProfile $fields = array(); while ($detail->fetch()) { - $fields[$detail->field][] = clone($detail); + $fields[$detail->field_name][] = clone($detail); } return $fields; @@ -86,7 +86,7 @@ class ExtendedProfile if (in_array(strtolower($name), $profileFields)) { return $this->profile->$name; } else if (in_array($name, $this->fields)) { - return $this->fields[$name]->value; + return $this->fields[$name]->field_value; } else { return null; } diff --git a/plugins/ExtendedProfile/profiledetailsettingsaction.php b/plugins/ExtendedProfile/profiledetailsettingsaction.php index ce0828c3e1..1f2be5a060 100644 --- a/plugins/ExtendedProfile/profiledetailsettingsaction.php +++ b/plugins/ExtendedProfile/profiledetailsettingsaction.php @@ -111,26 +111,33 @@ class ProfileDetailSettingsAction extends SettingsAction $detail = new Profile_detail(); $detail->profile_id = $profile->id; - $detail->field = $name; - $detail->field_index = 1; + $detail->field_name = $name; $result = $detail->find(true); if (empty($result)) { - $detail->value = $value; + + $detail->field_value = $value; $detail->created = common_sql_now(); common_debug("XXXXXXXXXXXXXXX not found"); - //common_debug('bbbbbbbbbbbb ' . var_export($detail, true)); $result = $detail->insert(); + + if (empty($result)) { + common_log_db_error($detail, 'INSERT', __FILE__); + $this->serverError(_m('Could not save profile details.')); + } + } else { + common_debug('zzzzz FOUND'); $orig = clone($detail); - $detail->value = $value; + $detail->field_value = $value; $result = $detail->update($orig); + } $detail->free();