Esempio n. 1
0
    static function Parse($srctree, $optimize = false, $flags = 0)
    {
        global $ADEI;
        global $ADEI_SRCTREE_EXTRA;
        $elements = explode(",", preg_replace_callback("/(\\([^)]+,[^)]+\\))/", create_function('$matches', '
		return preg_replace("/,/", ";", $matches[0]);
	    '), $srctree));
        $curid = false;
        $res = array();
        $idnum = array();
        $extras = array();
        if (!$elements || !$elements[0]) {
            $elements = array();
        }
        if ($flags & SOURCETree::EXPAND_SERVERS) {
            $remove_dublicates = false;
            $new_elements = array();
            foreach ($elements as $element) {
                if (preg_match("/^(.*)\\(([^)]+)\\)\$/", $element, $m)) {
                    array_push($new_elements, $element);
                } else {
                    $parts = explode("__", $element, 4);
                    if (sizeof($parts) == 1) {
                        $req = new SERVERRequest($props = array("db_server" => $parts[0]));
                        $list = $req->GetDatabaseList();
                        foreach ($list as $id => $info) {
                            array_push($new_elements, $parts[0] . "__" . $id);
                        }
                        $remove_dublicates = true;
                    } else {
                        if (sizeof($parts) > 2 && $parts[0] == "virtual") {
                            $extra = $parts[1];
                            if (!$extras[$extra]) {
                                ADEI::RequireClass("srctree/{$ADEI_SRCTREE_EXTRA[$extra]['class']}");
                                $extras[$extra] = new $ADEI_SRCTREE_EXTRA[$extra]['class']($req, $ADEI_SRCTREE_EXTRA[$extra]['options']);
                            }
                            $parts = explode("__", $element, 3);
                            $list = $extras[$extra]->Parse($parts[2]);
                            foreach ($list as $item) {
                                array_push($new_elements, $item);
                            }
                            $remove_dublicates = true;
                        } else {
                            array_push($new_elements, $element);
                        }
                    }
                }
            }
            $elements = array();
            foreach ($new_elements as $element) {
                if (preg_match("/^(.*)\\(([^)]+)\\)\$/", $element, $m)) {
                    array_push($elements, $element);
                } else {
                    $parts = explode("__", $element, 4);
                    if (sizeof($parts) == 2) {
                        $req = new SOURCERequest($props = array("db_server" => $parts[0], "db_name" => $parts[1]));
                        $list = $req->GetGroupList();
                        foreach ($list as $gid => $info) {
                            array_push($elements, $parts[0] . "__" . $parts[1] . "__" . $gid);
                        }
                        $remove_dublicates = true;
                    } else {
                        array_push($elements, $element);
                    }
                }
            }
            if ($remove_dublicates) {
                if ($optimize) {
                    $elements = array_unique($elements);
                } else {
                    $new_elements = array_unique($elements);
                    ksort($new_elements);
                    $elements = array_values($new_elements);
                }
            }
        }
        foreach ($elements as $element) {
            if (preg_match("/^(.*)\\(([^)]+)\\)\$/", $element, $m)) {
                $id = $m[1];
                $parts = explode("__", $m[1], 3);
                if (sizeof($parts) < 3) {
                    throw new ADEIException(translate("Unsupported element (%s) in the source tree", $m[1]));
                }
                $items = explode(";", $m[2]);
            } else {
                $parts = explode("__", $element, 4);
                if (sizeof($parts) == 1 && ($flags & SOURCETree::IGNORE_UIDS) == 0) {
                    $item_props = $ADEI->ResolveUID($parts[0]);
                    // Controls are not supported at the moment
                    if ($item_props) {
                        $parts = explode("__", SOURCETree::PropsToItem($item_props));
                    } else {
                        if (($flags & SOURCETree::IGNORE_BADITEMS) == 0) {
                            throw new ADEIException(translate("UID (%s) is not available", $parts[0]));
                        } else {
                            continue;
                        }
                    }
                }
                if (sizeof($parts) < 3) {
                    if (($flags & SOURCETree::IGNORE_BADITEMS) == 0) {
                        throw new ADEIException(translate("Unsupported element (%s) of source tree", $element));
                    } else {
                        continue;
                    }
                }
                $id = $parts[0] . "__" . $parts[1] . "__" . $parts[2];
                if (sizeof($parts) == 4) {
                    $items = array($parts[3]);
                } else {
                    $items = false;
                }
            }
            if ($optimize) {
                $realid = $id;
            } else {
                if (strcmp($id, $curid)) {
                    if ($idnum[$id]) {
                        $realid = $id . "__" . ++$idnum[$id];
                    } else {
                        $realid = $id;
                        $idnum[$id] = 1;
                    }
                    $curid = $id;
                }
            }
            if (!isset($res[$realid])) {
                $res[$realid] = array('props' => array('db_server' => $parts[0], 'db_name' => $parts[1], 'db_group' => $parts[2]), 'items' => array());
            }
            if ($items === false) {
                $res[$realid]['items'] = false;
                unset($res[$realid]['props']['db_mask']);
            } else {
                if (is_array($res[$realid]['items'])) {
                    $res[$realid]['items'] = array_merge($res[$realid]['items'], $items);
                    $res[$realid]['props']['db_mask'] = implode(",", $res[$realid]['items']);
                }
            }
        }
        return $res;
    }
Esempio n. 2
0
 function __construct(&$req = NULL, &$override = NULL)
 {
     global $OPTIONS;
     if ($req instanceof REQUEST) {
         $props =& $req->props;
     } else {
         $props =& $req;
     }
     $this->props =& $props;
     $this->options = array();
     if ($override) {
         $this->options[] =& $override;
     }
     if ($req && isset($props['db_server'])) {
         $src = array($props['db_server']);
         if (isset($props['db_name'])) {
             $src[] = $props['db_name'];
             if (isset($props['db_group'])) {
                 $src[] = $props['db_group'];
             }
         }
         if (!$req instanceof SERVERRequest) {
             $req = new SERVERRequest($props);
         }
         $server = $req->GetServerInfo(REQUEST::NEED_INFO);
         if (is_string($server['multibase'])) {
             $multibase = $server['multibase'];
         } else {
             if ($server['multibase']) {
                 $multibase = ".*";
             } else {
                 $multibase = false;
             }
         }
         $opts = array(array(), array(), array());
         foreach (array_keys($OPTIONS) as $regex) {
             $src_regex = explode("__", $regex, 3);
             // Handle multibase sources automatically
             if ($multibase && sizeof($src_regex) > 1) {
                 $src_regex[1] .= $multibase;
             }
             // option is two specific for current request
             if (sizeof($src_regex) > sizeof($src)) {
                 continue;
             }
             // check if all parts of regex match
             for ($i = 0; $i < sizeof($src_regex); $i++) {
                 //echo "checking $i (of ".sizeof($src_regex)."): {$src_regex[$i]}\n";
                 if (!preg_match("/^{$src_regex[$i]}\$/", $src[$i])) {
                     break;
                 }
             }
             if ($i < sizeof($src_regex)) {
                 continue;
             }
             // update options, the later defined options override earlier defined ones
             $pos = sizeof($src_regex) - 1;
             $opts[$pos] = array_merge($opts[$pos], $OPTIONS[$regex]);
         }
         // Putting in reverse order to give proper priorities
         for ($i = 0; $i < 3; $i++) {
             if ($opts[2 - $i]) {
                 $this->options[] =& $opts[2 - $i];
             }
         }
     }
     if (isset($OPTIONS['default'])) {
         $this->options[] =& $OPTIONS['default'];
     }
 }
Esempio n. 3
0
 function CreateGroupRequest(LOGGROUP $grp = NULL)
 {
     if ($grp) {
         $props = $this->props;
         $props['db_group'] = $grp->gid;
         return new GROUPRequest($props);
     }
     return parent::CreateGroupRequest();
 }
Esempio n. 4
0
     break;
 case 'experiments':
     $req = new SOURCERequest($_GET);
     $reader = $req->CreateReader();
     $elist = $reader->GetExperimentList();
     $list = array("-" => _("All Measurements"), "*-*" => _("Everything"));
     foreach ($elist as $db) {
         $list[$db['start'] . '-' . $db['stop']] = $db['name'];
     }
     if ($menu) {
         $list["0"] = _("Custom");
     }
     break;
 case 'axes':
     try {
         $req = new SERVERRequest($_GET);
         $rdr = $req->CreateReader();
         $axes = $rdr->CreateAxes();
     } catch (ADEIException $ae) {
         $req = new REQUEST($_GET);
         $axes = new GRAPHAxes($req, $flags);
     }
     $list = $axes->GetAxesInfo();
     $mode = PASSTHROUGH_MODE;
     break;
 case 'window_modes':
     $list = array("0" => _("All"));
     foreach ($ADEI_TIMINGS as $opt => $value) {
         $list["{$value}"] = $opt;
     }
     if ($menu) {