r4078 genericAssertion(): new function, multiplexer
authorDenis Ovsienko <infrastation@yandex.ru>
Fri, 7 Jan 2011 12:57:11 +0000 (12:57 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Fri, 7 Jan 2011 12:57:11 +0000 (12:57 +0000)
getBypassValue(): new function to aid in context focusing
index.php: make use of above
tableHandler(): new function, a generic substitute for many trivial DB functions
process.php: recognize "opspec" structure and use multiplexer for these
addRow(): sayonara
commitAddRow(): sayonara

inc/database.php
inc/functions.php
inc/navigation.php
inc/ophandlers.php
index.php
process.php

index a21192006b8d8bb2ad463d0357c0b32888f95bd9..4a6793385d25ea3e589b4751a57c7d1ce7c9a8c4 100644 (file)
@@ -220,11 +220,6 @@ function getRackRows ()
        return $rows;
 }
 
-function commitAddRow($rackrow_name)
-{
-       return usePreparedInsertBlade ('RackRow', array ('name' => $rackrow_name));
-}
-
 function commitUpdateRow ($rackrow_id, $rackrow_name)
 {
        return usePreparedExecuteBlade ('UPDATE RackRow SET name = ? WHERE id = ?', array ($rackrow_name, $rackrow_id));
index a65f6a9c0910341708a5bed2f85d090e725525d2..93c22cc7c5942a51613bc1541c2b2f5c421e3383 100644 (file)
@@ -216,6 +216,40 @@ function isPCRE ($arg)
        return TRUE;
 }
 
+function genericAssertion ($argname, $argtype)
+{
+       switch ($argtype)
+       {
+       case 'string':
+               assertStringArg ($argname);
+               break;
+       case 'uint':
+               assertUIntArg ($argname);
+               break;
+       case 'uint0':
+               assertUIntArg ($argname, TRUE);
+               break;
+       case 'inet4':
+               assertIPv4Arg ($argname);
+               break;
+       default:
+               throw new InvalidArgException ('argtype', $argtype); // comes not from user's input
+       }
+}
+
+// Validate and return "bypass" value for the current context, if one is
+// defined for it, or NULL otherwise.
+function getBypassValue()
+{
+       global $page, $pageno, $sic;
+       if (!array_key_exists ('bypass', $page[$pageno]))
+               return NULL;
+       if (!array_key_exists ('bypass_type', $page[$pageno]))
+               throw new RackTablesError ("Internal structure error at node '${pageno}' (bypass_type is not set)", RackTablesError::INTERNAL);
+       genericAssertion ($page[$pageno]['bypass'], $page[$pageno]['bypass_type']);
+       return $sic[$page[$pageno]['bypass']];
+}
+
 // Objects of some types should be explicitly shown as
 // anonymous (labelless). This function is a single place where the
 // decision about displayed name is made.
index d031c8c28b39c0c3a750f81dd131eb82528d504d..85ee5ff7cdcfa5cc327be4fc1327cebe41260bab 100644 (file)
@@ -30,9 +30,22 @@ $tab['rackspace']['history'] = 'History';
 $tabhandler['rackspace']['default'] = 'renderRackspace';
 $tabhandler['rackspace']['edit'] = 'renderRackspaceRowEditor';
 $tabhandler['rackspace']['history'] = 'renderRackspaceHistory';
-$ophandler['rackspace']['edit']['addRow'] = 'addRow';
 $ophandler['rackspace']['edit']['updateRow'] = 'updateRow';
 $ophandler['rackspace']['edit']['delete'] = 'deleteRow';
+$ophandler['rackspace']['edit']['addRow'] = array
+(
+       'table' => 'RackRow',
+       'action' => 'INSERT',
+       'arglist' => array
+       (
+               array
+               (
+                       'url_argname' => 'name',
+                       'table_colname' => 'name',
+                       'assertion' => 'string',
+               )
+       ),
+);
 
 $page['depot']['parent'] = 'index';
 $page['depot']['title'] = 'Objects';
index c7b02f1520680af11441173a1d68fc1eae46d98a..e34ffc9b6cf4f7369ab46142b03291bc1a94281c 100644 (file)
@@ -1817,18 +1817,6 @@ function submitSLBConfig ()
        return buildRedirectURL (__FUNCTION__, 'OK', array ('slbconfig'));
 }
 
-$msgcode['addRow']['OK'] = 74;
-$msgcode['addRow']['ERR'] = 100;
-function addRow ()
-{
-       assertStringArg ('name');
-
-       if (commitAddRow ($_REQUEST['name']) === TRUE)
-               return buildRedirectURL (__FUNCTION__, 'OK', array ($_REQUEST['name']));
-       else
-               return buildRedirectURL (__FUNCTION__, 'ERR', array ($_REQUEST['name']));
-}
-
 $msgcode['updateRow']['OK'] = 75;
 $msgcode['updateRow']['ERR'] = 100;
 function updateRow ()
