API to retrieve the newly created entity ID
authorAlexey Andriyanov <alan@al-an.info>
Thu, 6 Mar 2014 16:40:28 +0000 (20:40 +0400)
committerAlexey Andriyanov <alan@al-an.info>
Thu, 6 Mar 2014 16:40:28 +0000 (20:40 +0400)
When you implement a plugin that need to process the newly created
entity (by chaining after the original ophandler), you need to know the
entity id. lastInsertID() is not a choise since there may be multiple
inserts to different tables in the original ophandler.

lastCreated: new function to track or return the last created IDs
getLastCreatedId: wrapper around lastCreated(), filtering the last
created ID of a given realm.

these functions changed to call lastCreated():
commitAddObject
commitAddPort
commitCreateUserAccount
createIPv4Prefix
createIPv6Prefix
addVService
addVSG
createVLANDomain
addRStoRSPool
commitCreateRSPool
tableHandler

wwwroot/inc/database.php
wwwroot/inc/functions.php
wwwroot/inc/ophandlers.php
wwwroot/inc/slb.php

index ad9c0c9ad1e3fc60babe06532dda7d5387699ad0..4cf0eea5d78ea65081250b9d4d3cc726fdacf21c 100644 (file)
@@ -944,6 +944,22 @@ function commitAddObject ($new_name, $new_label, $new_type_id, $new_asset_no, $t
                )
        );
        $object_id = lastInsertID();
+       switch ($new_type_id)
+       {
+               case 1560:
+                       $realm = 'rack';
+                       break;
+               case 1561:
+                       $realm = 'row';
+                       break;
+               case 1562:
+                       $realm = 'localtion';
+                       break;
+               default:
+                       $realm = 'object';
+       }
+       lastCreated ($realm, $object_id);
+
        // Do AutoPorts magic
        executeAutoPorts ($object_id, $new_type_id);
        // Now tags...
@@ -1704,6 +1720,7 @@ function commitAddPort ($object_id = 0, $port_name, $port_type_id, $port_label,
                                'l2address' => nullEmptyStr ($db_l2address),
                        )
                );
+               lastCreated ('port', lastInsertID());
                if ($do_locks)
                        $dbxlink->exec ('UNLOCK TABLES');
        }
@@ -3299,7 +3316,9 @@ function commitCreateUserAccount ($username, $realname, $password)
                        'user_password_hash' => $password,
                )
        );
-       return lastInsertID();
+       $user_id = lastInsertID();
+       lastCreated ('user', $user_id);
+       return $user_id;
 }
 
 function commitUpdateUserAccount ($id, $new_username, $new_realname, $new_password)
@@ -4244,6 +4263,7 @@ function createIPv4Prefix ($range = '', $name = '', $is_connected = FALSE, $tagl
                )
        );
        $network_id = lastInsertID();
+       lastCreated ('ipv4net', $network_id);
 
        if ($is_connected and $mask < 31)
        {
@@ -4283,6 +4303,8 @@ function createIPv6Prefix ($range = '', $name = '', $is_connected = FALSE, $tagl
                )
        );
        $network_id = lastInsertID();
+       lastCreated ('ipv6net', lastInsertID());
+
        # RFC3513 2.6.1 - Subnet-Router anycast
        if ($is_connected)
                updateV6Address ($net['ip_bin'], 'Subnet-Router anycast', 'yes');
index 96ead366634e12220f05088baf9a5d03c073f9ac..b306a28274bb097480b7bfcf817d3976543de2a0 100644 (file)
@@ -6138,4 +6138,24 @@ function splitNetworkByMask ($netinfo, $dst_mask)
     );
 }
 
+// this function is used both to remember and to retrieve the last created entity's ID
+// it stores given id in the static var, and returns the stored value is called without args
+// used in plugins to make additional work on created entity in the chained ophandler
+// returns an array of realm-ID pairs
+function lastCreated ($realm = NULL, $id = NULL)
+{
+       static $last_ids = array();
+       if (isset ($realm) && isset ($id))
+               $last_ids[] = array('realm' => $realm, 'id' => $id);
+       return $last_ids;
+}
+
+// returns last id of a given type from lastCreated() result array
+function getLastCreatedId ($realm)
+{
+       foreach (array_reverse (lastCreated()) as $item)
+               if ($item['realm'] == $realm)
+                       return $item['id'];
+}
+
 ?>
