From 73297d374974a431b40d0cc45a7180613b8d5762 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 28 Sep 2010 19:07:45 -0700 Subject: [PATCH] New DB_DataObject for storing favorites tally --- plugins/AnonymousFave/AnonymousFavePlugin.php | 36 +++ plugins/AnonymousFave/Fave_tally.php | 209 ++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 plugins/AnonymousFave/Fave_tally.php diff --git a/plugins/AnonymousFave/AnonymousFavePlugin.php b/plugins/AnonymousFave/AnonymousFavePlugin.php index 3dccaf538a..98f747748c 100644 --- a/plugins/AnonymousFave/AnonymousFavePlugin.php +++ b/plugins/AnonymousFave/AnonymousFavePlugin.php @@ -55,6 +55,39 @@ class AnonymousFavePlugin extends Plugin { common_ensure_session(); } + /** + * Hook for ensuring our tables are created + * + * Ensures the fave_tally table is there and has the right columns + * + * @return boolean hook return + */ + + function onCheckSchema() + { + $schema = Schema::get(); + + // For storing total number of times a notice has been faved + + $schema->ensureTable('fave_tally', + array( + new ColumnDef('notice_id', 'integer', null, false, 'PRI'), + new ColumnDef('count', 'integer', null, false), + new ColumnDef( + 'modified', + 'timestamp', + null, + false, + null, + 'CURRENT_TIMESTAMP', + 'on update CURRENT_TIMESTAMP' + ) + ) + ); + + return true; + } + function onEndShowHTML($action) { if (!common_logged_in()) { @@ -75,6 +108,9 @@ class AnonymousFavePlugin extends Plugin { $dir = dirname(__FILE__); switch ($cls) { + case 'Fave_tally': + include_once $dir . '/' . $cls . '.php'; + return false; case 'AnonFavorAction': include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; return false; diff --git a/plugins/AnonymousFave/Fave_tally.php b/plugins/AnonymousFave/Fave_tally.php new file mode 100644 index 0000000000..fc7e4a5790 --- /dev/null +++ b/plugins/AnonymousFave/Fave_tally.php @@ -0,0 +1,209 @@ + + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2010, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; + +/** + * Data class for favorites tally + * + * A class representing a total number of times a notice has been favorited + * + * @category Action + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + */ + +class Fave_tally extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'fave_tally'; // table name + public $notice_id; // int(4) primary_key not_null + public $count; // int(4) primary_key not_null + public $modified; // datetime not_null default_0000-00-00%2000%3A00%3A00 + + /* Static get */ + function staticGet($k, $v = NULL) { return Memcached_DataObject::staticGet('Fave_tally', $k, $v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + /** + * return table definition for DB_DataObject + * + * @return array array of column definitions + */ + + function table() + { + return array( + 'notice_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, + 'count' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, + 'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL + ); + } + + /** + * return key definitions for DB_DataObject + * + * @return array key definitions + */ + + function keys() + { + return array('notice_id' => 'K'); + } + + /** + * return key definitions for DB_DataObject + * + * @return array key definitions + */ + + function keyTypes() + { + return $this->keys(); + } + + /** + * Magic formula for non-autoincrementing integer primary keys + * + * @return array magic three-false array that stops auto-incrementing. + */ + + function sequenceKey() + { + return array(false, false, false); + } + + /** + * Get a single object with multiple keys + * + * @param array $kv Map of key-value pairs + * + * @return User_flag_profile found object or null + */ + + function pkeyGet($kv) + { + return Memcached_DataObject::pkeyGet('Fave_tally', $kv); + } + + /** + * Increment a notice's tally + * + * @param integer $notice_id ID of notice we're tallying + * + * @return integer the total times the notice has been faved + */ + + static function increment($notice_id) + { + $tally = Fave_tally::ensureTally($notice_id); + $count = $tally->count + 1; + $tally->count = $count; + $result = $tally->update(); + $tally->free(); + + if ($result === false) { + $msg = sprintf( + _m("Couldn't update favorite tally for notice ID %d.", $notice_id) + ); + throw new ServerException($msg); + } + + return $count; + } + + /** + * Decrement a notice's tally + * + * @param integer $notice_id ID of notice we're tallying + * + * @return integer the total times the notice has been faved + */ + + static function decrement($notice_id) + { + $tally = Fave_tally::ensureTally($notice_id); + + $count = 0; + + if ($tally->count > 0) { + $count = $tally->count - 1; + $tally->count = $count; + $result = $tally->update(); + $tally->free(); + + if ($result === false) { + $msg = sprintf( + _m("Couldn't update favorite tally for notice ID %d.", $notice_id) + ); + throw new ServerException($msg); + } + } + + return $count; + } + + /** + * Ensure a tally exists for a given notice. If we can't find + * one create one. + * + * @param integer $notice_id + * + * @return Fave_tally the tally data object + */ + + static function ensureTally($notice_id) + { + $tally = new Fave_tally(); + $result = $tally->get($notice_id); + + if (empty($result)) { + $tally->notice_id = $notice_id; + $tally->count = 0; + if ($tally->insert() === false) { + $msg = sprintf( + _m("Couldn't create favorite tally for notice ID %d.", $notice_id) + ); + throw new ServerException($msg); + } + } + + return $tally; + } +}