@@ -2847,4 +2835,26 @@ function addObjectlog ()
        return buildRedirectURL (__FUNCTION__, 'OK', array ("Log entry for <a href=" . ${ob_url} . ">${oi['dname']}</a> added by ${remote_username}"));
 }
 
+function tableHandler ($opspec)
+{
+       global $sic;
+       if (!array_key_exists ('table', $opspec))
+               throw new InvalidArgException ('opspec', '(malformed array structure)', '"table" not set');
+       $columns = array();
+       foreach ($opspec['arglist'] as $argspec)
+       {
+               genericAssertion ($argspec['url_argname'], $argspec['assertion']);
+               $columns[$argspec['table_colname']] = $sic[$argspec['url_argname']];
+       }
+       switch ($opspec['action'])
+       {
+       case 'INSERT':
+               $retcode = TRUE === usePreparedInsertBlade ($opspec['table'], $columns) ? 48 : 110;
+               break;
+       default:
+               throw new InvalidArgException ('opspec/action', '(malformed array structure)');
+       }
+       return buildWideRedirectURL (oneLiner ($retcode));
+}
+
 ?>
index 50f1a434ec3ef0ccdb5349a9406e0bc386155922..5af20c73fad32563adc279635d96e4a1069920a5 100644 (file)
--- a/index.php
+++ b/index.php
@@ -48,33 +48,11 @@ if (isset ($_REQUEST['tab']) and ! isset ($_SESSION['RTLT'][$pageno]['dont_remem
 <?php
 if (isset ($tabhandler[$pageno][$tabno]))
 {
-       if (isset ($page[$pageno]['bypass']) && isset ($page[$pageno]['bypass_type']))
-       {
-               switch ($page[$pageno]['bypass_type'])
-               {
-                       case 'uint':
-                               assertUIntArg ($page[$pageno]['bypass']);
-                               break;
-                       case 'uint0':
-                               assertUIntArg ($page[$pageno]['bypass'], TRUE);
-                               break;
-                       case 'inet4':
-                               assertIPv4Arg ($page[$pageno]['bypass']);
-                               break;
-                       case 'string':
-                               assertStringArg ($page[$pageno]['bypass']);
-                               break;
-                       default:
-                               throw new RackTablesError ('Dispatching error for bypass parameter', RackTablesError::INTERNAL);
-               }
-               showMessageOrError();
-               call_user_func ($tabhandler[$pageno][$tabno], $_REQUEST[$page[$pageno]['bypass']]);
-       }
+       showMessageOrError();
+       if (NULL !== ($bypass = getBypassValue()))
+               call_user_func ($tabhandler[$pageno][$tabno], $bypass);
        else
-       {
-               showMessageOrError();
                call_user_func ($tabhandler[$pageno][$tabno]);
-       }
 }
 elseif (isset ($page[$pageno]['handler']))
 {
index 01a6b6904bf5d680fe518d787609651821f2f3da..c1d4a4dee1f4d522abeedd3347aad16b6e138776 100644 (file)
@@ -15,7 +15,11 @@ if ($op == 'addFile' && !isset($_FILES['file']['error']))
        throw new RackTablesError ('File upload error, check upload_max_filesize in php.ini', RackTablesError::MISCONFIGURED);
 fixContext();
 
-if (!isset ($ophandler[$pageno][$tabno][$op]) or !function_exists ($ophandler[$pageno][$tabno][$op]))
+if
+(
+       !isset ($ophandler[$pageno][$tabno][$op]) or
+       (!is_array ($ophandler[$pageno][$tabno][$op]) and !function_exists ($ophandler[$pageno][$tabno][$op]))
+)
        throw new RackTablesError ("Invalid navigation data for '${pageno}-${tabno}-${op}'", RackTablesError::INTERNAL);
 
 // We have a chance to handle an error before starting HTTP header.
@@ -23,7 +27,10 @@ if (!isset ($delayauth[$pageno][$tabno][$op]) and !permitted())
        $location = buildWideRedirectURL (oneLiner (157)); // operation not permitted
 else
 {
-       $location = call_user_func ($ophandler[$pageno][$tabno][$op]);
+       if (!is_array ($ophandler[$pageno][$tabno][$op]))
+               $location = call_user_func ($ophandler[$pageno][$tabno][$op]);
+       else
+               $location = tableGateway ($ophandler[$pageno][$tabno][$op]);
        if (!strlen ($location))
                throw new RackTablesError ('Operation handler failed to return its status', RackTablesError::INTERNAL);
 }