index 08c7b601cd05923c47bbb02afd0c692dd1a040c5..2cc5dc3cd32b89595f8989b6adc7721d1364e3b1 100644 (file)
@@ -1531,6 +1531,7 @@ function addVService ()
                )
        );
        $vs_id = lastInsertID();
+       lastCreated ('ipv4vs', $vs_id);
        if (isset ($_REQUEST['taglist']))
                produceTagsForNewRecord ('ipv4vs', $_REQUEST['taglist'], $vs_id);
        $vsinfo = spotEntity ('ipv4vs', $vs_id);
@@ -1542,6 +1543,7 @@ function addVSG ()
        $name = assertStringArg ('name');
        usePreparedInsertBlade ('VS', array ('name' => $name));
        $vs_id = lastInsertID();
+       lastCreated ('ipvs', $vs_id);
        if (isset ($_REQUEST['taglist']))
                produceTagsForNewRecord ('ipvs', $_REQUEST['taglist'], $vs_id);
        $vsinfo = spotEntity ('ipvs', $vs_id);
@@ -2677,12 +2679,14 @@ function createVLANDomain ()
                        'description' => $sic['vdom_descr'],
                )
        );
+       $domain_id = lastInsertID();
+       lastCreated ('vdom', $domain_id);
        usePreparedInsertBlade
        (
                'VLANDescription',
                array
                (
-                       'domain_id' => lastInsertID(),
+                       'domain_id' => $domain_id,
                        'vlan_id' => VLAN_DFL_ID,
                        'vlan_type' => 'compulsory',
                        'vlan_descr' => 'default',
@@ -3404,7 +3408,30 @@ function tableHandler()
        switch ($opspec['action'])
        {
        case 'INSERT':
+               switch ($opspec['table'])
+               {
+                       case 'Attribute':
+                               $realm = 'attr';
+                               break;
+                       case 'Chapter':
+                               $realm = 'chapter';
+                               break;
+                       case 'Dictionary':
+                               $realm = 'dict';
+                               break;
+                       case 'TagTree':
+                               $realm = 'tag';
+                               break;
+                       case 'VLANSwitchTemplate':
+                               $realm = 'vst';
+                               break;
+                       default:
+                               $realm = NULL;
+               }
                usePreparedInsertBlade ($opspec['table'], buildOpspecColumns ($opspec, 'arglist'));
+               if (isset ($realm))
+                       lastCreated ($realm, lastInsertID());
+
                $retcode = 48;
                break;
        case 'DELETE':
index 77e053dc5d14aef783b7409ab446e434c8661d8f..3241ae7c26d2fab0d0b6477859e89b34b331ead5 100644 (file)
@@ -558,7 +558,7 @@ function buildLVSConfig ($object_id)
 
 function addRStoRSPool ($pool_id, $rsip_bin, $rsport = 0, $inservice = 'no', $rsconfig = '', $comment = '')
 {
-       return usePreparedInsertBlade
+       $ret = usePreparedInsertBlade
        (
                'IPv4RS',
                array
@@ -571,6 +571,8 @@ function addRStoRSPool ($pool_id, $rsip_bin, $rsport = 0, $inservice = 'no', $rs
                        'comment' => !strlen ($comment) ? NULL : $comment,
                )
        );
+       lastCreated ('iprs', lastInsertID());
+       return $ret;
 }
 
 function addLBtoRSPool ($pool_id = 0, $object_id = 0, $vs_id = 0, $vsconfig = '', $rsconfig = '', $prio = '')
@@ -639,8 +641,7 @@ function commitUpdateVS ($vsid, $vip_bin, $vport = 0, $proto = '', $name = '', $
 
 function commitCreateRSPool ($name = '', $vsconfig = '', $rsconfig = '', $tagidlist = array())
 {
-       $new_pool_id = FALSE;
-       if (usePreparedInsertBlade
+       usePreparedInsertBlade
        (
                'IPv4RSPool',
                array
@@ -649,8 +650,9 @@ function commitCreateRSPool ($name = '', $vsconfig = '', $rsconfig = '', $tagidl
                        'vsconfig' => (!strlen ($vsconfig) ? NULL : $vsconfig),
                        'rsconfig' => (!strlen ($rsconfig) ? NULL : $rsconfig)
                )
-       ))
-               $new_pool_id = lastInsertID();
+       );
+       $new_pool_id = lastInsertID();
+       lastCreated ('ipv4rspool', $new_pool_id);
        produceTagsForNewRecord ('ipv4rspool', $tagidlist, $new_pool_id);
        return $new_pool_id;
 }