r2062 + implement RackCode parse tree caching and save roughly 3 seconds delay per...
authorDenis Ovsienko <infrastation@yandex.ru>
Wed, 16 Jul 2008 14:39:02 +0000 (14:39 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Wed, 16 Jul 2008 14:39:02 +0000 (14:39 +0000)
ChangeLog
inc/database.php
inc/init.php
inc/ophandlers.php
install/init-structure.sql
upgrade.php

index f16ebe7ce5b8cbce56ded6bee380acecbd7574c9..2fdb4ba511ae60c601917d7b41ca15dc2ebd00d4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,9 @@
 0.16.1
        new feature: allow pre-selected tags for newly added virtual services and RS pools
+       new feature: cache RackCode parse tree for better performance
        bugfix: don't escape Greek letters to enable them in tag names
        bugfix: port manager messages were incorrect
+       update: adjusted database for bigger texts
 0.16.0 2008-07-09
        new feature: tag roller
        new feature: taggable user accounts
index c158df5e0d7bccb97ad9f74664e9e82edff4c386..178e889e4c0da912f1b5a35c5a7d2524bcd508aa 100644 (file)
@@ -2758,7 +2758,10 @@ function loadScript ($name)
 {
        $result = useSelectBlade ("select script_text from Script where script_name = '${name}'");
        $row = $result->fetch (PDO::FETCH_NUM);
-       return $row[0];
+       if ($row !== FALSE)
+               return $row[0];
+       else
+               return NULL;
 }
 
 function saveScript ($name, $text)
@@ -2768,7 +2771,9 @@ function saveScript ($name, $text)
                showError ('Invalid argument');
                return FALSE;
        }
-       return useDeleteBlade ('Script', 'script_name', $name, TRUE) && useInsertBlade
+       // delete regardless of existence
+       useDeleteBlade ('Script', 'script_name', $name, TRUE);
+       return useInsertBlade
        (
                'Script',
                array
index d2efe258a1af7b0fb3d316f20859aa8211a0de11..1e309a8b9665532c83c1fb4198b6d803468de162 100644 (file)
@@ -95,9 +95,33 @@ if (!count ($configCache))
 }
 
 require_once 'inc/code.php';
+$rackCodeCache = loadScript ('RackCodeCache');
+if ($rackCodeCache == NULL or empty ($rackCodeCache))
+{
+//     $t1 = microtime (TRUE);
+       $rackCode = getRackCode (loadScript ('RackCode'));
+//     $t2 = microtime (TRUE);
+//     echo 'DEBUG: parsed RackCode tree from scratch in ' . ($t2 - $t1) . ' second(s)<br>';
+       saveScript ('RackCodeCache', base64_encode (serialize ($rackCode)));
+}
+else
+{
+//     $t1 = microtime (TRUE);
+       $rackCode = unserialize (base64_decode ($rackCodeCache));
+//     $t2 = microtime (TRUE);
+//     echo 'DEBUG: loaded RackCode cache in ' . ($t2 - $t1) . ' second(s)<br>';
+       if ($rackCode === FALSE) // invalid cache
+       {
+               saveScript ('RackCodeCache', '');
+//             $t1 = microtime (TRUE);
+               $rackCode = getRackCode (loadScript ('RackCode'));
+//             $t2 = microtime (TRUE);
+//             echo 'DEBUG: discarded RackCode cache and parsed tree from scratch in ' . ($t2 - $t1) . ' second(s)<br>';
+       }
+}
+
 // Depending on the 'result' value the 'load' carries either the
 // parse tree or error message.
-$rackCode = getRackCode (loadScript ('RackCode'));
 if ($rackCode['result'] != 'ACK')
 {
        // FIXME: display a message with an option to reset RackCode text
index 0dcc471513c4d05a09458d8946f271277b935fc8..960ad9f30e87a56801d60be12cb84b7c21e58684 100644 (file)
@@ -1271,6 +1271,7 @@ function saveRackCode ()
        $parseTree = getRackCode ($newcode);
        if ($parseTree['result'] != 'ACK')
                return buildRedirectURL_ERR ('Verification failed: ' . $parseTree['load']);
+       saveScript ('RackCodeCache', '');
        if (saveScript ('RackCode', $newcode))
                return buildRedirectURL_OK ('Saved successfully.');
        else
index e25d7cdec808635be44badec451441151e72c66a..21b672c4df06fbde6de007f13bcf12b36a78d0a8 100644 (file)
@@ -245,7 +245,7 @@ CREATE TABLE `RackSpace` (
 
 CREATE TABLE `Script` (
   `script_name` char(64) NOT NULL,
-  `script_text` text,
+  `script_text` longtext,
   PRIMARY KEY  (`script_name`)
 ) TYPE=MyISAM;
 
index cd1964ed51030c0a2f84b727cc8f0ffce8b2e0c3..da8899366d0f44052314c71c88c43a93197b2d07 100644 (file)
@@ -22,6 +22,7 @@ function getDBUpgradePath ($v1, $v2)
                '0.15.0',
                '0.15.1',
                '0.16.0',
+               '0.16.1',
        );
        if (!in_array ($v1, $versionhistory) || !in_array ($v2, $versionhistory))
        {
@@ -1352,6 +1353,10 @@ CREATE TABLE `TagTree` (
                                                "VALUES (${chapter_no}, ${dict_key}, '${dict_value}')";
                        $query[] = "update Config set varvalue = '0.16.0' where varname = 'DB_VERSION'";
                        break;
+               case '0.16.1':
+                       $query[] = 'alter table Script modify column script_text longtext';
+                       $query[] = "update Config set varvalue = '0.16.1' where varname = 'DB_VERSION'";
+                       break;
                default:
                        showError ("executeUpgradeBatch () failed, because batch '${batchid}' isn't defined");
                        die;