r2629 - judgeEntityRecord(): new loader/filter code
authorDenis Ovsienko <infrastation@yandex.ru>
Sat, 11 Apr 2009 18:30:25 +0000 (18:30 +0000)
committerDenis Ovsienko <infrastation@yandex.ru>
Sat, 11 Apr 2009 18:30:25 +0000 (18:30 +0000)
 - filterEntityRecordList(): idem
 - listEntities(): idem
 - loadFullEntityInfo(): idem

inc/database.php
inc/functions.php

index ee061f48c4085c2637c546dc676ed1fdba26a151..78c026d023d69ff036cc71446b3c29ff36597136 100644 (file)
@@ -216,6 +216,81 @@ function getObjectList ($type_id = 0, $tagfilter = array(), $tfmode = 'any')
        return $ret;
 }
 
+// For a given realm return a list of entity records, each with
+// enough information for judgeEntityRecord() to execute.
+function listEntities ($realm)
+{
+       switch ($realm)
+       {
+       case 'object':
+               $table = 'RackObject';
+               $columns = array ('id', 'name', 'objtype_id');
+               $keycolumn = 'id';
+               break;
+       default:
+               showError ('invalid arg', __FUNCTION__);
+               break;
+       }
+       $query = 'select tag_id';
+       foreach ($columns as $column)
+               $query .= ", ${table}.${column}";
+       $query .= " from ${table} left join TagStorage on entity_realm = '${realm}' and entity_id = ${table}.${keycolumn}";
+       $query .= " order by ${table}.${keycolumn}, tag_id";
+       $result = useSelectBlade ($query, __FUNCTION__);
+       $ret = array();
+       global $taglist;
+       // Index returned result by the value of key column.
+       while ($row = $result->fetch (PDO::FETCH_ASSOC))
+       {
+               $entity_id = $row[$keycolumn];
+               // Init the first record anyway, but store tag only if there is one.
+               if (!isset ($ret[$entity_id]))
+               {
+                       $ret[$entity_id] = array ('realm' => $realm, 'etags' => array());
+                       foreach ($columns as $column)
+                               $ret[$entity_id][$column] = $row[$column];
+                       if ($row['tag_id'] != NULL && isset ($taglist[$row['tag_id']]))
+                               $ret[$entity_id]['etags'][] = array
+                               (
+                                       'id' => $row['tag_id'],
+                                       'tag' => $taglist[$row['tag_id']]['tag'],
+                                       'parent_id' => $taglist[$row['tag_id']]['parent_id'],
+                               );
+               }
+               else
+                       // Meeting existing key later is always more tags on existing list.
+                       $ret[$entity_id]['etags'][] = array
+                       (
+                               'id' => $row['tag_id'],
+                               'tag' => $taglist[$row['tag_id']]['tag'],
+                               'parent_id' => $taglist[$row['tag_id']]['parent_id'],
+                       );
+       }
+       foreach (array_keys ($ret) as $entity_id)
+       {
+               $ret[$entity_id]['itags'] = getImplicitTags ($ret[$entity_id]['etags']);
+               $ret[$entity_id]['atags'] = generateEntityAutoTags ($realm, $entity_id);
+       }
+       return $ret;
+}
+
+// This function can be used with array_walk().
+function loadFullEntityInfo (&$record, $dummy = NULL)
+{
+       $record['test'] = __FUNCTION__ . ' was here';
+       switch ($record['realm'])
+       {
+       case 'object':
+               $record['ports'] = getObjectPortsAndLinks ($record['id']);
+               $record['ipv4'] = getObjectIPv4Allocations ($record['id']);
+               $record['nat4'] = getNATv4ForObject ($record['id']);
+               $record['ipv4rspools'] = getRSPoolsForObject ($record['id']);
+               $record['files'] = getFilesOfEntity ($record['realm'], $record['id']);
+               break;
+       default:
+       }
+}
+
 function getRacksForRow ($row_id = 0, $tagfilter = array(), $tfmode = 'any')
 {
        $query =
index 94f415a40a065f7765247fb6aa02fb04e5f3c48d..9d092b93db47743bed3a8e0f9f62729f462e021b 100644 (file)
@@ -1952,6 +1952,20 @@ function filterEntityList ($list_in, $realm, $expression = array())
        return $list_out;
 }
 
+function filterEntityRecordList ($list_in, $expression = array())
+{
+       if ($expression === NULL)
+               return array();
+       if (!count ($expression))
+               return $list_in;
+       global $rackCode;
+       $list_out = array();
+       foreach ($list_in as $item_key => $item_value)
+               if (TRUE === judgeEntityRecord ($item_value, $expression))
+                       $list_out[$item_key] = $item_value;
+       return $list_out;
+}
+
 // Tell, if the given expression is true for the given entity.
 function judgeEntity ($realm, $id, $expression)
 {
@@ -1971,6 +1985,24 @@ function judgeEntity ($realm, $id, $expression)
        );
 }
 
+// Idem, but use complete record instead of key.
+function judgeEntityRecord ($record, $expression)
+{
+       global $pTable;
+       return eval_expression
+       (
+               $expression,
+               array_merge
+               (
+                       $record['etags'],
+                       $record['itags'],
+                       $record['atags']
+               ),
+               $pTable,
+               TRUE
+       );
+}
+
 // If the requested predicate exists, return its [last] definition.
 // Otherwise return NULL (to signal filterEntityList() about error).
 // Also detect "not set" option selected.