123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- <?php
- require_once 'includes/common.inc.php';
- if($redis) {
- if (!empty($server['keys'])) {
- $keys = $redis->keys($server['filter']);
- } else {
- $next = 0;
- $keys = array();
- while (true) {
- $r = $redis->scan($next, 'MATCH', $server['filter'], 'COUNT', $server['scansize']);
- $next = $r[0];
- $keys = array_merge($keys, $r[1]);
- if ($next == 0) {
- break;
- }
- }
- }
- sort($keys);
- $namespaces = array(); // Array to hold our top namespaces.
- // Build an array of nested arrays containing all our namespaces and containing keys.
- foreach ($keys as $key) {
- // Ignore keys that are to long (Redis supports keys that can be way to long to put in an url).
- if (strlen($key) > $config['maxkeylen']) {
- continue;
- }
- $key = explode($server['seperator'], $key);
- // $d will be a reference to the current namespace.
- $d = &$namespaces;
- // We loop though all the namespaces for this key creating the array for each.
- // Each time updating $d to be a reference to the last namespace so we can create the next one in it.
- for ($i = 0; $i < (count($key) - 1); ++$i) {
- if (!isset($d[$key[$i]])) {
- $d[$key[$i]] = array();
- }
- $d = &$d[$key[$i]];
- }
- // Nodes containing an item named __phpredisadmin__ are also a key, not just a directory.
- // This means that creating an actual key named __phpredisadmin__ will make this bug.
- $d[$key[count($key) - 1]] = array('__phpredisadmin__' => true);
- // Unset $d so we don't accidentally overwrite it somewhere else.
- unset($d);
- }
- // Recursive function used to print the namespaces.
- function print_namespace($item, $name, $fullkey, $islast) {
- global $config, $server, $redis;
- // Is this also a key and not just a namespace?
- if (isset($item['__phpredisadmin__'])) {
- // Unset it so we won't loop over it when printing this namespace.
- unset($item['__phpredisadmin__']);
- $class = array();
- $len = false;
- if (isset($_GET['key']) && ($fullkey == $_GET['key'])) {
- $class[] = 'current';
- }
- if ($islast) {
- $class[] = 'last';
- }
- // Get the number of items in the key.
- if (!isset($config['faster']) || !$config['faster']) {
- switch ($redis->type($fullkey)) {
- case 'hash':
- $len = $redis->hLen($fullkey);
- break;
- case 'list':
- $len = $redis->lLen($fullkey);
- break;
- case 'set':
- $len = $redis->sCard($fullkey);
- break;
- case 'zset':
- $len = $redis->zCard($fullkey);
- break;
- }
- }
- ?>
- <li<?php echo empty($class) ? '' : ' class="'.implode(' ', $class).'"'?>>
- <a href="?view&s=<?php echo $server['id']?>&d=<?php echo $server['db']?>&key=<?php echo urlencode($fullkey)?>"><?php echo format_html($name)?><?php if ($len !== false) { ?><span class="info">(<?php echo $len?>)</span><?php } ?></a>
- </li>
- <?php
- }
- // Does this namespace also contain subkeys?
- if (count($item) > 0) {
- ?>
- <li class="folder<?php echo ($fullkey === '') ? '' : ' collapsed'?><?php echo $islast ? ' last' : ''?>">
- <div class="icon"><?php echo format_html($name)?> <span class="info">(<?php echo count($item)?>)</span>
- <?php if ($fullkey !== '') { ?><a href="delete.php?s=<?php echo $server['id']?>&d=<?php echo $server['db']?>&tree=<?php echo urlencode($fullkey)?>:" class="deltree"><img src="images/delete.png" width="10" height="10" title="Delete tree" alt="[X]"></a><?php } ?>
- </div><ul>
- <?php
- $l = count($item);
- foreach ($item as $childname => $childitem) {
- // $fullkey will be empty on the first call.
- if ($fullkey === '') {
- $childfullkey = $childname;
- } else {
- $childfullkey = $fullkey.$server['seperator'].$childname;
- }
- print_namespace($childitem, $childname, $childfullkey, (--$l == 0));
- }
- ?>
- </ul>
- </li>
- <?php
- }
- }
- } // if redis
- // This is basically the same as the click code in index.js.
- // Just build the url for the frame based on our own url.
- if (count($_GET) == 0) {
- $iframe = 'overview.php';
- } else {
- $iframe = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '?') + 1);
- if (strpos($iframe, '&') !== false) {
- $iframe = substr_replace($iframe, '.php?', strpos($iframe, '&'), 1);
- } else {
- $iframe .= '.php';
- }
- }
- $page['css'][] = 'index';
- $page['js'][] = 'index';
- $page['js'][] = 'jquery-cookie';
- require 'includes/header.inc.php';
- ?>
- <div id="sidebar">
- <h1 class="logo"><a href="?overview&s=<?php echo $server['id']?>&d=<?php echo $server['db']?>">phpRedisAdmin</a></h1>
- <p>
- <select id="server">
- <?php foreach ($config['servers'] as $i => $srv) { ?>
- <option value="<?php echo $i?>" <?php echo ($server['id'] == $i) ? 'selected="selected"' : ''?>><?php echo isset($srv['name']) ? format_html($srv['name']) : $srv['host'].':'.$srv['port']?></option>
- <?php } ?>
- </select>
- <?php if($redis) { ?>
- <?php
- if (isset($server['databases'])) {
- $databases = $server['databases'];
- } else {
- $databases = $redis->config('GET', 'databases');
- $databases = $databases['databases'];
- }
- if ($databases > 1) { ?>
- <select id="database">
- <?php for ($d = 0; $d < $databases; ++$d) { ?>
- <option value="<?php echo $d?>" <?php echo ($server['db'] == $d) ? 'selected="selected"' : ''?>>database <?php echo $d?></option>
- <?php } ?>
- </select>
- <?php } ?>
- </p>
- <p>
- <?php if (isset($login)) { ?>
- <a href="logout.php"><img src="images/logout.png" width="16" height="16" title="Logout" alt="[L]"></a>
- <?php } ?>
- <a href="?info&s=<?php echo $server['id']?>&d=<?php echo $server['db']?>"><img src="images/info.png" width="16" height="16" title="Info" alt="[I]"></a>
- <a href="?export&s=<?php echo $server['id']?>&d=<?php echo $server['db']?>"><img src="images/export.png" width="16" height="16" title="Export" alt="[E]"></a>
- <a href="?import&s=<?php echo $server['id']?>&d=<?php echo $server['db']?>"><img src="images/import.png" width="16" height="16" title="Import" alt="[I]"></a>
- <?php if (isset($server['flush']) && $server['flush']) { ?>
- <a href="?flush&s=<?php echo $server['id']?>&d=<?php echo $server['db']?>" id="flush"><img src="images/flush.png" width="16" height="16" title="Flush" alt="[F]"></a>
- <?php } ?>
- </p>
- <p>
- <a href="?edit&s=<?php echo $server['id']?>&d=<?php echo $server['db']?>" class="add">Add another key</a>
- </p>
- <p>
- <input type="text" id="server_filter" size="14" value="<?php echo format_html($server['filter']); ?>" placeholder="type here to server filter" class="info">
- <button id="btn_server_filter">Filter!</button>
- </p>
- <p>
- <input type="text" id="filter" size="24" value="type here to filter" placeholder="type here to filter" class="info">
- </p>
- <div id="keys">
- <ul>
- <?php print_namespace($namespaces, 'Keys', '', empty($namespaces))?>
- </ul>
- </div><!-- #keys -->
- <?php } else { ?>
- </p>
- <div style="color:red">Can't connect to this server</div>
- <?php } ?>
- </div><!-- #sidebar -->
- <div id="resize"></div>
- <div id="resize-layover"></div>
- <div id="frame">
- <iframe src="<?php echo format_html($iframe)?>" id="iframe" frameborder="0" scrolling="0"></iframe>
- </div><!-- #frame -->
- <?php
- require 'includes/footer.inc.php';
- ?>
|