From 6e5f40eadc02f204bbdb82b28913384f6a77b768 Mon Sep 17 00:00:00 2001 From: dongsheng Date: Thu, 24 Jul 2008 03:15:03 +0000 Subject: [PATCH] MDL-14650, create a new table `chat_messages_current` to save latest 8 hours messages, could improve performance. The expired message will be deleted in chat_cron function --- mod/chat/chatd.php | 4 +++ mod/chat/db/install.xml | 24 +++++++++++-- mod/chat/db/upgrade.php | 54 ++++++++++++++++++++++++++-- mod/chat/gui_basic/index.php | 6 ++-- mod/chat/gui_header_js/index.php | 4 +-- mod/chat/gui_header_js/insert.php | 6 ++-- mod/chat/gui_header_js/jsupdate.php | 2 +- mod/chat/gui_header_js/jsupdated.php | 2 +- mod/chat/gui_header_js/users.php | 3 +- mod/chat/lib.php | 41 ++++++++++++--------- mod/chat/version.php | 2 +- mod/chat/view.php | 10 +++--- 12 files changed, 121 insertions(+), 37 deletions(-) diff --git a/mod/chat/chatd.php b/mod/chat/chatd.php index dd69746fbc..5b903a51f5 100755 --- a/mod/chat/chatd.php +++ b/mod/chat/chatd.php @@ -337,6 +337,7 @@ class ChatDaemon { // Commit to DB $DB->insert_record('chat_messages', $msg, false); + $DB->insert_record('chat_messages_current', $msg, false); // OK, now push it out to all users $this->message_broadcast($msg, $this->sets_info[$sessionid]['user']); @@ -431,6 +432,7 @@ class ChatDaemon { // Commit to DB $DB->insert_record('chat_messages', $msg, false); + $DB->insert_record('chat_messages_current', $msg, false); // Undo the hack $msg->message = $origmsg; @@ -543,6 +545,7 @@ class ChatDaemon { $msg->timestamp = time(); $DB->insert_record('chat_messages', $msg, false); + $DB->insert_record('chat_messages_current', $msg, false); $this->message_broadcast($msg, $this->sets_info[$sessionid]['user']); return true; @@ -750,6 +753,7 @@ class ChatDaemon { $this->trace('User has disconnected, destroying uid '.$info['userid'].' with SID '.$sessionid, E_USER_WARNING); $DB->insert_record('chat_messages', $msg, false); + $DB->insert_record('chat_messages_current', $msg, false); // *************************** IMPORTANT // diff --git a/mod/chat/db/install.xml b/mod/chat/db/install.xml index 10134d0b8a..1cad1e1fe6 100644 --- a/mod/chat/db/install.xml +++ b/mod/chat/db/install.xml @@ -23,7 +23,7 @@ - +
@@ -43,7 +43,27 @@
- +
+ + + + + + + + + + + + + + + + + + +
+ diff --git a/mod/chat/db/upgrade.php b/mod/chat/db/upgrade.php index f2876317fd..6f63201b40 100644 --- a/mod/chat/db/upgrade.php +++ b/mod/chat/db/upgrade.php @@ -1,6 +1,6 @@ get_manager(); + $result = true; -//===== 1.9.0 upgrade line ======// + if ($result && $oldversion < 2007101510) { + + /// Define field id to be added to chat_messages_current + $table = new xmldb_table('chat_messages_current'); + + $field = new xmldb_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null, null); + $table->addField($field); + + $field = new xmldb_field('chatid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, null, '0', 'id'); + $table->addField($field); + + $field = new xmldb_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, null, '0', 'chatid'); + $table->addField($field); + + $field = new xmldb_field('groupid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null, null, '0', 'userid'); + $table->addField($field); + + $field = new xmldb_field('system', XMLDB_TYPE_INTEGER, '1', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0', 'groupid'); + $table->addField($field); + + $field = new xmldb_field('message', XMLDB_TYPE_TEXT, 'small', null, XMLDB_NOTNULL, null, null, null, null, 'system'); + $table->addField($field); + + $field = new xmldb_field('timestamp', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '0', 'message'); + $table->addField($field); + + $key = new xmldb_key('primary', XMLDB_KEY_PRIMARY, array('id')); + $table->addKey($key); + + $key = new xmldb_key('chatid', XMLDB_KEY_FOREIGN, array('chatid'), 'chat', array('id')); + $table->addKey($key); + + $result = $result && $dbman->create_table($table); + + $index = new xmldb_index('userid', XMLDB_INDEX_NOTUNIQUE, array('userid')); + if (!$dbman->index_exists($table, $index)) { + $result = $result && $dbman->add_index($table, $index); + } + + $index = new xmldb_index('groupid', XMLDB_INDEX_NOTUNIQUE, array('groupid')); + if (!$dbman->index_exists($table, $index)) { + $result = $result && $dbman->add_index($table, $index); + } + + $index = new xmldb_index('timestamp-chatid', XMLDB_INDEX_NOTUNIQUE, array('timestamp', 'chatid')); + if (!$dbman->index_exists($table, $index)) { + $result = $result && $dbman->add_index($table, $index); + } + } return $result; } diff --git a/mod/chat/gui_basic/index.php b/mod/chat/gui_basic/index.php index 4a64cbb31a..c284dddaad 100644 --- a/mod/chat/gui_basic/index.php +++ b/mod/chat/gui_basic/index.php @@ -80,7 +80,7 @@ $newmessage->systrem = 0; $newmessage->message = $message; $newmessage->timestamp = time(); - if (!$DB->insert_record('chat_messages', $newmessage)) { + if (!$DB->insert_record('chat_messages', $newmessage) && !$DB->insert_record('chat_messages_current', $newmessage)) { print_error('cantinsert', 'chat'); } @@ -141,7 +141,7 @@ $options->para = false; $options->newlines = true; - $params = array('last'=>$last, 'groupid'=>$groupid, 'chatid'=>$chat->id, 'chatentered'=>$chatentered); + $params = array('last'=>$last, 'groupid'=>$groupid, 'chatid'=>$chat->id, 'chatentered'=>$chatentered); if ($newonly) { $lastsql = "AND timestamp > :last"; @@ -151,7 +151,7 @@ $groupselect = $groupid ? "AND (groupid=:groupid OR groupid=0)" : ""; - $messages = $DB->get_records_select("chat_messages", + $messages = $DB->get_records_select("chat_messages_current", "chatid = :chatid AND timestamp > :chatentered $lastsql $groupselect", $params, "timestamp DESC"); diff --git a/mod/chat/gui_header_js/index.php b/mod/chat/gui_header_js/index.php index f90af0777e..a468e6c567 100644 --- a/mod/chat/gui_header_js/index.php +++ b/mod/chat/gui_header_js/index.php @@ -17,9 +17,9 @@ if (!$cm = get_coursemodule_from_instance('chat', $chat->id, $course->id)) { print_error('invalidcoursemodule'); } - + $context = get_context_instance(CONTEXT_MODULE, $cm->id); - + require_login($course->id, false, $cm); require_capability('mod/chat:chat',$context); diff --git a/mod/chat/gui_header_js/insert.php b/mod/chat/gui_header_js/insert.php index 406e7345a4..4c0d6bacfd 100644 --- a/mod/chat/gui_header_js/insert.php +++ b/mod/chat/gui_header_js/insert.php @@ -21,7 +21,7 @@ if (!$cm = get_coursemodule_from_instance('chat', $chat->id, $course->id)) { print_error('invalidcoursemodule'); } - + require_login($course->id, false, $cm); if (isguest()) { @@ -49,8 +49,8 @@ $message->message = $chat_message; $message->timestamp = time(); - if (!$DB->insert_record('chat_messages', $message)) { - print_error('cantinsert', 'chat'); + if (!$DB->insert_record('chat_messages', $message) || !$DB->insert_record('chat_messages_current', $message)) { + print_error('Could not insert a chat message!'); } $chatuser->lastmessageping = time() - 2; diff --git a/mod/chat/gui_header_js/jsupdate.php b/mod/chat/gui_header_js/jsupdate.php index 87fed99cce..819628f3ad 100644 --- a/mod/chat/gui_header_js/jsupdate.php +++ b/mod/chat/gui_header_js/jsupdate.php @@ -49,7 +49,7 @@ $groupselect = $chatuser->groupid ? " AND (groupid=:groupid OR groupid=0) " : ""; - $messages = $DB->get_records_select("chat_messages", + $messages = $DB->get_records_select("chat_messages_current", "chatid = :chatid AND timestamp > :lasttime $groupselect", $params, "timestamp ASC"); diff --git a/mod/chat/gui_header_js/jsupdated.php b/mod/chat/gui_header_js/jsupdated.php index 33f410b956..f2af38754e 100644 --- a/mod/chat/gui_header_js/jsupdated.php +++ b/mod/chat/gui_header_js/jsupdated.php @@ -133,7 +133,7 @@ $newcriteria = "timestamp > :lasttime"; } - $messages = $DB->get_records_select("chat_messages", + $messages = $DB->get_records_select("chat_messages_current", "chatid = :chatid AND $newcriteria $groupselect", $params, "timestamp ASC"); diff --git a/mod/chat/gui_header_js/users.php b/mod/chat/gui_header_js/users.php index 991c6a9490..e623a2fd4a 100644 --- a/mod/chat/gui_header_js/users.php +++ b/mod/chat/gui_header_js/users.php @@ -40,7 +40,8 @@ $message->system = 0; $message->timestamp = time(); - if (!$DB->insert_record('chat_messages', $message)) { + if (!$DB->insert_record('chat_messages', $message) || + !$DB->insert_record('chat_messages_current', $message)) { print_error('cantinsert', 'chat'); } diff --git a/mod/chat/lib.php b/mod/chat/lib.php index 57217b48da..da5ab75284 100644 --- a/mod/chat/lib.php +++ b/mod/chat/lib.php @@ -3,12 +3,11 @@ /// Library of functions and constants for module chat require_once($CFG->libdir.'/pagelib.php'); - // The HTML head for the message window to start with ( is used to get some browsers starting with output -$CHAT_HTMLHEAD = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; +$CHAT_HTMLHEAD = "\n\n\n".padding(200); // The HTML head for the message window to start with (with js scrolling) -$CHAT_HTMLHEAD_JS = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"; +$CHAT_HTMLHEAD_JS = "\n\n\n\n".padding(200); // The HTML code for standard empty pages (e.g. if a user was kicked out) $CHAT_HTMLHEAD_OUT = "You are out!"; @@ -20,9 +19,9 @@ $CHAT_HTMLHEAD_MSGINPUT = "Message Input\n\n"; // Dummy data that gets output to the browser as needed, in order to make it show output -$CHAT_DUMMY_DATA = produce_data(200); +$CHAT_DUMMY_DATA = padding(200); -function produce_data($n){ +function padding($n){ $str = ''; for($i=0; $i<$n; $i++){ $str.='\n'; @@ -108,6 +107,9 @@ function chat_delete_instance($id) { if (! $DB->delete_records('chat_messages', array('chatid'=>$chat->id))) { $result = false; } + if (! $DB->delete_records('chat_messages_current', array('chatid'=>$chat->id))) { + $result = false; + } if (! $DB->delete_records('chat_users', array('chatid'=>$chat->id))) { $result = false; } @@ -202,7 +204,7 @@ function chat_print_recent_activity($course, $viewfullnames, $timestart) { if (!$mcm = $DB->get_record_sql("SELECT cm.id, MAX(chm.timestamp) AS lasttime FROM {course_modules} cm JOIN {chat} ch ON ch.id = cm.instance - JOIN {chat_messages} chm ON chm.chatid = ch.id + JOIN {chat_messages_current} chm ON chm.chatid = ch.id WHERE chm.timestamp > ? AND cm.id = ? AND (chm.groupid IN ($mygroupids) OR chm.groupid = 0) GROUP BY cm.id", array($timestart, $cm->id))) { @@ -304,7 +306,13 @@ function chat_cron () { $sql = "DELETE FROM {chat_messages} - WHERE ($subselect) > 0 AND timestamp < ( ".time()." -($subselect) * 24 * 3600)"; + WHERE ($subselect) > 0 AND timestamp < ( ".time()." -($subselect) * 24 * 3600)"; + + $DB->execute($sql); + + $sql = "DELETE + FROM {chat_messages_current} + WHERE timestamp < ( ".time()." - 8 * 3600)"; $DB->execute($sql); @@ -392,11 +400,11 @@ function chat_get_users($chatid, $groupid=0, $groupingid=0) { } else { $groupselect = ""; } - + if (!empty($CFG->enablegroupings) && !(empty($groupingid))) { $groupingjoin = "JOIN {groups_members} gm ON u.id = gm.userid JOIN {groupings_groups} gg ON gm.groupid = gg.groupid AND gg.groupingid = :groupingid "; - + } else { $groupingjoin = ''; } @@ -422,7 +430,7 @@ function chat_get_latest_message($chatid, $groupid=0) { } $sql = "SELECT * - FROM {chat_messages} + FROM {chat_messages_current} WHERE chatid = :chatid $groupselect ORDER BY timestamp DESC"; @@ -498,7 +506,7 @@ function chat_login_user($chatid, $version, $groupid, $course) { $message->system = 1; $message->timestamp = time(); - if (!$DB->insert_record('chat_messages', $message)) { + if (!$DB->insert_record('chat_messages', $message) || !$DB->insert_record('chat_messages_current', $message)) { print_error('cantinsert', 'chat'); } } @@ -528,7 +536,7 @@ function chat_delete_old_users() { $message->system = 1; $message->timestamp = time(); - if (!$DB->insert_record('chat_messages', $message)) { + if (!$DB->insert_record('chat_messages', $message) || !$DB->insert_record('chat_messages_current', $message) ) { print_error('cantinsert', 'chat'); } } @@ -627,7 +635,7 @@ function chat_format_message_manually($message, $courseid, $sender, $currentuser $output->text = $message->strtime.': '.get_string('message'.$message->message, 'chat', fullname($sender)); $output->html = '
'.$message->picture.''; $output->html .= ''.$output->text.'
'; - $output->basic = '
'.$message->strtime.': '.get_string('message'.$message->message, 'chat', fullname($sender)).'
'; + $output->basic = '
'.$message->strtime.': '.get_string('message'.$message->message, 'chat', fullname($sender)).'
'; if($message->message == 'exit' or $message->message == 'enter') { $output->refreshusers = true; //force user panel refresh ASAP @@ -649,7 +657,7 @@ function chat_format_message_manually($message, $courseid, $sender, $currentuser $special = false; if (substr($text, 0, 5) == 'beep ') { - /// It's a beep! + /// It's a beep! $special = true; $beepwho = trim(substr($text, 5)); @@ -688,9 +696,9 @@ function chat_format_message_manually($message, $courseid, $sender, $currentuser $output->html .= "$outinfo"; if ($outmain) { $output->html .= ": $outmain"; - $output->basic = '
'.$outinfo.':
'.$outmain.'
'; + $output->basic = '
'.$outinfo.':
'.$outmain.'
'; } else { - $output->basic = '
'.$outinfo.'
'; + $output->basic = '
'.$outinfo.'
'; } $output->html .= ""; return $output; @@ -790,6 +798,7 @@ function chat_reset_userdata($data) { $params = array($data->courseid); $DB->delete_records_select('chat_messages', "chatid IN ($chatessql)", $params); + $DB->delete_records_select('chat_messages_current', "chatid IN ($chatessql)", $params); $DB->delete_records_select('chat_users', "chatid IN ($chatessql)", $params); $status[] = array('component'=>$componentstr, 'item'=>get_string('removemessages', 'chat'), 'error'=>false); } diff --git a/mod/chat/version.php b/mod/chat/version.php index c216f0d39b..632b37beaf 100644 --- a/mod/chat/version.php +++ b/mod/chat/version.php @@ -5,7 +5,7 @@ /// This fragment is called by moodle_needs_upgrading() and /admin/index.php ///////////////////////////////////////////////////////////////////////////////// -$module->version = 2007101509; // The (date) version of this module +$module->version = 2007101510; // The (date) version of this module $module->requires = 2007101509; // Requires this Moodle version $module->cron = 300; // How often should cron check this module (seconds)? diff --git a/mod/chat/view.php b/mod/chat/view.php index 1def50e531..caa37354dd 100644 --- a/mod/chat/view.php +++ b/mod/chat/view.php @@ -6,7 +6,7 @@ require_once('lib.php'); require_once($CFG->libdir.'/blocklib.php'); require_once('pagelib.php'); - + $id = optional_param('id', 0, PARAM_INT); $c = optional_param('c', 0, PARAM_INT); $edit = optional_param('edit', -1, PARAM_BOOL); @@ -42,9 +42,9 @@ require_course_login($course, true, $cm); - + $context = get_context_instance(CONTEXT_MODULE, $cm->id); - + // show some info for guests if (isguestuser()) { $navigation = build_navigation('', $cm); @@ -135,7 +135,7 @@ if (!empty($USER->screenreader)) { $chattarget = "/mod/chat/gui_basic/index.php?id=$chat->id$groupparam"; } else { - $chattarget = "/mod/chat/gui_$CFG->chat_method/index.php?id=$chat->id$groupparam"; + $chattarget = "/mod/chat/gui_$CFG->chat_method/index.php?id=$chat->id$groupparam"; } echo '

'; @@ -194,7 +194,7 @@ break; } } - + echo ''; print_footer($course); -- 2.39.5