Index: includes/bootstrap.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v retrieving revision 1.112 diff -u -p -r1.112 bootstrap.inc --- includes/bootstrap.inc 12 Aug 2006 11:47:24 -0000 1.112 +++ includes/bootstrap.inc 14 Aug 2006 03:08:17 -0000 @@ -542,7 +542,7 @@ function watchdog($type, $message, $seve // Note: log the exact, entire absolute URL. $request_uri = $base_root . request_uri(); - db_query("INSERT INTO {watchdog} (uid, type, message, severity, link, location, referer, hostname, timestamp) VALUES (%d, '%s', '%s', %d, '%s', '%s', '%s', '%s', %d)", $user->uid, $type, $message, $severity, $link, $request_uri, referer_uri(), $_SERVER['REMOTE_ADDR'], time()); + db_log("INSERT INTO {watchdog} (uid, type, message, severity, link, location, referer, hostname, timestamp) VALUES (%d, '%s', '%s', %d, '%s', '%s', '%s', '%s', %d)", array($user->uid, $type, $message, $severity, $link, $request_uri, referer_uri(), $_SERVER['REMOTE_ADDR'], time())); if ($current_db) { db_set_active($current_db); Index: includes/database.mysql.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.mysql.inc,v retrieving revision 1.56 diff -u -p -r1.56 database.mysql.inc --- includes/database.mysql.inc 31 Jul 2006 19:24:16 -0000 1.56 +++ includes/database.mysql.inc 14 Aug 2006 03:08:17 -0000 @@ -379,6 +379,35 @@ function db_table_exists($table) { } /** + * Check if an engine exists. + * + * @param $query the engine to test for + */ +function db_engine_exists($query) { + $result = db_query('SHOW ENGINES'); + while($engine = db_fetch_array($result)) { + if (strtolower($engine['Engine']) == strtolower($query) && $engine['Support'] == 'YES'){ + return TRUE; + } + } + + return FALSE; +} + +/** + * Insert log entry into appropriate table. + */ +function db_log($sql, $args = array()) { + if (variable_get('mysql_can_merge', 0)) { + $sql = strtr($sql, array('}' => '_insert}')); + return db_query($sql, $args); + } + else { + return db_query($sql, $args); + } +} + +/** * @} End of "ingroup database". */ Index: includes/database.mysqli.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.mysqli.inc,v retrieving revision 1.20 diff -u -p -r1.20 database.mysqli.inc --- includes/database.mysqli.inc 26 Jul 2006 07:16:08 -0000 1.20 +++ includes/database.mysqli.inc 14 Aug 2006 03:08:17 -0000 @@ -374,6 +374,35 @@ function db_table_exists($table) { } /** + * Check if an engine exists. + * + * @param $query the engine to test for + */ +function db_engine_exists($query) { + $result = db_query('SHOW ENGINES'); + while($engine = db_fetch_array($result)) { + if (strtolower($engine['Engine']) == strtolower($query) && $engine['Support'] == 'YES'){ + return TRUE; + } + } + + return FALSE; +} + +/** + * Insert log entry into appropriate table. + */ +function db_log($sql, $args = array()) { + if (variable_get('mysql_can_merge', 0)) { + $sql = strtr($sql, array('}' => '_insert}')); + return db_query($sql, $args); + } + else { + return db_query($sql, $args); + } +} + +/** * @} End of "ingroup database". */ Index: includes/database.pgsql.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database.pgsql.inc,v retrieving revision 1.32 diff -u -p -r1.32 database.pgsql.inc --- includes/database.pgsql.inc 26 Jul 2006 07:16:08 -0000 1.32 +++ includes/database.pgsql.inc 14 Aug 2006 03:08:17 -0000 @@ -361,6 +361,22 @@ function db_check_setup() { } /** + * Check if an engine exists. + * + * @param $query the engine to test for + */ +function db_engine_exists($query) { + return FALSE; +} + +/** + * Insert log entry into appropriate table. + */ +function db_log($sql, $args = array()) { + return db_query($sql, $args); +} + +/** * @} End of "ingroup database". */ Index: modules/statistics/statistics.install =================================================================== RCS file: /cvs/drupal/drupal/modules/statistics/statistics.install,v retrieving revision 1.3 diff -u -p -r1.3 statistics.install --- modules/statistics/statistics.install 4 Aug 2006 06:58:44 -0000 1.3 +++ modules/statistics/statistics.install 14 Aug 2006 03:08:23 -0000 @@ -5,19 +5,61 @@ function statistics_install() { switch ($GLOBALS['db_type']) { case 'mysql': case 'mysqli': - db_query("CREATE TABLE {accesslog} ( - aid int(10) NOT NULL auto_increment, - sid varchar(32) NOT NULL default '', - title varchar(255) default NULL, - path varchar(255) default NULL, - url varchar(255) default NULL, - hostname varchar(128) default NULL, - uid int(10) unsigned default '0', - timer int(10) unsigned NOT NULL default '0', - timestamp int(11) unsigned NOT NULL default '0', - KEY accesslog_timestamp (timestamp), - PRIMARY KEY (aid) - ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); + if (db_engine_exists('MERGE')) { + variable_set('mysql_can_merge', 1); + db_query("CREATE TABLE {accesslog_insert} ( + aid int(10) NOT NULL auto_increment, + sid varchar(32) NOT NULL default '', + title varchar(255) default NULL, + path varchar(255) default NULL, + url varchar(255) default NULL, + hostname varchar(128) default NULL, + uid int(10) unsigned default '0', + timer int(10) unsigned NOT NULL default '0', + timestamp int(11) unsigned NOT NULL default '0', + KEY accesslog_timestamp (timestamp), + PRIMARY KEY (aid) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ENGINE=MyISAM"); + db_query("CREATE TABLE {accesslog_storage} ( + aid int(10) NOT NULL auto_increment, + sid varchar(32) NOT NULL default '', + title varchar(255) default NULL, + path varchar(255) default NULL, + url varchar(255) default NULL, + hostname varchar(128) default NULL, + uid int(10) unsigned default '0', + timer int(10) unsigned NOT NULL default '0', + timestamp int(11) unsigned NOT NULL default '0', + KEY accesslog_timestamp (timestamp), + PRIMARY KEY (aid) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ENGINE=MyISAM"); + db_query("CREATE TABLE {accesslog} ( + aid int(10) NOT NULL auto_increment, + sid varchar(32) NOT NULL default '', + title varchar(255) default NULL, + path varchar(255) default NULL, + url varchar(255) default NULL, + hostname varchar(128) default NULL, + uid int(10) unsigned default '0', + timer int(10) unsigned NOT NULL default '0', + timestamp int(11) unsigned NOT NULL default '0' + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ENGINE=MERGE UNION=(accesslog_insert, accesslog_storage) INSERT_METHOD=NO"); + } + else { + db_query("CREATE TABLE {accesslog} ( + aid int(10) NOT NULL auto_increment, + sid varchar(32) NOT NULL default '', + title varchar(255) default NULL, + path varchar(255) default NULL, + url varchar(255) default NULL, + hostname varchar(128) default NULL, + uid int(10) unsigned default '0', + timer int(10) unsigned NOT NULL default '0', + timestamp int(11) unsigned NOT NULL default '0', + KEY accesslog_timestamp (timestamp), + PRIMARY KEY (aid) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); + } break; case 'pgsql': db_query("CREATE TABLE {accesslog} ( Index: modules/statistics/statistics.module =================================================================== RCS file: /cvs/drupal/drupal/modules/statistics/statistics.module,v retrieving revision 1.235 diff -u -p -r1.235 statistics.module --- modules/statistics/statistics.module 10 Aug 2006 15:35:10 -0000 1.235 +++ modules/statistics/statistics.module 14 Aug 2006 03:08:24 -0000 @@ -78,7 +78,7 @@ function statistics_init() { } if ((variable_get('statistics_enable_access_log', 0)) && (module_invoke('throttle', 'status') == 0)) { // Log this page access. - db_query("INSERT INTO {accesslog} (title, path, url, hostname, uid, sid, timer, timestamp) values('%s', '%s', '%s', '%s', %d, '%s', %d, %d)", strip_tags(drupal_get_title()), $_GET['q'], referer_uri(), $_SERVER['REMOTE_ADDR'], $user->uid, session_id(), timer_read('page'), time()); + db_log("INSERT INTO {accesslog} (title, path, url, hostname, uid, sid, timer, timestamp) values('%s', '%s', '%s', '%s', %d, '%s', %d, %d)", array(strip_tags(drupal_get_title()), $_GET['q'], referer_uri(), $_SERVER['REMOTE_ADDR'], $user->uid, session_id(), timer_read('page'), time())); } } @@ -415,7 +415,13 @@ function statistics_cron() { variable_set('statistics_day_timestamp', time()); } - /* clean expired access logs */ + // move access logs into storage + if (variable_get('mysql_can_merge', 0)) { + $max_aid = db_result('SELECT MAX(aid) FROM {accesslog_insert}'); + db_query('INSERT INTO {accesslog_storage} SELECT sid, title, path, url, hostname, uid, timer, timestamp FROM {accesslog_insert} WHERE aid <= %d', $max_aid); + db_query('DELETE FROM {accesslog_insert} WHERE aid <= %d', $max_aid); + } + // clean expired access logs db_query('DELETE FROM {accesslog} WHERE timestamp < %d', time() - variable_get('statistics_flush_accesslog_timer', 259200)); } Index: modules/system/system.install =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.install,v retrieving revision 1.5 diff -u -p -r1.5 system.install --- modules/system/system.install 6 Aug 2006 23:00:42 -0000 1.5 +++ modules/system/system.install 14 Aug 2006 03:08:25 -0000 @@ -386,20 +386,62 @@ function system_install() { PRIMARY KEY (vid, type) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); - db_query("CREATE TABLE {watchdog} ( - wid int(5) NOT NULL auto_increment, - uid int(10) NOT NULL default '0', - type varchar(16) NOT NULL default '', - message longtext NOT NULL, - severity tinyint(3) unsigned NOT NULL default '0', - link varchar(255) NOT NULL default '', - location varchar(128) NOT NULL default '', - referer varchar(128) NOT NULL default '', - hostname varchar(128) NOT NULL default '', - timestamp int(11) NOT NULL default '0', - PRIMARY KEY (wid) - ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); - + if (db_engine_exists('MERGE')) { + variable_set('mysql_can_merge', 1); + db_query("CREATE TABLE {watchdog_insert} ( + wid int(5) NOT NULL auto_increment, + uid int(10) NOT NULL default '0', + type varchar(16) NOT NULL default '', + message longtext NOT NULL, + severity tinyint(3) unsigned NOT NULL default '0', + link varchar(255) NOT NULL default '', + location varchar(128) NOT NULL default '', + referer varchar(128) NOT NULL default '', + hostname varchar(128) NOT NULL default '', + timestamp int(11) NOT NULL default '0', + PRIMARY KEY (wid) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ENGINE=MyISAM"); + db_query("CREATE TABLE {watchdog_storage} ( + wid int(5) NOT NULL auto_increment, + uid int(10) NOT NULL default '0', + type varchar(16) NOT NULL default '', + message longtext NOT NULL, + severity tinyint(3) unsigned NOT NULL default '0', + link varchar(255) NOT NULL default '', + location varchar(128) NOT NULL default '', + referer varchar(128) NOT NULL default '', + hostname varchar(128) NOT NULL default '', + timestamp int(11) NOT NULL default '0', + PRIMARY KEY (wid) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ENGINE=MyISAM"); + db_query("CREATE TABLE {watchdog} ( + wid int(5) NOT NULL auto_increment, + uid int(10) NOT NULL default '0', + type varchar(16) NOT NULL default '', + message longtext NOT NULL, + severity tinyint(3) unsigned NOT NULL default '0', + link varchar(255) NOT NULL default '', + location varchar(128) NOT NULL default '', + referer varchar(128) NOT NULL default '', + hostname varchar(128) NOT NULL default '', + timestamp int(11) NOT NULL default '0' + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ ENGINE=MERGE UNION=(watchdog_insert, watchdog_storage) INSERT_METHOD=NO"); + } + else { + db_query("CREATE TABLE {watchdog} ( + wid int(5) NOT NULL auto_increment, + uid int(10) NOT NULL default '0', + type varchar(16) NOT NULL default '', + message longtext NOT NULL, + severity tinyint(3) unsigned NOT NULL default '0', + link varchar(255) NOT NULL default '', + location varchar(128) NOT NULL default '', + referer varchar(128) NOT NULL default '', + hostname varchar(128) NOT NULL default '', + timestamp int(11) NOT NULL default '0', + PRIMARY KEY (wid) + ) /*!40100 DEFAULT CHARACTER SET UTF8 */ "); + } break; case 'pgsql': /* create unsigned types */ Index: modules/watchdog/watchdog.module =================================================================== RCS file: /cvs/drupal/drupal/modules/watchdog/watchdog.module,v retrieving revision 1.147 diff -u -p -r1.147 watchdog.module --- modules/watchdog/watchdog.module 10 Aug 2006 15:42:33 -0000 1.147 +++ modules/watchdog/watchdog.module 14 Aug 2006 03:08:25 -0000 @@ -64,6 +64,11 @@ function watchdog_menu($may_cache) { * Remove expired log messages and flood control events. */ function watchdog_cron() { + if (variable_get('mysql_can_merge', 0)) { + $max_wid = db_result('SELECT MAX(wid) FROM {watchdog_insert}'); + db_query('INSERT INTO {watchdog_storage} SELECT uid, type, message, severity, link, location, referer, hostname, timestamp FROM {watchdog_insert} WHERE wid <= %d', $max_wid); + db_query('DELETE FROM {watchdog_insert} WHERE wid <= %d', $max_wid); + } db_query('DELETE FROM {watchdog} WHERE timestamp < %d', time() - variable_get('watchdog_clear', 604800)); db_query('DELETE FROM {flood} WHERE timestamp < %d', time() - 3600); }