r3841 saveScript(): employ single-query update against a race condition
authorDenis Ovsienko <infrastation@yandex.ru>
Wed, 16 Jun 2010 22:04:44 +0000 (22:04 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Wed, 16 Jun 2010 22:04:44 +0000 (22:04 +0000)
saveRackCode(): update cache instead of resetting it, but only
  if the source text was saved successfully

ChangeLog
inc/database.php
inc/ophandlers.php

index 42dd38f044833000f00d69893bdff3076bf756ab..86b9391618aa75829ff90ae39e85801c86d1d62d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,5 @@
+0.18.4
+       bugfix: a race condition could be triggered in permissions editor
 0.18.3 2010-06-15
        bugfix: fix mktemp not working on Slackware (by Rafael Ganascim)
        bugfix: Nexus 802.1Q fixes
index a60b48b69030cbb672c3ff65781b19f1f9673e1c..40a38a0442f0ac37f6b21155e7289bfce690d868 100644 (file)
@@ -2870,16 +2870,11 @@ function saveScript ($name = '', $text)
 {
        if (!strlen ($name))
                throw new InvalidArgException ('$name', $name);
-       // delete regardless of existence
-       usePreparedDeleteBlade ('Script', array ('script_name' => $name));
-       return usePreparedInsertBlade
+       return usePreparedExecuteBlade
        (
-               'Script',
-               array
-               (
-                       'script_name' => $name,
-                       'script_text' => $text,
-               )
+               'INSERT INTO Script (script_name, script_text) VALUES (?, ?) ' .
+               'ON DUPLICATE KEY UPDATE script_text=?',
+               array ($name, $text, $text)
        );
 }
 
index eba5ec6e8a49e39602522ac4bc9bf7596b206422..4354fc572fba86c2af2edc3806427f6aa12c2117 100644 (file)
@@ -1599,11 +1599,12 @@ function saveRackCode ()
        $parseTree = getRackCode ($newcode);
        if ($parseTree['result'] != 'ACK')
                return buildRedirectURL (__FUNCTION__, 'ERR1', array ($parseTree['load']));
-       saveScript ('RackCodeCache', '');
-       if (saveScript ('RackCode', $newcode))
+       if (FALSE !== saveScript ('RackCode', $newcode))
+       {
+               saveScript ('RackCodeCache', base64_encode (serialize ($parseTree)));
                return buildRedirectURL (__FUNCTION__, 'OK');
-       else
-               return buildRedirectURL (__FUNCTION__, 'ERR2');
+       }
+       return buildRedirectURL (__FUNCTION__, 'ERR2');
 }
 
 $msgcode['setPortVLAN']['ERR1'] = 156;