From 6bfeeb62caa90249bd9314152a5a7a5cb72d003b Mon Sep 17 00:00:00 2001 From: Guillaume Dievart Date: Thu, 23 Apr 2015 07:24:34 +0200 Subject: [PATCH 001/110] Use the default interpretor instead of bash --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bf6b88e73f..d81387c868 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Website (French): [https://jeedom.fr/](https://jeedom.fr/) ```bash sudo apt-get update sudo apt-get dist-upgrade -curl -sS https://raw.githubusercontent.com/jeedom/core/stable/install/install.sh | sudo bash +curl -sS https://raw.githubusercontent.com/jeedom/core/stable/install/install.sh | sudo sh ``` # French # @@ -19,5 +19,5 @@ curl -sS https://raw.githubusercontent.com/jeedom/core/stable/install/install.sh ```bash sudo apt-get update sudo apt-get dist-upgrade -curl -sS https://raw.githubusercontent.com/jeedom/core/stable/install/install.sh | sudo bash +curl -sS https://raw.githubusercontent.com/jeedom/core/stable/install/install.sh | sudo sh ``` From 2ffaebd29545b75c5d3233429729c728b896ba86 Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 23 Apr 2015 17:04:57 +0200 Subject: [PATCH 002/110] =?UTF-8?q?Possibilit=C3=A9=20d'envoyer=20seulemen?= =?UTF-8?q?t=20la=20doc=20d'un=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/market.class.php | 9 ++++++ desktop/modal/market.send.php | 59 ++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/core/class/market.class.php b/core/class/market.class.php index cc9247ce2f..f1897b195b 100644 --- a/core/class/market.class.php +++ b/core/class/market.class.php @@ -50,6 +50,7 @@ class market { private $private; private $change; private $updateBy; + private $docOnly; /* * ***********************Méthodes statiques*************************** */ @@ -1076,6 +1077,14 @@ public function setChange($change) { $this->change = $change; } + public function getDocOnly() { + return $this->docOnly; + } + + public function setDocOnly($docOnly) { + $this->docOnly = $docOnly; + } + public function getUpdateBy() { return $this->updateBy; } diff --git a/desktop/modal/market.send.php b/desktop/modal/market.send.php index df76e803c3..4876e6cc62 100644 --- a/desktop/modal/market.send.php +++ b/desktop/modal/market.send.php @@ -149,9 +149,9 @@
-
- -
+
+ +
@@ -204,20 +204,27 @@
-
+
- -
- -
-
- {{Valider}} - {{Annuler}} + +
+ +
+
+
+ +
+ +
+ +
+ {{Valider}} + {{Annuler}}
@@ -230,7 +237,7 @@ $("#md_marketSendChangeChange").dialog({ autoOpen: false, modal: true, - height: 350, + height: 400, width:700, position: {my: 'center', at: 'center', of: window}, open: function () { @@ -267,11 +274,11 @@ $('body').setValues(market_display_info, '.marketAttr'); if(market_display_info.id != ''){ $('#span_directLinkWidget').value('{{Ou en cliquant }}{{ici}}'); - }else{ +}else{ $('#span_directLinkWidget').value(''); - } +} - if (market_display_info.realcost == '' || market_display_info.realcost == 0) { +if (market_display_info.realcost == '' || market_display_info.realcost == 0) { $('.rb_price.free').prop('checked', true); $('.marketAttr[data-l1key=cost]').value(''); $('.rb_price.free').closest('.priceChoose').addClass('alert alert-success'); @@ -304,16 +311,18 @@ }); if(market.id != ''){ - $('#md_marketSendChangeChange').dialog('open'); - $('#in_marketSendVersion').value(market_display_info.version); - $('#ta_marketSendChange').value(''); - $('#bt_marketSendCancelChange').off().on('click',function(){ + $('#md_marketSendChangeChange').dialog('open'); + $('#in_marketSendVersion').value(market_display_info.version); + $('#ta_marketSendChange').value(''); + $('#cb_marketSendDocOnly').value(0); + $('#bt_marketSendCancelChange').off().on('click',function(){ $('#md_marketSendChangeChange').dialog('close'); }); - $('#bt_marketSendValideChange').off().on('click',function(){ + $('#bt_marketSendValideChange').off().on('click',function(){ market.version = $('#in_marketSendVersion').value(); market.change = $('#ta_marketSendChange').value(); + market.docOnly = $('#cb_marketSendDocOnly').value(); $.ajax({// fonction permettant de faire de l'ajax @@ -336,12 +345,12 @@ $.showLoading(); window.location.reload(); } else { - $('#md_marketSendChangeChange').dialog('close'); - $('#div_alertMarketSend').showAlert({message: '{{Votre objet a été envoyé avec succès sur le market}}', level: 'success'}); - } + $('#md_marketSendChangeChange').dialog('close'); + $('#div_alertMarketSend').showAlert({message: '{{Votre objet a été envoyé avec succès sur le market}}', level: 'success'}); + } - } - }); + } + }); }); }else{ From cf5f446163b927961bc7887b0a6ea1fe9e684585 Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 23 Apr 2015 17:22:09 +0200 Subject: [PATCH 003/110] Fix configuration --- desktop/js/plugin.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/desktop/js/plugin.js b/desktop/js/plugin.js index 7c6f45c511..d617f73242 100644 --- a/desktop/js/plugin.js +++ b/desktop/js/plugin.js @@ -110,7 +110,7 @@ $(".li_plugin,.pluginDisplayCard").on('click', function () { html += '
'; $('#span_plugin_toggleState').html(html); } - + initExpertMode(); $('#div_plugin_configuration').empty(); if (data.checkVersion != -1) { if (data.configurationPath != '' && data.activate == 1) { @@ -126,6 +126,7 @@ $(".li_plugin,.pluginDisplayCard").on('click', function () { $('#div_plugin_configuration').parent().show(); modifyWithoutSave = false; initTooltips(); + initExpertMode(); } }); $('.slaveConfig').each(function(){ @@ -141,6 +142,7 @@ $(".li_plugin,.pluginDisplayCard").on('click', function () { $('#div_plugin_configuration .slaveConfig[data-slave_id='+slave_id+']').setValues(data, '.slaveConfigKey'); modifyWithoutSave = false; initTooltips(); + initExpertMode(); } }); }) From 3a38e2077fdadb257db81d237f691c8b4a465f67 Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 23 Apr 2015 17:40:47 +0200 Subject: [PATCH 004/110] Bugfix --- core/php/jeeCron.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/php/jeeCron.php b/core/php/jeeCron.php index e45dab2799..b8e7cd9d4b 100644 --- a/core/php/jeeCron.php +++ b/core/php/jeeCron.php @@ -74,9 +74,6 @@ if ($cycleDuration < $cron->getDeamonSleepTime()) { usleep(($cron->getDeamonSleepTime() - $cycleDuration) * 1000000); } - if ((strtotime('now') - $datetimeStart) / 60 >= $cron->getTimeout()) { - die(); - } } } } else { @@ -100,9 +97,6 @@ if ($cycleDuration < $cron->getDeamonSleepTime()) { usleep(($cron->getDeamonSleepTime() - $cycleDuration) * 1000000); } - if ((strtotime('now') - $datetimeStart) / 60 >= $cron->getTimeout()) { - die(); - } } } } else { From fe96b3dc4f9aca815d6bf9840288c21bad3c366e Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 23 Apr 2015 17:59:48 +0200 Subject: [PATCH 005/110] Improve cron management --- core/class/cron.class.php | 1082 ++++++++++++++++++------------------- core/php/jeeCron.php | 28 + 2 files changed, 569 insertions(+), 541 deletions(-) diff --git a/core/class/cron.class.php b/core/class/cron.class.php index 6bf7609588..05dcc3cd1b 100644 --- a/core/class/cron.class.php +++ b/core/class/cron.class.php @@ -1,541 +1,541 @@ -. - */ - -/* * ***************************Includes********************************* */ -require_once dirname(__FILE__) . '/../../core/php/core.inc.php'; - -class cron { - /* * *************************Attributs****************************** */ - - private $id; - private $server; - private $enable = 1; - private $class = ''; - private $function; - private $lastRun = '0000-00-00 00:00:00'; - private $duration = '0'; - private $state = 'stop'; - private $pid = ''; - private $schedule = ''; - private $timeout; - private $deamon = 0; - private $deamonSleepTime; - private $option; - private $once = 0; - - /* * ***********************Méthodes statiques*************************** */ - - /** - * Return an array of all cron object - * @return array - */ - public static function all($_order = false) { - $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' - FROM cron'; - if ($_order) { - $sql .= ' ORDER BY deamon DESC'; - } - return DB::Prepare($sql, array(), DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, __CLASS__); - } - - /** - * Get cron object associate to id - * @param int $_id - * @return object - */ - public static function byId($_id) { - $value = array( - 'id' => $_id, - ); - $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' - FROM cron - WHERE id=:id'; - return DB::Prepare($sql, $value, DB::FETCH_TYPE_ROW, PDO::FETCH_CLASS, __CLASS__); - } - - /** - * Return cron object corresponding to parameters - * @param string $_class - * @param string $_function - * @param string $_option - * @return object - */ - public static function byClassAndFunction($_class, $_function, $_option = '') { - $value = array( - 'class' => $_class, - 'function' => $_function, - ); - $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' - FROM cron - WHERE class=:class - AND function=:function'; - if ($_option != '') { - $_option = json_encode($_option, JSON_UNESCAPED_UNICODE); - $value['option'] = $_option; - $sql .= ' AND `option`=:option'; - } - return DB::Prepare($sql, $value, DB::FETCH_TYPE_ROW, PDO::FETCH_CLASS, __CLASS__); - } - - public static function searchClassAndFunction($_class, $_function, $_option = '') { - $value = array( - 'class' => $_class, - 'function' => $_function, - ); - $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' - FROM cron - WHERE class=:class - AND function=:function'; - if ($_option != '') { - $value['option'] = '%' . $_option . '%'; - $sql .= ' AND `option` LIKE :option'; - } - return DB::Prepare($sql, $value, DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, __CLASS__); - } - - public static function clean() { - $crons = self::all(); - foreach ($crons as $cron) { - $c = new Cron\CronExpression($cron->getSchedule(), new Cron\FieldFactory); - try { - if(!$c->isDue()){ - $c->getNextRunDate(); - } - } catch (Exception $ex) { - $cron->remove(); - } - } - } - - /** - * Return number of cron running - * @return int - */ - public static function nbCronRun() { - return shell_exec('ps ax | grep jeeCron.php | grep -v "grep" | grep -v "sudo" | grep -v "shell=/bin/bash - " | grep -v "/bin/bash -c " | grep -v "/bin/sh -c " | grep -v ' . posix_getppid() . ' | grep -v ' . getmypid() . ' | wc -l'); - } - - /** - * Return number of process on system - * @return int - */ - public static function nbProcess() { - $result = shell_exec('ps ax | wc -l'); - return $result; - } - - /** - * Return array of load average - * @return array - */ - public static function loadAvg() { - return sys_getloadavg(); - } - - /** - * Set jeecron pid of current process - */ - public static function setPidFile() { - $path = '/tmp/jeeCron.pid'; - $fp = fopen($path, 'w'); - fwrite($fp, getmypid()); - fclose($fp); - } - - /** - * Return the current pid of jeecron or empty if not running - * @return int - */ - public static function getPidFile() { - $path = '/tmp/jeeCron.pid'; - if (file_exists($path)) { - return file_get_contents($path); - } - return ''; - } - - /** - * Return state of jeecron master - * @return boolean - */ - public static function jeeCronRun() { - $pid = self::getPidFile(); - if ($pid == '' || !is_numeric($pid)) { - return false; - } - return posix_getsid($pid); - } - - public static function ok() { - $sql = 'SELECT UNIX_TIMESTAMP(max(`lastRun`)) as `time` - FROM cron'; - $result = DB::Prepare($sql, array(), DB::FETCH_TYPE_ROW); - if ((strtotime('now') - $result['time']) > 3600) { - return false; - } - return true; - } - - /* * *********************Méthodes d'instance************************* */ - - /** - * Check if cron object is valid before save - * @throws Exception - */ - public function preSave() { - if ($this->getFunction() == '') { - throw new Exception(__('La fonction ne peut pas être vide', __FILE__)); - } - if ($this->getSchedule() == '') { - throw new Exception(__('La programmation ne peut pas être vide : ', __FILE__) . print_r($this, true)); - } - } - - /** - * Save cron object - * @return boolean - */ - public function save() { - return DB::save($this, false, true); - } - - /** - * Remove cron object - * @return boolean - */ - public function remove($halt_before = true) { - if ($halt_before && $this->running()) { - $this->halt(); - } - return DB::remove($this); - } - - /** - * Set cron to be start - */ - public function start() { - if (!$this->running()) { - $this->setState('starting'); - $this->save(); - } else { - $this->setState('run'); - $this->save(); - } - } - - /** - * Number of this cron running - * @return int - */ - public function getNbRun() { - $cmd = 'php ' . dirname(__FILE__) . '/../php/jeeCron.php'; - $cmd.= ' cron_id=' . $this->getId(); - return jeedom::checkOngoingThread($cmd); - } - - /** - * Return pid of this cron (if running) - * @return int - */ - public function retrievePid() { - $cmd = 'php ' . dirname(__FILE__) . '/../php/jeeCron.php'; - $cmd.= ' cron_id=' . $this->getId(); - return jeedom::retrievePidThread($cmd); - } - - /** - * Launch cron (this method must be only call by jeecron master) - * @throws Exception - */ - public function run($_noErrorReport = false) { - $cmd = '/usr/bin/php ' . dirname(__FILE__) . '/../php/jeeCron.php'; - $cmd.= ' cron_id=' . $this->getId(); - if (!$this->running()) { - exec($cmd . ' >> /dev/null 2>&1 &'); - } else { - if (!$_noErrorReport) { - $this->setPID($this->retrievePid()); - $this->setServer(gethostname()); - $this->setState('run'); - $this->halt(); - if (!$this->running()) { - exec($cmd . ' >> /dev/null 2>&1 &'); - } else { - throw new Exception(__('Impossible d\'exécuter la tâche car elle est déjà en cours d\'exécution (', __FILE__) . $this->getNbRun() . ') : ' . $cmd); - } - } - } - } - - /** - * Check if this cron is currently running - * @return boolean - */ - public function running() { - if (($this->getState() == 'run' || $this->getState() == 'stoping' ) && $this->getPID() > 0) { - return posix_getsid($this->getPID()); - } - return false; - } - - /** - * Refresh DB state of this cron - * @return boolean - */ - public function refresh() { - $result = DB::refresh($this); - if ($result && ($this->getState() == 'run' || $this->getState() == 'stoping') && !$this->running()) { - $this->setState('stop'); - $this->setPID(); - $this->setServer(''); - $this->save(); - } - return $result; - } - - /* - * Set this cron to stop - */ - - public function stop() { - if ($this->running()) { - $this->setState('stoping'); - $this->save(); - } - } - - /* - * Stop immediatly cron (this method must be only call by jeecron master) - */ - - public function halt() { - if (!$this->running()) { - $this->setState('stop'); - $this->setPID(); - $this->setServer(''); - $this->save(); - return true; - } - log::add('cron', 'info', __('Arret de ', __FILE__) . $this->getClass() . '::' . $this->getFunction() . '(), PID : ' . $this->getPID()); - $kill = posix_kill($this->getPID(), 15); - $retry = 0; - while (!$kill && $retry < (config::byKey('deamonsSleepTime') + 5)) { - sleep(1); - $kill = posix_kill($this->getPID(), 9); - $retry++; - } - $retry = 0; - while (!$kill && $retry < (config::byKey('deamonsSleepTime') + 5)) { - sleep(1); - exec('kill -9 ' . $this->getPID()); - $kill = $this->running(); - $retry++; - } - if (!$kill && $this->running()) { - $this->setState('error'); - $this->setServer(''); - $this->setPID(); - $this->save(); - throw new Exception($this->getClass() . '::' . $this->getFunction() . __('() : Impossible d\'arrêter la tâche', __FILE__)); - } else { - $this->setState('stop'); - $this->setDuration(-1); - $this->setPID(); - $this->setServer(''); - $this->save(); - } - } - - /** - * Check if it's time to launch cron - * @return boolean - */ - public function isDue() { - //check if already sent on that minute - $last = strtotime($this->getLastRun()); - $now = time(); - $now = ($now - $now % 60); - $last = ($last - $last % 60); - if ($now == $last) { - return false; - } - try { - $c = new Cron\CronExpression($this->getSchedule(), new Cron\FieldFactory); - try { - if ($c->isDue()) { - return true; - } - } catch (Exception $e) { - - } - $prev = $c->getPreviousRunDate(); - $lastCheck = new DateTime($this->getLastRun()); - $diff = round(abs((strtotime('now') - $prev->getTimestamp()) / 60)); - if ($lastCheck < $prev && $diff <= config::byKey('maxCatchAllow') || config::byKey('maxCatchAllow') == -1) { - return true; - } - } catch (Exception $e) { - - } - return false; - } - - /** - * Get human name of cron - * @return string - */ - public function getName() { - if ($this->getClass() != '') { - return $this->getClass() . '::' . $this->getFunction() . '()'; - } - return $this->getFunction() . '()'; - } - - /* * **********************Getteur Setteur*************************** */ - - public function getId() { - return $this->id; - } - - public function getClass() { - return $this->class; - } - - public function getFunction() { - return $this->function; - } - - public function getLastRun() { - return $this->lastRun; - } - - public function getState() { - return $this->state; - } - - public function getEnable() { - return $this->enable; - } - - public function getDuration() { - return $this->duration; - } - - public function getPID() { - return $this->pid; - } - - public function setId($id) { - $this->id = $id; - } - - public function setEnable($enable) { - $this->enable = $enable; - } - - public function setClass($class) { - $this->class = $class; - } - - public function setFunction($function) { - $this->function = $function; - } - - public function setLastRun($lastRun) { - $this->lastRun = $lastRun; - } - - public function setDuration($duration) { - $this->duration = $duration; - } - - public function setState($state) { - $this->state = $state; - } - - public function setPID($pid = '') { - $this->pid = $pid; - } - - public function getServer() { - return $this->server; - } - - public function setServer($server) { - $this->server = $server; - } - - public function getSchedule() { - return $this->schedule; - } - - public function setSchedule($schedule) { - $this->schedule = $schedule; - } - - public function getDeamon() { - return $this->deamon; - } - - public function setDeamon($deamons) { - $this->deamon = $deamons; - } - - public function getTimeout() { - $timeout = $this->timeout; - if ($timeout == 0) { - $timeout = config::byKey('maxExecTimeCrontask'); - } - return $timeout; - } - - public function setTimeout($timeout) { - $this->timeout = $timeout; - } - - public function getDeamonSleepTime() { - $deamonSleepTime = $this->deamonSleepTime; - if ($deamonSleepTime == 0) { - $deamonSleepTime = config::byKey('deamonsSleepTime'); - } - return $deamonSleepTime; - } - - public function setDeamonSleepTime($deamonSleepTime) { - $this->deamonSleepTime = $deamonSleepTime; - } - - public function getOption() { - return json_decode($this->option, true); - } - - public function getOnce() { - return $this->once; - } - - public function setOption($option) { - $this->option = json_encode($option, JSON_UNESCAPED_UNICODE); - } - - public function setOnce($once) { - $this->once = $once; - } - -} - -?> +. + */ + +/* * ***************************Includes********************************* */ +require_once dirname(__FILE__) . '/../../core/php/core.inc.php'; + +class cron { + /* * *************************Attributs****************************** */ + + private $id; + private $server; + private $enable = 1; + private $class = ''; + private $function; + private $lastRun = '0000-00-00 00:00:00'; + private $duration = '0'; + private $state = 'stop'; + private $pid = ''; + private $schedule = ''; + private $timeout; + private $deamon = 0; + private $deamonSleepTime; + private $option; + private $once = 0; + + /* * ***********************Méthodes statiques*************************** */ + + /** + * Return an array of all cron object + * @return array + */ + public static function all($_order = false) { + $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' + FROM cron'; + if ($_order) { + $sql .= ' ORDER BY deamon DESC'; + } + return DB::Prepare($sql, array(), DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, __CLASS__); + } + + /** + * Get cron object associate to id + * @param int $_id + * @return object + */ + public static function byId($_id) { + $value = array( + 'id' => $_id, + ); + $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' + FROM cron + WHERE id=:id'; + return DB::Prepare($sql, $value, DB::FETCH_TYPE_ROW, PDO::FETCH_CLASS, __CLASS__); + } + + /** + * Return cron object corresponding to parameters + * @param string $_class + * @param string $_function + * @param string $_option + * @return object + */ + public static function byClassAndFunction($_class, $_function, $_option = '') { + $value = array( + 'class' => $_class, + 'function' => $_function, + ); + $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' + FROM cron + WHERE class=:class + AND function=:function'; + if ($_option != '') { + $_option = json_encode($_option, JSON_UNESCAPED_UNICODE); + $value['option'] = $_option; + $sql .= ' AND `option`=:option'; + } + return DB::Prepare($sql, $value, DB::FETCH_TYPE_ROW, PDO::FETCH_CLASS, __CLASS__); + } + + public static function searchClassAndFunction($_class, $_function, $_option = '') { + $value = array( + 'class' => $_class, + 'function' => $_function, + ); + $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' + FROM cron + WHERE class=:class + AND function=:function'; + if ($_option != '') { + $value['option'] = '%' . $_option . '%'; + $sql .= ' AND `option` LIKE :option'; + } + return DB::Prepare($sql, $value, DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, __CLASS__); + } + + public static function clean() { + $crons = self::all(); + foreach ($crons as $cron) { + $c = new Cron\CronExpression($cron->getSchedule(), new Cron\FieldFactory); + try { + if (!$c->isDue()) { + $c->getNextRunDate(); + } + } catch (Exception $ex) { + $cron->remove(); + } + } + } + + /** + * Return number of cron running + * @return int + */ + public static function nbCronRun() { + return shell_exec('ps ax | grep jeeCron.php | grep -v "grep" | grep -v "sudo" | grep -v "shell=/bin/bash - " | grep -v "/bin/bash -c " | grep -v "/bin/sh -c " | grep -v ' . posix_getppid() . ' | grep -v ' . getmypid() . ' | wc -l'); + } + + /** + * Return number of process on system + * @return int + */ + public static function nbProcess() { + $result = shell_exec('ps ax | wc -l'); + return $result; + } + + /** + * Return array of load average + * @return array + */ + public static function loadAvg() { + return sys_getloadavg(); + } + + /** + * Set jeecron pid of current process + */ + public static function setPidFile() { + $path = '/tmp/jeeCron.pid'; + $fp = fopen($path, 'w'); + fwrite($fp, getmypid()); + fclose($fp); + } + + /** + * Return the current pid of jeecron or empty if not running + * @return int + */ + public static function getPidFile() { + $path = '/tmp/jeeCron.pid'; + if (file_exists($path)) { + return file_get_contents($path); + } + return ''; + } + + /** + * Return state of jeecron master + * @return boolean + */ + public static function jeeCronRun() { + $pid = self::getPidFile(); + if ($pid == '' || !is_numeric($pid)) { + return false; + } + return posix_getsid($pid); + } + + public static function ok() { + $sql = 'SELECT UNIX_TIMESTAMP(max(`lastRun`)) as `time` + FROM cron'; + $result = DB::Prepare($sql, array(), DB::FETCH_TYPE_ROW); + if ((strtotime('now') - $result['time']) > 3600) { + return false; + } + return true; + } + + /* * *********************Méthodes d'instance************************* */ + + /** + * Check if cron object is valid before save + * @throws Exception + */ + public function preSave() { + if ($this->getFunction() == '') { + throw new Exception(__('La fonction ne peut pas être vide', __FILE__)); + } + if ($this->getSchedule() == '') { + throw new Exception(__('La programmation ne peut pas être vide : ', __FILE__) . print_r($this, true)); + } + } + + /** + * Save cron object + * @return boolean + */ + public function save() { + return DB::save($this, false, true); + } + + /** + * Remove cron object + * @return boolean + */ + public function remove($halt_before = true) { + if ($halt_before && $this->running()) { + $this->halt(); + } + return DB::remove($this); + } + + /** + * Set cron to be start + */ + public function start() { + if (!$this->running()) { + $this->setState('starting'); + $this->save(); + } else { + $this->setState('run'); + $this->save(); + } + } + + /** + * Number of this cron running + * @return int + */ + public function getNbRun() { + $cmd = 'php ' . dirname(__FILE__) . '/../php/jeeCron.php'; + $cmd .= ' cron_id=' . $this->getId(); + return jeedom::checkOngoingThread($cmd); + } + + /** + * Return pid of this cron (if running) + * @return int + */ + public function retrievePid() { + $cmd = 'php ' . dirname(__FILE__) . '/../php/jeeCron.php'; + $cmd .= ' cron_id=' . $this->getId(); + return jeedom::retrievePidThread($cmd); + } + + /** + * Launch cron (this method must be only call by jeecron master) + * @throws Exception + */ + public function run($_noErrorReport = false) { + $cmd = '/usr/bin/php ' . dirname(__FILE__) . '/../php/jeeCron.php'; + $cmd .= ' cron_id=' . $this->getId(); + if (!$this->running()) { + exec($cmd . ' >> /dev/null 2>&1 &'); + } else { + if (!$_noErrorReport) { + $this->setPID($this->retrievePid()); + $this->setServer(gethostname()); + $this->setState('run'); + $this->halt(); + if (!$this->running()) { + exec($cmd . ' >> /dev/null 2>&1 &'); + } else { + throw new Exception(__('Impossible d\'exécuter la tâche car elle est déjà en cours d\'exécution (', __FILE__) . $this->getNbRun() . ') : ' . $cmd); + } + } + } + } + + /** + * Check if this cron is currently running + * @return boolean + */ + public function running() { + if (($this->getState() == 'run' || $this->getState() == 'stoping') && $this->getPID() > 0) { + return posix_getsid($this->getPID()); + } + return false; + } + + /** + * Refresh DB state of this cron + * @return boolean + */ + public function refresh() { + $result = DB::refresh($this); + if ($result && ($this->getState() == 'run' || $this->getState() == 'stoping') && !$this->running()) { + $this->setState('stop'); + $this->setPID(); + $this->setServer(''); + $this->save(); + } + return $result; + } + + /* + * Set this cron to stop + */ + + public function stop() { + if ($this->running()) { + $this->setState('stoping'); + $this->save(); + } + } + + /* + * Stop immediatly cron (this method must be only call by jeecron master) + */ + + public function halt() { + if (!$this->running()) { + $this->setState('stop'); + $this->setPID(); + $this->setServer(''); + $this->save(); + return true; + } + log::add('cron', 'info', __('Arret de ', __FILE__) . $this->getClass() . '::' . $this->getFunction() . '(), PID : ' . $this->getPID()); + $kill = posix_kill($this->getPID(), 15); + $retry = 0; + while (!$kill && $retry < (config::byKey('deamonsSleepTime') + 5)) { + sleep(1); + $kill = posix_kill($this->getPID(), 9); + $retry++; + } + $retry = 0; + while (!$kill && $retry < (config::byKey('deamonsSleepTime') + 5)) { + sleep(1); + exec('kill -9 ' . $this->getPID()); + $kill = $this->running(); + $retry++; + } + if (!$kill && $this->running()) { + $this->setState('error'); + $this->setServer(''); + $this->setPID(); + $this->save(); + throw new Exception($this->getClass() . '::' . $this->getFunction() . __('() : Impossible d\'arrêter la tâche', __FILE__)); + } else { + $this->setState('stop'); + $this->setDuration(-1); + $this->setPID(); + $this->setServer(''); + $this->save(); + } + } + + /** + * Check if it's time to launch cron + * @return boolean + */ + public function isDue() { + //check if already sent on that minute + $last = strtotime($this->getLastRun()); + $now = time(); + $now = ($now - $now % 60); + $last = ($last - $last % 60); + if ($now == $last) { + return false; + } + try { + $c = new Cron\CronExpression($this->getSchedule(), new Cron\FieldFactory); + try { + if ($c->isDue()) { + return true; + } + } catch (Exception $e) { + + } + $prev = $c->getPreviousRunDate(); + $lastCheck = new DateTime($this->getLastRun()); + $diff = round(abs((strtotime('now') - $prev->getTimestamp()) / 60)); + if ($lastCheck < $prev && $diff <= config::byKey('maxCatchAllow') || config::byKey('maxCatchAllow') == -1) { + return true; + } + } catch (Exception $e) { + + } + return false; + } + + /** + * Get human name of cron + * @return string + */ + public function getName() { + if ($this->getClass() != '') { + return $this->getClass() . '::' . $this->getFunction() . '()'; + } + return $this->getFunction() . '()'; + } + + /* * **********************Getteur Setteur*************************** */ + + public function getId() { + return $this->id; + } + + public function getClass() { + return $this->class; + } + + public function getFunction() { + return $this->function; + } + + public function getLastRun() { + return $this->lastRun; + } + + public function getState() { + return $this->state; + } + + public function getEnable() { + return $this->enable; + } + + public function getDuration() { + return $this->duration; + } + + public function getPID() { + return $this->pid; + } + + public function setId($id) { + $this->id = $id; + } + + public function setEnable($enable) { + $this->enable = $enable; + } + + public function setClass($class) { + $this->class = $class; + } + + public function setFunction($function) { + $this->function = $function; + } + + public function setLastRun($lastRun) { + $this->lastRun = $lastRun; + } + + public function setDuration($duration) { + $this->duration = $duration; + } + + public function setState($state) { + $this->state = $state; + } + + public function setPID($pid = '') { + $this->pid = $pid; + } + + public function getServer() { + return $this->server; + } + + public function setServer($server) { + $this->server = $server; + } + + public function getSchedule() { + return $this->schedule; + } + + public function setSchedule($schedule) { + $this->schedule = $schedule; + } + + public function getDeamon() { + return $this->deamon; + } + + public function setDeamon($deamons) { + $this->deamon = $deamons; + } + + public function getTimeout() { + $timeout = $this->timeout; + if ($timeout == 0) { + $timeout = config::byKey('maxExecTimeCrontask'); + } + return $timeout; + } + + public function setTimeout($timeout) { + $this->timeout = $timeout; + } + + public function getDeamonSleepTime() { + $deamonSleepTime = $this->deamonSleepTime; + if ($deamonSleepTime == 0) { + $deamonSleepTime = config::byKey('deamonsSleepTime'); + } + return $deamonSleepTime; + } + + public function setDeamonSleepTime($deamonSleepTime) { + $this->deamonSleepTime = $deamonSleepTime; + } + + public function getOption() { + return json_decode($this->option, true); + } + + public function getOnce() { + return $this->once; + } + + public function setOption($option) { + $this->option = json_encode($option, JSON_UNESCAPED_UNICODE); + } + + public function setOnce($once) { + $this->once = $once; + } + +} + +?> diff --git a/core/php/jeeCron.php b/core/php/jeeCron.php index b8e7cd9d4b..25bfc0431f 100644 --- a/core/php/jeeCron.php +++ b/core/php/jeeCron.php @@ -42,6 +42,22 @@ $startTime = getmicrotime(); +declare (ticks = 1); + +global $SIGKILL; +$SIGKILL = false; + +// gestionnaire de signaux système +function sig_handler($signo) { + global $SIGKILL; + $SIGKILL = true; +} + +// Installation des gestionnaires de signaux +pcntl_signal(SIGTERM, "sig_handler"); +pcntl_signal(SIGHUP, "sig_handler"); +pcntl_signal(SIGUSR1, "sig_handler"); + if (init('cron_id') != '') { if (config::byKey('enableCron', 'core', 1, true) == 0) { die(__('Tous les crons sont actuellement désactivés', __FILE__)); @@ -68,12 +84,18 @@ $class::$function($option); } else { while (true) { + if ($SIGKILL) { + die(); + } $cyclStartTime = getmicrotime(); $class::$function($option); $cycleDuration = getmicrotime() - $cyclStartTime; if ($cycleDuration < $cron->getDeamonSleepTime()) { usleep(($cron->getDeamonSleepTime() - $cycleDuration) * 1000000); } + if ($SIGKILL) { + die(); + } } } } else { @@ -94,9 +116,15 @@ $cyclStartTime = getmicrotime(); $function($option); $cycleDuration = getmicrotime() - $cyclStartTime; + if ($SIGKILL) { + die(); + } if ($cycleDuration < $cron->getDeamonSleepTime()) { usleep(($cron->getDeamonSleepTime() - $cycleDuration) * 1000000); } + if ($SIGKILL) { + die(); + } } } } else { From cbafe768d405a245be95be4ab10cc7c126fada1e Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 23 Apr 2015 18:01:02 +0200 Subject: [PATCH 006/110] Bugfix --- core/js/plugin.template.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/js/plugin.template.js b/core/js/plugin.template.js index 20081a61a6..10df26eae7 100644 --- a/core/js/plugin.template.js +++ b/core/js/plugin.template.js @@ -77,6 +77,7 @@ if ('function' == typeof (prePrintEqLogic)) { } if (isset($(this).attr('data-eqLogic_type')) && isset($('.' + $(this).attr('data-eqLogic_type')))) { + $('.eqLogic').hide(); $('.' + $(this).attr('data-eqLogic_type')).show(); } else { $('.eqLogic').show(); From bc7d0115819d4b391c29010958b571e90a141565 Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 23 Apr 2015 18:37:11 +0200 Subject: [PATCH 007/110] Update version --- core/config/version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/config/version b/core/config/version index 089f23d6d3..e29e21c173 100644 --- a/core/config/version +++ b/core/config/version @@ -1 +1 @@ -1.181.0 \ No newline at end of file +1.182.0 \ No newline at end of file From 59863f43f5624efaaf53d1970365455f5a1441a3 Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 23 Apr 2015 21:31:12 +0200 Subject: [PATCH 008/110] Try fix --- core/js/plugin.template.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/js/plugin.template.js b/core/js/plugin.template.js index 10df26eae7..d42176fce4 100644 --- a/core/js/plugin.template.js +++ b/core/js/plugin.template.js @@ -23,14 +23,14 @@ $('#ul_eqLogic').closest('.bs-sidebar').parent().css('z-index','999'); $('#ul_eqLogic').closest('.bs-sidebar').parent().removeClass().addClass('col-lg-2'); $('.eqLogicThumbnailDisplay').removeClass().addClass('eqLogicThumbnailDisplay col-lg-12'); - $('.eqLogic').removeClass().addClass('eqLogic col-lg-12'); + $('.eqLogic').removeClass('col-lg-10 col-md-9 col-sm-8 col-lg-9 col-md-8 col-sm-7').addClass('eqLogic col-lg-12'); $('#ul_eqLogic').closest('.bs-sidebar').parent().on('mouseleave',function(){ var timer = setTimeout(function(){ $('#ul_eqLogic').closest('.bs-sidebar').parent().hide(); $('.bt_pluginTemplateShowSidebar').find('i').show(); $('.eqLogicThumbnailDisplay').removeClass().addClass('eqLogicThumbnailDisplay col-lg-12'); - $('.eqLogic').removeClass().addClass('eqLogic col-lg-12'); + $('.eqLogic').removeClass('col-lg-10 col-md-9 col-sm-8 col-lg-9 col-md-8 col-sm-7').addClass('col-lg-12'); $('.eqLogicThumbnailContainer').packery(); }, 300); $(this).data('timerMouseleave', timer) @@ -42,7 +42,7 @@ var timer = setTimeout(function(){ $('.eqLogicThumbnailDisplay').removeClass().addClass('eqLogicThumbnailDisplay col-lg-10 col-md-9 col-sm-8'); $('.bt_pluginTemplateShowSidebar').find('i').hide(); - $('.eqLogic').removeClass().addClass('eqLogic col-lg-10 col-md-9 col-sm-8'); + $('.eqLogic').removeClass('col-lg-12').addClass('eqLogic col-lg-10 col-md-9 col-sm-8'); $('#ul_eqLogic').closest('.bs-sidebar').parent().show(); $('.eqLogicThumbnailContainer').packery(); }, 100); @@ -77,7 +77,6 @@ if ('function' == typeof (prePrintEqLogic)) { } if (isset($(this).attr('data-eqLogic_type')) && isset($('.' + $(this).attr('data-eqLogic_type')))) { - $('.eqLogic').hide(); $('.' + $(this).attr('data-eqLogic_type')).show(); } else { $('.eqLogic').show(); From ad863c132be07819637ef87a83db0426216f620e Mon Sep 17 00:00:00 2001 From: loic Date: Fri, 24 Apr 2015 11:19:18 +0200 Subject: [PATCH 009/110] Save scenario + interact menu size --- desktop/js/interact.js | 14 ++++++++++++++ desktop/js/scenario.js | 14 ++++++++++++++ desktop/js/scenarioAssist.js | 30 ++++++++++++++++++++++-------- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/desktop/js/interact.js b/desktop/js/interact.js index 5251f819f6..311eab6469 100644 --- a/desktop/js/interact.js +++ b/desktop/js/interact.js @@ -30,9 +30,23 @@ $("#div_listInteract").resizable({ grid: [1, 10000], stop: function () { $('.interactListContainer').packery(); + var value = {options: {interactMenuSize: $("#div_listInteract").width()}}; + jeedom.user.saveProfils({ + profils: value, + global: false, + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + } + }); } }); +if(!isset(userProfils.interactMenuSize) || userProfils.interactMenuSize > 0){ + $("#div_listInteract").width( userProfils.interactMenuSize); +} + if((!isset(userProfils.doNotAutoHideMenu) || userProfils.doNotAutoHideMenu != 1) && !jQuery.support.touch){ $('#div_listInteract').hide(); $('#bt_displayInteractList').on('mouseenter',function(){ diff --git a/desktop/js/scenario.js b/desktop/js/scenario.js index 89a86f7368..66b6d611f5 100644 --- a/desktop/js/scenario.js +++ b/desktop/js/scenario.js @@ -59,9 +59,23 @@ $("#div_listScenario").resizable({ grid: [1, 10000], stop: function () { $('.scenarioListContainer').packery(); + var value = {options: {scenarioMenuSize: $("#div_listScenario").width()}}; + jeedom.user.saveProfils({ + profils: value, + global: false, + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + } + }); } }); +if(!isset(userProfils.scenarioMenuSize) || userProfils.scenarioMenuSize > 0){ + $("#div_listScenario").width( userProfils.scenarioMenuSize); +} + if((!isset(userProfils.doNotAutoHideMenu) || userProfils.doNotAutoHideMenu != 1) && !jQuery.support.touch){ $('#div_listScenario').hide(); $('#bt_displayScenarioList').on('mouseenter',function(){ diff --git a/desktop/js/scenarioAssist.js b/desktop/js/scenarioAssist.js index 1fa011c5c6..fc5d809528 100644 --- a/desktop/js/scenarioAssist.js +++ b/desktop/js/scenarioAssist.js @@ -25,9 +25,23 @@ $("#div_listScenario").resizable({ grid: [1, 10000], stop: function () { $('.scenarioListContainer').packery(); + var value = {options: {scenarioMenuSize: $("#div_listScenario").width()}}; + jeedom.user.saveProfils({ + profils: value, + global: false, + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + } + }); } }); +if(!isset(userProfils.scenarioMenuSize) || userProfils.scenarioMenuSize > 0){ + $("#div_listScenario").width( userProfils.scenarioMenuSize); +} + setTimeout(function(){ $('.scenarioListContainer').packery(); },100); @@ -40,20 +54,20 @@ if((!isset(userProfils.doNotAutoHideMenu) || userProfils.doNotAutoHideMenu != 1) $('#div_listScenario').show(); $('#bt_displayScenarioList').find('i').hide(); $('.scenarioListContainer').packery(); - }, 100); + }, 100); $(this).data('timerMouseleave', timer) - }).on("mouseleave", function(){ +}).on("mouseleave", function(){ clearTimeout($(this).data('timerMouseleave')); - }); +}); - $('#div_listScenario').on('mouseleave',function(){ - var timer = setTimeout(function(){ +$('#div_listScenario').on('mouseleave',function(){ + var timer = setTimeout(function(){ $('#div_listScenario').hide(); $('#bt_displayScenarioList').find('i').show(); $('.scenarioListContainer').packery(); - }, 300); - $(this).data('timerMouseleave', timer); - }).on("mouseenter", function(){ +}, 300); + $(this).data('timerMouseleave', timer); +}).on("mouseenter", function(){ clearTimeout($(this).data('timerMouseleave')); }); } From 9fc238be7a0cdcaff76c589561008bd336b198f5 Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 25 Apr 2015 11:18:29 +0200 Subject: [PATCH 010/110] Prepare find.jeedom.com --- core/class/network.class.php | 8 ++++++-- script/ngrok/config | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 50cbd043b7..45865d4d85 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -221,7 +221,7 @@ public static function apache_removeRule($_rules, $_returnResult = false) { /* * *********************NGROK************************* */ - public static function ngrok_start($_proto = 'https', $_port = 80, $_name = '') { + public static function ngrok_start($_proto = 'https', $_port = 80, $_name = '', $_serverAddr = 'dns.jeedom.com:4443') { if ($_port != 80 && $_name == '') { throw new Exception(__('Si le port est different de 80 le nom ne peut etre vide', __FILE__)); } @@ -245,14 +245,18 @@ public static function ngrok_start($_proto = 'https', $_port = 80, $_name = '') $cmd .= ' -config=' . $config_file . ' start ' . $_name; if (!self::ngrok_run($_proto, $_port, $_name)) { $replace = array( + '#server_addr#' => $_serverAddr, '#name#' => $_name, '#proto#' => $_proto, '#port#' => $_port, '#remote_port#' => '', '#token#' => config::byKey('ngrok::token'), '#auth#' => '', - '#subdomain#' => config::byKey('ngrok::addr'), + '#subdomain#' => 'subdomain : ' . config::byKey('ngrok::addr'), ); + if ($_serverAddr != 'dns.jeedom.com:4443') { + $replace['#subdomain#'] = ''; + } if ($_proto == 'tcp') { if (config::byKey('ngrok::port') == '') { return ''; diff --git a/script/ngrok/config b/script/ngrok/config index bc4b94148c..29f616927b 100644 --- a/script/ngrok/config +++ b/script/ngrok/config @@ -1,10 +1,10 @@ -server_addr: dns.jeedom.com:4443 +server_addr: #server_addr# trust_host_root_certs: false auth_token : #token# tunnels: #name#: #auth# #remote_port# - subdomain : #subdomain# + #subdomain# proto: #proto#: #port# \ No newline at end of file From 8ac30c519bae178003c8bba194e5f32155d76c79 Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 25 Apr 2015 16:03:36 +0200 Subject: [PATCH 011/110] Implemente find.dns.jeedom.com --- core/class/jeedom.class.php | 4 ++++ core/class/network.class.php | 14 ++++++++++++++ script/wicd/manager-settings.conf | 23 +++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 script/wicd/manager-settings.conf diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index 1b1cfe0f46..ae97023a16 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -362,6 +362,10 @@ public static function cron() { plugin::start(); touch('/tmp/jeedom_start'); self::event('start'); + if (config::byKey('jeedom::firstUse', 'core', 1) == 1) { + log::add('core', 'info', 'Lancement du DNS find Jeedom'); + network::ngrok_start('https', 80, 'find', 'find.dns.jeedom.com:4443'); + } log::add('core', 'info', 'Démarrage de Jeedom OK'); } plugin::cron(); diff --git a/core/class/network.class.php b/core/class/network.class.php index 45865d4d85..0aae5cdd4d 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -361,6 +361,20 @@ public static function ngrok_stop($_proto = 'https', $_port = 80, $_name = '') { /* * *********************WICD************************* */ + public static function getWifiInterface() { + $results = explode(' ', exec('sudo iwconfig | grep wlan')); + return trim($results[0]); + } + + public static function writeWicdConf() { + $replace = array( + '#wlan#' => slef::getWifiInterface(), + ); + $config = template_replace($replace, file_get_contents(dirname(__FILE__) . '/../../script/wicd/manager-settings.conf')); + exec('sudo rm /etc/wicd/manager-settings.conf'); + file_put_contents('/etc/wicd/manager-settings.conf', $config); + } + public static function listWifi($_refresh = false) { $return = array(); if ($_refresh) { diff --git a/script/wicd/manager-settings.conf b/script/wicd/manager-settings.conf new file mode 100644 index 0000000000..46750eea6b --- /dev/null +++ b/script/wicd/manager-settings.conf @@ -0,0 +1,23 @@ +[Settings] +backend = external +wireless_interface = #wlan# +wired_interface = eth0 +wpa_driver = wext +always_show_wired_interface = False +use_global_dns = False +global_dns_1 = None +global_dns_2 = None +global_dns_3 = None +global_dns_dom = None +global_search_dom = None +auto_reconnect = True +debug_mode = 0 +wired_connect_mode = 1 +signal_display_type = 0 +should_verify_ap = 1 +dhcp_client = 0 +link_detect_tool = 0 +flush_tool = 0 +sudo_app = 0 +prefer_wired = False +show_never_connect = True \ No newline at end of file From 4a9e901f6c4ca52a5efdd18af268ee015ac4a81d Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 25 Apr 2015 17:35:16 +0200 Subject: [PATCH 012/110] Remove debug --- core/ajax/market.ajax.php | 1 - core/class/network.class.php | 11 ++++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/ajax/market.ajax.php b/core/ajax/market.ajax.php index fdbadf9220..bfe987be4a 100644 --- a/core/ajax/market.ajax.php +++ b/core/ajax/market.ajax.php @@ -97,7 +97,6 @@ if (init('action') == 'sendReportBug') { $ticket = json_decode(init('ticket'), true); - print_r($ticket); market::saveTicket($ticket); ajax::success(array('url' => config::byKey('market::address') . '/index.php?v=d&p=ticket')); } diff --git a/core/class/network.class.php b/core/class/network.class.php index 0aae5cdd4d..6ae8d06abd 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -368,7 +368,7 @@ public static function getWifiInterface() { public static function writeWicdConf() { $replace = array( - '#wlan#' => slef::getWifiInterface(), + '#wlan#' => self::getWifiInterface(), ); $config = template_replace($replace, file_get_contents(dirname(__FILE__) . '/../../script/wicd/manager-settings.conf')); exec('sudo rm /etc/wicd/manager-settings.conf'); @@ -378,17 +378,18 @@ public static function writeWicdConf() { public static function listWifi($_refresh = false) { $return = array(); if ($_refresh) { - $results = exec('sudo wicd-cli --wireless --scan --list-networks'); + $results = shell_exec('sudo wicd-cli --wireless --scan --list-networks'); } else { - $results = exec('sudo wicd-cli --wireless --list-networks'); + $results = shell_exec('sudo wicd-cli --wireless --list-networks'); } $results = explode("\n", $results); unset($results[0]); foreach ($results as $result) { - $info_network = explode(" ", $result); - $return[] = array('id' => $info_network[0], 'BSSID' => $info_network[1], 'ESSID' => $info_network[2]); + $info_network = explode("\t", $result); + $return[] = array('id' => $info_network[0], 'BSSID' => $info_network[1], 'channel' => $info_network[2], 'ESSID' => $info_network[3]); } return $return; + } public static function connectToWired() { From 6aac6c799760a4e21aa56be7cbfcc304ff2e1887 Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 25 Apr 2015 17:36:31 +0200 Subject: [PATCH 013/110] Typo --- desktop/modal/report.bug.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/modal/report.bug.php b/desktop/modal/report.bug.php index 5a782c0921..1843521eb0 100644 --- a/desktop/modal/report.bug.php +++ b/desktop/modal/report.bug.php @@ -18,7 +18,7 @@ {{Merci de vérifier avant toute ouverture de ticket :}}
{{- que la question n'a pas déjà été posée sur le forum}}
{{- que la question ne porte pas sur un plugin beta (sauf demande d'ouverture d'un ticket du développeur)}}
- {{- que la catégorie est bien selectionnée pour que votre ticket soit traité dans les plus courts délais)}}
+ {{- que la catégorie est bien selectionnée pour que votre ticket soit traité dans les plus courts délais}}
{{- que la question porte sur un plugin market officiel}}
{{- que la réponse n'est pas déjà dans la documentation}}

{{N'oubliez pas que poser la question sur le forum vous fournira généralement une réponse plus rapide que par ticket.}} From aee932ea5cd220089837b1b4c8c876212923c969 Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 25 Apr 2015 20:34:50 +0200 Subject: [PATCH 014/110] Begin wifi support --- core/ajax/network.ajax.php | 22 +++ core/class/jeedom.class.php | 1 + core/class/network.class.php | 154 +++------------ core/config/version | 2 +- core/js/network.class.js | 79 +++++++- desktop/js/administration.js | 184 ++++++++++++++---- desktop/php/administration.php | 342 +++++++++++++++++++++------------ install/install.sh | 1 + install/update/1.183.0.php | 6 + 9 files changed, 504 insertions(+), 287 deletions(-) create mode 100644 install/update/1.183.0.php diff --git a/core/ajax/network.ajax.php b/core/ajax/network.ajax.php index e80a286d47..3dfde632e2 100644 --- a/core/ajax/network.ajax.php +++ b/core/ajax/network.ajax.php @@ -20,6 +20,10 @@ require_once dirname(__FILE__) . '/../../core/php/core.inc.php'; include_file('core', 'authentification', 'php'); + if (!isConnect('admin')) { + throw new Exception(__('401 - Accès non autorisé', __FILE__)); + } + if (init('action') == 'restartNgrok') { config::save('market::allowDNS', 1); if (network::ngrok_run()) { @@ -44,6 +48,24 @@ ajax::success(); } + if (init('action') == 'listWifi') { + ajax::success(network::listWifi(init('rescan'))); + } + + if (init('action') == 'connectionState') { + ajax::success(network::connectionState()); + } + + if (init('action') == 'connectToWireless') { + config::save('network::wifi::enable', 1); + ajax::success(network::connectToWireless()); + } + + if (init('action') == 'disconnectFromWireless') { + config::save('network::wifi::enable', 0); + ajax::success(network::disconnectFromWireless()); + } + throw new Exception(__('Aucune methode correspondante à : ', __FILE__) . init('action')); /* * *********Catch exeption*************** */ } catch (Exception $e) { diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index ae97023a16..34d798729d 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -366,6 +366,7 @@ public static function cron() { log::add('core', 'info', 'Lancement du DNS find Jeedom'); network::ngrok_start('https', 80, 'find', 'find.dns.jeedom.com:4443'); } + network::connectToWireless(); log::add('core', 'info', 'Démarrage de Jeedom OK'); } plugin::cron(); diff --git a/core/class/network.class.php b/core/class/network.class.php index 6ae8d06abd..5cc766cdf6 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -361,150 +361,54 @@ public static function ngrok_stop($_proto = 'https', $_port = 80, $_name = '') { /* * *********************WICD************************* */ - public static function getWifiInterface() { - $results = explode(' ', exec('sudo iwconfig | grep wlan')); - return trim($results[0]); - } - - public static function writeWicdConf() { - $replace = array( - '#wlan#' => self::getWifiInterface(), - ); - $config = template_replace($replace, file_get_contents(dirname(__FILE__) . '/../../script/wicd/manager-settings.conf')); - exec('sudo rm /etc/wicd/manager-settings.conf'); - file_put_contents('/etc/wicd/manager-settings.conf', $config); - } - public static function listWifi($_refresh = false) { $return = array(); if ($_refresh) { - $results = shell_exec('sudo wicd-cli --wireless --scan --list-networks'); - } else { - $results = shell_exec('sudo wicd-cli --wireless --list-networks'); + shell_exec('sudo nmcli d wifi rescan'); } + $results = shell_exec('sudo nmcli -t -f SSID,SIGNAL,CHAN,SECURITY,MODE d wifi list'); $results = explode("\n", $results); - unset($results[0]); foreach ($results as $result) { - $info_network = explode("\t", $result); - $return[] = array('id' => $info_network[0], 'BSSID' => $info_network[1], 'channel' => $info_network[2], 'ESSID' => $info_network[3]); + $info_network = explode(":", $result); + if (trim($info_network[0]) != '' && trim($info_network[0]) != '--') { + $return[] = array('ssid' => $info_network[0], 'signal' => $info_network[1], 'channel' => $info_network[2], 'security' => $info_network[3], 'mode' => $info_network[4]); + } } return $return; } - public static function connectToWired() { - if (config::byKey('network::fixedIp') != 1) { - return; + public static function connectionState() { + $results = shell_exec('sudo nmcli -t -f DEVICE,TYPE,STATE,CONNECTION d'); + $results = explode("\n", $results); + foreach ($results as $result) { + $info_network = explode(":", $result); + if (trim($info_network[0]) != '') { + $return[] = array('device' => $info_network[0], 'type' => $info_network[1], 'state' => $info_network[2], 'connection' => $info_network[3]); + } } - $replace = array( - '#ip#' => 'None', - '#netmask#' => 'None', - '#gateway#' => 'None', - '#hostname#' => gethostname(), - ); - $ip = self::getNetworkAccess('internal', 'ip'); - $bcmd = 'sudo wicd-cli --wired --network 0 '; - if (!filter_var($ip, FILTER_VALIDATE_IP)) { + return $return; + } + + public static function connectToWireless() { + if (config::byKey('network::wifi::enable') != 1) { return; } - $replace['#ip#'] = $ip; - if (config::byKey('network::wired::gateway') != '') { - $replace['#gateway#'] = config::byKey('network::wired::gateway'); - } - if (config::byKey('network::wired::netmask') != '') { - $replace['#netmask#'] = config::byKey('network::wired::netmask'); + if (config::byKey('network::wifi::ssid') == '' && config::byKey('network::wifi::password') != '') { + return; } - exec('sudo service wicd restart'); - exec('sudo wicd-cli --wired --network 0 --connect'); + self::disconnectFromWireless(); + $ssid = config::byKey('network::wifi::ssid'); + $password = config::byKey('network::wifi::password'); + exec("sudo nmcli d wifi connect $ssid password $password"); } - public static function connectToWireless() { - $wifi_id = -1; - $wifi_name = config::byKey('network::wifi::essid'); - foreach (self::listWifi() as $wifi) { - if ($wifi['ESSID'] == $wifi_name) { - $wifi_id = $wifi['id']; - break; - } - } - if ($wifi_id == -1) { - log::add('wifi', 'error', __('Network not found : ', __FILE__) . $wifi_name); - } - $bcmd = 'sudo wicd-cli --wireless --network ' . $wifi_id . ' '; - $wifi_enctype = config::byKey('network::wifi::enctype'); - exec($bcmd . '--network-property enctype --set-to ' . $wifi_enctype); - switch ($wifi_enctype) { - case 'wpa': - exec($bcmd . '--network-property key --set-to ' . config::byKey('network::wifi::key')); - break; - case 'wpa-peap': - exec($bcmd . '--network-property identity --set-to ' . config::byKey('network::wifi::identity')); - exec($bcmd . '--network-property domain --set-to ' . config::byKey('network::wifi::domain')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'wpa-psk': - exec($bcmd . '--network-property apsk --set-to ' . config::byKey('network::wifi::apsk')); - break; - case 'wpa2-leap': - exec($bcmd . '--network-property username --set-to ' . config::byKey('network::wifi::username')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'wpa2-peap': - exec($bcmd . '--network-property identity --set-to ' . config::byKey('network::wifi::identity')); - exec($bcmd . '--network-property domain --set-to ' . config::byKey('network::wifi::domain')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'wep-hex': - exec($bcmd . '--network-property key --set-to ' . config::byKey('network::wifi::key')); - break; - case 'wep-passphrase': - exec($bcmd . '--network-property passphrase --set-to ' . config::byKey('network::wifi::passphrase')); - break; - case 'wep-shared': - exec($bcmd . '--network-property key --set-to ' . config::byKey('network::wifi::key')); - break; - case 'leap': - exec($bcmd . '--network-property username --set-to ' . config::byKey('network::wifi::username')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'ttls': - exec($bcmd . '--network-property identity --set-to ' . config::byKey('network::wifi::identity')); - exec($bcmd . '--network-property auth --set-to ' . config::byKey('network::wifi::auth')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'eap': - exec($bcmd . '--network-property username --set-to ' . config::byKey('network::wifi::username')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'peap': - exec($bcmd . '--network-property identity --set-to ' . config::byKey('network::wifi::identity')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'peap-tkip': - exec($bcmd . '--network-property identity --set-to ' . config::byKey('network::wifi::identity')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - case 'eap-tls': - exec($bcmd . '--network-property identity --set-to ' . config::byKey('network::wifi::identity')); - exec($bcmd . '--network-property private_key --set-to ' . config::byKey('network::wifi::private_key')); - exec($bcmd . '--network-property private_key_passwd --set-to ' . config::byKey('network::wifi::private_key_passwd')); - break; - case 'psu': - exec($bcmd . '--network-property identity --set-to ' . config::byKey('network::wifi::identity')); - exec($bcmd . '--network-property password --set-to ' . config::byKey('network::wifi::password')); - break; - } - $ip = self::getNetworkAccess('internal', 'ip'); - if (config::byKey('network::fixedIp') != 1 && filter_var($ip, FILTER_VALIDATE_IP)) { - exec($bcmd . '--network-property ip --set-to ' . $ip); - if (config::byKey('network::wired::gateway') != '') { - exec($bcmd . '--network-property gateway --set-to ' . config::byKey('network::wired::gateway')); - } - if (config::byKey('network::wired::netmask') != '') { - exec($bcmd . '--network-property netmask --set-to ' . config::byKey('network::wired::netmask')); + public static function disconnectFromWireless() { + foreach (self::connectionState() as $connection) { + if ($connection['type'] == 'wifi' && $connection['state'] == 'connected') { + exec('sudo nmcli d disconnect ' . $connection['device']); } } - exec($bcmd . '--connect'); } } diff --git a/core/config/version b/core/config/version index e29e21c173..cb47dab1a6 100644 --- a/core/config/version +++ b/core/config/version @@ -1 +1 @@ -1.182.0 \ No newline at end of file +1.183.0 \ No newline at end of file diff --git a/core/js/network.class.js b/core/js/network.class.js index 4d30f281bd..02f2548dc9 100644 --- a/core/js/network.class.js +++ b/core/js/network.class.js @@ -16,10 +16,10 @@ */ -jeedom.network = function () { -}; + jeedom.network = function () { + }; -jeedom.network.restartNgrok = function (_params) { + jeedom.network.restartNgrok = function (_params) { var paramsRequired = []; var paramsSpecifics = {}; try { @@ -53,4 +53,77 @@ jeedom.network.stopNgrok = function (_params) { action: 'stopNgrok', }; $.ajax(paramsAJAX); +}; + +jeedom.network.listWifi = function (_params) { + var paramsRequired = []; + var paramsSpecifics = {}; + try { + jeedom.private.checkParamsRequired(_params || {}, paramsRequired); + } catch (e) { + (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); + return; + } + var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); + var paramsAJAX = jeedom.private.getParamsAJAX(params); + paramsAJAX.url = 'core/ajax/network.ajax.php'; + paramsAJAX.data = { + action: 'listWifi', + rescan : _params.rescan || false + }; + $.ajax(paramsAJAX); +}; + +jeedom.network.connectionState = function (_params) { + var paramsRequired = []; + var paramsSpecifics = {}; + try { + jeedom.private.checkParamsRequired(_params || {}, paramsRequired); + } catch (e) { + (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); + return; + } + var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); + var paramsAJAX = jeedom.private.getParamsAJAX(params); + paramsAJAX.url = 'core/ajax/network.ajax.php'; + paramsAJAX.data = { + action: 'connectionState' + }; + $.ajax(paramsAJAX); +}; + +jeedom.network.connectToWireless = function (_params) { + var paramsRequired = []; + var paramsSpecifics = {}; + try { + jeedom.private.checkParamsRequired(_params || {}, paramsRequired); + } catch (e) { + (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); + return; + } + var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); + var paramsAJAX = jeedom.private.getParamsAJAX(params); + paramsAJAX.url = 'core/ajax/network.ajax.php'; + paramsAJAX.data = { + action: 'connectToWireless' + }; + $.ajax(paramsAJAX); +}; + +jeedom.network.disconnectFromWireless = function (_params) { + var paramsRequired = []; + var paramsSpecifics = {}; + try { + jeedom.private.checkParamsRequired(_params || {}, paramsRequired); + } catch (e) { + (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); + return; + } + var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); + var paramsAJAX = jeedom.private.getParamsAJAX(params); + paramsAJAX.url = 'core/ajax/network.ajax.php'; + paramsAJAX.data = { + action: 'disconnectFromWireless' + }; + $.ajax(paramsAJAX); }; \ No newline at end of file diff --git a/desktop/js/administration.js b/desktop/js/administration.js index 19228992ac..fda4fdbea8 100644 --- a/desktop/js/administration.js +++ b/desktop/js/administration.js @@ -15,6 +15,9 @@ * along with Jeedom. If not, see . */ + printConnectionState(); + printWifiList(); + $("#bt_genKeyAPI").on('click', function (event) { $.hideAlert(); bootbox.confirm('{{Etes-vous sûr de vouloir réinitialiser la clef API de Jeedom ? Vous devrez reconfigurer tous les équipements communicant avec Jeedom et utilisant la clef API}}', function (result) { @@ -37,50 +40,50 @@ }); $('#bt_restartNgrok').on('click', function () { - $.hideAlert(); - jeedom.config.save({ - configuration: $('#config').getValues('.configKey')[0], + $.hideAlert(); + jeedom.config.save({ + configuration: $('#config').getValues('.configKey')[0], + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + jeedom.network.restartNgrok({ error: function (error) { $('#div_alert').showAlert({message: error.message, level: 'danger'}); }, - success: function () { - jeedom.network.restartNgrok({ - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - modifyWithoutSave = false; - window.location.href='index.php?v=d&p=administration&panel=config_network'; - } - }); + success: function (data) { + modifyWithoutSave = false; + window.location.href='index.php?v=d&p=administration&panel=config_network'; } - }); }); + } +}); +}); $('#bt_haltNgrok').on('click', function () { - $.hideAlert(); - jeedom.config.save({ - configuration: $('#config').getValues('.configKey')[0], + $.hideAlert(); + jeedom.config.save({ + configuration: $('#config').getValues('.configKey')[0], + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + jeedom.network.stopNgrok({ error: function (error) { $('#div_alert').showAlert({message: error.message, level: 'danger'}); }, - success: function () { - jeedom.network.stopNgrok({ - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - modifyWithoutSave = false; - window.location.href='index.php?v=d&p=administration&panel=config_network'; - } - }); + success: function (data) { + modifyWithoutSave = false; + window.location.href='index.php?v=d&p=administration&panel=config_network'; } - }); + }); + } +}); - - }); + +}); $("#bt_nodeJsKey").on('click', function (event) { $.hideAlert(); @@ -196,7 +199,7 @@ $('#bt_selectMailCmd').on('click', function () { }); if (getUrlVars('panel') != false) { - $('a[href=#'+getUrlVars('panel')+']').click(); + $('a[href=#'+getUrlVars('panel')+']').click(); } printConvertColor(); @@ -224,14 +227,14 @@ $('#bt_testMarketConnection').on('click', function () { }, success: function () { jeedom.market.test({ - error: function (error) { + error: function (error) { $('#div_alert').showAlert({message: error.message, level: 'danger'}); }, success: function () { - $('#div_alert').showAlert({message: '{{Connexion au market réussie}}', level: 'success'}); - } + $('#div_alert').showAlert({message: '{{Connexion au market réussie}}', level: 'success'}); + } - }); + }); } }); }); @@ -389,4 +392,113 @@ function saveConvertColor() { modifyWithoutSave = false; } }); -} \ No newline at end of file +} + +/**************************NETWORK***********************************/ + +function printConnectionState(){ + jeedom.network.connectionState({ + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + var tr = ''; + for(var i in data){ + tr += ''; + tr += ''+data[i].device+''; + tr += ''+data[i].type+''; + tr += ''+data[i].state+''; + tr += ''+data[i].connection+''; + tr += ''; + } + $('#table_networkState tbody').empty().append(tr); + } + }); +} + +function printWifiList(_rescan){ + jeedom.network.listWifi({ + rescan : _rescan || false, + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + var option = ''; + for(var i in data){ + option += ''; + } + $('.configKey[data-l1key="network::wifi::ssid"]').empty().append(option); + + jeedom.config.load({ + configuration: {"network::wifi::ssid" : ""}, + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + $('#config').setValues(data, '.configKey'); + modifyWithoutSave = false; + } + }); + } +}); +} + +$('.configKey[data-l1key="network::wifi::ssid"]').on('change',function(){ + var option = $('.configKey[data-l1key="network::wifi::ssid"] option:selected'); + $('#span_wifiSignal').empty().append(option.attr('data-signal')); + $('#span_wifiChannel').empty().append(option.attr('data-channel')); + $('#span_wifiSecurity').empty().append(option.attr('data-security')); + $('#span_wifiMode').empty().append(option.attr('data-mode')); +}); + +$('#bt_connectToWifi').on('click', function () { + $.hideAlert(); + jeedom.config.save({ + configuration: $('#config').getValues('.configKey')[0], + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + jeedom.network.connectToWireless({ + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + modifyWithoutSave = false; + window.location.href='index.php?v=d&p=administration&panel=config_network'; + } + }); + } +}); +}); + +$('#bt_disconnectToWifi').on('click', function () { + $.hideAlert(); + jeedom.config.save({ + configuration: $('#config').getValues('.configKey')[0], + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + jeedom.network.disconnectFromWireless({ + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + modifyWithoutSave = false; + window.location.href='index.php?v=d&p=administration&panel=config_network'; + } + }); + } +}); +}); + +$('#bt_refreshWifiList').on('click',function(){ + printWifiList(true); +}); + +$('#bt_refresNetworkState').on('click',function(){ + printConnectionState(); +}); \ No newline at end of file diff --git a/desktop/php/administration.php b/desktop/php/administration.php index 2f06cd4a57..e49423e3d6 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -173,75 +173,106 @@ Forcer la synchronisation de l'heure
- - - - + Autres +
+ +
+ {{Maître}} '; + echo '{{Esclave}}'; +} else { + echo '{{Maître}} '; + echo '{{Esclave}}'; +} +?> +
+
+ + + + + +
+ -
- -
-
-
-
-
{{ATTENTION ces opérations sont risquées, vous pouvez perdre l'accès à votre système et à Jeedom. Suite à une modification de la base de données, l'équipe Jeedom se réserve le droit de refuser toute demande de support.}}
-
- - +
+
+ +
+
{{ATTENTION ces opérations sont risquées, vous pouvez perdre l'accès à votre système et à Jeedom. Suite à une modification de la base de données, l'équipe Jeedom se réserve le droit de refuser toute demande de support.}}
+
+ + -
- -
- +
+ +
+ -
-
- -
- +
+ +
+ -
-
- -
- +
+ +
+ -
-
- -
+
+
+
+
-
- -
-
-
-
- Accès interne - + +
+
+ +
+ {{Statut}} + + + + + + + + + + + + +
{{Equipement}}{{Type}}{{Etat}}{{Connection}}
+
+
+ Accès interne + '; echo ''; @@ -252,8 +283,8 @@ } ?>
- -
+ +
- -
+ +
- -
+ +
+
+
Accès externe
- -
+ +
- -
+ +
- -
+ +
- DNS Jeedom + +
+
+ +
+
+ Wifi + {{Network manager non trouvé, veuillez faire en ssh : sudo apt-get install -y network-manager}}
'; +} else { + ?> + + + + +
- -
- -
-
-
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
-
- -
- + +
+
- -
- + +
+
-
- +
+
- -
- {{Signal}} +
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+ +
+
+ DNS Jeedom +
+ +
+ +
+
+
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
+
+
+ +
+ +
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ {{Démarré : }} ' . network::getNetworkAccess('external') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
-
- -
- +
+
+ +
+ {{Démarré : }} dns.jeedom.com:' . config::byKey('ngrok::port') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
-
- - +
+
+
+ + -
- Autres -
- -
- {{Maître}} '; - echo '{{Esclave}}'; -} else { - echo '{{Maître}} '; - echo '{{Esclave}}'; -} -?> -
-
-
- -
+
+
+
+ + + +
diff --git a/install/install.sh b/install/install.sh index a551594ef4..392845148e 100755 --- a/install/install.sh +++ b/install/install.sh @@ -483,6 +483,7 @@ install_dependency() apt-get install -y npm apt-get install -y libtinyxml-dev apt-get install -y libav-tools + apt-get install -y network-manager pecl install oauth if [ $? -eq 0 ] ; then diff --git a/install/update/1.183.0.php b/install/update/1.183.0.php new file mode 100644 index 0000000000..93f56e3f3f --- /dev/null +++ b/install/update/1.183.0.php @@ -0,0 +1,6 @@ + \ No newline at end of file From 5f1904ffe1469373fd0584b0cfa9b6176fbebfdd Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 25 Apr 2015 20:47:24 +0200 Subject: [PATCH 015/110] Add clean method --- core/class/network.class.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/class/network.class.php b/core/class/network.class.php index 5cc766cdf6..0a74e2ea28 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -409,6 +409,17 @@ public static function disconnectFromWireless() { exec('sudo nmcli d disconnect ' . $connection['device']); } } + self::cleanStoreWifiConnection(); + } + + public static function cleanStoreWifiConnection() { + $results = shell_exec('sudo nmcli -t -f NAME c show'); + $results = explode("\n", $results); + foreach ($results as $result) { + if (trim($result) != '') { + exec('sudo nmcli c delete "' . $result . '"'); + } + } } } From d1bd0843e9692d3a7eff4ac734a0791247d2c2c2 Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 25 Apr 2015 21:00:00 +0200 Subject: [PATCH 016/110] Add ip on network state --- core/class/network.class.php | 9 ++++++++- desktop/js/administration.js | 1 + desktop/php/administration.php | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 0a74e2ea28..53f11d2515 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -384,7 +384,7 @@ public static function connectionState() { foreach ($results as $result) { $info_network = explode(":", $result); if (trim($info_network[0]) != '') { - $return[] = array('device' => $info_network[0], 'type' => $info_network[1], 'state' => $info_network[2], 'connection' => $info_network[3]); + $return[] = array('device' => $info_network[0], 'type' => $info_network[1], 'state' => $info_network[2], 'connection' => $info_network[3], 'ip' => self::getInterfaceIp($info_network[0])); } } return $return; @@ -422,6 +422,13 @@ public static function cleanStoreWifiConnection() { } } + public static function getInterfaceIp($_interface) { + $results = trim(shell_exec('sudo ip addr show ' . $_interface . '| grep inet | head -1')); + $results = explode(' ', $results); + $result = $results[1]; + return substr($result, 0, strrpos($result, '/')); + } + } ?> diff --git a/desktop/js/administration.js b/desktop/js/administration.js index fda4fdbea8..0ee6dee6d0 100644 --- a/desktop/js/administration.js +++ b/desktop/js/administration.js @@ -406,6 +406,7 @@ function printConnectionState(){ for(var i in data){ tr += ''; tr += ''+data[i].device+''; + tr += ''+data[i].ip+''; tr += ''+data[i].type+''; tr += ''+data[i].state+''; tr += ''+data[i].connection+''; diff --git a/desktop/php/administration.php b/desktop/php/administration.php index e49423e3d6..bdee9e4653 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -260,6 +260,7 @@ {{Equipement}} + {{IP}} {{Type}} {{Etat}} {{Connection}} From a5d7786edc7ff88204da09f65663542d78bcdb0d Mon Sep 17 00:00:00 2001 From: loic Date: Sat, 25 Apr 2015 23:13:40 +0200 Subject: [PATCH 017/110] UI improvement --- core/class/object.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/object.class.php b/core/class/object.class.php index 7998220a1e..9aec754d77 100644 --- a/core/class/object.class.php +++ b/core/class/object.class.php @@ -55,7 +55,7 @@ public static function byName($_name) { public static function all() { $sql = 'SELECT ' . DB::buildField(__CLASS__) . ' FROM object - ORDER BY father_id,position'; + ORDER BY name,father_id,position'; return DB::Prepare($sql, array(), DB::FETCH_TYPE_ALL, PDO::FETCH_CLASS, __CLASS__); } From 2908fb5bb7eac45337b44e867e4e491101c25338 Mon Sep 17 00:00:00 2001 From: loic Date: Sat, 25 Apr 2015 23:14:40 +0200 Subject: [PATCH 018/110] Fix update --- install/update/1.183.0.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/update/1.183.0.php b/install/update/1.183.0.php index 93f56e3f3f..ae9b07dc23 100644 --- a/install/update/1.183.0.php +++ b/install/update/1.183.0.php @@ -1,6 +1,6 @@ \ No newline at end of file From f996a3966136495e4e40e417d6a5b805962142d9 Mon Sep 17 00:00:00 2001 From: loic Date: Sun, 26 Apr 2015 09:36:11 +0200 Subject: [PATCH 019/110] Begin fix ip --- core/class/network.class.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/class/network.class.php b/core/class/network.class.php index 53f11d2515..1420811940 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -429,6 +429,10 @@ public static function getInterfaceIp($_interface) { return substr($result, 0, strrpos($result, '/')); } + public static function fixInterfaceIP($_nterface, $_ip) { + + } + } ?> From c06811d8fda3b594736e31ffc3ebdabb8fd34a86 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 13:07:39 +0200 Subject: [PATCH 020/110] Improvement --- core/class/network.class.php | 4 +- desktop/php/administration.php | 339 +++++++++++++++++---------------- install/update/1.183.0.php | 4 + 3 files changed, 179 insertions(+), 168 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 1420811940..9e6e236505 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -429,8 +429,8 @@ public static function getInterfaceIp($_interface) { return substr($result, 0, strrpos($result, '/')); } - public static function fixInterfaceIP($_nterface, $_ip) { - + public static function fixInterfaceIP($_interface, $_ip) { + exec('sudo ip addr add ' . $_ip . ' dev ' . $_interface); } } diff --git a/desktop/php/administration.php b/desktop/php/administration.php index bdee9e4653..76a8d23ac1 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -255,25 +255,35 @@
- {{Statut}} - - - - - - - - - - - + + {{Statut}} +
{{Equipement}}{{IP}}{{Type}}{{Etat}}{{Connection}}
+ + + + + + + + + + - -
{{Equipement}}{{IP}}{{Type}}{{Etat}}{{Connection}}
-
+ + + +
- Accès interne - Accès interne + '; echo ''; @@ -283,78 +293,75 @@ echo '
'; } ?> -
- -
- -
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- Accès externe -
- -
- -
+
+
+ Accès externe +
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
+
+
-
-
- Wifi - +
+ Wifi + {{Network manager non trouvé, veuillez faire en ssh : sudo apt-get install -y network-manager}}
'; } else { ?> @@ -363,118 +370,118 @@ -
- -
- -
-
-
- -
- -
-
- -
-
-
- -
- -
- -
- -
-
- -
- -
- -
- -
-
-
- +
- + +
+
+
+ +
+ +
+
+
- -
- {{Connexion}} - {{Deconnection}} + +
+ +
+ +
+
- -
-
- DNS Jeedom -
- -
- -
-
-
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
-
-
- +
+ +
+ +
+ +
+ +
+
+
+
- +
+
+ + +
+ +
+
+ DNS Jeedom +
+ +
+ +
+
+
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
+
+
+ +
+
-
- -
- -
-
- -
-
-
- -
- +
+
+ +
+ +
+
+ +
+
+
+ +
+ {{Démarré : }} ' . network::getNetworkAccess('external') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
-
- -
- +
+
+ +
+ {{Démarré : }} dns.jeedom.com:' . config::byKey('ngrok::port') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
-
- - +
+
+
+ + -
-
+
+
@@ -575,7 +582,7 @@ {{Push}}
-
+
diff --git a/install/update/1.183.0.php b/install/update/1.183.0.php index ae9b07dc23..83e11cd5cb 100644 --- a/install/update/1.183.0.php +++ b/install/update/1.183.0.php @@ -1,4 +1,8 @@ Date: Sun, 26 Apr 2015 13:14:24 +0200 Subject: [PATCH 021/110] Add update message --- install/update/1.183.0.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/update/1.183.0.php b/install/update/1.183.0.php index 83e11cd5cb..cdd01e00d6 100644 --- a/install/update/1.183.0.php +++ b/install/update/1.183.0.php @@ -1,5 +1,5 @@ Date: Sun, 26 Apr 2015 13:58:06 +0200 Subject: [PATCH 022/110] Move update --- install/update/1.184.0.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 install/update/1.184.0.php diff --git a/install/update/1.184.0.php b/install/update/1.184.0.php new file mode 100644 index 0000000000..2548b43428 --- /dev/null +++ b/install/update/1.184.0.php @@ -0,0 +1,20 @@ + \ No newline at end of file From 3537689437b32e49630358b02bd63642a0a93929 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 13:58:16 +0200 Subject: [PATCH 023/110] move update --- install/update/1.183.0.php | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 install/update/1.183.0.php diff --git a/install/update/1.183.0.php b/install/update/1.183.0.php deleted file mode 100644 index cdd01e00d6..0000000000 --- a/install/update/1.183.0.php +++ /dev/null @@ -1,10 +0,0 @@ - \ No newline at end of file From 749053901479121491696bbd6b4b65891f4814cf Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 14:29:56 +0200 Subject: [PATCH 024/110] Add method to fix ip --- core/class/network.class.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 9e6e236505..f0dc0d07ef 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -426,11 +426,19 @@ public static function getInterfaceIp($_interface) { $results = trim(shell_exec('sudo ip addr show ' . $_interface . '| grep inet | head -1')); $results = explode(' ', $results); $result = $results[1]; - return substr($result, 0, strrpos($result, '/')); + $ip = substr($result, 0, strrpos($result, '/')); + if (filter_var($ip, FILTER_VALIDATE_IP)) { + return $ip; + } + return false; } public static function fixInterfaceIP($_interface, $_ip) { - exec('sudo ip addr add ' . $_ip . ' dev ' . $_interface); + $ip = self::getInterfaceIp(); + if ($ip == false) { + return; + } + exec('sudo ip addr del ' . $ip . '/24 dev ' . $_interface . '; sudo ip addr add ' . $_ip . ' dev ' . $_interface); } } From ea64a18a890256c8a93c4fcb632e73be6d0f3c52 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 15:41:30 +0200 Subject: [PATCH 025/110] User can fix ip of jeedom --- core/ajax/network.ajax.php | 4 + core/class/jeedom.class.php | 2 + core/class/network.class.php | 10 +- core/js/network.class.js | 18 ++++ desktop/js/administration.js | 40 +++++++- desktop/php/administration.php | 164 +++++++++++++++++---------------- 6 files changed, 156 insertions(+), 82 deletions(-) diff --git a/core/ajax/network.ajax.php b/core/ajax/network.ajax.php index 3dfde632e2..a802aeb2cc 100644 --- a/core/ajax/network.ajax.php +++ b/core/ajax/network.ajax.php @@ -66,6 +66,10 @@ ajax::success(network::disconnectFromWireless()); } + if (init('action') == 'setFixIP') { + ajax::success(network::setFixIP()); + } + throw new Exception(__('Aucune methode correspondante à : ', __FILE__) . init('action')); /* * *********Catch exeption*************** */ } catch (Exception $e) { diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index 34d798729d..09fc268f8f 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -366,7 +366,9 @@ public static function cron() { log::add('core', 'info', 'Lancement du DNS find Jeedom'); network::ngrok_start('https', 80, 'find', 'find.dns.jeedom.com:4443'); } + sleep(60); network::connectToWireless(); + network::setFixIP(); log::add('core', 'info', 'Démarrage de Jeedom OK'); } plugin::cron(); diff --git a/core/class/network.class.php b/core/class/network.class.php index f0dc0d07ef..1c1b88bf95 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -383,7 +383,7 @@ public static function connectionState() { $results = explode("\n", $results); foreach ($results as $result) { $info_network = explode(":", $result); - if (trim($info_network[0]) != '') { + if (trim($info_network[0]) != '' && $info_network[0] != 'lo') { $return[] = array('device' => $info_network[0], 'type' => $info_network[1], 'state' => $info_network[2], 'connection' => $info_network[3], 'ip' => self::getInterfaceIp($info_network[0])); } } @@ -433,6 +433,14 @@ public static function getInterfaceIp($_interface) { return false; } + public static function setFixIP() { + foreach (self::connectionState() as $connexion) { + if (config::byKey('network::fixIp::' . $connexion['device']) == 1 && filter_var(config::byKey('network::selectIp::' . $connexion['device']), FILTER_VALIDATE_IP)) { + self::fixInterfaceIP($connexion['device'], config::byKey('network::selectIp::' . $connexion['device'])); + } + } + } + public static function fixInterfaceIP($_interface, $_ip) { $ip = self::getInterfaceIp(); if ($ip == false) { diff --git a/core/js/network.class.js b/core/js/network.class.js index 02f2548dc9..40ba0f8353 100644 --- a/core/js/network.class.js +++ b/core/js/network.class.js @@ -126,4 +126,22 @@ jeedom.network.disconnectFromWireless = function (_params) { action: 'disconnectFromWireless' }; $.ajax(paramsAJAX); +}; + +jeedom.network.setFixIP = function (_params) { + var paramsRequired = []; + var paramsSpecifics = {}; + try { + jeedom.private.checkParamsRequired(_params || {}, paramsRequired); + } catch (e) { + (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); + return; + } + var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); + var paramsAJAX = jeedom.private.getParamsAJAX(params); + paramsAJAX.url = 'core/ajax/network.ajax.php'; + paramsAJAX.data = { + action: 'setFixIP' + }; + $.ajax(paramsAJAX); }; \ No newline at end of file diff --git a/desktop/js/administration.js b/desktop/js/administration.js index 0ee6dee6d0..64baf4d9f3 100644 --- a/desktop/js/administration.js +++ b/desktop/js/administration.js @@ -403,16 +403,31 @@ function printConnectionState(){ }, success: function (data) { var tr = ''; + var config = {}; for(var i in data){ tr += ''; tr += ''+data[i].device+''; - tr += ''+data[i].ip+''; + tr += ''+data[i].ip+''; + tr += ''; + tr += ''; tr += ''+data[i].type+''; tr += ''+data[i].state+''; tr += ''+data[i].connection+''; tr += ''; + config['network::fixIp::'+data[i].device] = ''; + config['network::selectIp::'+data[i].device] = ''; } $('#table_networkState tbody').empty().append(tr); + jeedom.config.load({ + configuration: config, + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + $('#config').setValues(data, '.configKey'); + modifyWithoutSave = false; + } + }); } }); } @@ -502,4 +517,27 @@ $('#bt_refreshWifiList').on('click',function(){ $('#bt_refresNetworkState').on('click',function(){ printConnectionState(); +}); + +$('#bt_applyFixIp').on('click',function(){ + bootbox.confirm('{{Etes-vous sûr de vouloir appliquer les IPs fixe ? Cela peut changer la configuration de votre box. Attention une mauvaise configuration peut vous faire perdre l\'accès à votre box et une réinstallation sera necessaire}}', function (result) { + if (result) { + jeedom.config.save({ + configuration: $('#config').getValues('.configKey')[0], + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + jeedom.network.setFixIP({ + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + printConnectionState(); + } + }); + } + }); + } +}); }); \ No newline at end of file diff --git a/desktop/php/administration.php b/desktop/php/administration.php index 76a8d23ac1..9d51d8dbbd 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -255,35 +255,39 @@
- - {{Statut}} - - - - - - - - - - - + {{Statut}} + + + +
{{Equipement}}{{IP}}{{Type}}{{Etat}}{{Connection}}
+ + + + + + + + + + + - -
{{Equipement}}{{IP}}{{Fixe IP}}{{Type}}{{Etat}}{{Connection}}
- + + -
-
- Accès interne - +
+ Accès interne + '; echo ''; @@ -392,95 +396,95 @@
- -
-
-
- -
- -
- -
- -
-
-
+ +
+
+
+ +
+ +
+ +
+ +
+
+
- - -
- {{Gestion}} + +
+ -
-
- DNS Jeedom -
- -
- -
-
-
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
-
+
+
+ DNS Jeedom
- +
- +
-
-
- -
- +
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
+
+
+ +
+ +
+
-
- +
+ +
+ +
+
+ +
-
-
- -
- + +
+ {{Démarré : }} ' . network::getNetworkAccess('external') . ''; } else { echo '{{Arrêté}}'; } ?> +
-
-
- -
- + +
+ {{Démarré : }} dns.jeedom.com:' . config::byKey('ngrok::port') . ''; } else { echo '{{Arrêté}}'; } ?> +
-
-
- - +
+ + -
+
@@ -582,7 +586,7 @@ {{Push}}
-
+
From c53fc1c0ecc1d8df67e90e984c123f13d65d6c44 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 15:44:56 +0200 Subject: [PATCH 026/110] Add cursor class on link --- core/ajax/plan.ajax.php | 4 ++-- desktop/js/plan.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/ajax/plan.ajax.php b/core/ajax/plan.ajax.php index a66315141f..26ba7dee95 100644 --- a/core/ajax/plan.ajax.php +++ b/core/ajax/plan.ajax.php @@ -58,7 +58,7 @@ continue; } $link = 'index.php?v=d&p=plan&plan_id=' . $plan_link->getId(); - $html = ''; + $html = ''; $html .= ''; if ($plan->getDisplay('name') != '' || $plan->getDisplay('icon') != '') { $html .= $plan->getDisplay('icon') . ' ' . $plan->getDisplay('name'); @@ -77,7 +77,7 @@ continue; } $link = 'index.php?p=view&view_id=' . $view->getId(); - $html = ''; + $html = ''; $html .= ''; if ($plan->getDisplay('name') != '' || $plan->getDisplay('icon') != '') { $html .= $plan->getDisplay('icon') . ' ' . $plan->getDisplay('name'); diff --git a/desktop/js/plan.js b/desktop/js/plan.js index 31c6285c4e..062859c1bb 100644 --- a/desktop/js/plan.js +++ b/desktop/js/plan.js @@ -944,7 +944,7 @@ function addLink(_link, _plan) { link = 'index.php?v=d&p=view&view_id=' + _link.id; label = 'label-primary'; } - var html = ''; + var html = ''; html += ''; html += _link.name; html += ''; From 24e48c704da6e77674fb054c259ded7dc6f9d59c Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 15:51:41 +0200 Subject: [PATCH 027/110] Code improvement --- core/com/shell.com.php | 47 ++--- desktop/php/administration.php | 311 ++++++++++++++++----------------- 2 files changed, 181 insertions(+), 177 deletions(-) diff --git a/core/com/shell.com.php b/core/com/shell.com.php index 1c335a01ae..ce79921f42 100644 --- a/core/com/shell.com.php +++ b/core/com/shell.com.php @@ -20,33 +20,40 @@ require_once dirname(__FILE__) . '/../../core/php/core.inc.php'; class com_shell { - /* * ***********************Attributs************************* */ + /* * ***********************Attributs************************* */ - private $cmd; + private $cmd; - /* * ********************Functions static********************* */ + /* * ********************Functions static********************* */ - function __construct($_cmd) { - $this->cmd = $_cmd; - } + function __construct($_cmd) { + $this->cmd = $_cmd; + } - /* * ************* Functions ************************************ */ + /* * ************* Functions ************************************ */ - function exec() { - $output = array(); - $retval = 0; - $return = exec($this->cmd, $output, $retval); - if ($retval != 0) { - throw new Exception('Error on shell exec, return value : ' . $retval . '. Details : ' . $return); - } - return $return; - } + function exec() { + $output = array(); + $retval = 0; + $return = exec($this->cmd, $output, $retval); + if ($retval != 0) { + throw new Exception('Error on shell exec, return value : ' . $retval . '. Details : ' . $return); + } + return $return; + } - /* * **********************Getteur Setteur*************************** */ + function commandExist($_cmd) { + $fp = popen("which " . $_cmd, "r"); + $exists = !empty(fgets($fp, 255)); + pclose($fp); + return $exists; + } - public function getCmd() { - return $this->cmd; - } + /* * **********************Getteur Setteur*************************** */ + + public function getCmd() { + return $this->cmd; + } } diff --git a/desktop/php/administration.php b/desktop/php/administration.php index 9d51d8dbbd..3fe9af3704 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -256,10 +256,7 @@
{{Statut}} @@ -267,27 +264,27 @@ - - - - - - - - - - - + + + + + + + + + + + - -
{{Equipement}}{{IP}}{{Fixe IP}}{{Type}}{{Etat}}{{Connection}}
{{Equipement}}{{IP}}{{Fixe IP}}{{Type}}{{Etat}}{{Connection}}
- + + -
+
- Accès interne - Accès interne + '; echo ''; @@ -297,73 +294,73 @@ echo '
'; } ?> -
- -
- -
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- Accès externe -
- -
- -
+
+
+ Accès externe +
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- -
+
+
+ +
+
-
+
+
-
-
- Wifi - +
+ Wifi + {{Network manager non trouvé, veuillez faire en ssh : sudo apt-get install -y network-manager}}
'; @@ -374,117 +371,117 @@ -
- -
- -
-
-
- -
- -
-
- -
-
-
- -
- -
- -
- -
-
-
- -
- -
- -
- -
-
- +
- + +
+
+
+ +
+ +
+
+
- -
- {{Connexion}} - {{Deconnection}} + +
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+
- + +
+ +
+
+
+ + +
+ -
-
- DNS Jeedom +
+
+ DNS Jeedom +
+ +
+ +
+
+
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
+
- +
- +
-
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
-
-
- -
- -
-
+
+
+ +
+
-
- -
- -
-
- -
+
+
-
- -
- +
+ +
+ {{Démarré : }} ' . network::getNetworkAccess('external') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
- -
- +
+ +
+ {{Démarré : }} dns.jeedom.com:' . config::byKey('ngrok::port') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
- - +
+
+ + -
+
@@ -586,7 +583,7 @@ {{Push}}
-
+
From e313d4cec8f0e292572967286c628eb88ab9a5c2 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 15:52:53 +0200 Subject: [PATCH 028/110] Clean code --- core/nodeJS/server.js | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/core/nodeJS/server.js b/core/nodeJS/server.js index eff4c02ea4..56b9ef6a30 100644 --- a/core/nodeJS/server.js +++ b/core/nodeJS/server.js @@ -34,12 +34,9 @@ message.title = req.query['title']; message.text = req.query['text']; message.category = req.query['category']; - message.userFromId = req.query['userFromId']; - message.userDestId = req.query['userDestId']; message.message = req.query['message']; message.options = req.query['options']; handleMessage(message); - // addMessage(message); res.status(200).send('OK'); }); @@ -52,10 +49,6 @@ user_id : user_id, socket : socket, }; - /* addMessage(null); - for (var i in messages) { - handleMessage(messages[i]); - }*/ }); socket.on('disconnect', function(key) { @@ -63,24 +56,6 @@ }); }); - function addMessage(message) { - var tmp_message = []; - var now = new Date().getTime(); - for (var i in messages) { - if (messages[i].datetime > (now - 2000)) { - if (message == null || (messages[i].type != message.type || messages[i].options != message.options)) { - tmp_message.push(messages[i]); - } - } - } - if (message != null) { - if (message.type == 'eventScenario' || message.type == 'eventEqLogic' || message.type == 'eventCmd') { - tmp_message.push(message); - } -} -messages = tmp_message; -} - function handleMessage(message) { for (var i in clients) { if (clients[i].key == message.key) { From 246badba7aa890bcba8b6af4b8b57e11d4974135 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 18:50:30 +0200 Subject: [PATCH 029/110] Rewrtie management network --- core/ajax/network.ajax.php | 20 +- core/ajax/user.ajax.php | 2 +- core/class/network.class.php | 115 +++++------- core/js/config.class.js | 2 +- core/js/network.class.js | 60 +----- desktop/js/administration.js | 172 +++++------------ desktop/php/administration.php | 324 ++++++++++++++------------------- install/update/1.184.0.php | 20 -- 8 files changed, 237 insertions(+), 478 deletions(-) delete mode 100644 install/update/1.184.0.php diff --git a/core/ajax/network.ajax.php b/core/ajax/network.ajax.php index a802aeb2cc..55d21b4e68 100644 --- a/core/ajax/network.ajax.php +++ b/core/ajax/network.ajax.php @@ -49,25 +49,11 @@ } if (init('action') == 'listWifi') { - ajax::success(network::listWifi(init('rescan'))); + ajax::success(network::listWifi()); } - if (init('action') == 'connectionState') { - ajax::success(network::connectionState()); - } - - if (init('action') == 'connectToWireless') { - config::save('network::wifi::enable', 1); - ajax::success(network::connectToWireless()); - } - - if (init('action') == 'disconnectFromWireless') { - config::save('network::wifi::enable', 0); - ajax::success(network::disconnectFromWireless()); - } - - if (init('action') == 'setFixIP') { - ajax::success(network::setFixIP()); + if (init('action') == 'writeInterfaceFile') { + ajax::success(network::writeInterfaceFile()); } throw new Exception(__('Aucune methode correspondante à : ', __FILE__) . init('action')); diff --git a/core/ajax/user.ajax.php b/core/ajax/user.ajax.php index 0c0711f156..2b25a1965e 100644 --- a/core/ajax/user.ajax.php +++ b/core/ajax/user.ajax.php @@ -166,7 +166,7 @@ ajax::success(utils::o2a($_SESSION['user'])); } - if (init('action') == 'testLdapConneciton') { + if (init('action') == 'testLdapConnection') { if (!isConnect('admin')) { throw new Exception(__('401 - Accès non autorisé', __FILE__)); } diff --git a/core/class/network.class.php b/core/class/network.class.php index 1c1b88bf95..5bb26bf68c 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -361,65 +361,62 @@ public static function ngrok_stop($_proto = 'https', $_port = 80, $_name = '') { /* * *********************WICD************************* */ - public static function listWifi($_refresh = false) { - $return = array(); - if ($_refresh) { - shell_exec('sudo nmcli d wifi rescan'); - } - $results = shell_exec('sudo nmcli -t -f SSID,SIGNAL,CHAN,SECURITY,MODE d wifi list'); - $results = explode("\n", $results); - foreach ($results as $result) { - $info_network = explode(":", $result); - if (trim($info_network[0]) != '' && trim($info_network[0]) != '--') { - $return[] = array('ssid' => $info_network[0], 'signal' => $info_network[1], 'channel' => $info_network[2], 'security' => $info_network[3], 'mode' => $info_network[4]); - } - } - return $return; - - } - - public static function connectionState() { - $results = shell_exec('sudo nmcli -t -f DEVICE,TYPE,STATE,CONNECTION d'); + public static function listWifi() { + $results = shell_exec('sudo iwlist scan | grep ESSID 2> /dev/null'); $results = explode("\n", $results); + $return = array(); foreach ($results as $result) { - $info_network = explode(":", $result); - if (trim($info_network[0]) != '' && $info_network[0] != 'lo') { - $return[] = array('device' => $info_network[0], 'type' => $info_network[1], 'state' => $info_network[2], 'connection' => $info_network[3], 'ip' => self::getInterfaceIp($info_network[0])); + if (strpos($result, 'ESSID') !== false) { + $essid = trim(str_replace(array('ESSID', ':', '"'), '', $result)); + if ($essid != '') { + $return[] = $essid; + } } } return $return; - } - - public static function connectToWireless() { - if (config::byKey('network::wifi::enable') != 1) { - return; - } - if (config::byKey('network::wifi::ssid') == '' && config::byKey('network::wifi::password') != '') { - return; - } - self::disconnectFromWireless(); - $ssid = config::byKey('network::wifi::ssid'); - $password = config::byKey('network::wifi::password'); - exec("sudo nmcli d wifi connect $ssid password $password"); - } - public static function disconnectFromWireless() { - foreach (self::connectionState() as $connection) { - if ($connection['type'] == 'wifi' && $connection['state'] == 'connected') { - exec('sudo nmcli d disconnect ' . $connection['device']); - } - } - self::cleanStoreWifiConnection(); } - public static function cleanStoreWifiConnection() { - $results = shell_exec('sudo nmcli -t -f NAME c show'); - $results = explode("\n", $results); - foreach ($results as $result) { - if (trim($result) != '') { - exec('sudo nmcli c delete "' . $result . '"'); - } - } + public static function writeInterfaceFile() { + $interface = 'auto lo + iface lo inet loopback'; + $interface .= "\n\n"; + $interface .= 'auto eth0 + iface eth0 inet manual + bond-master bond0 + bond-primary eth0 + bond-mode active-backup'; + $interface .= "\n\n"; + if (config::byKey('network::fixip::enable') == 1 && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { + $interface .= 'auto bond0 + iface bond0 inet static + address ' . config::byKey('internalAddr') . ' + gateway ' . config::byKey('network::fixip::gateway') . ' + netmask ' . config::byKey('network::fixip::netmask') . ' + bond-slaves none + bond-primary eth0 + bond-mode active-backup + bond-miimon 100'; + } else { + $interface .= 'auto bond0 + iface bond0 inet dhcp + bond-slaves none + bond-primary eth0 + bond-mode active-backup + bond-miimon 100'; + } + $interface .= "\n\n"; + if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { + $interface .= 'iface wlan0 inet manual + wpa-ssid ' . config::byKey('network::wifi::ssid') . ' + wpa-psk ' . config::byKey('network::wifi::password') . ' + bond-master bond0 + bond-primary eth0 + bond-mode active-backup'; + } + file_put_contents('/tmp/interfaces', $interface); + $filepath = '/etc/network/interfaces2'; + exec('sudo rm -rf ' . $filepath . '; sudo mv /tmp/interfaces ' . $filepath . ';sudo chown root:root ' . $filepath . ';sudo chmod 644 ' . $filepath); } public static function getInterfaceIp($_interface) { @@ -433,22 +430,6 @@ public static function getInterfaceIp($_interface) { return false; } - public static function setFixIP() { - foreach (self::connectionState() as $connexion) { - if (config::byKey('network::fixIp::' . $connexion['device']) == 1 && filter_var(config::byKey('network::selectIp::' . $connexion['device']), FILTER_VALIDATE_IP)) { - self::fixInterfaceIP($connexion['device'], config::byKey('network::selectIp::' . $connexion['device'])); - } - } - } - - public static function fixInterfaceIP($_interface, $_ip) { - $ip = self::getInterfaceIp(); - if ($ip == false) { - return; - } - exec('sudo ip addr del ' . $ip . '/24 dev ' . $_interface . '; sudo ip addr add ' . $_ip . ' dev ' . $_interface); - } - } ?> diff --git a/core/js/config.class.js b/core/js/config.class.js index 7e66b7f38d..bb4b200cb4 100644 --- a/core/js/config.class.js +++ b/core/js/config.class.js @@ -41,7 +41,7 @@ jeedom.config.save = function (_params) { jeedom.config.load = function (_params) { var paramsRequired = ['configuration']; - var paramsSpecifics = {}; + var paramsSpecifics = {global: _params.global || true}; try { jeedom.private.checkParamsRequired(_params || {}, paramsRequired); } catch (e) { diff --git a/core/js/network.class.js b/core/js/network.class.js index 40ba0f8353..c1e6c02df1 100644 --- a/core/js/network.class.js +++ b/core/js/network.class.js @@ -57,7 +57,7 @@ jeedom.network.stopNgrok = function (_params) { jeedom.network.listWifi = function (_params) { var paramsRequired = []; - var paramsSpecifics = {}; + var paramsSpecifics = {global: _params.global || true}; try { jeedom.private.checkParamsRequired(_params || {}, paramsRequired); } catch (e) { @@ -74,61 +74,7 @@ jeedom.network.listWifi = function (_params) { $.ajax(paramsAJAX); }; -jeedom.network.connectionState = function (_params) { - var paramsRequired = []; - var paramsSpecifics = {}; - try { - jeedom.private.checkParamsRequired(_params || {}, paramsRequired); - } catch (e) { - (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); - return; - } - var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); - var paramsAJAX = jeedom.private.getParamsAJAX(params); - paramsAJAX.url = 'core/ajax/network.ajax.php'; - paramsAJAX.data = { - action: 'connectionState' - }; - $.ajax(paramsAJAX); -}; - -jeedom.network.connectToWireless = function (_params) { - var paramsRequired = []; - var paramsSpecifics = {}; - try { - jeedom.private.checkParamsRequired(_params || {}, paramsRequired); - } catch (e) { - (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); - return; - } - var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); - var paramsAJAX = jeedom.private.getParamsAJAX(params); - paramsAJAX.url = 'core/ajax/network.ajax.php'; - paramsAJAX.data = { - action: 'connectToWireless' - }; - $.ajax(paramsAJAX); -}; - -jeedom.network.disconnectFromWireless = function (_params) { - var paramsRequired = []; - var paramsSpecifics = {}; - try { - jeedom.private.checkParamsRequired(_params || {}, paramsRequired); - } catch (e) { - (_params.error || paramsSpecifics.error || jeedom.private.default_params.error)(e); - return; - } - var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); - var paramsAJAX = jeedom.private.getParamsAJAX(params); - paramsAJAX.url = 'core/ajax/network.ajax.php'; - paramsAJAX.data = { - action: 'disconnectFromWireless' - }; - $.ajax(paramsAJAX); -}; - -jeedom.network.setFixIP = function (_params) { +jeedom.network.writeInterfaceFile = function (_params) { var paramsRequired = []; var paramsSpecifics = {}; try { @@ -141,7 +87,7 @@ jeedom.network.setFixIP = function (_params) { var paramsAJAX = jeedom.private.getParamsAJAX(params); paramsAJAX.url = 'core/ajax/network.ajax.php'; paramsAJAX.data = { - action: 'setFixIP' + action: 'writeInterfaceFile' }; $.ajax(paramsAJAX); }; \ No newline at end of file diff --git a/desktop/js/administration.js b/desktop/js/administration.js index 64baf4d9f3..5fdc9f439b 100644 --- a/desktop/js/administration.js +++ b/desktop/js/administration.js @@ -15,7 +15,6 @@ * along with Jeedom. If not, see . */ - printConnectionState(); printWifiList(); $("#bt_genKeyAPI").on('click', function (event) { @@ -168,7 +167,7 @@ type: 'POST', url: 'core/ajax/user.ajax.php', data: { - action: 'testLdapConneciton', + action: 'testLdapConnection', }, dataType: 'json', error: function (request, status, error) { @@ -396,148 +395,59 @@ function saveConvertColor() { /**************************NETWORK***********************************/ -function printConnectionState(){ - jeedom.network.connectionState({ - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - var tr = ''; - var config = {}; - for(var i in data){ - tr += ''; - tr += ''+data[i].device+''; - tr += ''+data[i].ip+''; - tr += ''; - tr += ''; - tr += ''+data[i].type+''; - tr += ''+data[i].state+''; - tr += ''+data[i].connection+''; - tr += ''; - config['network::fixIp::'+data[i].device] = ''; - config['network::selectIp::'+data[i].device] = ''; - } - $('#table_networkState tbody').empty().append(tr); - jeedom.config.load({ - configuration: config, - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - $('#config').setValues(data, '.configKey'); - modifyWithoutSave = false; - } - }); - } - }); -} - -function printWifiList(_rescan){ +function printWifiList(_global){ jeedom.network.listWifi({ - rescan : _rescan || false, + global : _global || false, error: function (error) { $('#div_alert').showAlert({message: error.message, level: 'danger'}); }, success: function (data) { var option = ''; for(var i in data){ - option += ''; - } - $('.configKey[data-l1key="network::wifi::ssid"]').empty().append(option); - - jeedom.config.load({ - configuration: {"network::wifi::ssid" : ""}, - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - $('#config').setValues(data, '.configKey'); - modifyWithoutSave = false; + option += ''; } - }); - } + $('.configKey[data-l1key="network::wifi::ssid"]').empty().append(option); + jeedom.config.load({ + configuration: {"network::wifi::ssid" : ""}, + global : false, + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + $('#config').setValues(data, '.configKey'); + modifyWithoutSave = false; + } + }); + } }); } -$('.configKey[data-l1key="network::wifi::ssid"]').on('change',function(){ - var option = $('.configKey[data-l1key="network::wifi::ssid"] option:selected'); - $('#span_wifiSignal').empty().append(option.attr('data-signal')); - $('#span_wifiChannel').empty().append(option.attr('data-channel')); - $('#span_wifiSecurity').empty().append(option.attr('data-security')); - $('#span_wifiMode').empty().append(option.attr('data-mode')); -}); - -$('#bt_connectToWifi').on('click', function () { - $.hideAlert(); - jeedom.config.save({ - configuration: $('#config').getValues('.configKey')[0], - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function () { - jeedom.network.connectToWireless({ - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - modifyWithoutSave = false; - window.location.href='index.php?v=d&p=administration&panel=config_network'; - } - }); - } -}); -}); - -$('#bt_disconnectToWifi').on('click', function () { - $.hideAlert(); - jeedom.config.save({ - configuration: $('#config').getValues('.configKey')[0], - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function () { - jeedom.network.disconnectFromWireless({ - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - modifyWithoutSave = false; - window.location.href='index.php?v=d&p=administration&panel=config_network'; - } - }); - } -}); +$('#bt_writeInterfaceFile').on('click', function () { + bootbox.confirm('{{Etes-vous sûr de vouloir ecrire la configuration réseaux ? La moindre erreur peut rendre votre box inaccessible et vous obligera à une reinstallation. Suite à ce changement un redemarrage est necessaire.}}', function (result) { + if (result) { + $.hideAlert(); + jeedom.config.save({ + configuration: $('#config').getValues('.configKey')[0], + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function () { + jeedom.network.writeInterfaceFile({ + error: function (error) { + $('#div_alert').showAlert({message: error.message, level: 'danger'}); + }, + success: function (data) { + modifyWithoutSave = false; + } + }); + } + }); + } + }); }); $('#bt_refreshWifiList').on('click',function(){ printWifiList(true); }); - -$('#bt_refresNetworkState').on('click',function(){ - printConnectionState(); -}); - -$('#bt_applyFixIp').on('click',function(){ - bootbox.confirm('{{Etes-vous sûr de vouloir appliquer les IPs fixe ? Cela peut changer la configuration de votre box. Attention une mauvaise configuration peut vous faire perdre l\'accès à votre box et une réinstallation sera necessaire}}', function (result) { - if (result) { - jeedom.config.save({ - configuration: $('#config').getValues('.configKey')[0], - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function () { - jeedom.network.setFixIP({ - error: function (error) { - $('#div_alert').showAlert({message: error.message, level: 'danger'}); - }, - success: function (data) { - printConnectionState(); - } - }); - } - }); - } -}); -}); \ No newline at end of file diff --git a/desktop/php/administration.php b/desktop/php/administration.php index 3fe9af3704..c71680ad17 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -255,36 +255,10 @@
- - {{Statut}} - - - - - - - - - - - - - - - - - -
{{Equipement}}{{IP}}{{Fixe IP}}{{Type}}{{Etat}}{{Connection}}
- -
-
- Accès interne - +
+ Accès interne + '; echo ''; @@ -294,194 +268,176 @@ echo '
'; } ?> -
- -
- +
+ +
+ +
-
-
- -
- +
+ +
+ +
-
-
- -
- +
+ +
+ +
-
-
- -
- +
+ +
+ +
-
-
- Accès externe -
- -
- +
+ Accès externe +
+ +
+ +
-
-
- -
- +
+ +
+ +
-
-
- -
- +
+ +
+ +
-
-
- -
- +
+ +
+ +
-
+
-
- -
-
- Wifi - {{Network manager non trouvé, veuillez faire en ssh : sudo apt-get install -y network-manager}}
'; -} else { - ?> - - - - -
- -
- +
+
+ {{Wifi et IP fixe}} +
+ +
+ +
-
-
- -
- +
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
-
- +
+ +
+ +
+
+
+ +
+ +
+
+ + +
+
+
+ DNS Jeedom +
+ +
+
+
+
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
+
- -
- -
- -
- -
-
-
- -
- -
- -
- -
-
-
- -
- + +
+ +
- - -
- -
-
- DNS Jeedom -
- -
- -
-
-
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
-
-
- -
- + +
+ +
+
+ +
-
-
-
- -
- -
-
- -
-
-
- -
- + +
+ {{Démarré : }} ' . network::getNetworkAccess('external') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
-
- -
- +
+
+ +
+ {{Démarré : }} dns.jeedom.com:' . config::byKey('ngrok::port') . ''; } else { echo '{{Arrêté}}'; } ?> -
-
-
- - +
+
+
+ + -
+
diff --git a/install/update/1.184.0.php b/install/update/1.184.0.php deleted file mode 100644 index 2548b43428..0000000000 --- a/install/update/1.184.0.php +++ /dev/null @@ -1,20 +0,0 @@ - \ No newline at end of file From f3ba4d0a58d832bbbfe4699d2c175e9e852eb2a3 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 19:02:51 +0200 Subject: [PATCH 030/110] Improvement --- core/class/network.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 5bb26bf68c..e18ad6064e 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -368,8 +368,8 @@ public static function listWifi() { foreach ($results as $result) { if (strpos($result, 'ESSID') !== false) { $essid = trim(str_replace(array('ESSID', ':', '"'), '', $result)); - if ($essid != '') { - $return[] = $essid; + if ($essid != '' && !isset($return[$essid])) { + $return[$essid] = $essid; } } } @@ -415,7 +415,7 @@ public static function writeInterfaceFile() { bond-mode active-backup'; } file_put_contents('/tmp/interfaces', $interface); - $filepath = '/etc/network/interfaces2'; + $filepath = '/etc/network/interfaces'; exec('sudo rm -rf ' . $filepath . '; sudo mv /tmp/interfaces ' . $filepath . ';sudo chown root:root ' . $filepath . ';sudo chmod 644 ' . $filepath); } From f4d7e7065a6270a4b6c1fde89680726ec8d9635b Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 19:15:13 +0200 Subject: [PATCH 031/110] Improve wifi scan --- core/class/network.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index e18ad6064e..ed48902e29 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -362,7 +362,7 @@ public static function ngrok_stop($_proto = 'https', $_port = 80, $_name = '') { /* * *********************WICD************************* */ public static function listWifi() { - $results = shell_exec('sudo iwlist scan | grep ESSID 2> /dev/null'); + $results = shell_exec('sudo ifconfig wlan0 up;sudo iwlist scan | grep ESSID 2> /dev/null'); $results = explode("\n", $results); $return = array(); foreach ($results as $result) { From 63d1876af3513301a885080fde8863daa909254d Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 19:23:51 +0200 Subject: [PATCH 032/110] Fix wifi --- core/class/network.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index ed48902e29..443b663988 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -407,7 +407,8 @@ public static function writeInterfaceFile() { } $interface .= "\n\n"; if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { - $interface .= 'iface wlan0 inet manual + $interface .= 'auto wlan0 + iface wlan0 inet manual wpa-ssid ' . config::byKey('network::wifi::ssid') . ' wpa-psk ' . config::byKey('network::wifi::password') . ' bond-master bond0 From 5689057bd7eaf970e52fb42c6d9a7b2524938555 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 19:24:55 +0200 Subject: [PATCH 033/110] Improve configuration --- core/class/network.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/core/class/network.class.php b/core/class/network.class.php index 443b663988..8edcbd5791 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -409,6 +409,7 @@ public static function writeInterfaceFile() { if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { $interface .= 'auto wlan0 iface wlan0 inet manual + allow-hotplug wlan0 wpa-ssid ' . config::byKey('network::wifi::ssid') . ' wpa-psk ' . config::byKey('network::wifi::password') . ' bond-master bond0 From b159e36bde7826f2125fe1ccba40e0ef7f597038 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 19:41:54 +0200 Subject: [PATCH 034/110] Bugfix --- core/class/network.class.php | 5 ++++- desktop/php/administration.php | 28 ++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 8edcbd5791..bbcd3121f1 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -387,12 +387,14 @@ public static function writeInterfaceFile() { bond-primary eth0 bond-mode active-backup'; $interface .= "\n\n"; - if (config::byKey('network::fixip::enable') == 1 && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { + if (config::byKey('network::fixip::enable') == 1 && filter_var(config::byKey('network::fixip::network'), FILTER_VALIDATE_IP) && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 iface bond0 inet static address ' . config::byKey('internalAddr') . ' gateway ' . config::byKey('network::fixip::gateway') . ' netmask ' . config::byKey('network::fixip::netmask') . ' + network ' . config::byKey('network::fixip::network ') . ' + broadcast ' . config::byKey('network::fixip::broadcast ') . ' bond-slaves none bond-primary eth0 bond-mode active-backup @@ -416,6 +418,7 @@ public static function writeInterfaceFile() { bond-primary eth0 bond-mode active-backup'; } + $interface .= "\n"; file_put_contents('/tmp/interfaces', $interface); $filepath = '/etc/network/interfaces'; exec('sudo rm -rf ' . $filepath . '; sudo mv /tmp/interfaces ' . $filepath . ';sudo chown root:root ' . $filepath . ';sudo chmod 644 ' . $filepath); diff --git a/desktop/php/administration.php b/desktop/php/administration.php index c71680ad17..c0f925c4f2 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -243,7 +243,7 @@
-
+ -
+
@@ -315,7 +315,7 @@
-
+
@@ -355,23 +355,35 @@
-
+
-
+
-
+
+
+
+ +
+ +
+
+
+ +
+ +
@@ -389,7 +401,7 @@
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
-
+
@@ -397,7 +409,7 @@
-
+
From 522e040198cc532058b116b93d1923b3932ccb30 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 19:44:51 +0200 Subject: [PATCH 035/110] Fix start --- core/class/jeedom.class.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index 09fc268f8f..ae97023a16 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -366,9 +366,6 @@ public static function cron() { log::add('core', 'info', 'Lancement du DNS find Jeedom'); network::ngrok_start('https', 80, 'find', 'find.dns.jeedom.com:4443'); } - sleep(60); - network::connectToWireless(); - network::setFixIP(); log::add('core', 'info', 'Démarrage de Jeedom OK'); } plugin::cron(); From 545e0ee678aab5b4c676fc72b5dcbb3352ced9e2 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 19:59:01 +0200 Subject: [PATCH 036/110] bugfix --- desktop/php/administration.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desktop/php/administration.php b/desktop/php/administration.php index c0f925c4f2..0235133db0 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -364,13 +364,13 @@
- +
- +
@@ -380,7 +380,7 @@
- +
From 88a81bd4f65a2fc5c6f48ef0db74ead91fd7b38c Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 20:07:15 +0200 Subject: [PATCH 037/110] Disable fix IP --- core/class/network.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index bbcd3121f1..f40f897db0 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -387,7 +387,7 @@ public static function writeInterfaceFile() { bond-primary eth0 bond-mode active-backup'; $interface .= "\n\n"; - if (config::byKey('network::fixip::enable') == 1 && filter_var(config::byKey('network::fixip::network'), FILTER_VALIDATE_IP) && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { + if (false && config::byKey('network::fixip::enable') == 1 && filter_var(config::byKey('network::fixip::network'), FILTER_VALIDATE_IP) && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 iface bond0 inet static address ' . config::byKey('internalAddr') . ' From f5272d1a58759fbf4ae9be0b105fd7e750ca44d3 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 20:23:55 +0200 Subject: [PATCH 038/110] Comment --- desktop/php/administration.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/desktop/php/administration.php b/desktop/php/administration.php index 0235133db0..d23a7203f6 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -355,6 +355,8 @@
+ +
From a8c6e8af382ae2be8380d65979811933ece99e62 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 26 Apr 2015 20:24:07 +0200 Subject: [PATCH 039/110] Typo --- desktop/php/administration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/php/administration.php b/desktop/php/administration.php index d23a7203f6..cb57da6584 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -333,7 +333,7 @@
- {{Wifi et IP fixe}} + {{Wifi}}
From 77c88e0c5f86782e8b5948d30caab74157b4477d Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 27 Apr 2015 11:03:31 +0200 Subject: [PATCH 040/110] Typo --- core/class/network.class.php | 23 ++++++++++++----------- core/i18n/fr_FR.json | 2 +- desktop/modal/market.send.php | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index f40f897db0..db8437864e 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -387,6 +387,18 @@ public static function writeInterfaceFile() { bond-primary eth0 bond-mode active-backup'; $interface .= "\n\n"; + + if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { + $interface .= 'auto wlan0 + iface wlan0 inet manual + allow-hotplug wlan0 + wpa-ssid ' . config::byKey('network::wifi::ssid') . ' + wpa-psk ' . config::byKey('network::wifi::password') . ' + bond-master bond0 + bond-primary eth0 + bond-mode active-backup'; + } + $interface .= "\n\n"; if (false && config::byKey('network::fixip::enable') == 1 && filter_var(config::byKey('network::fixip::network'), FILTER_VALIDATE_IP) && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 iface bond0 inet static @@ -406,17 +418,6 @@ public static function writeInterfaceFile() { bond-primary eth0 bond-mode active-backup bond-miimon 100'; - } - $interface .= "\n\n"; - if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { - $interface .= 'auto wlan0 - iface wlan0 inet manual - allow-hotplug wlan0 - wpa-ssid ' . config::byKey('network::wifi::ssid') . ' - wpa-psk ' . config::byKey('network::wifi::password') . ' - bond-master bond0 - bond-primary eth0 - bond-mode active-backup'; } $interface .= "\n"; file_put_contents('/tmp/interfaces', $interface); diff --git a/core/i18n/fr_FR.json b/core/i18n/fr_FR.json index 17ca1d0f99..0d97f3c037 100644 --- a/core/i18n/fr_FR.json +++ b/core/i18n/fr_FR.json @@ -961,7 +961,7 @@ "Espagnole": "Espagnole", "Russe": "Russe", "Votre objet a été envoyé avec succès sur le market": "Votre objet a été envoyé avec succès sur le market", - "Vous n'etes pas l'autheur du plugin": "Vous n'etes pas l'autheur du plugin", + "Vous n'etes pas l'auteur du plugin": "Vous n'etes pas l'auteur du plugin", "English": "English", "Deutsch": "Deutsch", "Español": "Español", diff --git a/desktop/modal/market.send.php b/desktop/modal/market.send.php index 4876e6cc62..06dc91f7a0 100644 --- a/desktop/modal/market.send.php +++ b/desktop/modal/market.send.php @@ -16,7 +16,7 @@ } if (is_object($market)) { if ($market->getApi_author() == '') { - throw new Exception('{{Vous n\'etes pas l\'autheur du plugin}}'); + throw new Exception('{{Vous n\'etes pas l\'auteur du plugin}}'); } } From f02e204488869eafe244db9f881af50406693af2 Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 27 Apr 2015 16:08:23 +0200 Subject: [PATCH 041/110] Improve network management --- core/class/jeedom.class.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index ae97023a16..80f3fcf4f4 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -361,6 +361,7 @@ public static function cron() { jeedom::start(); plugin::start(); touch('/tmp/jeedom_start'); + config::save('network::lastNoGw', -1); self::event('start'); if (config::byKey('jeedom::firstUse', 'core', 1) == 1) { log::add('core', 'info', 'Lancement du DNS find Jeedom'); @@ -462,6 +463,11 @@ public static function cron() { } catch (Exception $e) { log::add('cache', 'error', 'Clean cache : ' . $e->getMessage()); } + try { + network::cron(); + } catch (Exception $e) { + log::add('network', 'error', 'network::cron : ' . $e->getMessage()); + } } From 9f1d4b288185d53e770ef7175366f1f73d7bcbdd Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 27 Apr 2015 16:28:04 +0200 Subject: [PATCH 042/110] Improve network --- core/class/history.class.php | 2 +- core/class/network.class.php | 105 +++++++++++++++++++++++++++++++++-- 2 files changed, 101 insertions(+), 6 deletions(-) diff --git a/core/class/history.class.php b/core/class/history.class.php index 6ead63a19a..dc412c12f4 100644 --- a/core/class/history.class.php +++ b/core/class/history.class.php @@ -516,7 +516,7 @@ public function save($_cmd = null, $_direct = false) { if ($cmd->getConfiguration('historizeRound') !== '' && is_numeric($cmd->getConfiguration('historizeRound')) && $cmd->getConfiguration('historizeRound') >= 0 && $this->getValue() !== null) { $this->setValue(round($this->getValue(), $cmd->getConfiguration('historizeRound'))); } - if ($cmd->getSubType() != 'binary' && $cmd->getConfiguration('historizeMode', 'avg') != 'none' && $this->getValue() !== null && $direct = false) { + if ($cmd->getSubType() != 'binary' && $cmd->getConfiguration('historizeMode', 'avg') != 'none' && $this->getValue() !== null && $_direct == false) { if ($this->getTableName() == 'history') { $time = strtotime($this->getDatetime()); $time -= $time % 300; diff --git a/core/class/network.class.php b/core/class/network.class.php index db8437864e..e5d3cea531 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -399,15 +399,21 @@ public static function writeInterfaceFile() { bond-mode active-backup'; } $interface .= "\n\n"; - if (false && config::byKey('network::fixip::enable') == 1 && filter_var(config::byKey('network::fixip::network'), FILTER_VALIDATE_IP) && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { + if (false && config::byKey('network::fixip::enable') == 1 && config::byKey('internalAddr') != '' && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::gateway') != '' && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::netmask') != '' && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 iface bond0 inet static address ' . config::byKey('internalAddr') . ' gateway ' . config::byKey('network::fixip::gateway') . ' - netmask ' . config::byKey('network::fixip::netmask') . ' - network ' . config::byKey('network::fixip::network ') . ' - broadcast ' . config::byKey('network::fixip::broadcast ') . ' - bond-slaves none + netmask ' . config::byKey('network::fixip::netmask'); + if (filter_var(config::byKey('network::fixip::network'), FILTER_VALIDATE_IP)) { + $interface .= "\n"; + $interface .= 'network ' . config::byKey('network::fixip::network '); + } + if (filter_var(config::byKey('network::fixip::broadcast'), FILTER_VALIDATE_IP)) { + $interface .= "\n"; + $interface .= 'broadcast ' . config::byKey('network::fixip::broadcast '); + } + $interface .= 'bond-slaves none bond-primary eth0 bond-mode active-backup bond-miimon 100'; @@ -436,6 +442,95 @@ public static function getInterfaceIp($_interface) { return false; } + public static function getRoute() { + $return = array(); + $results = trim(shell_exec('sudo route -n')); + $results = explode("\n", $results); + unset($results[0]); + unset($results[1]); + foreach ($results as $result) { + $info = explode(' ', $result); + $destination = null; + $gw = null; + $iface = $info[count($info) - 1]; + for ($i = 0; $i < count($info); $i++) { + if ($info[$i] != '' && filter_var($info[$i], FILTER_VALIDATE_IP)) { + if ($destination == null) { + $destination = $info[$i]; + } else if ($gw == null) { + $gw = $info[$i]; + } + } + } + if (isset($return[$iface])) { + if ($destination != '0.0.0.0') { + $return[$iface]['destination'] = $destination; + } + if ($gw != '0.0.0.0') { + $return[$iface]['gateway'] = $gw; + } + } else { + $return[$iface] = array('destination' => $destination, 'gateway' => $gw, 'iface' => $iface); + } + } + return $return; + } + + public static function checkGw() { + $return = array(); + foreach (self::getRoute() as $route) { + $return[$route['iface']] = array('destination' => $route['destination'], 'gateway' => $route['gateway'], 'iface' => $route['iface']); + $output = array(); + $return_val = -1; + exec('sudo ping -c 1 ' . $route['gateway'] . ' > /dev/null 2> /dev/null', $output, $return_val); + $return[$route['iface']]['ping'] = ($return_val == 0) ? 'ok' : 'nok'; + } + return $return; + } + + public static function cron() { + $gws = self::checkGw(); + if (count($gws)) { + foreach ($gws as $gw) { + if ($gw['ping'] == 'ok') { + if (config::byKey('network::lastNoGw', 'core', -1) != -1) { + config::save('network::lastNoGw', -1); + } + return; + } + } + } + $lastNoOk = config::byKey('network::lastNoGw', 'core', -1); + if ($lastNoOk < 0) { + config::save('network::lastNoGw', strtotime('now')); + return; + } + if ((strtotime('now') - $lastNoOk) < 300) { + return; + } + if (config::byKey('network::fixip::enable') == 1) { + log::add('network', 'error', __('Aucune gateway trouvée, la configuration IP fixe est surement invalide. Désactivation de celle-ci et redemarrage', __FILE__)); + config::save('network::fixip::enable', 0); + config::save('network::lastNoGw', -1); + self::writeInterfaceFile(); + jeedom::rebootSystem(); + return; + } + if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { + log::add('network', 'error', __('Aucune gateway trouvée, redemarrage de l\'interface wifi', __FILE__)); + config::save('network::lastNoGw', -1); + exec('sudo ifdown wlan0'); + sleep(5); + exec('sudo ifup --force wlan0'); + return; + } + log::add('network', 'error', __('Aucune gateway trouvée, redemarrage de l\'interface filaire', __FILE__)); + config::save('network::lastNoGw', -1); + //exec('sudo ifdown eth0'); + sleep(5); + //exec('sudo ifup --force eth0'); + } + } ?> From c7b62fbfc3fbecb3ef2e1ff63c046041555e2f48 Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 27 Apr 2015 17:03:22 +0200 Subject: [PATCH 043/110] =?UTF-8?q?Possibilit=C3=A9=20d'avoir=20des=20repo?= =?UTF-8?q?nses=20vide=20aux=20interaciton?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/interactQuery.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/interactQuery.class.php b/core/class/interactQuery.class.php index c93350ee9e..c05298bcd0 100644 --- a/core/class/interactQuery.class.php +++ b/core/class/interactQuery.class.php @@ -196,7 +196,7 @@ public static function tryToReply($_query, $_parameters = array()) { if (is_object($interactQuery)) { $reply = $interactQuery->executeAndReply($_parameters); if (trim($reply) == '') { - $reply = sefl::replyOk(); + //$reply = sefl::replyOk(); } } if (trim($reply) == '' && (!isset($_parameters['emptyReply']) || $_parameters['emptyReply'] == 0)) { From 42001a074d4b3204bcf3321278a1c13fe76867da Mon Sep 17 00:00:00 2001 From: Loic Date: Mon, 27 Apr 2015 19:17:34 +0200 Subject: [PATCH 044/110] Try improve wifi conf --- core/class/network.class.php | 37 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index e5d3cea531..99e0cc9776 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -380,24 +380,6 @@ public static function listWifi() { public static function writeInterfaceFile() { $interface = 'auto lo iface lo inet loopback'; - $interface .= "\n\n"; - $interface .= 'auto eth0 - iface eth0 inet manual - bond-master bond0 - bond-primary eth0 - bond-mode active-backup'; - $interface .= "\n\n"; - - if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { - $interface .= 'auto wlan0 - iface wlan0 inet manual - allow-hotplug wlan0 - wpa-ssid ' . config::byKey('network::wifi::ssid') . ' - wpa-psk ' . config::byKey('network::wifi::password') . ' - bond-master bond0 - bond-primary eth0 - bond-mode active-backup'; - } $interface .= "\n\n"; if (false && config::byKey('network::fixip::enable') == 1 && config::byKey('internalAddr') != '' && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::gateway') != '' && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::netmask') != '' && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 @@ -425,6 +407,25 @@ public static function writeInterfaceFile() { bond-mode active-backup bond-miimon 100'; } + $interface .= "\n\n"; + $interface .= 'auto eth0 + iface eth0 inet manual + bond-master bond0 + bond-primary eth0 + bond-mode active-backup'; + $interface .= "\n\n"; + + if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { + $interface .= 'auto wlan0 + iface wlan0 inet manual + allow-hotplug wlan0 + wpa-ssid ' . config::byKey('network::wifi::ssid') . ' + wpa-psk ' . config::byKey('network::wifi::password') . ' + bond-master bond0 + bond-primary eth0 + bond-mode active-backup'; + } + $interface .= "\n"; file_put_contents('/tmp/interfaces', $interface); $filepath = '/etc/network/interfaces'; From 6cd25b39382eb27ba5f4159208f5c8a3c46620fc Mon Sep 17 00:00:00 2001 From: Loic Date: Mon, 27 Apr 2015 19:28:37 +0200 Subject: [PATCH 045/110] Fix network con --- core/class/network.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 99e0cc9776..47b89a0efd 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -380,6 +380,12 @@ public static function listWifi() { public static function writeInterfaceFile() { $interface = 'auto lo iface lo inet loopback'; + $interface .= "\n\n"; + $interface .= 'auto eth0 + iface eth0 inet manual + bond-master bond0 + bond-primary eth0 + bond-mode active-backup'; $interface .= "\n\n"; if (false && config::byKey('network::fixip::enable') == 1 && config::byKey('internalAddr') != '' && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::gateway') != '' && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::netmask') != '' && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 @@ -408,12 +414,6 @@ public static function writeInterfaceFile() { bond-miimon 100'; } $interface .= "\n\n"; - $interface .= 'auto eth0 - iface eth0 inet manual - bond-master bond0 - bond-primary eth0 - bond-mode active-backup'; - $interface .= "\n\n"; if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { $interface .= 'auto wlan0 From 7014f07a70d751ce7fb5fa28cabf29049ff0cf20 Mon Sep 17 00:00:00 2001 From: Loic Date: Mon, 27 Apr 2015 19:31:01 +0200 Subject: [PATCH 046/110] Fix --- core/com/shell.com.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/com/shell.com.php b/core/com/shell.com.php index ce79921f42..6b0a9f90c0 100644 --- a/core/com/shell.com.php +++ b/core/com/shell.com.php @@ -44,7 +44,8 @@ function exec() { function commandExist($_cmd) { $fp = popen("which " . $_cmd, "r"); - $exists = !empty(fgets($fp, 255)); + $value = fgets($fp, 255); + $exists = !empty($value); pclose($fp); return $exists; } From fcb50f9e24228805221fa251cf56ca423a5f659d Mon Sep 17 00:00:00 2001 From: Loic Date: Mon, 27 Apr 2015 20:30:47 +0200 Subject: [PATCH 047/110] Fix conf --- core/class/network.class.php | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 47b89a0efd..c78d8e7303 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -387,6 +387,19 @@ public static function writeInterfaceFile() { bond-primary eth0 bond-mode active-backup'; $interface .= "\n\n"; + + if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { + $interface .= 'auto wlan0 + iface wlan0 inet manual + allow-hotplug wlan0 + wpa-ssid ' . config::byKey('network::wifi::ssid') . ' + wpa-psk ' . config::byKey('network::wifi::password') . ' + bond-master bond0 + bond-primary eth0 + bond-mode active-backup'; + } + $interface .= "\n\n"; + if (false && config::byKey('network::fixip::enable') == 1 && config::byKey('internalAddr') != '' && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::gateway') != '' && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::netmask') != '' && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 iface bond0 inet static @@ -413,18 +426,6 @@ public static function writeInterfaceFile() { bond-mode active-backup bond-miimon 100'; } - $interface .= "\n\n"; - - if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { - $interface .= 'auto wlan0 - iface wlan0 inet manual - allow-hotplug wlan0 - wpa-ssid ' . config::byKey('network::wifi::ssid') . ' - wpa-psk ' . config::byKey('network::wifi::password') . ' - bond-master bond0 - bond-primary eth0 - bond-mode active-backup'; - } $interface .= "\n"; file_put_contents('/tmp/interfaces', $interface); From a524cb81ae398832e6f03018230c8ca4645029e6 Mon Sep 17 00:00:00 2001 From: Loic Date: Mon, 27 Apr 2015 20:52:27 +0200 Subject: [PATCH 048/110] Improve network conf --- core/class/network.class.php | 11 +---------- desktop/php/administration.php | 18 ++---------------- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index c78d8e7303..cccc9c77cf 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -391,7 +391,6 @@ public static function writeInterfaceFile() { if (config::byKey('network::wifi::enable') == 1 && config::byKey('network::wifi::ssid') != '' && config::byKey('network::wifi::password') != '') { $interface .= 'auto wlan0 iface wlan0 inet manual - allow-hotplug wlan0 wpa-ssid ' . config::byKey('network::wifi::ssid') . ' wpa-psk ' . config::byKey('network::wifi::password') . ' bond-master bond0 @@ -400,20 +399,12 @@ public static function writeInterfaceFile() { } $interface .= "\n\n"; - if (false && config::byKey('network::fixip::enable') == 1 && config::byKey('internalAddr') != '' && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::gateway') != '' && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::netmask') != '' && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { + if (config::byKey('network::fixip::enable') == 1 && config::byKey('internalAddr') != '' && filter_var(config::byKey('internalAddr'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::gateway') != '' && filter_var(config::byKey('network::fixip::gateway'), FILTER_VALIDATE_IP) && config::byKey('network::fixip::netmask') != '' && filter_var(config::byKey('network::fixip::netmask'), FILTER_VALIDATE_IP)) { $interface .= 'auto bond0 iface bond0 inet static address ' . config::byKey('internalAddr') . ' gateway ' . config::byKey('network::fixip::gateway') . ' netmask ' . config::byKey('network::fixip::netmask'); - if (filter_var(config::byKey('network::fixip::network'), FILTER_VALIDATE_IP)) { - $interface .= "\n"; - $interface .= 'network ' . config::byKey('network::fixip::network '); - } - if (filter_var(config::byKey('network::fixip::broadcast'), FILTER_VALIDATE_IP)) { - $interface .= "\n"; - $interface .= 'broadcast ' . config::byKey('network::fixip::broadcast '); - } $interface .= 'bond-slaves none bond-primary eth0 bond-mode active-backup diff --git a/desktop/php/administration.php b/desktop/php/administration.php index cb57da6584..494e4380cd 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -355,8 +355,6 @@
- -
From 9ae16191d05cc8a728373d51d8c226cdeb1c6c99 Mon Sep 17 00:00:00 2001 From: Loic Date: Mon, 27 Apr 2015 20:56:29 +0200 Subject: [PATCH 049/110] UI fix --- desktop/php/interact.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/php/interact.php b/desktop/php/interact.php index 5ce56975a1..487addd972 100644 --- a/desktop/php/interact.php +++ b/desktop/php/interact.php @@ -121,7 +121,7 @@ -
- +
+ +
+
+
+ +
+
+
+ +
+
-
-
- -
-
-
- + - + - + -
-
-
-
+
+
+
+
+ +
+
+
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+
+ +
-
+
-
- -
- +
+
+ Accès interne + +
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
-
- -
-
-
- -
- -
-
-
- -
-
-
- Forcer la synchronisation de l'heure +
+ Accès externe +
+ +
+ +
-
-
-
-
-
-
- -
- -
-
-
-
- Accès interne - -
- -
- -
-
- -
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- Accès externe -
- -
- -
-
-
- -
- + +
+ '; } else { echo ''; } ?> -
-
-
- -
- -
-
-
- -
- +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
DNS Jeedom
- -
+ +
{{Toute modification nécessite de redémarrer le service DNS Jeedom (ligne "Gestion" puis "Redémarrer")}}
-
- -
+
+
+ +
+
- -
+ +
-
+
- -
+ +
- -
+ +
- - -
-
- -
-
+ + +
+
+
+
+ +
+
From c936d2be5ee4f6e251fb90a3128d4bea14349646 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 28 Apr 2015 10:27:05 +0200 Subject: [PATCH 061/110] Bugfix --- core/api/jeeApi.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/jeeApi.php b/core/api/jeeApi.php index 5c8edc4111..1ac69a3de9 100644 --- a/core/api/jeeApi.php +++ b/core/api/jeeApi.php @@ -490,7 +490,7 @@ 'jeedom::url' => config::byKey('jeedom::url'), 'ngrok::port' => config::byKey('ngrok::port'), ); - if (filter_var(network::getNetworkAccess('external', 'ip'), FILTER_VALIDATE_IP) || network::getNetworkAccess('external', 'ip') == '') { + if (!filter_var(network::getNetworkAccess('external', 'ip'), FILTER_VALIDATE_IP) && network::getNetworkAccess('external', 'ip') == '') { $return['jeedom::url'] = network::getNetworkAccess('internal'); } foreach (plugin::listPlugin(true) as $plugin) { From 9212def057f5c1476ec0e829170dc0878818132b Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 28 Apr 2015 10:29:42 +0200 Subject: [PATCH 062/110] Fix handshake --- core/api/jeeApi.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/api/jeeApi.php b/core/api/jeeApi.php index 1ac69a3de9..2fb0aab3fc 100644 --- a/core/api/jeeApi.php +++ b/core/api/jeeApi.php @@ -490,7 +490,7 @@ 'jeedom::url' => config::byKey('jeedom::url'), 'ngrok::port' => config::byKey('ngrok::port'), ); - if (!filter_var(network::getNetworkAccess('external', 'ip'), FILTER_VALIDATE_IP) && network::getNetworkAccess('external', 'ip') == '') { + if (!filter_var(network::getNetworkAccess('external', 'ip'), FILTER_VALIDATE_IP) && network::getNetworkAccess('external', 'ip') != '') { $return['jeedom::url'] = network::getNetworkAccess('internal'); } foreach (plugin::listPlugin(true) as $plugin) { From e1d07968730be54669acf4d2a56c7e3ba0bcbb3c Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 28 Apr 2015 15:53:15 +0200 Subject: [PATCH 063/110] Ajout refresh bouton --- desktop/modal/scenario.log.execution.php | 26 +++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/desktop/modal/scenario.log.execution.php b/desktop/modal/scenario.log.execution.php index 74236a00ff..b9210c3185 100644 --- a/desktop/modal/scenario.log.execution.php +++ b/desktop/modal/scenario.log.execution.php @@ -6,10 +6,12 @@ if (!is_object($scenario)) { throw new Exception(__('Aucun scénario correspondant à : ', __FILE__) . init('scenario_id')); } +sendVarToJs('scenarioLog_scenario_id', init('scenario_id')); ?> {{Vider les logs}} {{Télécharger}} + {{Rafraichir}}

+ {{Design}} + + = 0) { + if ($signalStrength > 80) { + echo '
  • '; + } else if ($signalStrength > 60) { + echo '
  • '; + } else if ($signalStrength > 40) { + echo '
  • '; + } else if ($signalStrength > 20) { + echo '
  • '; + } else if ($signalStrength > 0) { + echo '
  • '; + } else { + echo '
  • '; + } + } + + ?>
  • From b664d746aacb59855a000f183602e20fef859ab2 Mon Sep 17 00:00:00 2001 From: loic Date: Thu, 30 Apr 2015 18:51:28 +0200 Subject: [PATCH 077/110] Ajout icone pour indiquer le type de connexion --- core/class/network.class.php | 12 +++++------- desktop/php/index.php | 33 ++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index dc00a09450..e4173006a6 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -388,16 +388,14 @@ public static function canManageNetwork() { } public static function signalStrength() { - $cache = cache::byKey('network::signalStrength'); - if ($cache->getValue(-2) != -2) { - return $cache->getValue(-2); - } if (config::byKey('network::wifi::enable') != 1 || config::byKey('network::wifi::ssid') == '' || config::byKey('network::wifi::password') == '') { $return = -1; } - $return = str_replace('.', '', shell_exec("tail -n +3 /proc/net/wireless | awk '{ print $3 }'")); - cache::set('network::signalStrength', $return, 120); - return $return; + return str_replace('.', '', shell_exec("tail -n +3 /proc/net/wireless | awk '{ print $3 }'")); + } + + public static function ehtIsUp() { + return (trim(shell_exec("cat /sys/class/net/eth0/operstate")) == 'up') ? true : false; } public static function writeInterfaceFile() { diff --git a/desktop/php/index.php b/desktop/php/index.php index 53615f6975..f5e00b8615 100644 --- a/desktop/php/index.php +++ b/desktop/php/index.php @@ -390,23 +390,26 @@
  • = 0) { - if ($signalStrength > 80) { - echo '
  • '; - } else if ($signalStrength > 60) { - echo '
  • '; - } else if ($signalStrength > 40) { - echo '
  • '; - } else if ($signalStrength > 20) { - echo '
  • '; - } else if ($signalStrength > 0) { - echo '
  • '; - } else { - echo '
  • '; +if (network::ehtIsUp()) { + echo '
  • '; + } else { + $signalStrength = network::signalStrength(); + if ($signalStrength !== '' && $signalStrength >= 0) { + if ($signalStrength > 80) { + echo '
  • '; + } else if ($signalStrength > 60) { + echo '
  • '; + } else if ($signalStrength > 40) { + echo '
  • '; + } else if ($signalStrength > 20) { + echo '
  • '; + } else if ($signalStrength > 0) { + echo '
  • '; + } else { + echo '
  • '; + } } } - ?>
  • From f786cbcf39ada97a1bbabccf56d2a5e3a2e374af Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 2 May 2015 13:10:32 +0200 Subject: [PATCH 078/110] Fix defaut confidence --- core/config/default.config.ini | 2 +- install/install.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/config/default.config.ini b/core/config/default.config.ini index 36ce73fc7e..b5f2255822 100644 --- a/core/config/default.config.ini +++ b/core/config/default.config.ini @@ -83,4 +83,4 @@ eqLogic::widget::stepWidth = 40 eqLogic::widget::stepHeight = 80 ;interaction -interact::confidence = 30 \ No newline at end of file +interact::confidence = 15 \ No newline at end of file diff --git a/install/install.php b/install/install.php index 4815fbd1be..c5976cd6d5 100644 --- a/install/install.php +++ b/install/install.php @@ -373,6 +373,7 @@ } config::save('logLevel', $logLevel); echo "OK\n"; + } config::save('version', jeedom::version()); From 2bb03c5bbee985ba7736244a3e34bfe3bb26fbcb Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 2 May 2015 14:11:18 +0200 Subject: [PATCH 079/110] Improve display market --- desktop/modal/market.display.php | 38 +++++++++++++++++--------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/desktop/modal/market.display.php b/desktop/modal/market.display.php index fcedcde613..0dfe5a3fa5 100644 --- a/desktop/modal/market.display.php +++ b/desktop/modal/market.display.php @@ -307,9 +307,11 @@ $('.variable-width').slick({ dots: true, speed: 300, - variableWidth: true, accessibility: true, infinite: true, + lazyLoad: 'ondemand', + slidesToShow: 3, + slidesToScroll: 1 }); $('body').setValues(market_display_info, '.marketAttr'); @@ -328,21 +330,21 @@ $('.marketAttr[data-l1key=changelog]').html(html); var html = ''; for(var i in market_display_info.changelog.reverse()){ - html += '{{Version}} '+market_display_info.changelog[i].version+' - '+market_display_info.changelog[i].date+'
    '; - html += linkify(market_display_info.changelog[i].change); - html += '

    '; - } - $('#div_changelog').html(html); - } - $('.marketAttr[data-l1key=description]').html(linkify(market_display_info.description)); - $('.marketAttr[data-l1key=utilization]').html(linkify(market_display_info.utilization)); + html += '{{Version}} '+market_display_info.changelog[i].version+' - '+market_display_info.changelog[i].date+'
    '; + html += linkify(market_display_info.changelog[i].change); + html += '

    '; + } + $('#div_changelog').html(html); + } + $('.marketAttr[data-l1key=description]').html(linkify(market_display_info.description)); + $('.marketAttr[data-l1key=utilization]').html(linkify(market_display_info.utilization)); - $('#bt_paypalClick').on('click', function () { + $('#bt_paypalClick').on('click', function () { $(this).hide(); }); - $("#div_comments").dialog({ + $("#div_comments").dialog({ autoOpen: false, modal: true, height: (jQuery(window).height() - 300), @@ -355,7 +357,7 @@ } }); - $("#div_changelog").dialog({ + $("#div_changelog").dialog({ autoOpen: false, modal: true, height: (jQuery(window).height() - 300), @@ -368,17 +370,17 @@ } }); - $("#bt_viewCompleteChangelog").on('click',function(){ + $("#bt_viewCompleteChangelog").on('click',function(){ $('#div_changelog').dialog('open'); }); - $('#bt_viewComment').on('click', function () { + $('#bt_viewComment').on('click', function () { reloadMarketComment(); $('#div_comments').dialog('open'); }); - function reloadMarketComment() { + function reloadMarketComment() { $('#div_comments').load('index.php?v=d&modal=market.comment&id=' + $('.marketAttr[data-l1key=id]').value()); } @@ -421,9 +423,9 @@ function reloadMarketComment() { $('#in_myRating').on('change', function () { var id = $('.marketAttr[data-l1key=id]').value(); jeedom.market.setRating({ - id: id, - rating: $(this).val(), - error: function (error) { + id: id, + rating: $(this).val(), + error: function (error) { $('#div_alertMarketDisplay').showAlert({message: error.message, level: 'danger'}); } }); From 3e931bf4654972d3f8daf939a5f8a6b091b9421f Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 2 May 2015 14:18:04 +0200 Subject: [PATCH 080/110] Ajout info su consistency --- install/consistency.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/install/consistency.php b/install/consistency.php index 3cfaa4ad86..3b6888109c 100644 --- a/install/consistency.php +++ b/install/consistency.php @@ -49,6 +49,7 @@ $c->getNextRunDate(); } } catch (Exception $ex) { + echo "Suppression de : " . $cron->getName() . ' car pas de lancement prévu'; $cron->remove(); } } @@ -67,6 +68,7 @@ $cron = cron::byClassAndFunction('plugin', 'cronDaily'); if (!is_object($cron)) { + echo "Création de plugin::cronDaily\n"; $cron = new cron(); $cron->setClass('plugin'); $cron->setFunction('cronDaily'); @@ -77,6 +79,7 @@ $cron = cron::byClassAndFunction('plugin', 'cronHourly'); if (!is_object($cron)) { + echo "Création de plugin::cronHourly\n"; $cron = new cron(); $cron->setClass('plugin'); $cron->setFunction('cronHourly'); @@ -87,6 +90,7 @@ $cron = cron::byClassAndFunction('history', 'historize'); if (!is_object($cron)) { + echo "Création de history::historize\n"; $cron = new cron(); $cron->setClass('history'); $cron->setFunction('historize'); @@ -97,6 +101,7 @@ $cron = cron::byClassAndFunction('scenario', 'check'); if (!is_object($cron)) { + echo "Création de scenario::check\n"; $cron = new cron(); $cron->setClass('scenario'); $cron->setFunction('check'); @@ -107,6 +112,7 @@ $cron = cron::byClassAndFunction('cmd', 'collect'); if (!is_object($cron)) { + echo "Création de cmd::collect\n"; $cron = new cron(); $cron->setClass('cmd'); $cron->setFunction('collect'); @@ -117,6 +123,7 @@ $cron = cron::byClassAndFunction('history', 'archive'); if (!is_object($cron)) { + echo "Création de history::archive\n"; $cron = new cron(); $cron->setClass('history'); $cron->setFunction('archive'); @@ -127,6 +134,7 @@ $cron = cron::byClassAndFunction('jeedom', 'cron'); if (!is_object($cron)) { + echo "Création de jeedom::cron\n"; $cron = new cron(); $cron->setClass('jeedom'); $cron->setFunction('cron'); @@ -145,6 +153,7 @@ cache::deleteBySearch('cmdWidgetmobile'); cache::deleteBySearch('scenarioHtmldashboard'); } catch (Exception $e) { + echo "Error : "; echo $e->getMessage(); } echo "[END CONSISTENCY]\n"; From e6dbf8851664d0fec4bed9ca0f4ce889ac4c9390 Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 2 May 2015 15:01:30 +0200 Subject: [PATCH 081/110] Bugfix --- core/class/market.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/market.class.php b/core/class/market.class.php index 859b663d3d..e5ae9f95f9 100644 --- a/core/class/market.class.php +++ b/core/class/market.class.php @@ -446,7 +446,7 @@ public static function postJsonRpc(&$_result) { public static function getInfo($_logicalId, $_version = 'stable') { $returns = array(); if (is_array($_logicalId) && is_array($_version) && count($_logicalId) == count($_version)) { - if (count($_logicalId) > 1 && is_array(reset($_logicalId))) { + if (is_array(reset($_logicalId))) { $markets = market::byLogicalIdAndType($_logicalId); } else { $markets = market::byLogicalId($_logicalId); From 6b04488bdaeb5bc465db6765187971e8264ffef2 Mon Sep 17 00:00:00 2001 From: Loic Date: Sat, 2 May 2015 16:44:44 +0200 Subject: [PATCH 082/110] Some improvement --- desktop/js/scenario.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/desktop/js/scenario.js b/desktop/js/scenario.js index 66b6d611f5..e799d3e5b4 100644 --- a/desktop/js/scenario.js +++ b/desktop/js/scenario.js @@ -497,10 +497,14 @@ $('body').delegate('.bt_selectCmdExpression', 'click', function (event) { callback: function () { var condition = result.human; condition += ' ' + $('.conditionAttr[data-l1key=operator]').value(); - condition += ' ' + $('.conditionAttr[data-l1key=operande]').value(); - condition += ' ' + $('.conditionAttr[data-l1key=next]').value()+' '; - expression.find('.expressionAttr[data-l1key=expression]').atCaret('insert', condition); - if($('.conditionAttr[data-l1key=next]').value() != ''){ + if(result.cmd.subType == 'string'){ + condition += ' "' + $('.conditionAttr[data-l1key=operande]').value()+'"'; + }else{ + condition += ' ' + $('.conditionAttr[data-l1key=operande]').value(); + } + condition += ' ' + $('.conditionAttr[data-l1key=next]').value()+' '; + expression.find('.expressionAttr[data-l1key=expression]').atCaret('insert', condition); + if($('.conditionAttr[data-l1key=next]').value() != ''){ el.click(); } } @@ -509,7 +513,7 @@ $('body').delegate('.bt_selectCmdExpression', 'click', function (event) { }); - } +} }); }); From 01e3df38d530cf7dde71354561b2646931ed03ef Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 09:36:32 +0200 Subject: [PATCH 083/110] Improve time format fonction --- core/class/scenarioExpression.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/class/scenarioExpression.class.php b/core/class/scenarioExpression.class.php index c7c08c8f93..71aee455f9 100644 --- a/core/class/scenarioExpression.class.php +++ b/core/class/scenarioExpression.class.php @@ -460,8 +460,10 @@ public static function formatTime($_time) { $_time = self::setTags($_time); if (strlen($_time) > 3) { return substr($_time, 0, 2) . 'h' . substr($_time, 2, 2); - } else { + } else if (strlen($_time) > 3) { return substr($_time, 0, 1) . 'h' . substr($_time, 1, 2); + } else { + return '00h' . substr($_time, 0, 2); } } From dcff3a4bd4553c165f212956b0c63eb3437845bd Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 11:16:56 +0200 Subject: [PATCH 084/110] Improve message --- core/ajax/message.ajax.php | 76 ++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/core/ajax/message.ajax.php b/core/ajax/message.ajax.php index 337eb7b3b4..2acaa27b5a 100644 --- a/core/ajax/message.ajax.php +++ b/core/ajax/message.ajax.php @@ -17,42 +17,46 @@ */ try { - require_once(dirname(__FILE__) . '/../../core/php/core.inc.php'); - include_file('core', 'authentification', 'php'); - - if (!isConnect()) { - throw new Exception(__('401 - Accès non autorisé', __FILE__)); - } - - if (init('action') == 'clearMessage') { - message::removeAll(init('plugin')); - ajax::success(); - } - - if (init('action') == 'nbMessage') { - ajax::success(message::nbMessage()); - } - - if (init('action') == 'all') { - if (init('plugin') == '') { - ajax::success(utils::o2a(message::all())); - } else { - ajax::success(utils::o2a(message::byPlugin(init('plugin')))); - } - } - - if (init('action') == 'removeMessage') { - $message = message::byId(init('id')); - if (!is_object($message)) { - throw new Exception(__('Message inconnu verifié l\'id', __FILE__)); - } - $message->remove(); - ajax::success(); - } - - throw new Exception(__('Aucune methode correspondante à : ', __FILE__) . init('action')); - /* * *********Catch exeption*************** */ + require_once dirname(__FILE__) . '/../../core/php/core.inc.php'; + include_file('core', 'authentification', 'php'); + + if (!isConnect()) { + throw new Exception(__('401 - Accès non autorisé', __FILE__)); + } + + if (init('action') == 'clearMessage') { + message::removeAll(init('plugin')); + ajax::success(); + } + + if (init('action') == 'nbMessage') { + ajax::success(message::nbMessage()); + } + + if (init('action') == 'all') { + if (init('plugin') == '') { + $messages = utils::o2a(message::all()); + } else { + $messages = utils::o2a(message::byPlugin(init('plugin'))); + } + foreach ($messages as &$message) { + $message['message'] = htmlentities($message['message']); + } + ajax::success($messages); + } + + if (init('action') == 'removeMessage') { + $message = message::byId(init('id')); + if (!is_object($message)) { + throw new Exception(__('Message inconnu verifié l\'id', __FILE__)); + } + $message->remove(); + ajax::success(); + } + + throw new Exception(__('Aucune methode correspondante à : ', __FILE__) . init('action')); + /* * *********Catch exeption*************** */ } catch (Exception $e) { - ajax::error(displayExeption($e), $e->getCode()); + ajax::error(displayExeption($e), $e->getCode()); } ?> From c538c7bc6218f427cfa91db2e5756eb69313be2e Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 11:22:18 +0200 Subject: [PATCH 085/110] Improve sick --- core/class/jeedom.class.php | 4 + sick.php | 384 ++++++++++++++++++------------------ 2 files changed, 197 insertions(+), 191 deletions(-) diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index 80f3fcf4f4..a762d78bd9 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -275,6 +275,10 @@ private static function checkValueInconfiguration($_key, $_value) { } } + public static function hasSudo() { + return (trim(exec('sudo cat /etc/sudoers')) == "") ? true : false; + } + public static function whatDoYouKnow($_object = null) { $result = array(); if (is_object($_object)) { diff --git a/sick.php b/sick.php index a48ee71565..b89a411250 100644 --- a/sick.php +++ b/sick.php @@ -1,191 +1,193 @@ -404 Not Found"; - echo "The page that you have requested could not be found."; - exit(); -} -echo "==================================================\n"; -echo "| JEEDOM SICK SCRIPT ".date('Y-m-d H:i:s')." |"; -echo "\n==================================================\n"; - -echo "\n**************************************************\n"; -echo "* VARIABLES *"; -echo "\n**************************************************\n"; -$install_dir = dirname(__FILE__); -$processUser = posix_getpwuid(posix_geteuid()); -echo "Install dir : " . $install_dir . "\n"; -echo "User : " . $processUser['name'] . "\n"; - - -echo "\n**************************************************\n"; -echo "* DIRECTORIES *"; -echo "\n**************************************************\n"; -echo "Load Jeedom environement..."; -try { - require_once dirname(__FILE__) . "/core/php/core.inc.php"; - echo "OK\n"; -} catch (Exeption $e) { - echo "ERREUR\n"; - echo "Unable to load jeedom environement : " . $e->getMessage(); - echo "\n"; - die(); -} - -/* Check tmp dir */ -echo "Check if tmp is wirtable..."; -if (!file_exists($install_dir . '/tmp')) { - echo "not found\n"; - echo "Do : mkdir " . $install_dir . "/tmp\n"; - die(); -} -if (!is_writable($install_dir . '/tmp')) { - echo "not writable\n"; - echo "Do : chown -R " . $processUser['name'] . ' ' . $install_dir . "/tmp\n"; - die(); -} -echo "OK\n"; - - -/* Check log dir */ -echo "Check if log is wirtable..."; -if (!file_exists($install_dir . '/log')) { - echo "not found\n"; - echo "Do : mkdir " . $install_dir . "/log\n"; - die(); -} -if (!is_writable($install_dir . '/log')) { - echo "not writable\n"; - echo "Do : chown -R " . $processUser['name'] . ' ' . $install_dir . "/log\n"; - die(); -} -echo "OK\n"; - - -echo "\n**************************************************\n"; -echo "* USERS *"; -echo "\n**************************************************\n"; -try { - $foundAdmin = false; - foreach (user::all() as $user) { - echo $user->getLogin(); - echo " => "; - if ($user->getRights('admin') == 1) { - $foundAdmin = true; - echo " Admin\n"; - } else { - echo " Regular\n"; - } - } - - if (!$foundAdmin) { - echo "No admin user found, create it..."; - $user = new user(); - $user->setLogin('admin'); - $user->setPassword(sha1('admin')); - $user->setRights('admin', 1); - $user->save(); - echo "OK (admin/admin)\n"; - } -} catch (Exeption $e) { - echo "ERREUR\n"; - echo "Description : " . $e->getMessage(); - echo "\n"; - die(); -} - -echo "\n**************************************************\n"; -echo "* CRON *"; -echo "\n**************************************************\n"; -echo "Check last cron launch..."; -if (!cron::ok()) { - echo "NOK\n"; -} else { - echo "OK\n"; -} -echo "Check if cron is enable..."; -if (config::byKey('enableCron', 'core', 1, true) == 0) { - echo "NOK\n"; -} else { - echo "OK\n"; -} -echo "Check if scenario is enable..."; -if (config::byKey('enableScenario') == 0) { - echo "NOK\n"; -} else { - echo "OK\n"; -} -echo "\n"; -echo "NAME | STATE | SCHEDULE | DEAMON | ONCE | LAST RUN\n"; -foreach (cron::all() as $cron) { - echo $cron->getName(); - echo " | "; - echo $cron->getState(); - echo " | "; - echo $cron->getSchedule(); - echo " | "; - echo $cron->getDeamon(); - echo " | "; - echo $cron->getOnce(); - echo " | "; - echo $cron->getLastRun(); - echo "\n"; -} - -echo "\n**************************************************\n"; -echo "* DATE *"; -echo "\n**************************************************\n"; -echo "Check if Jeedom date's is good..."; -if (jeedom::isDateOk()) { - echo "OK"; -} else { - echo "NOK"; -} -$cache = cache::byKey('jeedom::lastDate'); -echo " (" . $cache->getValue() . ")\n"; - -echo "\n**************************************************\n"; -echo "* MESSAGE *"; -echo "\n**************************************************\n"; -echo "DATE | PLUGIN | LOGICALID | MESSAGE\n"; -foreach (message::all() as $message) { - echo $message->getDate(); - echo " | "; - echo $message->getPlugin(); - echo " | "; - echo $message->getLogicalId(); - echo " | "; - echo $message->getMessage(); - echo "\n"; -} - -echo "\n**************************************************\n"; -echo "* PLUGIN *"; -echo "\n**************************************************\n"; -echo "ID | NAME | STATE\n"; -foreach (plugin::listPlugin() as $plugin) { - echo $plugin->getId(); - echo " | "; - echo $plugin->getName(); - echo " | "; - echo $plugin->isActive(); - echo "\n"; -} - -foreach (plugin::listPlugin() as $plugin) { - if (method_exists($plugin->getId(), 'sick')) { - echo "\n**************************************************\n"; - echo "* SICK " . $plugin->getId() . " *"; - echo "\n**************************************************\n"; - $plugin_id = $plugin->getId(); - $plugin_id::sick(); - } -} - -echo "\n\n"; -echo "\n==================================================\n"; -echo "| ALL CHECKS COMPLET |"; -echo "\n==================================================\n"; +404 Not Found"; + echo "The page that you have requested could not be found."; + exit(); +} +echo "==================================================\n"; +echo "| JEEDOM SICK SCRIPT " . date('Y-m-d H:i:s') . " |"; +echo "\n==================================================\n"; + +echo "\n**************************************************\n"; +echo "* VARIABLES *"; +echo "\n**************************************************\n"; +$install_dir = dirname(__FILE__); +$processUser = posix_getpwuid(posix_geteuid()); +echo "Install dir : " . $install_dir . "\n"; +echo "User : " . $processUser['name'] . "\n"; +if (trim(exec('sudo cat /etc/sudoers')) != "") { + echo "Sudo : YES\n"; +} else { + echo "Sudo : NO\n"; +} + +echo "\n**************************************************\n"; +echo "* DIRECTORIES *"; +echo "\n**************************************************\n"; +echo "Load Jeedom environement..."; +try { + require_once dirname(__FILE__) . "/core/php/core.inc.php"; + echo "OK\n"; +} catch (Exeption $e) { + echo "ERREUR\n"; + echo "Unable to load jeedom environement : " . $e->getMessage(); + echo "\n"; + die(); +} + +/* Check tmp dir */ +echo "Check if tmp is wirtable..."; +if (!file_exists($install_dir . '/tmp')) { + echo "not found\n"; + echo "Do : mkdir " . $install_dir . "/tmp\n"; + die(); +} +if (!is_writable($install_dir . '/tmp')) { + echo "not writable\n"; + echo "Do : chown -R " . $processUser['name'] . ' ' . $install_dir . "/tmp\n"; + die(); +} +echo "OK\n"; + +/* Check log dir */ +echo "Check if log is wirtable..."; +if (!file_exists($install_dir . '/log')) { + echo "not found\n"; + echo "Do : mkdir " . $install_dir . "/log\n"; + die(); +} +if (!is_writable($install_dir . '/log')) { + echo "not writable\n"; + echo "Do : chown -R " . $processUser['name'] . ' ' . $install_dir . "/log\n"; + die(); +} +echo "OK\n"; + +echo "\n**************************************************\n"; +echo "* USERS *"; +echo "\n**************************************************\n"; +try { + $foundAdmin = false; + foreach (user::all() as $user) { + echo $user->getLogin(); + echo " => "; + if ($user->getRights('admin') == 1) { + $foundAdmin = true; + echo " Admin\n"; + } else { + echo " Regular\n"; + } + } + + if (!$foundAdmin) { + echo "No admin user found, create it..."; + $user = new user(); + $user->setLogin('admin'); + $user->setPassword(sha1('admin')); + $user->setRights('admin', 1); + $user->save(); + echo "OK (admin/admin)\n"; + } +} catch (Exeption $e) { + echo "ERREUR\n"; + echo "Description : " . $e->getMessage(); + echo "\n"; + die(); +} + +echo "\n**************************************************\n"; +echo "* CRON *"; +echo "\n**************************************************\n"; +echo "Check last cron launch..."; +if (!cron::ok()) { + echo "NOK\n"; +} else { + echo "OK\n"; +} +echo "Check if cron is enable..."; +if (config::byKey('enableCron', 'core', 1, true) == 0) { + echo "NOK\n"; +} else { + echo "OK\n"; +} +echo "Check if scenario is enable..."; +if (config::byKey('enableScenario') == 0) { + echo "NOK\n"; +} else { + echo "OK\n"; +} +echo "\n"; +echo "NAME | STATE | SCHEDULE | DEAMON | ONCE | LAST RUN\n"; +foreach (cron::all() as $cron) { + echo $cron->getName(); + echo " | "; + echo $cron->getState(); + echo " | "; + echo $cron->getSchedule(); + echo " | "; + echo $cron->getDeamon(); + echo " | "; + echo $cron->getOnce(); + echo " | "; + echo $cron->getLastRun(); + echo "\n"; +} + +echo "\n**************************************************\n"; +echo "* DATE *"; +echo "\n**************************************************\n"; +echo "Check if Jeedom date's is good..."; +if (jeedom::isDateOk()) { + echo "OK"; +} else { + echo "NOK"; +} +$cache = cache::byKey('jeedom::lastDate'); +echo " (" . $cache->getValue() . ")\n"; + +echo "\n**************************************************\n"; +echo "* MESSAGE *"; +echo "\n**************************************************\n"; +echo "DATE | PLUGIN | LOGICALID | MESSAGE\n"; +foreach (message::all() as $message) { + echo $message->getDate(); + echo " | "; + echo $message->getPlugin(); + echo " | "; + echo $message->getLogicalId(); + echo " | "; + echo $message->getMessage(); + echo "\n"; +} + +echo "\n**************************************************\n"; +echo "* PLUGIN *"; +echo "\n**************************************************\n"; +echo "ID | NAME | STATE\n"; +foreach (plugin::listPlugin() as $plugin) { + echo $plugin->getId(); + echo " | "; + echo $plugin->getName(); + echo " | "; + echo $plugin->isActive(); + echo "\n"; +} + +foreach (plugin::listPlugin() as $plugin) { + if (method_exists($plugin->getId(), 'sick')) { + echo "\n**************************************************\n"; + echo "* SICK " . $plugin->getId() . " *"; + echo "\n**************************************************\n"; + $plugin_id = $plugin->getId(); + $plugin_id::sick(); + } +} + +echo "\n\n"; +echo "\n==================================================\n"; +echo "| ALL CHECKS COMPLET |"; +echo "\n==================================================\n"; From 8f9389ea272fca2e3a39c60b7d3047c57008c59a Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 11:34:24 +0200 Subject: [PATCH 086/110] Improvement --- core/js/cmd.class.js | 1 - core/js/eqLogic.class.js | 1 - 2 files changed, 2 deletions(-) diff --git a/core/js/cmd.class.js b/core/js/cmd.class.js index 73d6166735..b24f3d08e7 100644 --- a/core/js/cmd.class.js +++ b/core/js/cmd.class.js @@ -496,7 +496,6 @@ jeedom.cmd.changeSubType = function(_cmd) { } } else { for (var j in subtype[i]) { - var el = _cmd.find('.cmdAttr[data-l1key=' + i + '][data-l2key=' + j + ']'); if (el.attr('type') == 'checkbox' && el.parent().is('span')) { el = el.parent(); diff --git a/core/js/eqLogic.class.js b/core/js/eqLogic.class.js index 21ed805e8c..7a0cf8865a 100644 --- a/core/js/eqLogic.class.js +++ b/core/js/eqLogic.class.js @@ -217,7 +217,6 @@ jeedom.eqLogic.builSelectCmd = function (_params) { jeedom.eqLogic.getCmd({ id: _params.id, async: false, - noCache: true, success: function (cmds) { var result = ''; for (var i in cmds) { From d04e455e8063e7960f09c9762162e5b5d03b26f3 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 14:14:52 +0200 Subject: [PATCH 087/110] Improvement --- core/class/network.class.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index e4173006a6..1375461831 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -104,10 +104,8 @@ public static function getNetworkAccess($_mode = 'auto', $_protocole = '', $_def } return config::byKey('externalProtocol'); } - if (config::byKey('jeedom::url') != '') { - if (config::byKey('jeedom::url') != '') { - return config::byKey('jeedom::url'); - } + if (config::byKey('market::allowDNS') == 1 && config::byKey('jeedom::url') != '') { + return config::byKey('jeedom::url'); } return config::byKey('externalProtocol') . config::byKey('externalAddr') . ':' . config::byKey('externalPort', 'core', 80) . config::byKey('externalComplement'); } From d6f5ec249c6914bc5ba238c5def79f831831913e Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 14:56:47 +0200 Subject: [PATCH 088/110] Improvement --- core/js/plugin.template.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/js/plugin.template.js b/core/js/plugin.template.js index d42176fce4..308260f23a 100644 --- a/core/js/plugin.template.js +++ b/core/js/plugin.template.js @@ -67,6 +67,7 @@ $('.eqLogicAction[data-action=returnToThumbnailDisplay]').on('click', function ( }); $(".li_eqLogic").on('click', function () { +jeedom.eqLogic.cache.getCmd = Array(); if ($('.eqLogicThumbnailDisplay').html() != undefined) { $('.eqLogicThumbnailDisplay').hide(); } From 6c87d4d67505f07fe04cbef9ed042c24df87c470 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 15:00:06 +0200 Subject: [PATCH 089/110] Improvement --- core/js/market.class.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/js/market.class.js b/core/js/market.class.js index c61d71a99a..59a96dcec8 100644 --- a/core/js/market.class.js +++ b/core/js/market.class.js @@ -22,6 +22,10 @@ jeedom.market = function() { jeedom.market.byLogicalId = function (_params) { var paramsRequired = ['logicalId']; + if( _params.logicalId == '' ){ + _params.success({}); + return; + } var paramsSpecifics = { global: _params.global || true, }; From 0766b28e0dd692e0a7838073c5eb3dbe51516750 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 15:02:45 +0200 Subject: [PATCH 090/110] Fix --- core/class/scenarioExpression.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/scenarioExpression.class.php b/core/class/scenarioExpression.class.php index 71aee455f9..ecc786c631 100644 --- a/core/class/scenarioExpression.class.php +++ b/core/class/scenarioExpression.class.php @@ -460,7 +460,7 @@ public static function formatTime($_time) { $_time = self::setTags($_time); if (strlen($_time) > 3) { return substr($_time, 0, 2) . 'h' . substr($_time, 2, 2); - } else if (strlen($_time) > 3) { + } else if (strlen($_time) > 2) { return substr($_time, 0, 1) . 'h' . substr($_time, 1, 2); } else { return '00h' . substr($_time, 0, 2); From f7dc855a3bfb3610bf65f63cb5c2211659c4c93d Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 15:17:40 +0200 Subject: [PATCH 091/110] Some improvement --- core/class/jeedom.class.php | 8 ++++++-- core/js/jeedom.class.js | 27 ++++++++++++++++++++------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index a762d78bd9..4c3116032a 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -234,7 +234,11 @@ public static function update($_mode = '', $_level = -1, $_system = 'no') { exec($cmd); } - public static function getConfiguration($_key, $_default = false) { + public static function getConfiguration($_key = '', $_default = false) { + global $JEEDOM_INTERNAL_CONFIG; + if ($_key == '') { + return $JEEDOM_INTERNAL_CONFIG; + } if (!is_array(self::$jeedomConfiguration)) { self::$jeedomConfiguration = array(); } @@ -242,7 +246,7 @@ public static function getConfiguration($_key, $_default = false) { return self::$jeedomConfiguration[$_key]; } $keys = explode(':', $_key); - global $JEEDOM_INTERNAL_CONFIG; + $result = $JEEDOM_INTERNAL_CONFIG; foreach ($keys as $key) { if (isset($result[$key])) { diff --git a/core/js/jeedom.class.js b/core/js/jeedom.class.js index b863f8ba64..84635b6b65 100644 --- a/core/js/jeedom.class.js +++ b/core/js/jeedom.class.js @@ -23,7 +23,7 @@ jeedom.display = {}; if (!isset(jeedom.cache.getConfiguration)) { - jeedom.cache.getConfiguration = Array(); + jeedom.cache.getConfiguration = null; } @@ -81,7 +81,7 @@ jeedom.init = function () { }); socket.on('jeedom::gotoplan', function (_plan_id) { if(getUrlVars('p') == 'plan' && 'function' == typeof (displayPlan)){ - if (_plan_id != $('#sel_planHeader').attr('data-link_id')) { + if (_plan_id != $('#sel_planHeader').attr('data-link_id')) { planHeader_id = _plan_id; displayPlan(); } @@ -140,7 +140,14 @@ jeedom.getConfiguration = function (_params) { var paramsRequired = ['key']; var paramsSpecifics = { pre_success: function (data) { - jeedom.cache.getConfiguration[_params.key] = data.result; + jeedom.cache.getConfiguration = data.result; + var keys = _params.key.split(':'); + data.result = jeedom.cache.getConfiguration; + for(var i in keys){ + if (data.result[keys[i]]) { + data.result = data.result[keys[i]]; + } + } return data; } }; @@ -151,16 +158,22 @@ jeedom.getConfiguration = function (_params) { return; } var params = $.extend({}, jeedom.private.default_params, paramsSpecifics, _params || {}); - if (isset(jeedom.cache.getConfiguration[params.key])) { - _params.success(jeedom.cache.getConfiguration[params.key]); + if (jeedom.cache.getConfiguration != null) { + var keys = _params.key.split(':'); + var result = jeedom.cache.getConfiguration; + for(var i in keys){ + if (result[keys[i]]) { + result = result[keys[i]]; + } + } + _params.success(result); return; } var paramsAJAX = jeedom.private.getParamsAJAX(params); paramsAJAX.url = 'core/ajax/jeedom.ajax.php'; paramsAJAX.data = { action: 'getConfiguration', - key: _params.key, - default: init(_params.default, 0) + key: '' }; $.ajax(paramsAJAX); }; From a8984a0d21f7c9acf0b3ecafd86ce7cd54b91a49 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 15:20:14 +0200 Subject: [PATCH 092/110] Improvement --- core/js/eqLogic.class.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/js/eqLogic.class.js b/core/js/eqLogic.class.js index 7a0cf8865a..b918708df1 100644 --- a/core/js/eqLogic.class.js +++ b/core/js/eqLogic.class.js @@ -114,7 +114,12 @@ jeedom.eqLogic.copy = function (_params) { jeedom.eqLogic.print = function (_params) { var paramsRequired = ['id', 'type']; - var paramsSpecifics = {}; + var paramsSpecifics = { + pre_success: function (data) { + jeedom.eqLogic.cache.getCmd[_params.id] = data.result.cmd; + return data; + } + }; try { jeedom.private.checkParamsRequired(_params || {}, paramsRequired); } catch (e) { From c11f35436a8980a149b43f804f31eb69c04cc363 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 16:12:32 +0200 Subject: [PATCH 093/110] Force ntp update if date is not o --- core/class/jeedom.class.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index 4c3116032a..c718a3cbdf 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -350,6 +350,14 @@ public static function isDateOk() { if (file_exists('/tmp/jeedom_dateOk')) { return true; } + if (strtotime('now') < strtotime('2015-01-01 00:00:00') || strtotime('now') > strtotime('2019-01-01 00:00:00')) { + shell_exec('sudo sntp 0.debian.pool.ntp.org'); + sleep(1); + } + if (strtotime('now') < strtotime('2015-01-01 00:00:00') || strtotime('now') > strtotime('2019-01-01 00:00:00')) { + shell_exec('sudo sntp 1.debian.pool.ntp.org'); + sleep(1); + } if (strtotime('now') < strtotime('2015-01-01 00:00:00') || strtotime('now') > strtotime('2019-01-01 00:00:00')) { log::add('core', 'error', __('La date du système est incorrect (avant 2014-01-01 ou après 2019-01-01) : ', __FILE__) . date('Y-m-d H:i:s'), 'dateCheckFailed'); return false; From a1501e2c29e02b8946afbf3512f8bdc6d4499137 Mon Sep 17 00:00:00 2001 From: Loic Date: Sun, 3 May 2015 17:33:19 +0200 Subject: [PATCH 094/110] User can configure ntp server --- core/class/jeedom.class.php | 4 ++-- desktop/php/administration.php | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index c718a3cbdf..566fd96ee1 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -351,11 +351,11 @@ public static function isDateOk() { return true; } if (strtotime('now') < strtotime('2015-01-01 00:00:00') || strtotime('now') > strtotime('2019-01-01 00:00:00')) { - shell_exec('sudo sntp 0.debian.pool.ntp.org'); + shell_exec('sudo sntp ' . config::byKey('ntp::optionalServer', 'core', '0.debian.pool.ntp.org')); sleep(1); } if (strtotime('now') < strtotime('2015-01-01 00:00:00') || strtotime('now') > strtotime('2019-01-01 00:00:00')) { - shell_exec('sudo sntp 1.debian.pool.ntp.org'); + shell_exec('sudo sntp 1.debian.pool.ntp.org'); sleep(1); } if (strtotime('now') < strtotime('2015-01-01 00:00:00') || strtotime('now') > strtotime('2019-01-01 00:00:00')) { diff --git a/desktop/php/administration.php b/desktop/php/administration.php index 4d4dabc3b9..e956c82fd1 100644 --- a/desktop/php/administration.php +++ b/desktop/php/administration.php @@ -173,7 +173,12 @@ Forcer la synchronisation de l'heure
  • - Autres +
    + +
    + +
    +
    From 0b8cebf6b9ac942d3f8bc7bbfe462ba1810cdd43 Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 4 May 2015 09:47:35 +0200 Subject: [PATCH 095/110] Add favicon --- favicon.ico | Bin 116133 -> 7094 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/favicon.ico b/favicon.ico index 4df1fcd208279dc84d783206b29e39d4dcfa108b..358afc0855cccb1966b41f373ef4beb3c947acf3 100644 GIT binary patch literal 7094 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 literal 116133 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�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%0DO{!MQR!CkDkR}yxrB~`U# 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 z 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 FV1mgB&HMlW From a14ef00c1186a1c247e432b3584ba546bc564a40 Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 4 May 2015 10:06:02 +0200 Subject: [PATCH 096/110] Add more lo --- core/class/cron.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/class/cron.class.php b/core/class/cron.class.php index 05dcc3cd1b..eb783eb6c7 100644 --- a/core/class/cron.class.php +++ b/core/class/cron.class.php @@ -384,13 +384,13 @@ public function isDue() { } $prev = $c->getPreviousRunDate(); - $lastCheck = new DateTime($this->getLastRun()); - $diff = round(abs((strtotime('now') - $prev->getTimestamp()) / 60)); - if ($lastCheck < $prev && $diff <= config::byKey('maxCatchAllow') || config::byKey('maxCatchAllow') == -1) { + $prev = $prev->getTimestamp(); + $diff = abs((strtotime('now') - $prev) / 60); + if (strtotime($this->getLastRun()) < $prev && ($diff <= config::byKey('maxCatchAllow') || config::byKey('maxCatchAllow') == -1)) { return true; } } catch (Exception $e) { - + log::add('cron', 'debug', 'Error on isDue : ' . $e->getMessage()); } return false; } From 9c89ae172d2541f0b53b6edf6da231147bf80f3a Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 4 May 2015 10:46:30 +0200 Subject: [PATCH 097/110] Improvement --- core/class/cron.class.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/class/cron.class.php b/core/class/cron.class.php index eb783eb6c7..468c5110bd 100644 --- a/core/class/cron.class.php +++ b/core/class/cron.class.php @@ -383,8 +383,7 @@ public function isDue() { } catch (Exception $e) { } - $prev = $c->getPreviousRunDate(); - $prev = $prev->getTimestamp(); + $prev = $c->getPreviousRunDate()->getTimestamp(); $diff = abs((strtotime('now') - $prev) / 60); if (strtotime($this->getLastRun()) < $prev && ($diff <= config::byKey('maxCatchAllow') || config::byKey('maxCatchAllow') == -1)) { return true; From fa5d6702ac7bb5e8c02b79d4d2a7d8fc0a77d4e5 Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 4 May 2015 10:52:45 +0200 Subject: [PATCH 098/110] Improvement --- core/config/default.config.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/config/default.config.ini b/core/config/default.config.ini index b5f2255822..7d9e92d773 100644 --- a/core/config/default.config.ini +++ b/core/config/default.config.ini @@ -48,7 +48,7 @@ update::auto = 0 ;Cron deamonsSleepTime = 1 maxExecTimeCrontask = 60 -maxCatchAllow = 10 +maxCatchAllow = 30 ;backup backup::keepDays = 3 From ddd343a63febd77ff8015c0d7bf9a593c46189c2 Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 4 May 2015 15:16:27 +0200 Subject: [PATCH 099/110] Bugfix --- desktop/php/message.php | 96 ++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/desktop/php/message.php b/desktop/php/message.php index 904265f831..17b0af4b2a 100644 --- a/desktop/php/message.php +++ b/desktop/php/message.php @@ -1,48 +1,48 @@ - - {{Vider}} - - - - - - - - - - getId() . '">'; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - } - ?> - -
    {{Date et heure}}{{Plugin}}{{Description}}{{Action}}
    ' . $message->getDate() . '' . $message->getPlugin() . '' . $message->getMessage() . '' . $message->getAction() . '
    - - + + {{Vider}} + + + + + + + + + + getId() . '">'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; +} +?> + +
    {{Date et heure}}{{Plugin}}{{Description}}{{Action}}
    ' . $message->getDate() . '' . $message->getPlugin() . '' . htmlentities($message->getMessage()) . '' . $message->getAction() . '
    + + From 7a3b279ab7e6dbd7f35cc18ab8182626c671be2b Mon Sep 17 00:00:00 2001 From: loic Date: Mon, 4 May 2015 17:12:55 +0200 Subject: [PATCH 100/110] Update responsivevoice --- 3rdparty/responsivevoices/responsivevoices.js | 1228 ++++++++++------- 1 file changed, 737 insertions(+), 491 deletions(-) diff --git a/3rdparty/responsivevoices/responsivevoices.js b/3rdparty/responsivevoices/responsivevoices.js index 6e36071c35..b8953e54af 100644 --- a/3rdparty/responsivevoices/responsivevoices.js +++ b/3rdparty/responsivevoices/responsivevoices.js @@ -1,492 +1,738 @@ -var ResponsiveVoice = function(){ - - var self = this; - - - // Ourn own collection of voices - var responsivevoices = [ - {name: 'UK English Female', voiceIDs: [3,5,1,6,7,8] }, - {name: 'UK English Male', voiceIDs: [0,4,2,6,7,8] }, - {name: 'US English Female', voiceIDs: [39,40,41,42,43,44] }, - {name: 'Spanish Female', voiceIDs: [19,16,17,18,20,15] }, - {name: 'French Female', voiceIDs: [21,22,23,26] }, - {name: 'Deutsch Female', voiceIDs: [27,28,29,30,31,32] }, - {name: 'Italian Female', voiceIDs: [33,34,35,36,37,38] }, - {name: 'Hungarian Female', voiceIDs: [9,10,11] }, - {name: 'Serbian Male', voiceIDs: [12] }, - {name: 'Croatian Male', voiceIDs: [13] }, - {name: 'Bosnian Male', voiceIDs: [14] }, - {name: 'Fallback UK Female', voiceIDs: [8] } - - ]; - - //All voices available on every system and device - var voicecollection = [ - {name: 'Google UK English Male'}, //0 male uk android/chrome - {name: 'Agnes'}, //1 female us safari mac - {name: 'Daniel Compact'}, //2 male us safari mac - {name: 'Google UK English Female'}, //3 female uk android/chrome - {name: 'en-GB', rate: 0.5, pitch: 1}, //4 male uk IOS - {name: 'en-AU', rate: 0.5, pitch: 1}, //5 female english IOS - {name: 'inglés Reino Unido'}, //6 spanish english android - {name: 'English United Kingdom'}, //7 english english android - {name: 'Fallback en-GB Female', lang: 'en-GB', fallbackvoice: true}, //8 fallback english female - {name: 'Eszter Compact'}, //9 Hungarian mac - {name: 'hu-HU', rate: 0.4}, //10 Hungarian iOS - {name: 'Fallback Hungarian', lang: 'hu', fallbackvoice:true}, //11 Hungarian fallback - {name: 'Fallback Serbian', lang: 'sr', fallbackvoice:true}, //12 Serbian fallback - {name: 'Fallback Croatian', lang: 'hr', fallbackvoice:true}, //13 Croatian fallback - {name: 'Fallback Bosnian', lang: 'bs', fallbackvoice:true}, //14 Bosnian fallback - - {name: 'Fallback Spanish', lang: 'es', fallbackvoice:true}, //15 Spanish fallback - {name: 'Spanish Spain'}, //16 female es android/chrome - {name: 'español España'}, //17 female es android/chrome - {name: 'Diego Compact', rate: 0.3}, //18 male es mac - {name: 'Google Español'}, //19 male es chrome - {name: 'es-ES', rate: 0.3}, //20 male es iOS - - {name: 'Google Français'}, //21 FR chrome - {name: 'French France'}, //22 android/chrome - {name: 'francés Francia'}, //23 android/chrome - {name: 'Virginie Compact', rate: 0.5}, //24 mac - {name: 'fr-FR', rate: 0.5}, //25 iOS - {name: 'Fallback French', lang: 'fr', fallbackvoice:true}, //26 fallback - - {name: 'Google Deutsch'}, //27 DE chrome - {name: 'German Germany'}, //28 android/chrome - {name: 'alemán Alemania'}, //29 android/chrome - {name: 'Yannick Compact', rate: 0.5}, //30 mac - {name: 'de-DE', rate: 0.5}, //31 iOS - {name: 'Fallback Deutsch', lang: 'de', fallbackvoice:true}, //32 fallback - - {name: 'Google Italiano'}, //33 DE chrome - {name: 'Italian Italy'}, //34 android/chrome - {name: 'italiano Italia'}, //35 android/chrome - {name: 'Paolo Compact', rate: 0.5}, //36 mac - {name: 'it-IT', rate: 0.5}, //37 iOS - {name: 'Fallback Italian', lang: 'it', fallbackvoice:true}, //38 fallback - - {name: 'Google US English'}, //39 DE chrome - {name: 'English United States'}, //40 android/chrome - {name: 'inglés Estados Unidos'}, //41 android/chrome - {name: 'Vicki'}, //42 mac - {name: 'en-US', rate: 0.5}, //43 iOS - {name: 'Fallback English', lang: 'en-US', fallbackvoice:true}, //44 fallback - - ]; - - var systemvoices; - - var CHARACTER_LIMIT = 100; - var VOICESUPPORT_ATTEMPTLIMIT = 5; - var voicesupport_attempts = 0; - var fallbackMode = false; - - this.fallback_playing = false; - this.fallback_parts = null; - this.fallback_part_index = 0; - this.fallback_audio = null; - - //Wait until system voices are ready and trigger the event OnVoiceReady - if (typeof speechSynthesis != 'undefined') { - speechSynthesis.onvoiceschanged = function() { - - systemvoices = window.speechSynthesis.getVoices(); - - if (self.OnVoiceReady!=null) { - self.OnVoiceReady.call(); - } - }; - } - - this.default_rv = responsivevoices[0]; - - - - this.OnVoiceReady = null; - - - //We should use jQuery if it's available - if (typeof $ === 'undefined') { - document.addEventListener('DOMContentLoaded',function(){ - init(); - }); - }else{ - - $(document).ready(function() { - init(); - }); - } - - function init() { - - - if (typeof speechSynthesis === 'undefined') { - - enableFallbackMode(); - - } else { - - - //Waiting a few ms before calling getVoices() fixes some issues with safari on IOS as well as Chrome - setTimeout(function(){ - var gsvinterval = setInterval(function() { - - var v = window.speechSynthesis.getVoices(); - - if (v.length==0 && (systemvoices==null || systemvoices.length==0)) { - console.log('Voice support NOT ready'); - - voicesupport_attempts++; - if (voicesupport_attempts > VOICESUPPORT_ATTEMPTLIMIT) { - //We don't support voices. Using fallback - - clearInterval(gsvinterval); - - enableFallbackMode(); - } - - }else{ - - console.log('Voice support ready'); - - clearInterval(gsvinterval); - - systemvoices = v; - - mapRVs(); - - if (self.OnVoiceReady!=null) - self.OnVoiceReady.call(); - - } - - },100); - },100); - } - } - - function enableFallbackMode() { - - fallbackMode = true; - console.log('Voice not supported. Using fallback mode'); - - mapRVs(); - - if (self.OnVoiceReady!=null) - self.OnVoiceReady.call(); - - - } - - - this.getVoices = function() { - - //Create voices array - - var v = []; - - for (var i=0; iCHARACTER_LIMIT) { - - var tmptxt = text; - - while(tmptxt.length>CHARACTER_LIMIT) { - - //Split by common phrase delimiters - var p = tmptxt.search(/[:!?.;]+/); - var part = ''; - - //Coludn't split by priority characters, try commas - if (p==-1 || p>=CHARACTER_LIMIT ) { - p = tmptxt.search(/[,]+/); - } - - //Couldn't split by normal characters, then we use spaces - if (p==-1 || p>=CHARACTER_LIMIT) { - - var words = tmptxt.split(' '); - - for (var i=0; iCHARACTER_LIMIT) - break; - - part += (i!=0?' ':'') + words[i]; - - } - - } else { - - part = tmptxt.substr(0, p+1); - - } - - tmptxt = tmptxt.substr(part.length, tmptxt.length-part.length); - - multipartText.push(part); - //console.log(part.length + " - " + part); - - } - - //Add the remaining text - if (tmptxt.length>0) { - multipartText.push(tmptxt); - } - - }else{ - - //Small text - multipartText.push(text); - } - - - //Find system voice that matches voice name - var rv; - - if (voicename==null) { - rv = self.default_rv; - }else{ - rv = getResponsiveVoice(voicename); - } - - var profile = {}; - - - - - //Map was done so no need to look for the mapped voice - if (rv.mappedProfile!=null) { - - profile = rv.mappedProfile; - - }else{ - - profile.systemvoice = getMatchedVoice(rv); - profile.collectionvoice = {}; - - if (profile.systemvoice==null) { - console.log('ERROR: No voice found for: ' + voicename); - return; - } - } - - - if (profile.collectionvoice.fallbackvoice==true) { - fallbackMode = true; - self.fallback_parts = []; - }else{ - fallbackMode = false; - } - - - //Play multipart text - for (var i=0; i VOICESUPPORT_ATTEMPTLIMIT) { + + clearInterval(gsvinterval); + + //On IOS, sometimes getVoices is just empty, but speech works. So we use a cached voice collection. + if (window.speechSynthesis != null) { + + if (self.iOS) { + + console.log('RV: Voice support ready (cached)'); + self.systemVoicesReady(cache_ios_voices); + + }else{ + + console.log("RV: speechSynthesis present but no system voices found"); + self.enableFallbackMode(); + } + + } else { + + //We don't support voices. Using fallback + self.enableFallbackMode(); + } + } + + } else { + + console.log('RV: Voice support ready'); + self.systemVoicesReady(v); + + clearInterval(gsvinterval); + + } + + }, 100); + }, 100); + } + + self.Dispatch("OnLoad"); + } + + self.systemVoicesReady = function(v) { + systemvoices = v; + + self.mapRVs(); + + if (self.OnVoiceReady != null) + self.OnVoiceReady.call(); + } + + self.enableFallbackMode = function() { + + fallbackMode = true; + console.log('RV: Enabling fallback mode'); + + self.mapRVs(); + + if (self.OnVoiceReady != null) + self.OnVoiceReady.call(); + + + } + + + self.getVoices = function () { + + //Create voices array + + var v = []; + + for (var i = 0; i < responsivevoices.length; i++) { + v.push({name: responsivevoices[i].name}); + } + + return v; + + } + + + self.speak = function (text, voicename, parameters) { + + self.msgparameters = parameters || {}; + self.msgtext = text; + self.msgvoicename = voicename; + + //Support for multipart text (there is a limit on characters) + var multipartText = []; + + if (text.length > CHARACTER_LIMIT) { + + var tmptxt = text; + + while (tmptxt.length > CHARACTER_LIMIT) { + + //Split by common phrase delimiters + var p = tmptxt.search(/[:!?.;]+/); + var part = ''; + + //Coludn't split by priority characters, try commas + if (p == -1 || p >= CHARACTER_LIMIT) { + p = tmptxt.search(/[,]+/); + } + + //Couldn't split by normal characters, then we use spaces + if (p == -1 || p >= CHARACTER_LIMIT) { + + var words = tmptxt.split(' '); + + for (var i = 0; i < words.length; i++) { + + if (part.length + words[i].length + 1 > CHARACTER_LIMIT) + break; + + part += (i != 0 ? ' ' : '') + words[i]; + + } + + } else { + + part = tmptxt.substr(0, p + 1); + + } + + tmptxt = tmptxt.substr(part.length, tmptxt.length - part.length); + + multipartText.push(part); + //console.log(part.length + " - " + part); + + } + + //Add the remaining text + if (tmptxt.length > 0) { + multipartText.push(tmptxt); + } + + } else { + + //Small text + multipartText.push(text); + } + + + //Find system voice that matches voice name + var rv; + + if (voicename == null) { + rv = self.default_rv; + } else { + rv = self.getResponsiveVoice(voicename); + } + + var profile = {}; + + + + + //Map was done so no need to look for the mapped voice + if (rv.mappedProfile != null) { + + profile = rv.mappedProfile; + + } else { + + profile.systemvoice = self.getMatchedVoice(rv); + profile.collectionvoice = {}; + + if (profile.systemvoice == null) { + console.log('RV: ERROR: No voice found for: ' + voicename); + return; + } + } + + + if (profile.collectionvoice.fallbackvoice == true) { + fallbackMode = true; + self.fallback_parts = []; + } else { + fallbackMode = false; + } + + self.msgprofile = profile; + //console.log("Start multipart play"); + + //Play multipart text + for (var i = 0; i < multipartText.length; i++) { + + if (!fallbackMode) { + //Use SpeechSynthesis + + //Create msg object + var msg = new SpeechSynthesisUtterance(); + msg.voice = profile.systemvoice; + msg.voiceURI = profile.systemvoice.voiceURI; + msg.volume = profile.collectionvoice.volume || profile.systemvoice.volume || 1; // 0 to 1 + msg.rate = profile.collectionvoice.rate || profile.systemvoice.rate || 1; // 0.1 to 10 + msg.pitch = profile.collectionvoice.pitch || profile.systemvoice.pitch || 1; //0 to 2*/ + msg.text = multipartText[i]; + msg.lang = profile.collectionvoice.lang || profile.systemvoice.lang; + msg.rvIndex = i; + msg.rvTotal = multipartText.length; + + if (i == 0) { + msg.onstart = self.speech_onstart; + } + self.msgparameters.onendcalled = false; + + if (parameters != null) { + + + + if (i < multipartText.length - 1 && multipartText.length > 1) { + msg.onend = parameters.onchunkend; + msg.addEventListener('end',parameters.onchuckend); + } else { + msg.onend = self.speech_onend; + msg.addEventListener('end',self.speech_onend); + } + + + + msg.onerror = parameters.onerror || function (e) { + console.log('RV: Error'); + console.log(e); + }; + + msg.onpause = parameters.onpause; + msg.onresume = parameters.onresume; + msg.onmark = parameters.onmark; + msg.onboundary = parameters.onboundary; + } else { + msg.onend = self.speech_onend; + msg.onerror = function (e) { + console.log('RV: Error'); + console.log(e); + }; + } + //console.log(JSON.stringify(msg)); + speechSynthesis.speak(msg); + + } else { + + //var url = 'http://www.corsproxy.com/translate.google.com/translate_tts?ie=UTF-8&q=' + multipartText[i] + '&tl=' + profile.collectionvoice.lang || profile.systemvoice.lang || 'en-US'; + var url = 'http://responsivevoice.org/responsivevoice/getvoice.php?t=' + multipartText[i]+ '&tl=' + profile.collectionvoice.lang || profile.systemvoice.lang || 'en-US'; + var audio = document.createElement("AUDIO"); + audio.src = url; + audio.playbackRate = 1; + audio.preload = 'auto'; + audio.volume = profile.collectionvoice.volume || profile.systemvoice.volume || 1; // 0 to 1; + self.fallback_parts.push(audio); + //console.log(audio); + + + } + + + } + + if (fallbackMode) { + + + self.fallback_part_index = 0; + self.fallback_startPart(); + + } + + } + + self.startTimeout = function (text, callback) { + + //if (self.iOS) { + // multiplier = 0.5; + //} + + var multiplier = self.msgprofile.collectionvoice.timerSpeed; + if (self.msgprofile.collectionvoice.timerSpeed==null) + multiplier = 1; + + //console.log(self.msgprofile.collectionvoice.name); + if (multiplier <=0) + return; + + self.timeoutId = setTimeout(callback, multiplier * 1000 * (60 / WORDS_PER_MINUTE) * text.split(/\s+/).length); //avg 140 words per minute read time + //console.log("Timeout " + self.timeoutId + " started: " + (multiplier * 1000 * (60 / WORDS_PER_MINUTE) * text.split(/\s+/).length).toString()); + } + + self.checkAndCancelTimeout = function () { + if (self.timeoutId != null) { + //console.log("Timeout " + self.timeoutId + " cancelled"); + clearTimeout(self.timeoutId); + self.timeoutId = null; + } + } + + self.speech_timedout = function() { + //console.log("Speech cancelled: Timeout " + self.timeoutId + " ended"); + self.cancel(); + //if (!self.iOS) //On iOS, cancel calls msg.onend + self.speech_onend(); + + } + + self.speech_onend = function () { + self.checkAndCancelTimeout(); + + //Avoid this being automatically called just after calling speechSynthesis.cancel + if (self.cancelled === true) { + self.cancelled = false; + return; + } + + //console.log("on end fired"); + if (self.msgparameters != null && self.msgparameters.onend != null && self.msgparameters.onendcalled!=true) { + //console.log("Speech on end called -" + self.msgtext); + self.msgparameters.onendcalled=true; + self.msgparameters.onend(); + + } + + } + + self.speech_onstart = function () { + //if (!self.iOS) + //console.log("Speech start"); + if (self.iOS) + self.startTimeout(self.msgtext,self.speech_timedout); + + self.msgparameters.onendcalled=false; + if (self.msgparameters != null && self.msgparameters.onstart != null) { + self.msgparameters.onstart(); + } + + } + + + + self.fallback_startPart = function () { + + if (self.fallback_part_index == 0) { + self.speech_onstart(); + } + + self.fallback_audio = self.fallback_parts[self.fallback_part_index]; + + if (self.fallback_audio == null) { + + //Fallback audio is not working. Just wait for the timeout event + console.log("RV: Fallback Audio is not available"); + + } else { + + self.fallback_audio.play(); + self.fallback_audio.addEventListener('ended', self.fallback_finishPart); + } + } + + self.fallback_finishPart = function (e) { + + self.checkAndCancelTimeout(); + + if (self.fallback_part_index < self.fallback_parts.length - 1) { + //console.log('chunk ended'); + self.fallback_part_index++; + self.fallback_startPart(); + + } else { + //console.log('msg ended'); + self.speech_onend(); + + } + + } + + + self.cancel = function () { + + self.checkAndCancelTimeout(); + + if (fallbackMode){ + if (self.fallback_audio!=null) + self.fallback_audio.pause(); + }else{ + self.cancelled = true; + speechSynthesis.cancel(); + + } + } + + + self.voiceSupport = function () { + + return ('speechSynthesis' in window); + + } + + self.OnFinishedPlaying = function (event) { + //console.log("OnFinishedPlaying"); + if (self.msgparameters != null) { + if (self.msgparameters.onend != null) + self.msgparameters.onend(); + } + + } + + //Set default voice to use when no voice name is supplied to speak() + self.setDefaultVoice = function (voicename) { + + var vr = self.getResponsiveVoice(voicename); + + if (vr != null) { + self.default_vr = vr; + } + + } + + //Map responsivevoices to system voices + self.mapRVs = function() { + + for (var i = 0; i < responsivevoices.length; i++) { + + var rv = responsivevoices[i]; + + for (var j = 0; j < rv.voiceIDs.length; j++) { + + var vcoll = voicecollection[rv.voiceIDs[j]]; + + if (vcoll.fallbackvoice != true) { // vcoll.fallbackvoice would be null instead of false + + // Look on system voices + var v = self.getSystemVoice(vcoll.name); + if (v != null) { + rv.mappedProfile = { + systemvoice: v, + collectionvoice: vcoll + }; + //console.log("Mapped " + rv.name + " to " + v.name); + break; + } + + } else { + + //Pick the fallback voice + rv.mappedProfile = { + systemvoice: {}, + collectionvoice: vcoll + }; + //console.log("Mapped " + rv.name + " to " + vcoll.lang + " fallback voice"); + break; + + } + } + } + + + } + + + //Look for the voice in the system that matches the one in our collection + self.getMatchedVoice = function(rv) { + + for (var i = 0; i < rv.voiceIDs.length; i++) { + var v = self.getSystemVoice(voicecollection[rv.voiceIDs[i]].name); + if (v != null) + return v; + } + + return null; + + } + + self.getSystemVoice = function(name) { + + if (typeof systemvoices === 'undefined') + return null; + + for (var i = 0; i < systemvoices.length; i++) { + if (systemvoices[i].name == name) + return systemvoices[i]; + } + + return null; + + } + + self.getResponsiveVoice = function(name) { + + for (var i = 0; i < responsivevoices.length; i++) { + if (responsivevoices[i].name == name) { + return responsivevoices[i]; + } + } + + return null; + + } + + self.Dispatch = function(name) { + + if (self.hasOwnProperty(name + "_callbacks") && + self[name + "_callbacks"].length > 0) { + var callbacks = self[name + "_callbacks"]; + for(var i=0; i Date: Tue, 5 May 2015 09:40:47 +0200 Subject: [PATCH 101/110] Improvement --- core/class/network.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 1375461831..a75b165e99 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -528,7 +528,7 @@ public static function cron() { } $filepath = '/etc/network/interfaces'; - if (config::byKey('network::failedNumber', 'core', 0) == 3 && file_exists($filepath . '.save')) { + if (config::byKey('network::failedNumber', 'core', 0) == 6 && file_exists($filepath . '.save')) { log::add('network', 'error', __('Aucune gateway trouvée depuis plus de 30min. Remise par defaut du fichier interface', __FILE__)); exec('sudo cp ' . $filepath . '.save ' . $filepath . '; sudo rm ' . $filepath . '.save '); //jeedom::rebootSystem(); From 6eb8a278a04b1945ff944a69d5bd357099ff6f93 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 09:41:49 +0200 Subject: [PATCH 102/110] Improvement --- core/class/network.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index a75b165e99..6a0259dc2f 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -528,7 +528,7 @@ public static function cron() { } $filepath = '/etc/network/interfaces'; - if (config::byKey('network::failedNumber', 'core', 0) == 6 && file_exists($filepath . '.save')) { + if (config::byKey('network::failedNumber', 'core', 0) == 3 && file_exists($filepath . '.save') && self::ehtIsUp()) { log::add('network', 'error', __('Aucune gateway trouvée depuis plus de 30min. Remise par defaut du fichier interface', __FILE__)); exec('sudo cp ' . $filepath . '.save ' . $filepath . '; sudo rm ' . $filepath . '.save '); //jeedom::rebootSystem(); From 3d10d59c39b96dd92b9c9013ebe1a97eb1dc5373 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 09:42:38 +0200 Subject: [PATCH 103/110] Fi --- core/class/network.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/network.class.php b/core/class/network.class.php index 6a0259dc2f..cabeb50b2e 100644 --- a/core/class/network.class.php +++ b/core/class/network.class.php @@ -528,7 +528,7 @@ public static function cron() { } $filepath = '/etc/network/interfaces'; - if (config::byKey('network::failedNumber', 'core', 0) == 3 && file_exists($filepath . '.save') && self::ehtIsUp()) { + if (config::byKey('network::failedNumber', 'core', 0) > 2 && file_exists($filepath . '.save') && self::ehtIsUp()) { log::add('network', 'error', __('Aucune gateway trouvée depuis plus de 30min. Remise par defaut du fichier interface', __FILE__)); exec('sudo cp ' . $filepath . '.save ' . $filepath . '; sudo rm ' . $filepath . '.save '); //jeedom::rebootSystem(); From ed0604d87da1d2605cb014d963fec04fdf46420f Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 10:04:43 +0200 Subject: [PATCH 104/110] Add specifique task for backup --- core/class/jeedom.class.php | 10 ---------- core/config/default.config.ini | 7 ++----- desktop/php/backup.php | 11 ----------- install/consistency.php | 11 +++++++++++ 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/core/class/jeedom.class.php b/core/class/jeedom.class.php index 566fd96ee1..e3a91f10fd 100644 --- a/core/class/jeedom.class.php +++ b/core/class/jeedom.class.php @@ -460,16 +460,6 @@ public static function cron() { } catch (Exception $e) { } - try { - $c = new Cron\CronExpression(config::byKey('backup::cron'), new Cron\FieldFactory); - if ($c->isDue()) { - log::add('backup_launch', 'debug', 'Lancement du backup automatiquement'); - jeedom::backup(); - } - } catch (Exception $e) { - log::add('backup', 'error', 'Auto backup error : ' . $e->getMessage()); - } - try { $c = new Cron\CronExpression('35 00 * * 0', new Cron\FieldFactory); if ($c->isDue()) { diff --git a/core/config/default.config.ini b/core/config/default.config.ini index 7d9e92d773..f52deb823b 100644 --- a/core/config/default.config.ini +++ b/core/config/default.config.ini @@ -26,10 +26,6 @@ maxLineLog = 500 ;Equipement numberOfTryBeforeEqLogicDisable = 3 -;Cron -cronSleepTime = 1 -enableCron = 1 - ;collect deamonsSleepTime = 1 @@ -49,11 +45,12 @@ update::auto = 0 deamonsSleepTime = 1 maxExecTimeCrontask = 60 maxCatchAllow = 30 +cronSleepTime = 1 +enableCron = 1 ;backup backup::keepDays = 3 backup::path = backup -backup::cron = 00 02 * * * backup::maxSize = 200 ;market diff --git a/desktop/php/backup.php b/desktop/php/backup.php index 93253f7e3a..2cb6b7ad30 100644 --- a/desktop/php/backup.php +++ b/desktop/php/backup.php @@ -9,17 +9,6 @@ {{Sauvegardes}}
    -
    -
    - -
    - -
    -
    - -
    -
    -
    diff --git a/install/consistency.php b/install/consistency.php index 3b6888109c..9d4317fc86 100644 --- a/install/consistency.php +++ b/install/consistency.php @@ -77,6 +77,17 @@ $cron->save(); } + $cron = cron::byClassAndFunction('jeedom', 'backup'); + if (!is_object($cron)) { + echo "Création de jeedom::backup\n"; + $cron = new cron(); + $cron->setClass('jeedom'); + $cron->setFunction('backup'); + $cron->setSchedule('00 02 * * *'); + $cron->setTimeout(60); + $cron->save(); + } + $cron = cron::byClassAndFunction('plugin', 'cronHourly'); if (!is_object($cron)) { echo "Création de plugin::cronHourly\n"; From 2c910aa328c17c97756d75536d5e2a1d520d2f54 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 10:05:25 +0200 Subject: [PATCH 105/110] Add more log --- core/class/cron.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/cron.class.php b/core/class/cron.class.php index 468c5110bd..f71829cfd3 100644 --- a/core/class/cron.class.php +++ b/core/class/cron.class.php @@ -389,7 +389,7 @@ public function isDue() { return true; } } catch (Exception $e) { - log::add('cron', 'debug', 'Error on isDue : ' . $e->getMessage()); + log::add('cron', 'debug', 'Error on isDue : ' . $e->getMessage() . ', cron : ' . $this->getSchedule()); } return false; } From 95e22c451632156d9a5208740efa08e8648e1e63 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 10:13:29 +0200 Subject: [PATCH 106/110] bugfix --- core/class/scenario.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/class/scenario.class.php b/core/class/scenario.class.php index 2676fcdf32..89aae85ed9 100644 --- a/core/class/scenario.class.php +++ b/core/class/scenario.class.php @@ -567,11 +567,11 @@ public function execute($_trigger = '', $_message = '') { log::add('event', 'event', __('Exécution du scénario ', __FILE__) . $this->getHumanName() . __(' déclenché par : ', __FILE__) . $_trigger); } $this->setLog(__('Début d\'exécution du scénario : ', __FILE__) . $this->getHumanName() . '. ' . $_message); + $this->setLastLaunch(date('Y-m-d H:i:s')); if ($this->getConfiguration('speedPriority', 0) == 0) { $this->setDisplay('icon', ''); $this->setState('in progress'); $this->setPID(getmypid()); - $this->setLastLaunch(date('Y-m-d H:i:s')); $this->save(); } $this->setRealTrigger($_trigger); @@ -581,10 +581,10 @@ public function execute($_trigger = '', $_message = '') { if ($this->getConfiguration('speedPriority', 0) == 0) { $this->setState('stop'); $this->setPID(''); - $this->save(); } $this->setLog(__('Fin correcte du scénario', __FILE__)); $this->persistLog(); + $this->save(); if ($this->getReturn() != '') { return $this->getReturn(); } From f0bb43c9d2dc029ce8f568570af367572f7382ea Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 10:25:29 +0200 Subject: [PATCH 107/110] Replace sqlbuddy by adminer --- adminer2986dsfez893qs2df/index.php | 818 +++++++++++ core/class/jeedom.class.php | 10 +- desktop/php/administration.php | 2 +- install/backup.php | 2 +- install/install.php | 9 +- sqlbuddy2986dsfez893qs2df/LICENSE | 19 - sqlbuddy2986dsfez893qs2df/README | 51 - sqlbuddy2986dsfez893qs2df/ajaxcreatetable.php | 37 - sqlbuddy2986dsfez893qs2df/ajaxfulltext.php | 64 - sqlbuddy2986dsfez893qs2df/ajaximportfile.php | 170 --- sqlbuddy2986dsfez893qs2df/ajaxquery.php | 37 - .../ajaxsavecolumnedit.php | 38 - sqlbuddy2986dsfez893qs2df/ajaxsaveedit.php | 128 -- .../ajaxsaveuseredit.php | 130 -- sqlbuddy2986dsfez893qs2df/browse.php | 70 - sqlbuddy2986dsfez893qs2df/config.php | 64 - sqlbuddy2986dsfez893qs2df/css/common.css | 888 ------------ sqlbuddy2986dsfez893qs2df/css/navigation.css | 94 -- sqlbuddy2986dsfez893qs2df/css/print.css | 27 - sqlbuddy2986dsfez893qs2df/dboverview.php | 577 -------- sqlbuddy2986dsfez893qs2df/edit.php | 210 --- sqlbuddy2986dsfez893qs2df/editcolumn.php | 189 --- sqlbuddy2986dsfez893qs2df/edituser.php | 254 ---- sqlbuddy2986dsfez893qs2df/export.php | 677 --------- sqlbuddy2986dsfez893qs2df/functions.php | 568 -------- sqlbuddy2986dsfez893qs2df/home.php | 311 ----- sqlbuddy2986dsfez893qs2df/images/button.png | Bin 428 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/close.png | Bin 528 -> 0 bytes .../images/closeHover.png | Bin 532 -> 0 bytes .../images/closedArrow.png | Bin 247 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/goto.png | Bin 316 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/info.png | Bin 252 -> 0 bytes .../images/infoHover.png | Bin 374 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/initLoad.png | Bin 5029 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/loading.gif | Bin 673 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/logo.png | Bin 2249 -> 0 bytes .../images/openArrow.png | Bin 244 -> 0 bytes .../images/schemaHeader.png | Bin 158 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/sortasc.gif | Bin 112 -> 0 bytes sqlbuddy2986dsfez893qs2df/images/sortdesc.gif | Bin 111 -> 0 bytes .../images/transparent.png | Bin 148 -> 0 bytes .../images/window-button.png | Bin 284 -> 0 bytes .../images/window-center.png | Bin 128 -> 0 bytes .../images/window-close.png | Bin 346 -> 0 bytes .../images/window-header-center.png | Bin 165 -> 0 bytes .../images/window-header-left.png | Bin 383 -> 0 bytes .../images/window-header-right.png | Bin 422 -> 0 bytes .../images/window-resize.png | Bin 185 -> 0 bytes .../images/window-shadow-bottom-left.png | Bin 302 -> 0 bytes .../images/window-shadow-bottom-right.png | Bin 330 -> 0 bytes .../images/window-shadow-bottom.png | Bin 169 -> 0 bytes .../images/window-shadow-left.png | Bin 148 -> 0 bytes .../images/window-shadow-right.png | Bin 151 -> 0 bytes sqlbuddy2986dsfez893qs2df/import.php | 88 -- sqlbuddy2986dsfez893qs2df/includes/browse.php | 402 ------ .../includes/class/GetTextReader.php | 78 -- .../includes/class/Sql-php4.php | 424 ------ .../includes/class/Sql.php | 495 ------- sqlbuddy2986dsfez893qs2df/includes/types.php | 80 -- sqlbuddy2986dsfez893qs2df/index.php | 22 - sqlbuddy2986dsfez893qs2df/insert.php | 249 ---- sqlbuddy2986dsfez893qs2df/js/core.js | 839 ----------- sqlbuddy2986dsfez893qs2df/js/helpers.js | 1240 ----------------- .../js/mootools-1.2-core.js | 242 ---- sqlbuddy2986dsfez893qs2df/js/movement.js | 206 --- sqlbuddy2986dsfez893qs2df/locale/ar_DZ.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/bg_BG.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/bn_BD.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/ca_AD.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/cs_CZ.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/da_DK.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/de_DE.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/el_GR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/en_US.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/eo_EO.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/es_AR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/es_ES.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/et_EE.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/fa_IR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/fi_FI.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/fr_FR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/gl_ES.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/he_IL.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/hr_HR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/hu_HU.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/id_ID.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/it_IT.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/ja_JP.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/ko_KR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/lo_LA.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/lt_LT.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/lv_LV.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/ms_ID.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/nl_NL.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/no_NO.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/pl_PL.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/pt_BR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/pt_PT.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/ro_RO.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/ru_RU.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/sk_SK.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/sl_SL.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/sp_RS.pot | 668 --------- sqlbuddy2986dsfez893qs2df/locale/sq_AL.pot | 668 --------- sqlbuddy2986dsfez893qs2df/locale/sr_RS.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/sv_SE.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/th_TH.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/tl_PH.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/tr_TR.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/uk_UA.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/vi_VN.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/zh_CN.pot | 667 --------- sqlbuddy2986dsfez893qs2df/locale/zh_TW.pot | 667 --------- sqlbuddy2986dsfez893qs2df/login.php | 267 ---- sqlbuddy2986dsfez893qs2df/logout.php | 41 - sqlbuddy2986dsfez893qs2df/query.php | 78 -- sqlbuddy2986dsfez893qs2df/serve.php | 116 -- sqlbuddy2986dsfez893qs2df/structure.php | 775 ----------- .../themes/bittersweet/css/ie.css | 44 - .../themes/bittersweet/css/main.css | 155 --- .../themes/bittersweet/images/header.png | Bin 170 -> 0 bytes .../bittersweet/images/initLoad-dark.png | Bin 4389 -> 0 bytes .../themes/classic/css/ie.css | 31 - .../themes/classic/css/main.css | 111 -- .../themes/classic/images/corner-bl.png | Bin 160 -> 0 bytes .../themes/classic/images/corner-br.png | Bin 158 -> 0 bytes .../themes/classic/images/corner-tl.png | Bin 153 -> 0 bytes .../themes/classic/images/corner-tr.png | Bin 158 -> 0 bytes .../themes/classic/images/header.png | Bin 195 -> 0 bytes .../themes/classic/images/shading.png | Bin 3638 -> 0 bytes sqlbuddy2986dsfez893qs2df/users.php | 440 ------ 131 files changed, 831 insertions(+), 43054 deletions(-) create mode 100644 adminer2986dsfez893qs2df/index.php delete mode 100644 sqlbuddy2986dsfez893qs2df/LICENSE delete mode 100644 sqlbuddy2986dsfez893qs2df/README delete mode 100644 sqlbuddy2986dsfez893qs2df/ajaxcreatetable.php delete mode 100644 sqlbuddy2986dsfez893qs2df/ajaxfulltext.php delete mode 100644 sqlbuddy2986dsfez893qs2df/ajaximportfile.php delete mode 100644 sqlbuddy2986dsfez893qs2df/ajaxquery.php delete mode 100644 sqlbuddy2986dsfez893qs2df/ajaxsavecolumnedit.php delete mode 100644 sqlbuddy2986dsfez893qs2df/ajaxsaveedit.php delete mode 100644 sqlbuddy2986dsfez893qs2df/ajaxsaveuseredit.php delete mode 100644 sqlbuddy2986dsfez893qs2df/browse.php delete mode 100644 sqlbuddy2986dsfez893qs2df/config.php delete mode 100644 sqlbuddy2986dsfez893qs2df/css/common.css delete mode 100644 sqlbuddy2986dsfez893qs2df/css/navigation.css delete mode 100644 sqlbuddy2986dsfez893qs2df/css/print.css delete mode 100644 sqlbuddy2986dsfez893qs2df/dboverview.php delete mode 100644 sqlbuddy2986dsfez893qs2df/edit.php delete mode 100644 sqlbuddy2986dsfez893qs2df/editcolumn.php delete mode 100644 sqlbuddy2986dsfez893qs2df/edituser.php delete mode 100644 sqlbuddy2986dsfez893qs2df/export.php delete mode 100644 sqlbuddy2986dsfez893qs2df/functions.php delete mode 100644 sqlbuddy2986dsfez893qs2df/home.php delete mode 100644 sqlbuddy2986dsfez893qs2df/images/button.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/close.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/closeHover.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/closedArrow.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/goto.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/info.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/infoHover.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/initLoad.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/loading.gif delete mode 100644 sqlbuddy2986dsfez893qs2df/images/logo.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/openArrow.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/schemaHeader.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/sortasc.gif delete mode 100644 sqlbuddy2986dsfez893qs2df/images/sortdesc.gif delete mode 100644 sqlbuddy2986dsfez893qs2df/images/transparent.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-button.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-center.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-close.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-header-center.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-header-left.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-header-right.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-resize.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-shadow-bottom-left.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-shadow-bottom-right.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-shadow-bottom.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-shadow-left.png delete mode 100644 sqlbuddy2986dsfez893qs2df/images/window-shadow-right.png delete mode 100644 sqlbuddy2986dsfez893qs2df/import.php delete mode 100644 sqlbuddy2986dsfez893qs2df/includes/browse.php delete mode 100644 sqlbuddy2986dsfez893qs2df/includes/class/GetTextReader.php delete mode 100644 sqlbuddy2986dsfez893qs2df/includes/class/Sql-php4.php delete mode 100644 sqlbuddy2986dsfez893qs2df/includes/class/Sql.php delete mode 100644 sqlbuddy2986dsfez893qs2df/includes/types.php delete mode 100644 sqlbuddy2986dsfez893qs2df/index.php delete mode 100644 sqlbuddy2986dsfez893qs2df/insert.php delete mode 100644 sqlbuddy2986dsfez893qs2df/js/core.js delete mode 100644 sqlbuddy2986dsfez893qs2df/js/helpers.js delete mode 100644 sqlbuddy2986dsfez893qs2df/js/mootools-1.2-core.js delete mode 100644 sqlbuddy2986dsfez893qs2df/js/movement.js delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/ar_DZ.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/bg_BG.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/bn_BD.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/ca_AD.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/cs_CZ.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/da_DK.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/de_DE.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/el_GR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/en_US.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/eo_EO.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/es_AR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/es_ES.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/et_EE.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/fa_IR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/fi_FI.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/fr_FR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/gl_ES.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/he_IL.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/hr_HR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/hu_HU.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/id_ID.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/it_IT.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/ja_JP.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/ko_KR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/lo_LA.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/lt_LT.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/lv_LV.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/ms_ID.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/nl_NL.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/no_NO.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/pl_PL.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/pt_BR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/pt_PT.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/ro_RO.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/ru_RU.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/sk_SK.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/sl_SL.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/sp_RS.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/sq_AL.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/sr_RS.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/sv_SE.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/th_TH.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/tl_PH.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/tr_TR.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/uk_UA.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/vi_VN.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/zh_CN.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/locale/zh_TW.pot delete mode 100644 sqlbuddy2986dsfez893qs2df/login.php delete mode 100644 sqlbuddy2986dsfez893qs2df/logout.php delete mode 100644 sqlbuddy2986dsfez893qs2df/query.php delete mode 100644 sqlbuddy2986dsfez893qs2df/serve.php delete mode 100644 sqlbuddy2986dsfez893qs2df/structure.php delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/ie.css delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/main.css delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/bittersweet/images/header.png delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/bittersweet/images/initLoad-dark.png delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/css/ie.css delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/css/main.css delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-bl.png delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-br.png delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-tl.png delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-tr.png delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/images/header.png delete mode 100644 sqlbuddy2986dsfez893qs2df/themes/classic/images/shading.png delete mode 100644 sqlbuddy2986dsfez893qs2df/users.php diff --git a/adminer2986dsfez893qs2df/index.php b/adminer2986dsfez893qs2df/index.php new file mode 100644 index 0000000000..910103f363 --- /dev/null +++ b/adminer2986dsfez893qs2df/index.php @@ -0,0 +1,818 @@ +S8LJt.M ϋ`'C889 Q2#8А6mjh<9/:J)ʂ\0d>!\0Zvno(k7s> !R\"*nS\0@P\"(#[@g ozn9k8n1I* =n0c(;à!*c>ΎE7DLJ1J=1L?s=#`3\$4uȱzGC YAt?;Qk&YPuǯ}UaHV%G;slڴIH3xw0t6%MR%jhB<\0AQ-ʈ QH\nvL+væ<\rv\\*Ӵݢgn˩ TЩ2P\rߋ\"+z8:#2J[i;zr3 #ى:n\r㽃epdݍ 2c4k\rGE6_މb/HB%0>hoWnxl֍浃CQ^\r4lK{Z:Ã.pĂJB-+B(T%J0lT`+-@BۄV\0C,0tF?Ġ\na@Ɍ>ZECO-^Q&)I)R]\r97_\rF80Ob >\nR_8٫ ov0bCAF!tă%0/zAYO(4 '] I8hH053@x&n|T)`.s6eYDzJѓ.{GEbӋ2{\$**@C-:zYHZI5F]YCOA`x'.*9t'{(wP=**xwr*cc|DV\rV.0 Vd?Ҁ,E͝`T6ۈ-ڎT[ѐz.Ar̀Pnc= a9Fn!u A0iPJ6e T]V[\rXav k\n+Eܕ*\0~@g\"NCI\$Ɍx@Wy*vuD\0v댆V\0V`GuE֕flh@)0@T7§RAٷ3ۘ/Q],s{VRFA<vץ%@9F5t%+ /8;WJo:N` h{ܣ Ԑ8Eu&W|ɆU&\r\"|-udžN:ncfV# U20>\">`k]-xS͇ТcB}&`r+E\$yNb,Wx -9r,`+ˊC)7x\rWfMSR \\zQ̓u A24L&Hi µS\$)eg rȌ\$]ZiYskWn>7E1k8drkEwwcmTya\$tx\rB=*<l fKN/ lkH8.?f6ч{gi/\"@ K@2a|#,Z wd6w^&tP].Tkro\ro=%h`:\0᱂ |ꊣa Ԯ6*:*rO-^nM}Aya\nu^rnO\r`T~</wy}:|̡6v \rcٸߣC/6ഷ#p@p `Zch\0 \0o 4OO i\0-\n/\0D. .Đ\0fiȫ\0ID\0\r0foGeJ|\rl 3~ iP&/\09 ^\0r0] ›o .\" M vPZm pP ڜޏ{C ?kϼ}d ʏ~=.- m1> hЕ1;QIOP\rcpApVk\rQ* Q}q>u15BqQ[1flap\0*JQ=G _bGHF.0 = 2P P!#(3 \n!1&72f`/\0\"PU \$\r0 ,QrU&2f_X ]9\"S''y8\rkW)O)*Ra%\\ i%&ҳ+r3S`,v&2L&Pu*-0\"%HĬԞ@ؓHBP(\$p&,1M ح;\rn. I.',1)42u+3 ` S pL\nt_*S3;6r'h3555䜋d2q+68O7sC\"pm8ҭ69m\n@e0<8B8<,(8\0 0J<@IR6pԭmG\"116.\"5̂:8bA1;';?<*\$,̍o= T/3#҆");}elseif($_GET["file"]=="functions.js"){header("Content-Type: text/javascript; charset=utf-8");echo +lzw_decompress("f:gCI\n0S a9S`&(n0QIf\$At^ sGtf6ey()LSP'R'fq]\"s> )`H2Eq9?*)t'ϧ\n \rs2Xœej:9^1cȝ:Y@u㓛4X&|)ђ-Kx S1\$@\\!x]\0FCO:1K*F4 ak KϚ2lp3J<,28# \r hF݉2Pl(\$ְ\nJ۷-ǰcc~Frtbm{h.{tkBKcz4C9۫~>`ƓC s:!cڵ*WHX:W;Nj*/(_p3HIKln!trG㭺tC v?m㤣\0Coܥcbf6I'\rb7h`9id5taM={ɩ`NoK !d4zWXdmH*S ]3&\0ڰ d%A- ( Q}U !t7 䋆>xt{mY0@^\"= @t\r+Y.X\nI'KT^(D.@ ++@3X aE!,Y2-432Ԍ MOI\$q% ċGX9[R\0nи PJy\r Bp\\HpgSɼFaejk.4C.^yi9PĈe\"ΔNYBH#8B1\"j\\کx#@G 92f.ЌpsrTJxk4KIlf8zKȇ>AKn^=&A*?' ^%; 4܀9QhN>M=['vHIJvRt<Ҳ^z‰B^h'ɩ)-'#9JT)@jO!c,ej@H,javZ>ҷ)E`\0\nTP8LX'L {XzoD%sPW:[=v0?ܷ,%{\". .YIB \nWpV)qAMV5IPοˎ(b.\$[Қj@h\nF-4 8nj+VMxnjmb\$ \n'~ Z@ VL\"p5O,\0K\0-6\r:pDbՐn\$mm\$i )O6 (APIP+VHpn4?BMJF.0+ij P(&a%l]'^@(5N fscbz >x\0k Đ\rJH'3 (Fт z`O qX`r\r 1,gk lv|+kf'=R@46` -.i~4#<\$R |u2N;Bn<-#{%b=#(J1b%gzG21^8w b^%/ G*7D\0^ rc p\nL, 0+ Xr\$ 8-)+(D \nb s12G\\{.I~`*l]N X.#%\$KS'36\$CrC0B\r--H| Ȇ,\"57ӒT)n ĸ/2La72K1/ d\"4SH ͌1\0O6R8|S|+rӲ\$O\re(\r\"8ӎs\r2!*mNTQ]jk+15Rh1Qz`pRE -SS\r1@vo.tTUFqE;g\\\"DQ`sIv`0 +KpT)|l 8%'LLJ@\r&+ ԃX&t \\*'4NƣO\0OTDb\r1PL\0gM\"O>Cw]770 !\"ː4\0zW2 D\\W<2\"_ xw|qJ&e24\"qX:d6+-̓/ӄ[V71\rc\n\0\n`J ~+'1f!G\0[a\rv\0^\0ZK ~Ʌ7w%/(F?`z%vjyj\$w/!fqT,ӉY7I*jF,yRK~ rr菒_W|x;`㍃nn<'%xр 8߀ b_J \"h`Ev\\ˁ#\"4ٛɖلxdLFq9TljV#q-=qD2Mދud+rTtgcfnx^@da&\n\0B|:I+,7'8\\P,\"-scsvG'W\$=}[~ YycYi2sw4\rK.PU@ 珜\nAi2قY~'AmqӚ,4<ss򉬜#@`X\rͲ1 E=G4vG\0R'Y@7:@fPV{!\"z7Mo[D!*W2j2g8|L\$ DiG}GRb!r&- 3ԣmș\r0qh1Ki,| ezHYFdiS3b\r>]:~=!}i'] 2(\nFgX Xn}#ܗn`\r?t XQɑLZny~?nNr\0\$oj7Z&9S tU`tc*7s\r|w盕N)=\$Z'ˀ a!#Uȕe^ia0-ʀ!JD`fd0) RH+dI6AfvۓxT{C 1&GO \\Ex(.nP\"(02쮇dW=.@gG['jZ2='!K5f)R(r1j\rX1i5\$ Ļt, o\0p2,m%unoS 0PJ\\6sp)jL?ֲ~9d\r-,@%Zf QY,pXRCiJ!3#Y nc|@ (ɲ\"q\n_)1!8\0ы `cC}(_2 8MY ^3.U]!4a\ngJKЋ`9LH) Xn00܌S4EP`+ I4YFXI9hWIJE9!k#H]f7< fm(Q<@0 |&'@4 vȞ\0/ A\"&0yS<'5UZq%\"3 Rr鋞Ip:\0-PXT\\\0NYI2\0&n;2g|9N}ANP欫\0>&T D5sb\",VSPО2` .e@\\RDw4\$(⒢ 'b2\0\$Bf7\"q%W@\0`E]BJSxo\r8By(\n S =@7UA\r{\$bc\n\\\".h^\0`\"^L\0@9 W\0RO`eN=8ogv3n-CFq!Bp-qa7Mb'sK'MqHZm\$1IOj5lkgmzi6A\\@d,\n@Ӯ4tiJ\0l(k哊Vˆ\0Oiȭm(9tЅA\0fT~\$S]\\d[9g2\rpB֠x\0- 6eEA1\"y,+V]ٔimtW[B<&`bmqH|fSZ-?g DOQAVθE3 Q`T&AƩ\0\n%a\\Si 'bhH^|} O!.ɞW!\$Lyи:ݻ[:HD\0 v\0v*l{(.uŕRÕZt m+lLY<+1 !05/>T:Z6ISǯՠ?La,l.=[3tlhʲ0XhF⧂xPFh‚Vu0a,،9\n`nTŬb7l \$M9+Ldl6Y5+ZreI qPZ40YaE'5 pmK`آ|\r|\$CKBxRյmt8ogIu1ZeИϓO%MCS nwݧAut\$2{6X2V'ݼ/o[\\]s0!%}xY7+?aI[#U\0c{2f*F2}\0bm@zdX!T˔Md&ےI8.tJd/\0X{I K~^7C @D&]&SCVۧdyD՗41\$ F'\\2Et@}fA8.iK6~kOrW['/FL`J8EݦvVR%꒡*ɀJ^rcH7t:n7m x]&ze)5JtA֫)ZK%/n e®|6ɘc|Ԗ\\>ۖK~Ԃ۾ò\0-MliRdB|!O\$=\$Y;z]a8p!T\0.\r>(28i,XW4Z8h%Z6jDs2 M_\nҤ6ՖRTQY,`F/S\"`nHWy!2\"\\\0=66B )\\-UιWp )}q!p\\\nRXlJ-# Sm=\\KE1#H2 _Mm.Hҥo&!΃9V'+*U_)L.&J p5kB5T,M\"7Q\"\$aE7):Ţr:*.5|=a68JZLivBx t>mY9N\"4Ub,p1wP>A:n WqhR;Z\0b,=Cp\0,R^rk7G>MiVi)h9+2Jս!~4V4疮l=e恺։,d #ZiYſiH#[Jk ɕkKax\n PTٲc8r~9dO,᠍DA^d=?O5E5O߲j)j#[eMݐViaqp Kt -9+ċ̙YN6\rH[ŹK:fQ\nAJ]eo Ҹ?-r:s)1 lS+dFz3<k^6\0Ae8fifj*rfi&V>Lzu'3I5k5Ƒ#la|@̗ lh9C拑,K,&nBUze7\n:X@I\n<+\r&mf[d++A3Dm7BD`9 Eh(N̓k :U)1뵙'\nL& \$8ElDihq%\"NcI@회6|Pe,{ śfu\"f(l-\\P5f|kP\nh(p&Nzb\r3*ֈL{zuLeoPͲVz\n<|N1l)9z*j#h)y_!gut!^My\rj4xҞ\"U] Xj>Cr:w\n׭t`%!CzȐ\0^Jxa4.cXmUY|\rHR%#N\$00.淝:2OA&\02 y0apYC\0{ IU1>|4 \0W@oQ\0An߈y.hFP\nx<\rDx}.Bh\0ʳ!uBE61U`i9噎=Kmi{?H˭wk>G)v-٥Z:m+CsQh\n[W)3ï\nH\0\n9\rsd3|h|9p,^WsգŒC/c\">AaNh0 {8Bȇ@0!t O-\n^9j/N7D\"pHsq^5Nˢ߁ ɗp WoyYr4Ί-9SXŞ&'Cuaz~d\n7 ??mnvKҶkWǐm+ba9\\/~˸ݸ|tcp%F0}p z\0Z5=qtTU\" u<.ugW&¿]f3י9 ?h6m\0tŏf,]\$u^-_UGԾ%&i(]0kGr'z \$?P~Kq\\*_gW2t");}elseif($_GET["file"]=="jush.js"){header("Content-Type: text/javascript; charset=utf-8");echo +lzw_decompress("v0F==FS _6MƳr:ECIo:CXc\r؄J(:=Ea28x?'iSANNxsNBVl0S Ul(D|҄P>E㩶yH ch-3Eb bpEp9.~\n?Kbiw|`d.x8EN!23\rYy6GFmY8o7\n\r0\0Dbc!Q7Шd8~N)Eг`Ns`S)O /<x9o3n2!r:;+9CȨ\n<`b\\?`4\r#`8\$c1cc{n7ANRLi\r1!( j´+62X8+.\r!xh' 6S\0RO\n1(W07q:NE:68n+մ5_(s\r /m6P@EQ9\nV-\".:J8weq|؇X]Y XezW 7Z1hQfuj4Z{p\\AUJ<k@ɍ@}&L7 UwuYh2@u P7Ah3 ÛXEͅZ]l@Mplv) HWy>Y-Y/hC[*F#~!`\r#0PC˝f \\^%B<\\fޱ&/OL\\jFjZ1\\:ƴ>NXaFAfh{\"s\n64?8^p\"띰ȸ\\e(PNq[gr&}PhW*r_sPh\nom#.\0@pdW \$ҺQ۽Tl0 HdH)ۏ )PHgUBe\rt:\0)\"t,[(DO\nR8!Ƭ֚lAV4hSq<@}gK]]=90'wA<a~WD|A2XU2yŊ=p)\0P sn3rf\0FvG I@%+_I` \r.NKI[ʖSJaUfSzM %\"Q|9Bcaq\08#Zle5#U@iUG‚n%Ұs;gxLpP?BQ\\b 龒Q=7:ݡQ\r:t:y( \nd)\nX;CaA\rPGH!@9\n\nAl~HV\nsիƯbBr3\rP% ф\r}b/Α\$5PC\"wB_UgAt夅^QUjBvh졄4) +)lj-&`9qPy6\r.y&ảE80kAVT7px)ޡ~M΁!EtP\\ϗm~cB\\\nmv{9`G[~xsL\\IXwy\nuSc1?A*{ Ϳ|9޾/E4/W[ȳ>] rv~B PB`TH>0B)>N!4\"xW-X)0BhA0J2P@>AA)SnnOQbrҦh@ȋ(\nF˜ϖƙ(γP\0No}lVԍp8%2>B m @G(s\$d̜v\"pw6}(V KˠKL ¾W q\r̤ʀQL%PdJHNxK:\n %fn%ҌDM [#T\rr.LL&W/>h6 @E LPvC6O:Yh^ mn6nj>7`z `N\\j\rg\ri2I\$\"@[`hM3q3d \0ֵys\$ `D\$\0QOf1&\"~0 ` \"@ZG) Y:SD.S%͈3 dmU5 .p2Q3VذWBDt Cq#C@IPDT_D:Qf-WX\rpUDt&7@? }O122#UK*)긋0o<>]HƿrLGNW%M^9X:ɥNsE@xy(HƙMd5<52B k!>\r^J`ISN4'ƚ**`>`|0,DJFxb 4lTؕ[[\\Ԡ\\{6\\ޖ (#mJԣ,`IJխl jj֟?֣kGkT9]3ohuJW\rk)\03@x,- 5B=࣐#gf&Z`#o Xf\r Jh5rqnz s,6otDybhCtn9n`X&\r'tpL7Η&lZ-w{ r@iUzM{rxאmSB\r@ H*BD.7(3XCV ʘɆ:6;ZX0 ̢#cMyUi2,qF˚bJ @gG|4gmzW )r|X`Scէ˙c!B/}{4J\0Ýn Kuz @mѮ߭y͞y\")uY睘scy둶y7||{Ϙ*)4Y`ϵ[v^NXW7;_*x\r߼߉xm+m \$\nl);|٠ڙ:N:_8NU5;p+UL \\9 O:IzQT)XGJ{w8ʼnU\$PxTYpjhJÀJ{@ǂZsh˘X\0ۖlӖθY}^@u2S#U;È|P\\#|<\\J۝,\\̚E]Wl,ɖ<Ό>Yn),ΙrԼ⍺] \$qDJ=XI-ŀallõ]\\w(iC׃tkRu\\+>)3PP6M%pԌ A3qmu2fzۯ4s `ێ-kS%6\"IT5~\"Ut_ TuvֽYw0I7L\$1M?e@3q{,\"&ViI?mUWR\"uiTuqj\"G(-By5c? wT`eiJtbgU3@~+\0MG7`\0_- ?\rV?FO6`\noϚIn*pe\"T{[Гp^\nlh@l0[/p oJKX<=9{Ǿ6!OQx{ZVFԎ`~IߖL)Q[TMT*BC~ \ngÈŅp9zKwzO9di^'+Dz4gHALy\nr/%|ȅ̒ގ\$)1P30(\r+\nZ z))\0*\0k2υ(E86stf& +;76&K_(9f,@-4l\$ۂe7\0:lLM7.\0 |oJ۩Zu̺'y{H,#\0vU@9! '&G@_-ٿt;:uDPUцjH 9FBcCiBwMtx PM?p=8lg~ta%]b\$\rra,6tW)\0UF |쓢vhQ*Ol.C\$\\ցRR[j[] KRJ>.;F=Rڌ<rM=Ԓh^Y\\Rmn Nn*gB5^Q҉@OxHIT9)(&}A)P\\/_!́Hڑ\0B\$z4TYuJv\0ꏃ%@32\0Sm--Gi@Q%jY+FuzlSW3ŷOrU\$E;M\\Աu/jeQ,#JXP&|Uс`h2n6I+ né-nD`ɔ@B!;XsmȯpC`p5O%Z/5#CK`XcbQ#Qaqp)G+~ۖ\"lM_^z!EХap86n+oJ,󇢺w\n]̓pR'eJq'ܨ%'nlOh@>NBȊX5,rGrZ l\r(ˑjIl%b;s+נWg7)*e13Le@(p\0ÎdsAD\0Í\\bD\nu/&1XRץE楂5T\r}7A٬k\\͵q2܀Z-wotZ]-yq2j+ՆխënXA\0\0+S+Y6_BV7znZ@̆Էƴ]-UMJc*s\"+\0xB3^0\rc\\j*P-\\Q8ʎlc%XVB},;(`*Q \$r{KC%\rx Q,/v\" p~   J5e E-^X;c\\׬m7?6C*庮,7Hf/9e0[@!bUБ=i.Jocj;B\0]ՔvG8O\\\0NJO\$.& p\\ H1bp:F\"8ŶVxRx=3f1+| \0BkbPLђ\$zc i,Pcb,pn(,`'/~kֵpq-ȱV܆\r  \0 dS+\"鈭1\0(-1~tcfBۑb}ؠ0<1\rL\$2d\"1&ƀBóN\rB\rr\"?vdZ.\".\0?w9o\r0с!dR뤶\0Hra%Њ+\0yrHsϒ4W#,\$ \0*xB\nP| 8@/\02UbΪx! dN3S?P(g\n8ppS 9@' \0y\0y46H<\n`SCYjp:\0N(ӍX4kgDyt{ >\0P`O\\s <?4w~f@z~hBWxhAO'=P֌ײ=c[ysg|掳%M,Q8 'X hlUs ٢ 4qDx*8gNLBȖ;}%e@Yvho!\$NcCX@;YH'@^ Rf^x\0^os_f;pj]:Ԥ.mLl\rV\0@܀\"1%!_@-]8f-a]YWψh`(J@\rY kB(x:5B\\QkO[:0¼ukX\\P\0[xŮ`RIGk5YzPҙ=l=e\02=k` [KB8C}kc{#آldfF.̵-A6KPv'lHiA8C G`Gbyپ- 0Ĭ;[*_mlH{(;Uo*],ċX80CK ! N(I` VDvwrpc,\09~sXnr[ec4dpi \\e2laZCkglbB7x%Żk` \n( @ź5ݘϭċ#tܖE}ńsLvE\nQQ۔76}Orjb%@7۵hw͹nk`Vq~~4{ˁ;8p2mP+ daX8&,=n}!/K&\rtH)/Y6@=}EUlK\\kb[1GM)J xXET /\"-<4xDp(3ʟߴ'+\$\rF܉\\Rپ-nܧ\n?F~a+x\rl,fC+wiG.X!_71ym~ D7 G;gwb/89x@!R9éJqYh'3Ĭ*Xwˮ^  75`:#+ۭ0S@0o7:&~r (ZG1zpdN`/Fz@8t0Z_ 0{LnׇoEÍ=rGj]H ҷAf+Vm7B*q}cw=ۄgwE-H&Rh4M Z_L]WV'զ\"u @-aMs@9L:Ւ]#aoyb\n\0[rp*}Qbw?;Vcʰ .s索XְyR=&drO2j!uxR{N&ѻ5}vy۰1o8Z#{NrQ:BHzW{W{:r}D\$j7)PCvVXdD7፮,h_]^qσܟxO]?p{\"O8Q?xw}J?9kx5bu& o^>wg]h#?+m(/ng 55<;ȅ˳x%;(V;o-˽.enkp_FX9WjQCB اv3R=솦;a][yȻ4/|##v @_ǭ}UM>1\rCMqCdĘU#[ɦm\n\\\r6'> i I;R \0X{~wH/vL\n9?do,x)#>#b`',gT~t Y}/]-'\0( @ϡ/>~olH/qDT~o|a #|F8dϥ/|uVh\n>{ _{G IaE&{VNodFBX׽(IN@Y9ɿ\n-{@Ro۽&o^3Y>|-~/?*`\n?S!Vϩ>}O⟕>RM?b@\nO? 0s\0Iπ+'X,`'?\0K௸CO2t>LOLv3\0[PΛlH\nhlr\$/\0+\0  \r@?K)<#Ps\0?K@@\0ꀱ\0%, p)?#\$\niL3[3? @O\0 A|P\0D? N@\$,/ \$B?0\0 \$\0VLhͅ >#6+>R:p>7#\\гlΓAo<3l pe#7A@)@#AV?h 0*Z\0*\\Au_>kb?>\"c #6>B\"\0>\0ps?DPvA\\ #(>3EP>:<\nO\0d\"@A\0Aꎐ5 # c +@h؀\$\0:M3n3c`„T+I8B3@* @'”\\pM 8OlM c# 7B h`, 6o\\\\.S>DC0ƣS\$2B@&A>Lk 4A ܭ3@ ;>p \r\n3|\0\nOA:6\0 d7@8%`#É[=D\n3uLC9BC:`\$!h\$;B20u[ 8C <篟dP|=q 2pV> |*1\0\rE\0dAovPt'?d,PD*@ /#6CPBO\n8',5ÏE Lq\r?mEq\nzC@+r60C?3/̓\nP܏lHDͤ5\ni)D1(D7u>\n\$Aj4\0?4?LK A>Ͻ?qDI@\$;D8 &?;cJأbP\0 B# 3`‚)O3CMZ50EO6C\0\\\$p[9B#cj<11 B;cDBh? @`*.qbX o?;\0Kp38 RC6/\$>lͤpI ,!*\0+>= ]w\nT^pgź #\0?\$J@ \0*C*7 h\nj?:pAr]YLDbь B4d@(DcE@>\$ 4ؑ </?\n/ĺ>gp>I6i8; Ɖc1AZ6!}œ_ dUкZP4D|;rC[9ꤥ5I5I\0EOB\0{9qC|\"pUZP` GcQCGPJO6(B z>7F0I:vOǑBuE,\\0Ǹr8qgA6>74D0qG>-SE@#G.*\0i\n\\-`*\0q\n\\e\"— )qun@`>D8 \0/@_ڀw#ǍlG>Ԅ-+ߐ6Wl%6l0\$5s&\r*\0e!rqI \"> Ș3EIL\"94G\$/\0 \0 -2>/倘Gg\n/LqBP\"#7zHMԅOO\0̏&2LT^P @Zd=]Q=KCE\0QO\\s0>qCzG> @?0?\\o¿4M d19\0G? m\rD(ԴLd\\KJ8\rE-2 4U 0VAR=Ee5!2mqAEV\$ϕ I9 C&\\G)D 4I#p#C\\xC(\$H:NI(J\0΋\"w\0 ,)PǬϋ4ex-JKPrԂ-`2_7-!\"JؐJH.o-.\$ d\nH\"؆o+sؐ 3+ 6/a.\rnd˨ ?z1\0 ? 7€̄\0?jēVq?\$ 9-2ID9Lg1h[ۏ1sC1sީ9Lz?  LWdovL#9`ͨ0ɦWh>\0> /)DL\$a9*<:C+JKPJ\"L\\*b 164 ja+\0%Qf ;KE`>>7tHwMPn3I:fD \rX\r!\0\nBsVM63KO:Įc5 X!AQ9z%` {:HDE cv!Ν,:X)(%2 a&,l38j1|͇=CRr<\$\"KB3'9:|)`Oj+9 }-S>2UU5BUNNSNO3KNЎ @:/7āQ!@. ( &v9d^ج![.pGc K#?fpÝeOd2\0k6),\r65GmOFVdix,a=O@ sc6`¤\rJ\0;H(*r -.M[BΠ!(MLPbUpJ:1E !:,:YB*KRޤr0جLa6;6+2 )UB`JsV0:0 _B14/AONe)A ~\r ̠NPw,C3殹T3q9}SQ\$APD;!:! Ys6RԁFt#CπQ\\`rXr<'72ؼO-w9Ӥb853{\07\ra\"\nh[jFa)+2<%M|m|\n54p &bUQ8\0Eѥ4AAN,ˍ˝FؕTo(G`OGAGl`:=\0<\0TNϬ=. 6Ζ(SBİ\0,J?.(%,?B.<2hM΃I`Ό4*˯G 'I9RXE%,O\r,ʈs*(}<ڗ@cRj]D`URγ,.dr \\NlR-󓴵˚kQK,I.T@1\0K4/]04KK\nC&F,SF0ԵS.-K2RLe'7L0oK3TS.4T:X̾49/:WR9.62J6S .cSv^ 0O|LMD%34z3Id\n#tPq5h{!7Zۻ2 thʠ!K7Y1Sƺ! 1{ÀӼuEM4{֔4TGa;|5\"SNkS8D?JcU0կRtB { 5qSB,\0pj!\0006K1 ƒX @DV_.(_`-`Dua .X\rFRFDSRxhLU`4\n͌To9vFUm\"uDՀ \rw+\r`V(VPj]K⏜4oT.\$mDĵ Se@3׭;@7m:륥d!ZQ[5P 7;S/B!McGTW(V䯕<7[lt^\ri0Pa|VX̃a[x9 H]^&mҤ\0Xl㤫ހTOXl0(,`oau3U#'0+ӽ8]HT!XX\ryW@\$MQb-)X o\n|`-q-bٶUVc  3N=5vAg\r8\ra^Ю0 \"䱿R,3D2iG5 ?:\rT!wgM[7;[v{֪Cs\rU9d`yh\0h@~qT4_QVvF5 Ps*Mc]I91T0mV)SX[*cdA+1hb:IhM@s>P9vuT>ֽ` O5ccjϏ?QTmq\$=(V6F\rTr~\0|mC)[ՂN,d+;Qm-Ň\$oB-sRN:/8> b.40>,.tںJ\r\rk6 WMm3[x5 qLb6 ;`Lm4I6^d!5`7:aOh4-3HUmڒ^_NTꍱ[PH؝a=UH\rE \rjMSPsN6MXQ 5 \rۭYKqs[s-\0]aNd5?+CfRe^+@[P5GaҵoM@w\0QyoKUe}[_oK@nwxVpEPuo5R8c . Uo5w\0\n(%NpV֮JAqtZ#Ոk6iEVR{qf{3l@PqHr!VS]6'q@> R=E\0S+ UjʔY[źuUոջrp6s]h't mJ8QUUuDm2zЄBKv'Pl]AAfch\"RVpX;U5܎cְzPTuUQYZ5UJen5novs=HuZoaitoUڻuuH5n=jSUPZMNQmobFA>]i\\ G\rTvւ\"2v4γ=]2z\n=:\rh*sfw_Ut8[݄8]+=G7z=nۗJu8|4u] caz׀Ywt]ܪ ^r)w]%i,e}w0<3nLr.iy-7(K&\r_;f[̈\\\rX+Ha=ܳbnc , c!8\$mVvRJ]g -WOsR(5]WHVC\\5@D!s%Β^sd%N97փ{U+I-ռP\0\"FЈS5F[zsk(7Ez1-@x̹>MgWMjԻn\n ^tLUc}AVR@;X-\nXsYn^c{j7:]E\"JVJe~.QHgT3rcVBce3e^Հ98\n Z(䇪 ;tzՍ# q#\0V .\nS/Dk");}else{header("Content-Type: image/gif");switch($_GET["file"]){case"plus.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0!M*)o) qe#L\0;";break;case"cross.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0##\naFo~y._wa1J GL6]\0\0;";break;case"up.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0 MQN\n}a8yaŶ\0\0;";break;case"down.gif":echo"GIF89a\0\0\0001\0\0\0\0\0!\0\0\0,\0\0\0\0\0\0 M*)[W\\L&ٜƶ\0\0;";break;case"arrow.gif":echo"GIF89a\0\n\0\0\0!\0\0\0,\0\0\0\0\0\n\0\0iӲ޻\0\0;";break;}}exit;}function +connection(){global$g;return$g;}function +adminer(){global$c;return$c;}function +idf_unescape($Kc){$id=substr($Kc,-1);return +str_replace($id.$id,$id,substr($Kc,1,-1));}function +escape_string($X){return +substr(q($X),1,-1);}function +number($X){return +preg_replace('~[^0-9]+~','',$X);}function +remove_slashes($Qe,$oc=false){if(get_magic_quotes_gpc()){while(list($z,$X)=each($Qe)){foreach($X +as$bd=>$W){unset($Qe[$z][$bd]);if(is_array($W)){$Qe[$z][stripslashes($bd)]=$W;$Qe[]=&$Qe[$z][stripslashes($bd)];}else$Qe[$z][stripslashes($bd)]=($oc?$W:stripslashes($W));}}}}function +bracket_escape($Kc,$_a=false){static$pg=array(':'=>':1',']'=>':2','['=>':3');return +strtr($Kc,($_a?array_flip($pg):$pg));}function +charset($g){return(version_compare($g->server_info,"5.5.3")>=0?"utf8mb4":"utf8");}function +h($Jf){return +str_replace("\0","�",htmlspecialchars($Jf,ENT_QUOTES,'utf-8'));}function +nbsp($Jf){return(trim($Jf)!=""?h($Jf):" ");}function +nl_br($Jf){return +str_replace("\n","
    ",$Jf);}function +checkbox($F,$Y,$Na,$fd="",$be="",$Ra=""){$K="";return($fd!=""||$Ra?"$K".h($fd)."":$K);}function +optionlist($fe,$uf=null,$Hg=false){$K="";foreach($fe +as$bd=>$W){$ge=array($bd=>$W);if(is_array($W)){$K.='';$ge=$W;}foreach($ge +as$z=>$X)$K.=''.h($X);if(is_array($W))$K.='';}return$K;}function +html_select($F,$fe,$Y="",$ae=true){if($ae)return"";$K="";foreach($fe +as$z=>$X)$K.="";return$K;}function +select_input($wa,$fe,$Y="",$De=""){return($fe?"
    \n";}function +selectOrderPrint($he,$e,$x){print_fieldset("sort",lang(45),$he);$v=0;foreach((array)$_GET["order"]as$z=>$X){if($X!=""){echo"
    ".select_input(" name='order[$v]' onchange='selectFieldChange(this.form);'",$e,$X),checkbox("desc[$v]",1,isset($_GET["desc"][$z]),lang(46))."
    \n";$v++;}}echo"
    ".select_input(" name='order[$v]' onchange='selectAddRow(this);'",$e),checkbox("desc[$v]",1,false,lang(46))."
    \n","
    \n";}function +selectLimitPrint($_){echo"
    ".lang(47)."
    ";echo"","
    \n";}function +selectLengthPrint($dg){if($dg!==null){echo"
    ".lang(48)."
    ","","
    \n";}}function +selectActionPrint($x){echo"
    ".lang(49)."
    ",""," ","\n","
    \n";}function +selectCommandPrint(){return!information_schema(DB);}function +selectImportPrint(){return!information_schema(DB);}function +selectEmailPrint($Qb,$e){}function +selectColumnsProcess($e,$x){global$xc,$_c;$N=array();$u=array();foreach((array)$_GET["columns"]as$z=>$X){if($X["fun"]=="count"||($X["col"]!=""&&(!$X["fun"]||in_array($X["fun"],$xc)||in_array($X["fun"],$_c)))){$N[$z]=apply_sql_function($X["fun"],($X["col"]!=""?idf_escape($X["col"]):"*"));if(!in_array($X["fun"],$_c))$u[]=$N[$z];}}return +array($N,$u);}function +selectSearchProcess($o,$x){global$g,$y;$K=array();foreach($x +as$v=>$w){if($w["type"]=="FULLTEXT"&&$_GET["fulltext"][$v]!="")$K[]="MATCH (".implode(", ",array_map('idf_escape',$w["columns"])).") AGAINST (".q($_GET["fulltext"][$v]).(isset($_GET["boolean"][$v])?" IN BOOLEAN MODE":"").")";}foreach((array)$_GET["where"]as$X){if("$X[col]$X[val]"!=""&&in_array($X["op"],$this->operators)){$db=" $X[op]";if(preg_match('~IN$~',$X["op"])){$Mc=process_length($X["val"]);$db.=" ".($Mc!=""?$Mc:"(NULL)");}elseif($X["op"]=="SQL")$db=" $X[val]";elseif($X["op"]=="LIKE %%")$db=" LIKE ".$this->processInput($o[$X["col"]],"%$X[val]%");elseif($X["op"]=="ILIKE %%")$db=" ILIKE ".$this->processInput($o[$X["col"]],"%$X[val]%");elseif(!preg_match('~NULL$~',$X["op"]))$db.=" ".$this->processInput($o[$X["col"]],$X["val"]);if($X["col"]!="")$K[]=idf_escape($X["col"]).$db;else{$Ya=array();foreach($o +as$F=>$n){$Yc=preg_match('~char|text|enum|set~',$n["type"]);if((is_numeric($X["val"])||!preg_match('~(^|[^o])int|float|double|decimal|bit~',$n["type"]))&&(!preg_match("~[\x80-\xFF]~",$X["val"])||$Yc)){$F=idf_escape($F);$Ya[]=($y=="sql"&&$Yc&&!preg_match("~^utf8_~",$n["collation"])?"CONVERT($F USING ".charset($g).")":$F);}}$K[]=($Ya?"(".implode("$db OR ",$Ya)."$db)":"0");}}}return$K;}function +selectOrderProcess($o,$x){$K=array();foreach((array)$_GET["order"]as$z=>$X){if($X!="")$K[]=(preg_match('~^((COUNT\\(DISTINCT |[A-Z0-9_]+\\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\\)|COUNT\\(\\*\\))$~',$X)?$X:idf_escape($X)).(isset($_GET["desc"][$z])?" DESC":"");}return$K;}function +selectLimitProcess(){return(isset($_GET["limit"])?$_GET["limit"]:"50");}function +selectLengthProcess(){return(isset($_GET["text_length"])?$_GET["text_length"]:"100");}function +selectEmailProcess($Z,$sc){return +false;}function +selectQueryBuild($N,$Z,$u,$he,$_,$G){return"";}function +messageQuery($I,$eg){global$y;restart_session();$Ec=&get_session("queries");$Ic="sql-".count($Ec[$_GET["db"]]);if(strlen($I)>1e6)$I=preg_replace('~[\x80-\xFF]+$~','',substr($I,0,1e6))."\n...";$Ec[$_GET["db"]][]=array($I,time(),$eg);return" ".@date("H:i:s")." ".lang(51).""."';}function +editFunctions($n){global$Lb;$K=($n["null"]?"NULL/":"");foreach($Lb +as$z=>$xc){if(!$z||(!isset($_GET["call"])&&(isset($_GET["select"])||where($_GET)))){foreach($xc +as$Be=>$X){if(!$Be||preg_match("~$Be~",$n["type"]))$K.="/$X";}if($z&&!preg_match('~set|blob|bytea|raw|file~',$n["type"]))$K.="/SQL";}}if($n["auto_increment"]&&!isset($_GET["select"])&&!where($_GET))$K=lang(52);return +explode("/",$K);}function +editInput($Q,$n,$wa,$Y){if($n["type"]=="enum")return(isset($_GET["select"])?" ":"").($n["null"]?" ":"").enum_input("radio",$wa,$n,$Y,0);return"";}function +processInput($n,$Y,$s=""){if($s=="SQL")return$Y;$F=$n["field"];$K=q($Y);if(preg_match('~^(now|getdate|uuid)$~',$s))$K="$s()";elseif(preg_match('~^current_(date|timestamp)$~',$s))$K=$s;elseif(preg_match('~^([+-]|\\|\\|)$~',$s))$K=idf_escape($F)." $s $K";elseif(preg_match('~^[+-] interval$~',$s))$K=idf_escape($F)." $s ".(preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+$~i",$Y)?$Y:$K);elseif(preg_match('~^(addtime|subtime|concat)$~',$s))$K="$s(".idf_escape($F).", $K)";elseif(preg_match('~^(md5|sha1|password|encrypt)$~',$s))$K="$s($K)";return +unconvert_field($n,$K);}function +dumpOutput(){$K=array('text'=>lang(53),'file'=>lang(54));if(function_exists('gzencode'))$K['gz']='gzip';return$K;}function +dumpFormat(){return +array('sql'=>'SQL','csv'=>'CSV,','csv;'=>'CSV;','tsv'=>'TSV');}function +dumpDatabase($k){}function +dumpTable($Q,$Lf,$Zc=0){if($_POST["format"]!="sql"){echo"\xef\xbb\xbf";if($Lf)dump_csv(array_keys(fields($Q)));}else{if($Zc==2){$o=array();foreach(fields($Q)as$F=>$n)$o[]=idf_escape($F)." $n[full_type]";$i="CREATE TABLE ".table($Q)." (".implode(", ",$o).")";}else$i=create_sql($Q,$_POST["auto_increment"]);set_utf8mb4($i);if($Lf&&$i){if($Lf=="DROP+CREATE"||$Zc==1)echo"DROP ".($Zc==2?"VIEW":"TABLE")." IF EXISTS ".table($Q).";\n";if($Zc==1)$i=remove_definer($i);echo"$i;\n\n";}}}function +dumpData($Q,$Lf,$I){global$g,$y;$xd=($y=="sqlite"?0:1048576);if($Lf){if($_POST["format"]=="sql"){if($Lf=="TRUNCATE+INSERT")echo +truncate_sql($Q).";\n";$o=fields($Q);}$J=$g->query($I,1);if($J){$Rc="";$Ia="";$cd=array();$Nf="";$lc=($Q!=''?'fetch_assoc':'fetch_row');while($L=$J->$lc()){if(!$cd){$Kg=array();foreach($L +as$X){$n=$J->fetch_field();$cd[]=$n->name;$z=idf_escape($n->name);$Kg[]="$z = VALUES($z)";}$Nf=($Lf=="INSERT+UPDATE"?"\nON DUPLICATE KEY UPDATE ".implode(", ",$Kg):"").";\n";}if($_POST["format"]!="sql"){if($Lf=="table"){dump_csv($cd);$Lf="INSERT";}dump_csv($L);}else{if(!$Rc)$Rc="INSERT INTO ".table($Q)." (".implode(", ",array_map('idf_escape',$cd)).") VALUES";foreach($L +as$z=>$X){$n=$o[$z];$L[$z]=($X!==null?unconvert_field($n,preg_match('~(^|[^o])int|float|double|decimal~',$n["type"])&&$X!=''?$X:q($X)):"NULL");}$pf=($xd?"\n":" ")."(".implode(",\t",$L).")";if(!$Ia)$Ia=$Rc.$pf;elseif(strlen($Ia)+4+strlen($pf)+strlen($Nf)<$xd)$Ia.=",$pf";else{echo$Ia.$Nf;$Ia=$Rc.$pf;}}}if($Ia)echo$Ia.$Nf;}elseif($_POST["format"]=="sql")echo"-- ".str_replace("\n"," ",$g->error)."\n";}}function +dumpFilename($Jc){return +friendly_url($Jc!=""?$Jc:(SERVER!=""?SERVER:"localhost"));}function +dumpHeaders($Jc,$Id=false){$qe=$_POST["output"];$gc=(preg_match('~sql~',$_POST["format"])?"sql":($Id?"tar":"csv"));header("Content-Type: ".($qe=="gz"?"application/x-gzip":($gc=="tar"?"application/x-tar":($gc=="sql"||$qe!="file"?"text/plain":"text/csv")."; charset=utf-8")));if($qe=="gz")ob_start('ob_gzencode',1e6);return$gc;}function +homepage(){echo'

    +',$this->name(),' ',$fa,' +',(version_compare($fa,$_COOKIE["adminer_version"])<0?h($_COOKIE["adminer_version"]):""),' +

    +';if($Hd=="auth"){$pc=true;foreach((array)$_SESSION["pwds"]as$Mg=>$zf){foreach($zf +as$O=>$Ig){foreach($Ig +as$V=>$_e){if($_e!==null){if($pc){echo"

    \n";$pc=false;}$tb=$_SESSION["db"][$Mg][$O][$V];foreach(($tb?array_keys($tb):array(""))as$k)echo"($Eb[$Mg]) ".h($V.($O!=""?"@$O":"").($k!=""?" - $k":""))."
    \n";}}}}}else{if($_GET["ns"]!==""&&!$Hd&&DB!=""){$g->select_db(DB);$S=table_status('',true);}if(support("sql")){echo' + +';}$this->databasesPrint($Hd);if(DB==""||!$Hd){echo"

    ".lang(9)."\n";else$this->tablesPrint($S);}}}function +databasesPrint($Hd){global$c,$g;$j=$this->databases();echo'

    +

    +';hidden_fields_get();$rb=" onmousedown='dbMouseDown(event, this);' onchange='dbChange(this);'";echo"DB: ".($j?"":''),"\n";if($Hd!="db"&&DB!=""&&$g->select_db(DB)){}echo(isset($_GET["sql"])?'':(isset($_GET["schema"])?'':(isset($_GET["dump"])?'':(isset($_GET["privileges"])?'':"")))),"

    \n";}function +tablesPrint($S){echo"

    \n";foreach($S +as$Q=>$Gf){echo'".lang(64)." ";$F=$this->tableName($Gf);echo(support("table")||support("indexes")?'$F":"$F")."
    \n";}}}$c=(function_exists('adminer_object')?adminer_object():new +Adminer);if($c->operators===null)$c->operators=$de;function +page_header($hg,$m="",$Ha=array(),$ig=""){global$a,$fa,$c,$Eb,$y;page_headers();if(is_ajax()&&$m){page_messages($m);exit;}$jg=$hg.($ig!=""?": $ig":"");$kg=strip_tags($jg.(SERVER!=""&&SERVER!="localhost"?h(" - ".SERVER):"")." - ".$c->name());echo' + + + + + +',$kg,' + + +';if($c->head()){echo' + +';if(file_exists("adminer.css")){echo' +';}}echo' +> + + +

    + +
    +';if($Ha!==null){$A=substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1);echo'

    $jg

    \n","\n";restart_session();page_messages($m);$j=&get_session("dbs");if(DB!=""&&$j&&!in_array(DB,$j,true))$j=null;stop_session();define("PAGE_HEADER",1);}function +page_headers(){global$c;header("Content-Type: text/html; charset=utf-8");header("Cache-Control: no-cache");if($c->headers()){header("X-Frame-Options: deny");header("X-XSS-Protection: 0");}}function +page_messages($m){$Eg=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$Fd=$_SESSION["messages"][$Eg];if($Fd){echo"
    ".implode("
    \n
    ",$Fd)."
    \n";unset($_SESSION["messages"][$Eg]);}if($m)echo"
    $m
    \n";}function +page_footer($Hd=""){global$c,$T;echo'
    + +';switch_lang();if($Hd!="auth"){echo'
    +

    + + +

    +
    +';}echo' + +';}function +int32($E){while($E>=2147483648)$E-=4294967296;while($E<=-2147483649)$E+=4294967296;return(int)$E;}function +long2str($W,$Qg){$pf='';foreach($W +as$X)$pf.=pack('V',$X);if($Qg)return +substr($pf,0,end($W));return$pf;}function +str2long($pf,$Qg){$W=array_values(unpack('V*',str_pad($pf,4*ceil(strlen($pf)/4),"\0")));if($Qg)$W[]=strlen($pf);return$W;}function +xxtea_mx($Vg,$Ug,$Of,$bd){return +int32((($Vg>>5&0x7FFFFFF)^$Ug<<2)+(($Ug>>3&0x1FFFFFFF)^$Vg<<4))^int32(($Of^$Ug)+($bd^$Vg));}function +encrypt_string($If,$z){if($If=="")return"";$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($If,true);$E=count($W)-1;$Vg=$W[$E];$Ug=$W[0];$H=floor(6+52/($E+1));$Of=0;while($H-->0){$Of=int32($Of+0x9E3779B9);$Kb=$Of>>2&3;for($re=0;$re<$E;$re++){$Ug=$W[$re+1];$Jd=xxtea_mx($Vg,$Ug,$Of,$z[$re&3^$Kb]);$Vg=int32($W[$re]+$Jd);$W[$re]=$Vg;}$Ug=$W[0];$Jd=xxtea_mx($Vg,$Ug,$Of,$z[$re&3^$Kb]);$Vg=int32($W[$E]+$Jd);$W[$E]=$Vg;}return +long2str($W,false);}function +decrypt_string($If,$z){if($If=="")return"";if(!$z)return +false;$z=array_values(unpack("V*",pack("H*",md5($z))));$W=str2long($If,false);$E=count($W)-1;$Vg=$W[$E];$Ug=$W[0];$H=floor(6+52/($E+1));$Of=int32($H*0x9E3779B9);while($Of){$Kb=$Of>>2&3;for($re=$E;$re>0;$re--){$Vg=$W[$re-1];$Jd=xxtea_mx($Vg,$Ug,$Of,$z[$re&3^$Kb]);$Ug=int32($W[$re]-$Jd);$W[$re]=$Ug;}$Vg=$W[$E];$Jd=xxtea_mx($Vg,$Ug,$Of,$z[$re&3^$Kb]);$Ug=int32($W[0]-$Jd);$W[0]=$Ug;$Of=int32($Of-0x9E3779B9);}return +long2str($W,true);}$g='';$Dc=$_SESSION["token"];if(!$Dc)$_SESSION["token"]=rand(1,1e6);$T=get_token();$Ce=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$X){list($z)=explode(":",$X);$Ce[$z]=$X;}}function +add_invalid_login(){global$c;$nc=get_temp_dir()."/adminer.invalid";$r=@fopen($nc,"r+");if(!$r){$r=@fopen($nc,"w");if(!$r)return;}flock($r,LOCK_EX);$Uc=unserialize(stream_get_contents($r));$eg=time();if($Uc){foreach($Uc +as$Vc=>$X){if($X[0]<$eg)unset($Uc[$Vc]);}}$Tc=&$Uc[$c->bruteForceKey()];if(!$Tc)$Tc=array($eg+30*60,0);$Tc[1]++;$xf=serialize($Uc);rewind($r);fwrite($r,$xf);ftruncate($r,strlen($xf));flock($r,LOCK_UN);fclose($r);}$xa=$_POST["auth"];if($xa){$Uc=unserialize(@file_get_contents(get_temp_dir()."/adminer.invalid"));$Tc=$Uc[$c->bruteForceKey()];$Od=($Tc[1]>30?$Tc[0]-time():0);if($Od>0)auth_error(lang(68,ceil($Od/60)));session_regenerate_id();$Mg=$xa["driver"];$O=$xa["server"];$V=$xa["username"];$_e=(string)$xa["password"];$k=$xa["db"];set_password($Mg,$O,$V,$_e);$_SESSION["db"][$Mg][$O][$V][$k]=true;if($xa["permanent"]){$z=base64_encode($Mg)."-".base64_encode($O)."-".base64_encode($V)."-".base64_encode($k);$Ne=$c->permanentLogin(true);$Ce[$z]="$z:".base64_encode($Ne?encrypt_string($_e,$Ne):"");cookie("adminer_permanent",implode(" ",$Ce));}if(count($_POST)==1||DRIVER!=$Mg||SERVER!=$O||$_GET["username"]!==$V||DB!=$k)redirect(auth_url($Mg,$O,$V,$k));}elseif($_POST["logout"]){if($Dc&&!verify_token()){page_header(lang(67),lang(69));page_footer("db");exit;}else{foreach(array("pwds","db","dbs","queries")as$z)set_session($z,null);unset_permanent();redirect(substr(preg_replace('~\b(username|db|ns)=[^&]*&~','',ME),0,-1),lang(70));}}elseif($Ce&&!$_SESSION["pwds"]){session_regenerate_id();$Ne=$c->permanentLogin();foreach($Ce +as$z=>$X){list(,$Qa)=explode(":",$X);list($Mg,$O,$V,$k)=array_map('base64_decode',explode("-",$z));set_password($Mg,$O,$V,decrypt_string(base64_decode($Qa),$Ne));$_SESSION["db"][$Mg][$O][$V][$k]=true;}}function +unset_permanent(){global$Ce;foreach($Ce +as$z=>$X){list($Mg,$O,$V,$k)=array_map('base64_decode',explode("-",$z));if($Mg==DRIVER&&$O==SERVER&&$V==$_GET["username"]&&$k==DB)unset($Ce[$z]);}cookie("adminer_permanent",implode(" ",$Ce));}function +auth_error($m){global$c,$Dc;$m=h($m);$_f=session_name();if(isset($_GET["username"])){header("HTTP/1.1 403 Forbidden");if(($_COOKIE[$_f]||$_GET[$_f])&&!$Dc)$m=lang(71);else{add_invalid_login();$_e=get_password();if($_e!==null){if($_e===false)$m.='
    '.lang(72,'permanentLogin()');set_password(DRIVER,SERVER,$_GET["username"],null);}unset_permanent();}}if(!$_COOKIE[$_f]&&$_GET[$_f]&&ini_bool("session.use_only_cookies"))$m=lang(73);$te=session_get_cookie_params();cookie("adminer_key",($_COOKIE["adminer_key"]?$_COOKIE["adminer_key"]:rand_string()),$te["lifetime"]);page_header(lang(32),$m,null);echo"
    \n";$c->loginForm();echo"
    ";hidden_fields($_POST,array("auth"));echo"
    \n","
    \n";page_footer("auth");exit;}if(isset($_GET["username"])){if(!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);unset_permanent();page_header(lang(74),lang(75,implode(", ",$Ie)),false);page_footer("auth");exit;}$g=connect();}$l=new +Min_Driver($g);if(!is_object($g)||!$c->login($_GET["username"],get_password()))auth_error((is_string($g)?$g:lang(76)));if($xa&&$_POST["token"])$_POST["token"]=$T;$m='';if($_POST){if(!verify_token()){$Oc="max_input_vars";$Ad=ini_get($Oc);if(extension_loaded("suhosin")){foreach(array("suhosin.request.max_vars","suhosin.post.max_vars")as$z){$X=ini_get($z);if($X&&(!$Ad||$X<$Ad)){$Oc=$z;$Ad=$X;}}}$m=(!$_POST["token"]&&$Ad?lang(77,"'$Oc'"):lang(69).' '.lang(78));}}elseif($_SERVER["REQUEST_METHOD"]=="POST"){$m=lang(79,"'post_max_size'");if(isset($_GET["sql"]))$m.=' '.lang(80);}if(!ini_bool("session.use_cookies")||@ini_set("session.use_cookies",false)!==false)session_write_close();function +select($J,$h=null,$ke=array(),$_=0){global$y;$sd=array();$x=array();$e=array();$Fa=array();$wg=array();$K=array();odd('');for($v=0;(!$_||$v<$_)&&($L=$J->fetch_row());$v++){if(!$v){echo"\n","";for($ad=0;$adfetch_field();$F=$n->name;$je=$n->orgtable;$ie=$n->orgname;$K[$n->table]=$je;if($ke&&$y=="sql")$sd[$ad]=($F=="table"?"table=":($F=="possible_keys"?"indexes=":null));elseif($je!=""){if(!isset($x[$je])){$x[$je]=array();foreach(indexes($je,$h)as$w){if($w["type"]=="PRIMARY"){$x[$je]=array_flip($w["columns"]);break;}}$e[$je]=$x[$je];}if(isset($e[$je][$ie])){unset($e[$je][$ie]);$x[$je][$ie]=$ad;$sd[$ad]=$je;}}if($n->charsetnr==63)$Fa[$ad]=true;$wg[$ad]=$n->type;echo"name!=$ie?" title='".h(($je!=""?"$je.":"").$ie)."'":"").">".h($F).($ke?doc_link(array('sql'=>"explain-output.html#explain_".strtolower($F))):"");}echo"\n";}echo"";foreach($L +as$z=>$X){if($X===null)$X="NULL";elseif($Fa[$z]&&!is_utf8($X))$X="".lang(39,strlen($X))."";elseif(!strlen($X))$X=" ";else{$X=h($X);if($wg[$z]==254)$X="$X";}if(isset($sd[$z])&&!$e[$sd[$z]]){if($ke&&$y=="sql"){$Q=$L[array_search("table=",$sd)];$A=$sd[$z].urlencode($ke[$Q]!=""?$ke[$Q]:$Q);}else{$A="edit=".urlencode($sd[$z]);foreach($x[$sd[$z]]as$Ua=>$ad)$A.="&where".urlencode("[".bracket_escape($Ua)."]")."=".urlencode($L[$ad]);}$X="$X";}echo"
    $X";}}echo($v?"
    ":"

    ".lang(12))."\n";return$K;}function +referencable_primary($vf){$K=array();foreach(table_status('',true)as$Sf=>$Q){if($Sf!=$vf&&fk_support($Q)){foreach(fields($Sf)as$n){if($n["primary"]){if($K[$Sf]){unset($K[$Sf]);break;}$K[$Sf]=$n;}}}}return$K;}function +textarea($F,$Y,$M=10,$Ya=80){global$y;echo"";}function +edit_type($z,$n,$Xa,$q=array()){global$Kf,$wg,$Cg,$Zd;$U=$n["type"];echo' +';echo"',($Cg?"':''),(isset($n['on_update'])?"':''),($q?" ":" ");}function +process_length($od){global$Vb;return(preg_match("~^\\s*\\(?\\s*$Vb(?:\\s*,\\s*$Vb)*+\\s*\\)?\\s*\$~",$od)&&preg_match_all("~$Vb~",$od,$vd)?"(".implode(",",$vd[0]).")":preg_replace('~^[0-9].*~','(\0)',preg_replace('~[^-0-9,+()[\]]~','',$od)));}function +process_type($n,$Va="COLLATE"){global$Cg;return" $n[type]".process_length($n["length"]).(preg_match('~(^|[^o])int|float|double|decimal~',$n["type"])&&in_array($n["unsigned"],$Cg)?" $n[unsigned]":"").(preg_match('~char|text|enum|set~',$n["type"])&&$n["collation"]?" $Va ".q($n["collation"]):"");}function +process_field($n,$ug){global$y;$vb=$n["default"];return +array(idf_escape(trim($n["field"])),process_type($ug),($n["null"]?" NULL":" NOT NULL"),(isset($vb)?" DEFAULT ".((preg_match('~time~',$n["type"])&&preg_match('~^CURRENT_TIMESTAMP$~i',$vb))||($y=="sqlite"&&preg_match('~^CURRENT_(TIME|TIMESTAMP|DATE)$~i',$vb))||($n["type"]=="bit"&&preg_match("~^([0-9]+|b'[0-1]+')\$~",$vb))||($y=="pgsql"&&preg_match("~^[a-z]+\\(('[^']*')+\\)\$~",$vb))?$vb:q($vb)):""),(preg_match('~timestamp|datetime~',$n["type"])&&$n["on_update"]?" ON UPDATE $n[on_update]":""),(support("comment")&&$n["comment"]!=""?" COMMENT ".q($n["comment"]):""),($n["auto_increment"]?auto_increment():null),);}function +type_class($U){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$z=>$X){if(preg_match("~$z|$X~",$U))return" class='$z'";}}function +edit_fields($o,$Xa,$U="TABLE",$q=array(),$cb=false){global$g,$Pc;echo' +';if($U=="PROCEDURE"){echo' ';}echo'',($U=="TABLE"?lang(85):lang(86)),'',lang(87),' +',lang(88),'',lang(89);if($U=="TABLE"){echo'NULL +AI',doc_link(array('sql'=>"example-auto-increment.html",'sqlite'=>"autoinc.html",'pgsql'=>"datatype.html#DATATYPE-SERIAL",'mssql'=>"ms186775.aspx",)),'',lang(90),(support("comment")?"

    ".lang(103,$Eb[DRIVER],"".h($g->server_info)."","$g->extension")."\n","

    ".lang(104,"".h(logged_user())."")."\n";$j=$c->databases();if($j){$sf=support("scheme");$Xa=collations();echo"

    \n","\n","".(support("database")?"\n";$j=($_GET["dbsize"]?count_tables($j):array_flip($j));foreach($j +as$k=>$S){$lf=h(ME)."db=".urlencode($k);echo"".(support("database")?"
     ":"")."".lang(31)." - ".lang(105).""."".lang(106)."".lang(107)."".lang(108)." - ".lang(109).""."
    ".checkbox("db[]",$k,in_array($k,(array)$_POST["db"])):""),"".h($k)."";$Wa=nbsp(db_collation($k,$Xa));echo"".(support("database")?"$Wa":$Wa),"".($_GET["dbsize"]?$S:"?")."","".($_GET["dbsize"]?db_size($k):"?"),"\n";}echo"
    \n",(support("database")?"
    ".lang(110)."
    \n"."\n"."\n"."
    \n":""),"\n","\n","
    \n";}}page_footer("db");}if(isset($_GET["status"]))$_GET["variables"]=$_GET["status"];if(isset($_GET["import"]))$_GET["sql"]=$_GET["import"];if(!(DB!=""?$g->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect"||$_GET["script"]=="kill")){if(DB!=""||$_GET["refresh"]){restart_session();set_session("dbs",null);}connect_error();exit;}$Zd="RESTRICT|NO ACTION|CASCADE|SET NULL|SET DEFAULT";class +TmpFile{var$handler;var$size;function +TmpFile(){$this->handler=tmpfile();}function +write($gb){$this->size+=strlen($gb);fwrite($this->handler,$gb);}function +send(){fseek($this->handler,0);fpassthru($this->handler);fclose($this->handler);}}$Vb="'(?:''|[^'\\\\]|\\\\.)*'";$Pc="IN|OUT|INOUT";if(isset($_GET["select"])&&($_POST["edit"]||$_POST["clone"])&&!$_POST["save"])$_GET["edit"]=$_GET["select"];if(isset($_GET["callf"]))$_GET["call"]=$_GET["callf"];if(isset($_GET["function"]))$_GET["procedure"]=$_GET["function"];if(isset($_GET["download"])){$b=$_GET["download"];$o=fields($b);header("Content-Type: application/octet-stream");header("Content-Disposition: attachment; filename=".friendly_url("$b-".implode("_",$_GET["where"])).".".friendly_url($_GET["field"]));$N=array(idf_escape($_GET["field"]));$J=$l->select($b,$N,array(where($_GET,$o)),$N);$L=($J?$J->fetch_row():array());echo$L[0];exit;}elseif(isset($_GET["table"])){$b=$_GET["table"];$o=fields($b);if(!$o)$m=error();$R=table_status1($b,true);page_header(($o&&is_view($R)?lang(112):lang(113)).": ".h($b),$m);$c->selectLinks($R);$bb=$R["Comment"];if($bb!="")echo"

    ".lang(91).": ".h($bb)."\n";if($o){echo"\n","\n";foreach($o +as$n){echo"
    ".lang(114)."".lang(87).(support("comment")?"".lang(91):"")."
    ".h($n["field"]),"".h($n["full_type"])."",($n["null"]?" NULL":""),($n["auto_increment"]?" ".lang(52)."":""),(isset($n["default"])?" [".h($n["default"])."]":""),(support("comment")?"".nbsp($n["comment"]):""),"\n";}echo"
    \n";}if(!is_view($R)){if(support("indexes")){echo"

    ".lang(115)."

    \n";$x=indexes($b);if($x){echo"\n";foreach($x +as$F=>$w){ksort($w["columns"]);$Me=array();foreach($w["columns"]as$z=>$X)$Me[]="".h($X)."".($w["lengths"][$z]?"(".$w["lengths"][$z].")":"").($w["descs"][$z]?" DESC":"");echo"
    $w[type]".implode(", ",$Me)."\n";}echo"
    \n";}echo'

    ".lang(81)."

    \n";$q=foreign_keys($b);if($q){echo"\n","\n";foreach($q +as$F=>$p){echo"","
    ".lang(117)."".lang(118)."".lang(84)."".lang(83)." 
    ".implode(", ",array_map('h',$p["source"]))."","".($p["db"]!=""?"".h($p["db"]).".":"").($p["ns"]!=""?"".h($p["ns"]).".":"").h($p["table"])."","(".implode(", ",array_map('h',$p["target"])).")","".nbsp($p["on_delete"])."\n","".nbsp($p["on_update"])."\n",''.lang(119).'';}echo"
    \n";}echo'

    ".lang(121)."

    \n";$tg=triggers($b);if($tg){echo"\n";foreach($tg +as$z=>$X)echo"
    ".h($X[0])."".h($X[1])."".h($z)."".lang(119)."\n";echo"
    \n";}echo'
    + +';foreach($rf +as$F=>$Q){echo"
    ",''.h($F)."";foreach($Q["fields"]as$n){$X=''.h($n["field"]).'';echo"
    ".($n["primary"]?"$X":$X);}foreach((array)$Q["references"]as$Zf=>$df){foreach($df +as$kd=>$Ze){$ld=$kd-$Tf[$F][1];$v=0;foreach($Ze[0]as$Cf)echo"\n
    ";}}foreach((array)$cf[$F]as$Zf=>$df){foreach($df +as$kd=>$e){$ld=$kd-$Tf[$F][1];$v=0;foreach($e +as$Yf)echo"\n
    ";}}echo"\n
    \n";}foreach($rf +as$F=>$Q){foreach((array)$Q["references"]as$Zf=>$df){foreach($df +as$kd=>$Ze){$Gd=$ng;$zd=-10;foreach($Ze[0]as$z=>$Cf){$Ge=$Q["pos"][0]+$Q["fields"][$Cf]["pos"];$He=$rf[$Zf]["pos"][0]+$rf[$Zf]["fields"][$Ze[1][$z]]["pos"];$Gd=min($Gd,$Ge,$He);$zd=max($zd,$Ge,$He);}echo"
    \n";}}}echo'
    +
    + +';$sb=array('','USE','DROP+CREATE','CREATE');$Vf=array('','DROP+CREATE','CREATE');$pb=array('','TRUNCATE+INSERT','INSERT');if($y=="sql")$pb[]='INSERT+UPDATE';parse_str($_COOKIE["adminer_export"],$L);if(!$L)$L=array("output"=>"text","format"=>"sql","db_style"=>(DB!=""?"":"CREATE"),"table_style"=>"DROP+CREATE","data_style"=>"INSERT");if(!isset($L["events"])){$L["routines"]=$L["events"]=($_GET["dump"]=="");$L["triggers"]=$L["table_style"];}echo"
    ".lang(124)."".html_select("output",$c->dumpOutput(),$L["output"],0)."\n";echo"
    ".lang(125)."".html_select("format",$c->dumpFormat(),$L["format"],0)."\n";echo($y=="sqlite"?"":"
    ".lang(31)."".html_select('db_style',$sb,$L["db_style"]).(support("routine")?checkbox("routines",1,$L["routines"],lang(126)):"").(support("event")?checkbox("events",1,$L["events"],lang(127)):"")),"
    ".lang(107)."".html_select('table_style',$Vf,$L["table_style"]).checkbox("auto_increment",1,$L["auto_increment"],lang(52)).(support("trigger")?checkbox("triggers",1,$L["triggers"],lang(121)):""),"
    ".lang(128)."".html_select('data_style',$pb,$L["data_style"]),'
    +

    + + + +';$Ke=array();if(DB!=""){$Na=($b!=""?"":" checked");echo"","\n";$Og="";$Wf=tables_list();foreach($Wf +as$F=>$U){$Je=preg_replace('~_.*~','',$F);$Na=($b==""||$b==(substr($b,-1)=="%"?"$Je%":$F));$Me="\n";$j=$c->databases();if($j){foreach($j +as$k){if(!information_schema($k)){$Je=preg_replace('~_.*~','',$k);echo"
    ","","
    ".checkbox("tables[]",$F,$Na,$F,"checkboxClick(event, this); formUncheck('check-tables');","block");if($U!==null&&!preg_match('~table~i',$U))$Og.="$Me\n";else +echo"$Me\n";$Ke[$Je]++;}echo$Og;if($Wf)echo"\n";}else{echo"
    ".checkbox("databases[]",$k,$b==""||$b=="$Je%",$k,"formUncheck('check-databases');","block")."\n";$Ke[$Je]++;}}}else +echo"
    ";}echo'
    +

    +';$pc=true;foreach($Ke +as$z=>$X){if($z!=""&&$X>1){echo($pc?"

    ":" ")."".h($z)."";$pc=false;}}}elseif(isset($_GET["privileges"])){page_header(lang(59));$J=$g->query("SELECT User, Host FROM mysql.".(DB==""?"user":"db WHERE ".q(DB)." LIKE Db")." ORDER BY Host, User");$t=$J;if(!$J)$J=$g->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");echo"

    \n";hidden_fields_get();echo"\n",($t?"":"\n"),"\n","\n";while($L=$J->fetch_assoc())echo'
    ".lang(29)."".lang(28)." 
    '.h($L["User"])."".h($L["Host"]).''.lang(10)."\n";if(!$t||DB!="")echo"\n";echo"
    \n","

    \n",'
    ".shorten_utf8(trim($H),1000)."
    \n";if(!$_POST["only_errors"]){echo$Me;ob_flush();flush();}$Ff=microtime(true);if($g->multi_query($H)&&is_object($h)&&preg_match("~^$Df*USE\\b~isU",$H))$h->query($H);do{$J=$g->store_result();$eg=" (".format_time($Ff).")".(strlen($H)<1000?" ".lang(10)."":"");if($g->error){echo($_POST["only_errors"]?$Me:""),"

    ".lang(130).($g->errno?" ($g->errno)":"").": ".error()."\n";$Xb[]=" $ab";if($_POST["error_stops"])break +2;}elseif(is_object($J)){$_=$_POST["limit"];$ke=select($J,$h,array(),$_);if(!$_POST["only_errors"]){echo"

    \n";$Pd=$J->num_rows;echo"

    ".($Pd?($_&&$Pd>$_?lang(131,$_):"").lang(132,$Pd):""),$eg;$Ic="export-$ab";$fc=", ".lang(61)."\n";if($h&&preg_match("~^($Df|\\()*SELECT\\b~isU",$H)&&($ec=explain($h,$H))){$Ic="explain-$ab";echo", EXPLAIN$fc","

    \n";}else +echo$fc;echo"
    \n";}}else{if(preg_match("~^$Df*(CREATE|DROP|ALTER)$Df+(DATABASE|SCHEMA)\\b~isU",$H)){restart_session();set_session("dbs",null);stop_session();}if(!$_POST["only_errors"])echo"

    ".lang(133,$g->affected_rows)."$eg\n";}$Ff=microtime(true);}while($g->next_result());$rd+=substr_count($H.$uc,"\n");$I=substr($I,$Sd);$Sd=0;}}}}if($Sb)echo"

    ".lang(134)."\n";elseif($_POST["only_errors"]){echo"

    ".lang(135,$ab-count($Xb))," (".format_time($og).")\n";}elseif($Xb&&$ab>1)echo"

    ".lang(130).": ".implode("",$Xb)."\n";}else +echo"

    ".upload_error($I)."\n";}echo' +

    +';$cc="";if(!isset($_GET["import"])){$H=$_GET["sql"];if($_POST)$H=$_POST["query"];elseif($_GET["history"]=="all")$H=$Ec;elseif($_GET["history"]!="")$H=$Ec[$_GET["history"]][0];echo"

    ";textarea("query",$H,20);echo($_POST?"":"\n"),"

    $cc\n",lang(137).": \n";}else{echo"

    ".lang(138)."
    ",(ini_bool("file_uploads")?"SQL (< ".ini_get("upload_max_filesize")."B): \n$cc":lang(139)),"
    \n","
    ".lang(140)."
    ",lang(141,"adminer.sql".(extension_loaded("zlib")?"[.gz]":"").""),' ',"
    \n","

    ";}echo +checkbox("error_stops",1,($_POST?$_POST["error_stops"]:isset($_GET["import"])),lang(143))."\n",checkbox("only_errors",1,($_POST?$_POST["only_errors"]:isset($_GET["import"])),lang(144))."\n","\n";if(!isset($_GET["import"])&&$Ec){print_fieldset("history",lang(145),$_GET["history"]!="");for($X=end($Ec);$X;$X=prev($Ec)){$z=key($Ec);list($H,$eg,$Nb)=$X;echo''.lang(10).""." ".@date("H:i:s",$eg).""." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$H)))),80,"").($Nb?" ($Nb)":"")."
    \n";}echo"\n","".lang(147)."\n","

    \n";}echo' +';}elseif(isset($_GET["edit"])){$b=$_GET["edit"];$o=fields($b);$Z=(isset($_GET["select"])?(count($_POST["check"])==1?where_check($_POST["check"][0],$o):""):where($_GET,$o));$Dg=(isset($_GET["select"])?$_POST["edit"]:$Z);foreach($o +as$F=>$n){if(!isset($n["privileges"][$Dg?"update":"insert"])||$c->fieldName($n)=="")unset($o[$F]);}if($_POST&&!$m&&!isset($_GET["select"])){$B=$_POST["referer"];if($_POST["insert"])$B=($Dg?null:$_SERVER["REQUEST_URI"]);elseif(!preg_match('~^.+&select=.+$~',$B))$B=ME."select=".urlencode($b);$x=indexes($b);$zg=unique_array($_GET["where"],$x);$Ve="\nWHERE $Z";if(isset($_POST["delete"]))queries_redirect($B,lang(148),$l->delete($b,$Ve,!$zg));else{$P=array();foreach($o +as$F=>$n){$X=process_input($n);if($X!==false&&$X!==null)$P[idf_escape($F)]=$X;}if($Dg){if(!$P)redirect($B);queries_redirect($B,lang(149),$l->update($b,$P,$Ve,!$zg));if(is_ajax()){page_headers();page_messages($m);exit;}}else{$J=$l->insert($b,$P);$jd=($J?last_id():0);queries_redirect($B,lang(150,($jd?" $jd":"")),$J);}}}$L=null;if($_POST["save"])$L=(array)$_POST["fields"];elseif($Z){$N=array();foreach($o +as$F=>$n){if(isset($n["privileges"]["select"])){$ua=convert_field($n);if($_POST["clone"]&&$n["auto_increment"])$ua="''";if($y=="sql"&&preg_match("~enum|set~",$n["type"]))$ua="1*".idf_escape($F);$N[]=($ua?"$ua AS ":"").idf_escape($F);}}$L=array();if(!support("table"))$N=array("*");if($N){$J=$l->select($b,$N,array($Z),$N,array(),(isset($_GET["select"])?2:1));$L=$J->fetch_assoc();if(!$L)$L=false;if(isset($_GET["select"])&&(!$L||$J->fetch_assoc()))$L=null;}}if(!support("table")&&!$o){if(!$Z){$J=$l->select($b,array("*"),$Z,array("*"));$L=($J?$J->fetch_assoc():false);if(!$L)$L=array($l->primary=>"");}if($L){foreach($L +as$z=>$X){if(!$Z)$L[$z]=null;$o[$z]=array("field"=>$z,"null"=>($z!=$l->primary),"auto_increment"=>($z==$l->primary));}}}edit_form($b,$o,$L,$Dg);}elseif(isset($_GET["create"])){$b=$_GET["create"];$ve=array();foreach(array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST')as$z)$ve[$z]=$z;$bf=referencable_primary($b);$q=array();foreach($bf +as$Sf=>$n)$q[str_replace("`","``",$Sf)."`".str_replace("`","``",$n["field"])]=$Sf;$ne=array();$R=array();if($b!=""){$ne=fields($b);$R=table_status($b);if(!$R)$m=lang(9);}$L=$_POST;$L["fields"]=(array)$L["fields"];if($L["auto_increment_col"])$L["fields"][$L["auto_increment_col"]]["auto_increment"]=true;if($_POST&&!process_fields($L["fields"])&&!$m){if($_POST["drop"])queries_redirect(substr(ME,0,-1),lang(151),drop_tables(array($b)));else{$o=array();$ra=array();$Gg=false;$rc=array();ksort($L["fields"]);$me=reset($ne);$pa=" FIRST";foreach($L["fields"]as$z=>$n){$p=$q[$n["type"]];$ug=($p!==null?$bf[$p]:$n);if($n["field"]!=""){if(!$n["has_default"])$n["default"]=null;if($z==$L["auto_increment_col"])$n["auto_increment"]=true;$Re=process_field($n,$ug);$ra[]=array($n["orig"],$Re,$pa);if($Re!=process_field($me,$me)){$o[]=array($n["orig"],$Re,$pa);if($n["orig"]!=""||$pa)$Gg=true;}if($p!==null)$rc[idf_escape($n["field"])]=($b!=""&&$y!="sqlite"?"ADD":" ").format_foreign_key(array('table'=>$q[$n["type"]],'source'=>array($n["field"]),'target'=>array($ug["field"]),'on_delete'=>$n["on_delete"],));$pa=" AFTER ".idf_escape($n["field"]);}elseif($n["orig"]!=""){$Gg=true;$o[]=array($n["orig"]);}if($n["orig"]!=""){$me=next($ne);if(!$me)$pa="";}}$xe="";if($ve[$L["partition_by"]]){$ye=array();if($L["partition_by"]=='RANGE'||$L["partition_by"]=='LIST'){foreach(array_filter($L["partition_names"])as$z=>$X){$Y=$L["partition_values"][$z];$ye[]="\n PARTITION ".idf_escape($X)." VALUES ".($L["partition_by"]=='RANGE'?"LESS THAN":"IN").($Y!=""?" ($Y)":" MAXVALUE");}}$xe.="\nPARTITION BY $L[partition_by]($L[partition])".($ye?" (".implode(",",$ye)."\n)":($L["partitions"]?" PARTITIONS ".(+$L["partitions"]):""));}elseif(support("partitioning")&&preg_match("~partitioned~",$R["Create_options"]))$xe.="\nREMOVE PARTITIONING";$D=lang(152);if($b==""){cookie("adminer_engine",$L["Engine"]);$D=lang(153);}$F=trim($L["name"]);queries_redirect(ME.(support("table")?"table=":"select=").urlencode($F),$D,alter_table($b,$F,($y=="sqlite"&&($Gg||$rc)?$ra:$o),$rc,($L["Comment"]!=$R["Comment"]?$L["Comment"]:null),($L["Engine"]&&$L["Engine"]!=$R["Engine"]?$L["Engine"]:""),($L["Collation"]&&$L["Collation"]!=$R["Collation"]?$L["Collation"]:""),($L["Auto_increment"]!=""?number($L["Auto_increment"]):""),$xe));}}page_header(($b!=""?lang(37):lang(62)),$m,array("table"=>$b),h($b));if(!$_POST){$L=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($wg["int"])?"int":(isset($wg["integer"])?"integer":"")))),"partition_names"=>array(""),);if($b!=""){$L=$R;$L["name"]=$b;$L["fields"]=array();if(!$_GET["auto_increment"])$L["Auto_increment"]="";foreach($ne +as$n){$n["has_default"]=isset($n["default"]);$L["fields"][]=$n;}if(support("partitioning")){$wc="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($b);$J=$g->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $wc ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($L["partition_by"],$L["partitions"],$L["partition"])=$J->fetch_row();$ye=get_key_vals("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $wc AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION");$ye[""]="";$L["partition_names"]=array_keys($ye);$L["partition_values"]=array_values($ye);}}}$Xa=collations();$Ub=engines();foreach($Ub +as$Tb){if(!strcasecmp($Tb,$L["Engine"])){$L["Engine"]=$Tb;break;}}echo' +
    +

    +';if(support("columns")||$b==""){echo +lang(154),': +';if($b==""&&!$_POST){?>".optionlist(array(""=>"(".lang(155).")")+$Ub,$L["Engine"])."":""),' ',($Xa&&!preg_match("~sqlite|mssql~",$y)?html_select("Collation",array(""=>"(".lang(82).")")+$Xa,$L["Collation"]):""),' +';}echo' +';if(support("columns")){echo' +';$cb=($_POST?$_POST["comments"]:$L["Comment"]!="");if(!$_POST&&!$cb){foreach($L["fields"]as$n){if($n["comment"]!=""){$cb=true;break;}}}edit_fields($L["fields"],$Xa,"TABLE",$q,$cb);echo'
    +

    +',lang(52),': +',checkbox("defaults",1,true,lang(156),"columnShow(this.checked, 5)","jsonly");if(!$_POST["defaults"]){echo'';}echo(support("comment")?"".' ':''),'

    + +';}echo' +';if($b!=""){echo'';}if(support("partitioning")){$we=preg_match('~RANGE|LIST~',$L["partition_by"]);print_fieldset("partition",lang(157),$L["partition_by"]);echo'

    +',"",'() +',lang(158),': + + +';foreach($L["partition_names"]as$z=>$X){echo'',' + +';}echo' +

    +';}elseif(isset($_GET["indexes"])){$b=$_GET["indexes"];$Nc=array("PRIMARY","UNIQUE","INDEX");$R=table_status($b,true);if(preg_match('~MyISAM|M?aria'.($g->server_info>=5.6?'|InnoDB':'').'~i',$R["Engine"]))$Nc[]="FULLTEXT";$x=indexes($b);$Le=array();if($y=="mongo"){$Le=$x["_id_"];unset($Nc[0]);unset($x["_id_"]);}$L=$_POST;if($_POST&&!$m&&!$_POST["add"]&&!$_POST["drop_col"]){$sa=array();foreach($L["indexes"]as$w){$F=$w["name"];if(in_array($w["type"],$Nc)){$e=array();$pd=array();$yb=array();$P=array();ksort($w["columns"]);foreach($w["columns"]as$z=>$d){if($d!=""){$od=$w["lengths"][$z];$xb=$w["descs"][$z];$P[]=idf_escape($d).($od?"(".(+$od).")":"").($xb?" DESC":"");$e[]=$d;$pd[]=($od?$od:null);$yb[]=$xb;}}if($e){$dc=$x[$F];if($dc){ksort($dc["columns"]);ksort($dc["lengths"]);ksort($dc["descs"]);if($w["type"]==$dc["type"]&&array_values($dc["columns"])===$e&&(!$dc["lengths"]||array_values($dc["lengths"])===$pd)&&array_values($dc["descs"])===$yb){unset($x[$F]);continue;}}$sa[]=array($w["type"],$F,$P);}}}foreach($x +as$F=>$dc)$sa[]=array($dc["type"],$F,"DROP");if(!$sa)redirect(ME."table=".urlencode($b));queries_redirect(ME."table=".urlencode($b),lang(161),alter_indexes($b,$sa));}page_header(lang(115),$m,array("table"=>$b),h($b));$o=array_keys(fields($b));if($_POST["add"]){foreach($L["indexes"]as$z=>$w){if($w["columns"][count($w["columns"])]!="")$L["indexes"][$z]["columns"][]="";}$w=end($L["indexes"]);if($w["type"]||array_filter($w["columns"],'strlen'))$L["indexes"][]=array("columns"=>array(1=>""));}if(!$L){foreach($x +as$z=>$w){$x[$z]["name"]=$z;$x[$z]["columns"][]="";}$x[]=array("columns"=>array(1=>""));$L["indexes"]=$x;}echo' +
    + + + +';if($Le){echo"
    ',lang(162),'',lang(163),'',lang(164);?> +  +
    PRIMARY";foreach($Le["columns"]as$z=>$d){echo +select_input(" disabled",$o,$d)," ";}echo"\n";}$ad=1;foreach($L["indexes"]as$w){if(!$_POST["drop_col"]||$ad!=key($_POST["drop_col"])){echo"
    ".html_select("indexes[$ad][type]",array(-1=>"")+$Nc,$w["type"],($ad==count($L["indexes"])?"indexesAddRow(this);":1)),"";ksort($w["columns"]);$v=1;foreach($w["columns"]as$z=>$d){echo"".select_input(" name='indexes[$ad][columns][$v]' onchange=\"".($v==count($w["columns"])?"indexesAddColumn":"indexesChangeColumn")."(this, '".js_escape($y=="sql"?"":$_GET["indexes"]."_")."');\"",($o?array_combine($o,$o):$o),$d),($y=="sql"||$y=="mssql"?"":""),($y!="sql"?checkbox("indexes[$ad][descs][$v]",1,$w["descs"][$z],lang(46)):"")," ";$v++;}echo"\n","\n";}$ad++;}echo'
    +

    + + +

    +';}elseif(isset($_GET["database"])){$L=$_POST;if($_POST&&!$m&&!isset($_POST["add_x"])){$F=trim($L["name"]);if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),lang(165),drop_databases(array(DB)));}elseif(DB!==$F){if(DB!=""){$_GET["db"]=$F;queries_redirect(preg_replace('~\bdb=[^&]*&~','',ME)."db=".urlencode($F),lang(166),rename_database($F,$L["collation"]));}else{$j=explode("\n",str_replace("\r","",$F));$Mf=true;$id="";foreach($j +as$k){if(count($j)==1||$k!=""){if(!create_database($k,$L["collation"]))$Mf=false;$id=$k;}}restart_session();set_session("dbs",null);queries_redirect(ME."db=".urlencode($id),lang(167),$Mf);}}else{if(!$L["collation"])redirect(substr(ME,0,-1));query_redirect("ALTER DATABASE ".idf_escape($F).(preg_match('~^[a-z0-9_]+$~i',$L["collation"])?" COLLATE $L[collation]":""),substr(ME,0,-1),lang(168));}}page_header(DB!=""?lang(55):lang(169),$m,array(),h(DB));$Xa=collations();$F=DB;if($_POST)$F=$L["name"];elseif(DB!="")$L["collation"]=db_collation(DB,$Xa);elseif($y=="sql"){foreach(get_vals("SHOW GRANTS")as$t){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~',$t,$C)&&$C[1]){$F=stripcslashes(idf_unescape("`$C[2]`"));break;}}}echo' +
    +

    +',($_POST["add_x"]||strpos($F,"\n")?'
    ':'')."\n".($Xa?html_select("collation",array(""=>"(".lang(82).")")+$Xa,$L["collation"]).doc_link(array('sql'=>"charset-charsets.html",'mssql'=>"ms187963.aspx",)):"");?> + + +';if(DB!="")echo"\n";elseif(!$_POST["add_x"]&&$_GET["db"]=="")echo"\n";echo' +

    +';}elseif(isset($_GET["call"])){$ca=$_GET["call"];page_header(lang(170).": ".h($ca),$m);$mf=routine($ca,(isset($_GET["callf"])?"FUNCTION":"PROCEDURE"));$Mc=array();$pe=array();foreach($mf["fields"]as$v=>$n){if(substr($n["inout"],-3)=="OUT")$pe[$v]="@".idf_escape($n["field"])." AS ".idf_escape($n["field"]);if(!$n["inout"]||substr($n["inout"],0,2)=="IN")$Mc[]=$v;}if(!$m&&$_POST){$Ja=array();foreach($mf["fields"]as$z=>$n){if(in_array($z,$Mc)){$X=process_input($n);if($X===false)$X="''";if(isset($pe[$z]))$g->query("SET @".idf_escape($n["field"])." = $X");}$Ja[]=(isset($pe[$z])?"@".idf_escape($n["field"]):$X);}$I=(isset($_GET["callf"])?"SELECT":"CALL")." ".idf_escape($ca)."(".implode(", ",$Ja).")";echo"

    ".h($I)." ".lang(10)."\n";if(!$g->multi_query($I))echo"

    ".error()."\n";else{$h=connect();if(is_object($h))$h->select_db(DB);do{$J=$g->store_result();if(is_object($J))select($J,$h);else +echo"

    ".lang(171,$g->affected_rows)."\n";}while($g->next_result());if($pe)select($g->query("SELECT ".implode(", ",$pe)));}}echo' +

    +';if($Mc){echo"\n";foreach($Mc +as$z){$n=$mf["fields"][$z];$F=$n["field"];echo"
    ".$c->fieldName($n);$Y=$_POST["fields"][$F];if($Y!=""){if($n["type"]=="enum")$Y=+$Y;if($n["type"]=="set")$Y=array_sum($Y);}input($n,$Y,(string)$_POST["function"][$F]);echo"\n";}echo"
    \n";}echo'

    + + +

    +';}elseif(isset($_GET["foreign"])){$b=$_GET["foreign"];$F=$_GET["name"];$L=$_POST;if($_POST&&!$m&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){$D=($_POST["drop"]?lang(172):($F!=""?lang(173):lang(174)));$B=ME."table=".urlencode($b);$L["source"]=array_filter($L["source"],'strlen');ksort($L["source"]);$Yf=array();foreach($L["source"]as$z=>$X)$Yf[$z]=$L["target"][$z];$L["target"]=$Yf;if($y=="sqlite")queries_redirect($B,$D,recreate_table($b,$b,array(),array(),array(" $F"=>($_POST["drop"]?"":" ".format_foreign_key($L)))));else{$sa="ALTER TABLE ".table($b);$Fb="\nDROP ".($y=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($F);if($_POST["drop"])query_redirect($sa.$Fb,$B,$D);else{query_redirect($sa.($F!=""?"$Fb,":"")."\nADD".format_foreign_key($L),$B,$D);$m=lang(175)."
    $m";}}}page_header(lang(176),$m,array("table"=>$b),h($b));if($_POST){ksort($L["source"]);if($_POST["add"])$L["source"][]="";elseif($_POST["change"]||$_POST["change-js"])$L["target"]=array();}elseif($F!=""){$q=foreign_keys($b);$L=$q[$F];$L["source"][]="";}else{$L["table"]=$b;$L["source"]=array("");}$Cf=array_keys(fields($b));$Yf=($b===$L["table"]?$Cf:array_keys(fields($L["table"])));$af=array_keys(array_filter(table_status('',true),'fk_support'));echo' +
    +

    +';if($L["db"]==""&&$L["ns"]==""){echo +lang(177),': +',html_select("table",$af,$L["table"],"this.form['change-js'].value = '1'; this.form.submit();"),' +

    + + +';$ad=0;foreach($L["source"]as$z=>$X){echo"","
    ',lang(117),'',lang(118),'
    ".html_select("source[".(+$z)."]",array(-1=>"")+$Cf,$X,($ad==count($L["source"])-1?"foreignAddRow(this);":1)),"".html_select("target[".(+$z)."]",$Yf,$L["target"][$z]);$ad++;}echo'
    +

    +',lang(84),': ',html_select("on_delete",array(-1=>"")+explode("|",$Zd),$L["on_delete"]),' ',lang(83),': ',html_select("on_update",array(-1=>"")+explode("|",$Zd),$L["on_update"]),doc_link(array('sql'=>"innodb-foreign-key-constraints.html",'pgsql'=>"sql-createtable.html#SQL-CREATETABLE-REFERENCES",'mssql'=>"ms174979.aspx",'oracle'=>"clauses002.htm#sthref2903",)),'

    + +

    +';}if($F!=""){echo'';}echo' +

    +';}elseif(isset($_GET["view"])){$b=$_GET["view"];$L=$_POST;if($_POST&&!$m){$F=trim($L["name"]);$ua=" AS\n$L[select]";$B=ME."table=".urlencode($F);$D=lang(180);if($_GET["materialized"])$U="MATERIALIZED VIEW";else{$U="VIEW";if($y=="pgsql"){$Gf=table_status($F);$U=($Gf?strtoupper($Gf["Engine"]):$U);}}if(!$_POST["drop"]&&$b==$F&&$y!="sqlite"&&$U!="MATERIALIZED VIEW")query_redirect(($y=="mssql"?"ALTER":"CREATE OR REPLACE")." VIEW ".table($F).$ua,$B,$D);else{$ag=$F."_adminer_".uniqid();drop_create("DROP $U ".table($b),"CREATE $U ".table($F).$ua,"DROP $U ".table($F),"CREATE $U ".table($ag).$ua,"DROP $U ".table($ag),($_POST["drop"]?substr(ME,0,-1):$B),lang(181),$D,lang(182),$b,$F);}}if(!$_POST&&$b!=""){$L=view($b);$L["name"]=$b;if(!$m)$m=error();}page_header(($b!=""?lang(36):lang(183)),$m,array("table"=>$b),h($b));echo' +
    +

    ',lang(164),': +

    ';textarea("select",$L["select"]);echo'

    + +';if($_GET["view"]!=""){echo'';}echo' +

    +';}elseif(isset($_GET["event"])){$aa=$_GET["event"];$Sc=array("YEAR","QUARTER","MONTH","DAY","HOUR","MINUTE","WEEK","SECOND","YEAR_MONTH","DAY_HOUR","DAY_MINUTE","DAY_SECOND","HOUR_MINUTE","HOUR_SECOND","MINUTE_SECOND");$Hf=array("ENABLED"=>"ENABLE","DISABLED"=>"DISABLE","SLAVESIDE_DISABLED"=>"DISABLE ON SLAVE");$L=$_POST;if($_POST&&!$m){if($_POST["drop"])query_redirect("DROP EVENT ".idf_escape($aa),substr(ME,0,-1),lang(184));elseif(in_array($L["INTERVAL_FIELD"],$Sc)&&isset($Hf[$L["STATUS"]])){$qf="\nON SCHEDULE ".($L["INTERVAL_VALUE"]?"EVERY ".q($L["INTERVAL_VALUE"])." $L[INTERVAL_FIELD]".($L["STARTS"]?" STARTS ".q($L["STARTS"]):"").($L["ENDS"]?" ENDS ".q($L["ENDS"]):""):"AT ".q($L["STARTS"]))." ON COMPLETION".($L["ON_COMPLETION"]?"":" NOT")." PRESERVE";queries_redirect(substr(ME,0,-1),($aa!=""?lang(185):lang(186)),queries(($aa!=""?"ALTER EVENT ".idf_escape($aa).$qf.($aa!=$L["EVENT_NAME"]?"\nRENAME TO ".idf_escape($L["EVENT_NAME"]):""):"CREATE EVENT ".idf_escape($L["EVENT_NAME"]).$qf)."\n".$Hf[$L["STATUS"]]." COMMENT ".q($L["EVENT_COMMENT"]).rtrim(" DO\n$L[EVENT_DEFINITION]",";").";"));}}page_header(($aa!=""?lang(187).": ".h($aa):lang(188)),$m);if(!$L&&$aa!=""){$M=get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = ".q(DB)." AND EVENT_NAME = ".q($aa));$L=reset($M);}echo' +
    + +
    ',lang(164),' +
    ',lang(189),' +
    ',lang(190),' +
    ',lang(191),' ',html_select("INTERVAL_FIELD",$Sc,$L["INTERVAL_FIELD"]),'
    ',lang(102),'',html_select("STATUS",$Hf,$L["STATUS"]),'
    ',lang(91),' +
     ',checkbox("ON_COMPLETION","PRESERVE",$L["ON_COMPLETION"]=="PRESERVE",lang(192)),'
    +

    ';textarea("EVENT_DEFINITION",$L["EVENT_DEFINITION"]);echo'

    + +';if($aa!=""){echo'';}echo' +

    +';}elseif(isset($_GET["procedure"])){$ca=$_GET["procedure"];$mf=(isset($_GET["function"])?"FUNCTION":"PROCEDURE");$L=$_POST;$L["fields"]=(array)$L["fields"];if($_POST&&!process_fields($L["fields"])&&!$m){$ag="$L[name]_adminer_".uniqid();drop_create("DROP $mf ".idf_escape($ca),create_routine($mf,$L),"DROP $mf ".idf_escape($L["name"]),create_routine($mf,array("name"=>$ag)+$L),"DROP $mf ".idf_escape($ag),substr(ME,0,-1),lang(193),lang(194),lang(195),$ca,$L["name"]);}page_header(($ca!=""?(isset($_GET["function"])?lang(196):lang(197)).": ".h($ca):(isset($_GET["function"])?lang(198):lang(199))),$m);if(!$_POST&&$ca!=""){$L=routine($ca,$mf);$L["name"]=$ca;}$Xa=get_vals("SHOW CHARACTER SET");sort($Xa);$nf=routine_languages();echo' +
    +

    ',lang(164),': +',($nf?lang(19).": ".html_select("language",$nf,$L["language"]):""),' + +';edit_fields($L["fields"],$Xa,$mf);if(isset($_GET["function"])){echo"
    ".lang(200);edit_type("returns",$L["returns"],$Xa);}echo'
    +

    ';textarea("definition",$L["definition"]);echo'

    + +';if($ca!=""){echo'';}echo' +

    +';}elseif(isset($_GET["trigger"])){$b=$_GET["trigger"];$F=$_GET["name"];$sg=trigger_options();$L=(array)trigger($F)+array("Trigger"=>$b."_bi");if($_POST){if(!$m&&in_array($_POST["Timing"],$sg["Timing"])&&in_array($_POST["Event"],$sg["Event"])&&in_array($_POST["Type"],$sg["Type"])){$Yd=" ON ".table($b);$Fb="DROP TRIGGER ".idf_escape($F).($y=="pgsql"?$Yd:"");$B=ME."table=".urlencode($b);if($_POST["drop"])query_redirect($Fb,$B,lang(201));else{if($F!="")queries($Fb);queries_redirect($B,($F!=""?lang(202):lang(203)),queries(create_trigger($Yd,$_POST)));if($F!="")queries(create_trigger($Yd,$L+array("Type"=>reset($sg["Type"]))));}}$L=$_POST;}page_header(($F!=""?lang(204).": ".h($F):lang(205)),$m,array("table"=>$b));echo' +
    + +
    ',lang(206),'',html_select("Timing",$sg["Timing"],$L["Timing"],"triggerChange(/^".preg_quote($b,"/")."_[ba][iud]$/, '".js_escape($b)."', this.form);"),'
    ',lang(207),'',html_select("Event",$sg["Event"],$L["Event"],"this.form['Timing'].onchange();"),(in_array("UPDATE OF",$sg["Event"])?" ":""),'
    ',lang(87),'',html_select("Type",$sg["Type"],$L["Type"]),'
    +

    ',lang(164),': " maxlength="64" autocapitalize="off"> + +

    + +';if($F!=""){echo'';}echo' +

    +';}elseif(isset($_GET["user"])){$ea=$_GET["user"];$Pe=array(""=>array("All privileges"=>""));foreach(get_rows("SHOW PRIVILEGES")as$L){foreach(explode(",",($L["Privilege"]=="Grant option"?"":$L["Context"]))as$hb)$Pe[$hb][$L["Privilege"]]=$L["Comment"];}$Pe["Server Admin"]+=$Pe["File access on server"];$Pe["Databases"]["Create routine"]=$Pe["Procedures"]["Create routine"];unset($Pe["Procedures"]["Create routine"]);$Pe["Columns"]=array();foreach(array("Select","Insert","Update","References")as$X)$Pe["Columns"][$X]=$Pe["Tables"][$X];unset($Pe["Server Admin"]["Usage"]);foreach($Pe["Tables"]as$z=>$X)unset($Pe["Databases"][$z]);$Ld=array();if($_POST){foreach($_POST["objects"]as$z=>$X)$Ld[$X]=(array)$Ld[$X]+(array)$_POST["grants"][$z];}$yc=array();$Wd="";if(isset($_GET["host"])&&($J=$g->query("SHOW GRANTS FOR ".q($ea)."@".q($_GET["host"])))){while($L=$J->fetch_row()){if(preg_match('~GRANT (.*) ON (.*) TO ~',$L[0],$C)&&preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~',$C[1],$vd,PREG_SET_ORDER)){foreach($vd +as$X){if($X[1]!="USAGE")$yc["$C[2]$X[2]"][$X[1]]=true;if(preg_match('~ WITH GRANT OPTION~',$L[0]))$yc["$C[2]$X[2]"]["GRANT OPTION"]=true;}}if(preg_match("~ IDENTIFIED BY PASSWORD '([^']+)~",$L[0],$C))$Wd=$C[1];}}if($_POST&&!$m){$Xd=(isset($_GET["host"])?q($ea)."@".q($_GET["host"]):"''");if($_POST["drop"])query_redirect("DROP USER $Xd",ME."privileges=",lang(208));else{$Nd=q($_POST["user"])."@".q($_POST["host"]);$ze=$_POST["pass"];if($ze!=''&&!$_POST["hashed"]){$ze=$g->result("SELECT PASSWORD(".q($ze).")");$m=!$ze;}$lb=false;if(!$m){if($Xd!=$Nd){$lb=queries(($g->server_info<5?"GRANT USAGE ON *.* TO":"CREATE USER")." $Nd IDENTIFIED BY PASSWORD ".q($ze));$m=!$lb;}elseif($ze!=$Wd)queries("SET PASSWORD FOR $Nd = ".q($ze));}if(!$m){$jf=array();foreach($Ld +as$Rd=>$t){if(isset($_GET["grant"]))$t=array_filter($t);$t=array_keys($t);if(isset($_GET["grant"]))$jf=array_diff(array_keys(array_filter($Ld[$Rd],'strlen')),$t);elseif($Xd==$Nd){$Ud=array_keys((array)$yc[$Rd]);$jf=array_diff($Ud,$t);$t=array_diff($t,$Ud);unset($yc[$Rd]);}if(preg_match('~^(.+)\\s*(\\(.*\\))?$~U',$Rd,$C)&&(!grant("REVOKE",$jf,$C[2]," ON $C[1] FROM $Nd")||!grant("GRANT",$t,$C[2]," ON $C[1] TO $Nd"))){$m=true;break;}}}if(!$m&&isset($_GET["host"])){if($Xd!=$Nd)queries("DROP USER $Xd");elseif(!isset($_GET["grant"])){foreach($yc +as$Rd=>$jf){if(preg_match('~^(.+)(\\(.*\\))?$~U',$Rd,$C))grant("REVOKE",array_keys($jf),$C[2]," ON $C[1] FROM $Nd");}}}queries_redirect(ME."privileges=",(isset($_GET["host"])?lang(209):lang(210)),!$m);if($lb)$g->query("DROP USER $Nd");}}page_header((isset($_GET["host"])?lang(29).": ".h("$ea@$_GET[host]"):lang(129)),$m,array("privileges"=>array('',lang(59))));if($_POST){$L=$_POST;$yc=$Ld;}else{$L=$_GET+array("host"=>$g->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)"));$L["pass"]=$Wd;if($Wd!="")$L["hashed"]=true;$yc[(DB==""||$yc?"":idf_escape(addcslashes(DB,"%_\\"))).".*"]=array();}echo'
    + +
    ',lang(28),' +
    ',lang(29),' +
    ',lang(30),' +';if(!$L["hashed"]){echo'';}echo +checkbox("hashed",1,$L["hashed"],lang(211),"typePassword(this.form['pass'], this.checked);"),'
    + +';echo"\n","\n";foreach(array(""=>"","Server Admin"=>lang(28),"Databases"=>lang(31),"Tables"=>lang(113),"Columns"=>lang(114),"Procedures"=>lang(212),)as$hb=>$xb){foreach((array)$Pe[$hb]as$Oe=>$bb){echo"$xb'.h($Oe);$v=0;foreach($yc +as$Rd=>$t){$F="'grants[$v][".h(strtoupper($Oe))."]'";$Y=$t[strtoupper($Oe)];if($hb=="Server Admin"&&$Rd!=(isset($yc["*.*"])?"*.*":".*"))echo"
    ".lang(59).doc_link(array('sql'=>"grant.html#priv_level"));$v=0;foreach($yc +as$Rd=>$t){echo''.($Rd!="*.*"?"":"*.*");$v++;}echo"
     ";elseif(isset($_GET["grant"]))echo"";else +echo"";$v++;}}}echo"
    \n",'

    + +';if(isset($_GET["host"])){echo'';}echo' +

    +';}elseif(isset($_GET["processlist"])){if(support("kill")&&$_POST&&!$m){$ed=0;foreach((array)$_POST["kill"]as$X){if(queries("KILL ".number($X)))$ed++;}queries_redirect(ME."processlist=",lang(215,$ed),$ed||!$_POST["kill"]);}page_header(lang(100),$m);echo' +
    + +';$v=-1;foreach(process_list()as$v=>$L){if(!$v){echo"".(support("kill")?"\n";}echo"".(support("kill")?"
     ":"");foreach($L +as$z=>$X)echo"$z".doc_link(array('sql'=>"show-processlist.html#processlist_".strtolower($z),'pgsql'=>"monitoring-stats.html#PG-STAT-ACTIVITY-VIEW",'oracle'=>"../b14237/dynviews_2088.htm",));echo"
    ".checkbox("kill[]",$L["Id"],0):"");foreach($L +as$z=>$X)echo"".(($y=="sql"&&$z=="Info"&&preg_match("~Query|Killed~",$L["Command"])&&$X!="")||($y=="pgsql"&&$z=="current_query"&&$X!="")||($y=="oracle"&&$z=="sql_text"&&$X!="")?"".shorten_utf8($X,100,"").' '.lang(216).'':nbsp($X));echo"\n";}echo'
    + +

    +';if(support("kill")){echo($v+1)."/".lang(217,$g->result("SELECT @@max_connections")),"

    \n";}echo' +

    +';}elseif(isset($_GET["select"])){$b=$_GET["select"];$R=table_status1($b);$x=indexes($b);$o=fields($b);$q=column_foreign_keys($b);$Td="";if($R["Oid"]){$Td=($y=="sqlite"?"rowid":"oid");$x[]=array("type"=>"PRIMARY","columns"=>array($Td));}parse_str($_COOKIE["adminer_import"],$ma);$kf=array();$e=array();$dg=null;foreach($o +as$z=>$n){$F=$c->fieldName($n);if(isset($n["privileges"]["select"])&&$F!=""){$e[$z]=html_entity_decode(strip_tags($F),ENT_QUOTES);if(is_shortable($n))$dg=$c->selectLengthProcess();}$kf+=$n["privileges"];}list($N,$u)=$c->selectColumnsProcess($e,$x);$Wc=count($u)selectSearchProcess($o,$x);$he=$c->selectOrderProcess($o,$x);$_=$c->selectLimitProcess();$wc=($N?implode(", ",$N):"*".($Td?", $Td":"")).convert_fields($e,$o,$N)."\nFROM ".table($b);$zc=($u&&$Wc?"\nGROUP BY ".implode(", ",$u):"").($he?"\nORDER BY ".implode(", ",$he):"");if($_GET["val"]&&is_ajax()){header("Content-Type: text/plain; charset=utf-8");foreach($_GET["val"]as$_g=>$L){$ua=convert_field($o[key($L)]);$N=array($ua?$ua:idf_escape(key($L)));$Z[]=where_check($_g,$o);$K=$l->select($b,$N,$Z,$N);if($K)echo +reset($K->fetch_row());}exit;}if($_POST&&!$m){$Sg=$Z;if(!$_POST["all"]&&is_array($_POST["check"])){$Oa=array();foreach($_POST["check"]as$Ma)$Oa[]=where_check($Ma,$o);$Sg[]="((".implode(") OR (",$Oa)."))";}$Sg=($Sg?"\nWHERE ".implode(" AND ",$Sg):"");$Le=$Bg=null;foreach($x +as$w){if($w["type"]=="PRIMARY"){$Le=array_flip($w["columns"]);$Bg=($N?$Le:array());break;}}foreach((array)$Bg +as$z=>$X){if(in_array(idf_escape($z),$N))unset($Bg[$z]);}if($_POST["export"]){cookie("adminer_import","output=".urlencode($_POST["output"])."&format=".urlencode($_POST["format"]));dump_headers($b);$c->dumpTable($b,"");if(!is_array($_POST["check"])||$Bg===array())$I="SELECT $wc$Sg$zc";else{$yg=array();foreach($_POST["check"]as$X)$yg[]="(SELECT".limit($wc,"\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$o).$zc,1).")";$I=implode(" UNION ALL ",$yg);}$c->dumpData($b,"table",$I);exit;}if(!$c->selectEmailProcess($Z,$q)){if($_POST["save"]||$_POST["delete"]){$J=true;$na=0;$P=array();if(!$_POST["delete"]){foreach($e +as$F=>$X){$X=process_input($o[$F]);if($X!==null&&($_POST["clone"]||$X!==false))$P[idf_escape($F)]=($X!==false?$X:idf_escape($F));}}if($_POST["delete"]||$P){if($_POST["clone"])$I="INTO ".table($b)." (".implode(", ",array_keys($P)).")\nSELECT ".implode(", ",$P)."\nFROM ".table($b);if($_POST["all"]||($Bg===array()&&is_array($_POST["check"]))||$Wc){$J=($_POST["delete"]?$l->delete($b,$Sg):($_POST["clone"]?queries("INSERT $I$Sg"):$l->update($b,$P,$Sg)));$na=$g->affected_rows;}else{foreach((array)$_POST["check"]as$X){$Rg="\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($X,$o);$J=($_POST["delete"]?$l->delete($b,$Rg,1):($_POST["clone"]?queries("INSERT".limit1($I,$Rg)):$l->update($b,$P,$Rg)));if(!$J)break;$na+=$g->affected_rows;}}}$D=lang(219,$na);if($_POST["clone"]&&$J&&$na==1){$jd=last_id();if($jd)$D=lang(150," $jd");}queries_redirect(remove_from_uri($_POST["all"]&&$_POST["delete"]?"page":""),$D,$J);if(!$_POST["delete"]){edit_form($b,$o,(array)$_POST["fields"],!$_POST["clone"]);page_footer();exit;}}elseif(!$_POST["import"]){if(!$_POST["val"])$m=lang(220);else{$J=true;$na=0;foreach($_POST["val"]as$_g=>$L){$P=array();foreach($L +as$z=>$X){$z=bracket_escape($z,1);$P[idf_escape($z)]=(preg_match('~char|text~',$o[$z]["type"])||$X!=""?$c->processInput($o[$z],$X):"NULL");}$J=$l->update($b,$P," WHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($_g,$o),!($Wc||$Bg===array())," ");if(!$J)break;$na+=$g->affected_rows;}queries_redirect(remove_from_uri(),lang(219,$na),$J);}}elseif(!is_string($mc=get_file("csv_file",true)))$m=upload_error($mc);elseif(!preg_match('~~u',$mc))$m=lang(221);else{cookie("adminer_import","output=".urlencode($ma["output"])."&format=".urlencode($_POST["separator"]));$J=true;$Ya=array_keys($o);preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~',$mc,$vd);$na=count($vd[0]);$l->begin();$wf=($_POST["separator"]=="csv"?",":($_POST["separator"]=="tsv"?"\t":";"));$M=array();foreach($vd[0]as$z=>$X){preg_match_all("~((?>\"[^\"]*\")+|[^$wf]*)$wf~",$X.$wf,$wd);if(!$z&&!array_diff($wd[1],$Ya)){$Ya=$wd[1];$na--;}else{$P=array();foreach($wd[1]as$v=>$Ua)$P[idf_escape($Ya[$v])]=($Ua==""&&$o[$Ya[$v]]["null"]?"NULL":q(str_replace('""','"',preg_replace('~^"|"$~','',$Ua))));$M[]=$P;}}$J=(!$M||$l->insertUpdate($b,$M,$Le));if($J)$l->commit();queries_redirect(remove_from_uri("page"),lang(222,$na),$J);$l->rollback();}}}$Sf=$c->tableName($R);if(is_ajax()){page_headers();ob_start();}else +page_header(lang(40).": $Sf",$m);$P=null;if(isset($kf["insert"])||!support("table")){$P="";foreach((array)$_GET["where"]as$X){if(count($q[$X["col"]])==1&&($X["op"]=="="||(!$X["op"]&&!preg_match('~[_%]~',$X["val"]))))$P.="&set".urlencode("[".bracket_escape($X["col"])."]")."=".urlencode($X["val"]);}}$c->selectLinks($R,$P);if(!$e&&support("table"))echo"

    ".lang(223).($o?".":": ".error())."\n";else{echo"

    \n","
    ";hidden_fields_get();echo(DB!=""?''.(isset($_GET["ns"])?'':""):"");echo'',"
    \n";$c->selectColumnsPrint($N,$e);$c->selectSearchPrint($Z,$e,$x);$c->selectOrderPrint($he,$e,$x);$c->selectLimitPrint($_);$c->selectLengthPrint($dg);$c->selectActionPrint($x);echo"
    \n";$G=$_GET["page"];if($G=="last"){$vc=$g->result(count_rows($b,$Z,$Wc,$u));$G=floor(max(0,$vc-1)/$_);}$tf=$N;if(!$tf){$tf[]="*";if($Td)$tf[]=$Td;}$ib=convert_fields($e,$o,$N);if($ib)$tf[]=substr($ib,2);$J=$l->select($b,$tf,$Z,$u,$he,$_,$G,true);if(!$J)echo"

    ".error()."\n";else{if($y=="mssql"&&$G)$J->seek($_*$G);$Rb=array();echo"

    \n";$M=array();while($L=$J->fetch_assoc()){if($G&&$y=="oracle")unset($L["RNUM"]);$M[]=$L;}if($_GET["page"]!="last"&&+$_&&$u&&$Wc&&$y=="sql")$vc=$g->result(" SELECT FOUND_ROWS()");if(!$M)echo"

    ".lang(12)."\n";else{$Ba=$c->backwardKeys($b,$Sf);echo"\n","".(!$u&&$N?"":"\n";if(is_ajax()){if($_%2==1&&$G%2==1)odd();ob_end_clean();}foreach($c->rowDescriptions($M,$q)as$E=>$L){$zg=unique_array($M[$E],$x);if(!$zg){$zg=array();foreach($M[$E]as$z=>$X){if(!preg_match('~^(COUNT\\((\\*|(DISTINCT )?`(?:[^`]|``)+`)\\)|(AVG|GROUP_CONCAT|MAX|MIN|SUM)\\(`(?:[^`]|``)+`\\))$~',$z))$zg[$z]=$X;}}$_g="";foreach($zg +as$z=>$X){if(($y=="sql"||$y=="pgsql")&&strlen($X)>64){$z=(strpos($z,'(')?$z:idf_escape($z));$z="MD5(".($y=='sql'&&preg_match("~^utf8_~",$o[$z]["collation"])?$z:"CONVERT($z USING ".charset($g).")").")";$X=md5($X);}$_g.="&".($X!==null?urlencode("where[".bracket_escape($z)."]")."=".urlencode($X):"null%5B%5D=".urlencode($z));}echo"".(!$u&&$N?"":"\n";}if(is_ajax())exit;echo"
    ".lang(224)."");$Kd=array();$xc=array();reset($N);$Xe=1;foreach($M[0]as$z=>$X){if($z!=$Td){$X=$_GET["columns"][key($N)];$n=$o[$N?($X?$X["col"]:current($N)):$z];$F=($n?$c->fieldName($n,$Xe):($X["fun"]?"*":$z));if($F!=""){$Xe++;$Kd[$z]=$F;$d=idf_escape($z);$Hc=remove_from_uri('(order|desc)[^=]*|page').'&order%5B0%5D='.urlencode($z);$xb="&desc%5B0%5D=1";echo'','';echo +apply_sql_function($X["fun"],$F)."";echo"";}$xc[$z]=$X["fun"];next($N);}}$pd=array();if($_GET["modify"]){foreach($M +as$L){foreach($L +as$z=>$X)$pd[$z]=max($pd[$z],min(40,strlen(utf8_decode($X))));}}echo($Ba?"".lang(225):"")."
    ".checkbox("check[]",substr($_g,1),in_array(substr($_g,1),(array)$_POST["check"]),"","this.form['all'].checked = false; formUncheck('all-page');").($Wc||information_schema(DB)?"":" ".lang(226).""));foreach($L +as$z=>$X){if(isset($Kd[$z])){$n=$o[$z];if($X!=""&&(!isset($Rb[$z])||$Rb[$z]!=""))$Rb[$z]=(is_mail($X)?$Kd[$z]:"");$A="";if(preg_match('~blob|bytea|raw|file~',$n["type"])&&$X!="")$A=ME.'download='.urlencode($b).'&field='.urlencode($z).$_g;if(!$A&&$X!==null){foreach((array)$q[$z]as$p){if(count($q[$z])==1||end($p["source"])==$z){$A="";foreach($p["source"]as$v=>$Cf)$A.=where_link($v,$p["target"][$v],$M[$E][$Cf]);$A=($p["db"]!=""?preg_replace('~([?&]db=)[^&]+~','\\1'.urlencode($p["db"]),ME):ME).'select='.urlencode($p["table"]).$A;if(count($p["source"])==1)break;}}}if($z=="COUNT(*)"){$A=ME."select=".urlencode($b);$v=0;foreach((array)$_GET["where"]as$W){if(!array_key_exists($W["col"],$zg))$A.=where_link($v++,$W["col"],$W["val"],$W["op"]);}foreach($zg +as$bd=>$W)$A.=where_link($v++,$bd,$W);}$X=select_value($X,$A,$n,$dg);$Ic=h("val[$_g][".bracket_escape($z)."]");$Y=$_POST["val"][$_g][bracket_escape($z)];$Mb=!is_array($L[$z])&&is_utf8($X)&&$M[$E][$z]==$L[$z]&&!$xc[$z];$cg=preg_match('~text|lob~',$n["type"]);if(($_GET["modify"]&&$Mb)||$Y!==null){$Ac=h($Y!==null?$Y:$L[$z]);echo"".($cg?"":"");}else{$ud=strpos($X,"...");echo"$X";}}}if($Ba)echo"";$c->backwardKeysPrint($Ba,$M[$E]);echo"
    \n";}if(($M||$G)&&!is_ajax()){$bc=true;if($_GET["page"]!="last"){if(!+$_)$vc=count($M);elseif($y!="sql"||!$Wc){$vc=($Wc?false:found_rows($R,$Z));if($vc$_||$G)){echo"

    ";$yd=($vc===false?$G+(count($M)>=$_?2:1):floor(($vc-1)/$_));if($y!="simpledb"){echo'".lang(228).":",pagination(0,$G).($G>5?" ...":"");for($v=max(1,$G-4);$v0){echo($G+5<$yd?" ...":""),($bc&&$vc!==false?pagination($yd,$G):" ".lang(229)."");}echo(($vc===false?count($M)+1:$vc-$G*$_)>$_?' '.lang(231).'':'');}else{echo +lang(228).":",pagination(0,$G).($G>1?" ...":""),($G?pagination($G,$G):""),($yd>$G?pagination($G+1,$G).($yd>$G+1?" ...":""):"");}}echo"

    \n",($vc!==false?"(".($bc?"":"~ ").lang(132,$vc).") ":"");$Bb=($bc?"":"~ ").$vc;echo +checkbox("all",1,0,lang(232),"var checked = formChecked(this, /check/); selectCount('selected', this.checked ? '$Bb' : checked); selectCount('selected2', this.checked || !checked ? '$Bb' : checked);")."\n";if($c->selectCommandPrint()){echo'',lang(224),'

    + +
    +
    ',lang(110),'
    + + + +
    +';}$tc=$c->dumpFormat();foreach((array)$_GET["columns"]as$d){if($d["fun"]){unset($tc['sql']);break;}}if($tc){print_fieldset("export",lang(61)." ");$qe=$c->dumpOutput();echo($qe?html_select("output",$qe,$ma["output"])." ":""),html_select("format",$tc,$ma["format"])," \n","\n";}echo(!$u&&$N?"":"\n");}if($c->selectImportPrint()){print_fieldset("import",lang(60),!$M);echo" ",html_select("separator",array("csv"=>"CSV,","csv;"=>"CSV;","tsv"=>"TSV"),$ma["format"],1);echo" ","\n";}$c->selectEmailPrint(array_filter($Rb,'strlen'),$e);echo"

    \n","
    \n";}}if(is_ajax()){ob_end_clean();exit;}}elseif(isset($_GET["variables"])){$Gf=isset($_GET["status"]);page_header($Gf?lang(102):lang(101));$Lg=($Gf?show_status():show_variables());if(!$Lg)echo"

    ".lang(12)."\n";else{echo"\n";foreach($Lg +as$z=>$X){echo"","
    ".h($z)."","".nbsp($X);}echo"
    \n";}}elseif(isset($_GET["script"])){header("Content-Type: text/javascript; charset=utf-8");if($_GET["script"]=="db"){$Pf=array("Data_length"=>0,"Index_length"=>0,"Data_free"=>0);foreach(table_status()as$F=>$R){json_row("Comment-$F",nbsp($R["Comment"]));if(!is_view($R)){foreach(array("Engine","Collation")as$z)json_row("$z-$F",nbsp($R[$z]));foreach($Pf+array("Auto_increment"=>0,"Rows"=>0)as$z=>$X){if($R[$z]!=""){$X=format_number($R[$z]);json_row("$z-$F",($z=="Rows"&&$X&&$R["Engine"]==($Ef=="pgsql"?"table":"InnoDB")?"~ $X":$X));if(isset($Pf[$z]))$Pf[$z]+=($R["Engine"]!="InnoDB"||$z!="Data_free"?$R[$z]:0);}elseif(array_key_exists($z,$R))json_row("$z-$F");}}}foreach($Pf +as$z=>$X)json_row("sum-$z",format_number($X));json_row("");}elseif($_GET["script"]=="kill")$g->query("KILL ".number($_POST["kill"]));else{foreach(count_tables($c->databases())as$k=>$X){json_row("tables-$k",$X);json_row("size-$k",db_size($k));}json_row("");}exit;}else{$Xf=array_merge((array)$_POST["tables"],(array)$_POST["views"]);if($Xf&&!$m&&!$_POST["search"]){$J=true;$D="";if($y=="sql"&&count($_POST["tables"])>1&&($_POST["drop"]||$_POST["truncate"]||$_POST["copy"]))queries("SET foreign_key_checks = 0");if($_POST["truncate"]){if($_POST["tables"])$J=truncate_tables($_POST["tables"]);$D=lang(233);}elseif($_POST["move"]){$J=move_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D=lang(234);}elseif($_POST["copy"]){$J=copy_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$D=lang(235);}elseif($_POST["drop"]){if($_POST["views"])$J=drop_views($_POST["views"]);if($J&&$_POST["tables"])$J=drop_tables($_POST["tables"]);$D=lang(236);}elseif($y!="sql"){$J=($y=="sqlite"?queries("VACUUM"):apply_queries("VACUUM".($_POST["optimize"]?"":" ANALYZE"),$_POST["tables"]));$D=lang(237);}elseif(!$_POST["tables"])$D=lang(9);elseif($J=queries(($_POST["optimize"]?"OPTIMIZE":($_POST["check"]?"CHECK":($_POST["repair"]?"REPAIR":"ANALYZE")))." TABLE ".implode(", ",array_map('idf_escape',$_POST["tables"])))){while($L=$J->fetch_assoc())$D.="".h($L["Table"]).": ".h($L["Msg_text"])."
    ";}queries_redirect(substr(ME,0,-1),$D,$J);}page_header(($_GET["ns"]==""?lang(31).": ".h(DB):lang(238).": ".h($_GET["ns"])),$m,true);if($c->homepage()){if($_GET["ns"]!==""){echo"

    ".lang(239)."

    \n";$Wf=tables_list();if(!$Wf)echo"

    ".lang(9)."\n";else{echo"

    \n";if(support("table")){echo"
    ".lang(240)."
    "," \n","
    \n";if($_POST["search"]&&$_POST["query"]!="")search_tables();}echo"\n",'\n";$S=0;foreach($Wf +as$F=>$U){$Ng=($U!==null&&!preg_match('~table~i',$U));echo'
    ';$Cb=doc_link(array('sql'=>'show-table-status.html'));echo''.lang(113),''.lang(241).doc_link(array('sql'=>'storage-engines.html')),''.lang(106).doc_link(array('sql'=>'charset-mysql.html')),''.lang(242).$Cb,''.lang(243).$Cb,''.lang(244).$Cb,''.lang(52).doc_link(array('sql'=>'example-auto-increment.html')),''.lang(245).$Cb,(support("comment")?''.lang(91).$Cb:''),"
    '.checkbox(($Ng?"views[]":"tables[]"),$F,in_array($F,$Xf,true),"","formUncheck('check-all');"),''.(support("table")||support("indexes")?''.h($F).'':h($F));if($Ng){echo''.(preg_match('~materialized~i',$U)?lang(246):lang(112)).'','?';}else{foreach(array("Engine"=>array(),"Collation"=>array(),"Data_length"=>array("create",lang(37)),"Index_length"=>array("indexes",lang(116)),"Data_free"=>array("edit",lang(38)),"Auto_increment"=>array("auto_increment=1&create",lang(37)),"Rows"=>array("select",lang(34)),)as$z=>$A){$Ic=" id='$z-".h($F)."'";echo($A?"".(support("table")||$z=="Rows"||(support("indexes")&&$z!="Data_length")?"?":"?"):" ");}$S++;}echo(support("comment")?" ":"");}echo"
     ".lang(217,count($Wf)),"".nbsp($y=="sql"?$g->result("SELECT @@storage_engine"):""),"".nbsp(db_collation(DB,collations()));foreach(array("Data_length","Index_length","Data_free")as$z)echo" ";echo"
    \n";if(!information_schema(DB)){$Jg=" ";$ee=" ";echo"
    ".lang(110)."
    ".($y=="sqlite"?$Jg:($y=="pgsql"?$Jg.$ee:($y=="sql"?" ".$ee." "." ":"")))." "."\n";$j=(support("scheme")?$c->schemas():$c->databases());if(count($j)!=1&&$y!="sqlite"){$k=(isset($_POST["target"])?$_POST["target"]:(support("scheme")?$_GET["ns"]:DB));echo"

    ".lang(253).": ",($j?html_select("target",$j,$k):'')," ",(support("copy")?" ":""),"\n";}echo"\n";echo"\n","

    \n";}echo"
    \n","\n";}echo'

    ".lang(126)."

    \n";$of=routines();if($of){echo"\n",'\n";odd('');foreach($of +as$L){echo'','
    '.lang(164).''.lang(87).''.lang(200)." 
    '.h($L["ROUTINE_NAME"]).'',''.h($L["ROUTINE_TYPE"]),''.h($L["DTD_IDENTIFIER"]),''.lang(119)."";}echo"
    \n";}echo'

    ".lang(127)."

    \n";$M=get_rows("SHOW EVENTS");if($M){echo"\n","\n";foreach($M +as$L){echo"","
    ".lang(164)."".lang(257)."".lang(189)."".lang(190)."
    ".h($L["Name"]),"".($L["Execute at"]?lang(258)."".$L["Execute at"]:lang(191)." ".$L["Interval value"]." ".$L["Interval field"]."$L[Starts]"),"$L[Ends]",''.lang(119).'';}echo"
    \n";$Zb=$g->result("SELECT @@event_scheduler");if($Zb&&$Zb!="ON")echo"

    event_scheduler: ".h($Zb)."\n";}echo'

    diff --git a/install/backup.php b/install/backup.php index 0d8672be73..57c92bd8c1 100644 --- a/install/backup.php +++ b/install/backup.php @@ -68,7 +68,7 @@ $bakcup_name = 'backup-' . jeedom::version() . '-' . date("Y-m-d-H\hi") . '.tar.gz'; echo __('Sauvegarde des fichiers...', __FILE__); - $exclude = array('tmp', 'backup', 'log', 'ngrok', str_replace('/', '', jeedom::getCurrentSysInfoFolder()), str_replace('/', '', jeedom::getCurrentSqlBuddyFolder())); + $exclude = array('tmp', 'backup', 'log', 'ngrok', str_replace('/', '', jeedom::getCurrentSysInfoFolder()), str_replace('/', '', jeedom::getCurrentAdminerFolder())); if (strpos('/', config::byKey('backup::path')) === false) { $exclude[] = config::byKey('backup::path'); } diff --git a/install/install.php b/install/install.php index c5976cd6d5..c3f5915f01 100644 --- a/install/install.php +++ b/install/install.php @@ -136,10 +136,13 @@ rrmdir($cibDir); } echo __("OK\n", __FILE__); - echo __("Nettoyage sqlbuddy en cours...", __FILE__); + echo __("Nettoyage adminer en cours...", __FILE__); foreach (ls(dirname(__FILE__) . '/../', 'sqlbuddy*') as $file) { @rrmdir(dirname(__FILE__) . '/../' . $file); } + foreach (ls(dirname(__FILE__) . '/../', 'adminer*') as $file) { + @rrmdir(dirname(__FILE__) . '/../' . $file); + } echo __("OK\n", __FILE__); echo __("Nettoyage sysinfo en cours...", __FILE__); foreach (ls(dirname(__FILE__) . '/../', 'sysinfo*') as $file) { @@ -168,8 +171,8 @@ rrmdir($cibDir); unlink($tmp); echo __("OK\n", __FILE__); - echo __("Renommage sqlbuddy en cours...", __FILE__); - jeedom::renameSqlBuddyFolder(); + echo __("Renommage adminer en cours...", __FILE__); + jeedom::renameAdminerFolder(); echo __("OK\n", __FILE__); echo __("Renommage sysinfo en cours...", __FILE__); jeedom::renameSysInfoFolder(); diff --git a/sqlbuddy2986dsfez893qs2df/LICENSE b/sqlbuddy2986dsfez893qs2df/LICENSE deleted file mode 100644 index c999e6d2c3..0000000000 --- a/sqlbuddy2986dsfez893qs2df/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2008 Calvin Lough - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/README b/sqlbuddy2986dsfez893qs2df/README deleted file mode 100644 index cefea7d361..0000000000 --- a/sqlbuddy2986dsfez893qs2df/README +++ /dev/null @@ -1,51 +0,0 @@ -SQL Buddy - Web based MySQL administration -http://www.sqlbuddy.com/ - -2008 Calvin Lough - -INTRODUCTION - -SQL Buddy is open source! Use of the application is governed by -a MIT license - see LICENSE file for details. - -CHANGELOG - -A list of changes made in this version is available online -at http://www.sqlbuddy.com/releasenotes/ - -INSTALLATION - -To start using SQL Buddy take the folder of unzipped files and -ftp them to your server. I would recommend placing them in a -folder such as http://www.yourserver.com/sqlbuddy/. But in -reality, it shouldn't matter where you put them or what you call -the folder. - -If you are interested, there is a few variables in config.php that you -can change if you want to customize your installation. It is totally -optional, and your setup will work just fine if you leave the values at -their defaults. - -UPGRADING - -To upgrade SQL Buddy, its probably best to delete the old version then -unzip the new version in its place. - -KEYBOARD SHORTCUTS - -There is a bunch of keyboard shortcuts available to speed up things like -navigating through results, editing rows, etc. A list of shortcuts is -available on the home tab after you login. If you find the shortcuts -annoying and would like to disable them, there is a line in main.js that you -can disable. Its about 50 lines down, and I have left a comment indicating -which line you need to comment out. - -HELP - -If you need help, first check http://www.sqlbuddy.com/help/ - -A forum is also available at http://groups.google.com/group/sql-buddy/topics - -Thanks for your support, - -Calvin \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/ajaxcreatetable.php b/sqlbuddy2986dsfez893qs2df/ajaxcreatetable.php deleted file mode 100644 index 12f6ffb3ae..0000000000 --- a/sqlbuddy2986dsfez893qs2df/ajaxcreatetable.php +++ /dev/null @@ -1,37 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($_POST['query'])) { - - $queryList = splitQueryText($_POST['query']); - - foreach ($queryList as $query) { - $sql = $conn->query($query) or ($dbError = $conn->error()); - } - - if (isset($dbError)) { - echo $dbError; - } - -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/ajaxfulltext.php b/sqlbuddy2986dsfez893qs2df/ajaxfulltext.php deleted file mode 100644 index eedebbeac9..0000000000 --- a/sqlbuddy2986dsfez893qs2df/ajaxfulltext.php +++ /dev/null @@ -1,64 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($_POST['query'])) { - - $queryList = splitQueryText($_POST['query']); - - foreach ($queryList as $query) { - $sql = $conn->query($query); - } -} - -if ($conn->getAdapter() == "mysql") { - $structureSql = $conn->describeTable($table); - - while ($structureRow = $conn->fetchAssoc($structureSql)) { - $types[$structureRow['Field']] = $structureRow['Type']; - } -} - -if ($conn->isResultSet($sql)) { - - $row = $conn->fetchAssoc($sql); - - foreach ($row as $key => $value) { - echo "
    " . $key . "
    "; - echo "
    "; - - $curtype = $types[$key]; - - if (strpos(" ", $curtype) > 0) { - $curtype = substr($curtype, 0, strpos(" ", $curtype)); - } - - if ($value && isset($binaryDTs) && in_array($curtype, $binaryDTs)) { - echo '(' . __("binary data") . ')'; - } else { - echo nl2br(htmlentities($value, ENT_QUOTES, 'UTF-8')); - } - - echo "
    "; - } -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/ajaximportfile.php b/sqlbuddy2986dsfez893qs2df/ajaximportfile.php deleted file mode 100644 index 816fefeb33..0000000000 --- a/sqlbuddy2986dsfez893qs2df/ajaximportfile.php +++ /dev/null @@ -1,170 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) - $conn->selectDB($db); - -function stripCommentLines($in) { - if (substr($in, 0, 2) == "--") - $in = ''; - - return $in; -} - -if (isset($_POST) || isset($_FILES)) { - - if (isset($_FILES['INPUTFILE']['tmp_name'])) - $file = $_FILES['INPUTFILE']['tmp_name']; - - if (isset($_POST['FORMAT'])) - $format = $_POST['FORMAT']; - - if (!(isset($format) && $format == "CSV")) - $format = "SQL"; - - if (isset($_POST['IGNOREFIRST'])) - $ignoreFirst = $_POST['IGNOREFIRST']; - - $first = true; - - // for csv - if (isset($format) && $format == "CSV" && isset($table)) { - $columnCount = 0; - - $structureSQL = $conn->describeTable($table); - - if ($conn->isResultSet($structureSQL)) { - while ($structureRow = $conn->fetchAssoc($structureSQL)) { - $columnCount++; - } - } - } - - $insertCount = 0; - $skipCount = 0; - - if (isset($file) && is_uploaded_file($file)) { - if (isset($format) && $format == "SQL") { - $lines = file($file); - - // the file() function doesn't handle mac line endings correctly - if (sizeof($lines) == 1 && strpos($lines[0], "\r") > 0) { - $lines = explode("\r", $lines[0]); - } - - $commentFree = array_map("stripCommentLines", $lines); - - $contents = trim(implode('', $commentFree)); - - $statements = splitQueryText($contents); - } else { - $statements = file($file); - - // see previous comment - if (sizeof($statements) == 1 && strpos($statements[0], "\r") > 0) { - $statements = explode("\r", $statements[0]); - } - } - - foreach ($statements as $statement) { - $statement = trim($statement); - - if ($statement) { - if (isset($format) && $format == "SQL") { - $importQuery = $conn->query($statement) or ($dbErrors[] = $conn->error()); - - $affected = (int)($conn->affectedRows($importQuery)); - $insertCount += $affected; - } else if (isset($format) && $format == "CSV" && isset($table)) { - if (!(isset($ignoreFirst) && $first)) { - preg_match_all('/"(([^"]|"")*)"/i', $statement, $matches); - - $rawValues = $matches[1]; - - for ($i=0; $iescapeString($rawValues[$i]); - } - - $values = implode("','", $rawValues); - - // make sure that the counts match up - if (sizeof($rawValues) == $columnCount) { - - if ($conn->getAdapter() == "sqlite") - $importQuery = $conn->query("INSERT INTO '$table' VALUES ('$values')") or ($dbErrors[] = $conn->error()); - else - $importQuery = $conn->query("INSERT INTO `$table` VALUES ('$values')") or ($dbErrors[] = $conn->error()); - - $affected = (int)($conn->affectedRows($importQuery)); - - $insertCount += $affected; - } else { - $skipCount++; - } - } - $first = false; - } - } - } - } - - $message = ""; - - if (!isset($statements)) { - $message .= __("Either the file could not be read or it was empty") . "
    "; - } else if ($format == "SQL") { - $message .= sprintf(__p("%d statement was executed from the file", "%d statements were executed from the file", $insertCount), $insertCount) . ".
    "; - } else if ($format == "CSV") { - if (isset($insertCount) && $insertCount > 0) { - $message .= sprintf(__p("%d row was inserted into the database from the file", "%d rows were inserted into the database from the file", $insertCount), $insertCount) . ".
    "; - } - if (isset($skipCount) && $skipCount > 0) { - $message .= sprintf(__p("%d row had to be skipped because the number of values was incorrect", "%d rows had to be skipped because the number of values was incorrect", $skipCount), $skipCount) . ".
    "; - } - } - - if (isset($dbErrors)) { - $message .= __("The following errors were reported") . ":
    "; - foreach ($dbErrors as $merr) { - $message .= " - " . $merr . "
    "; - } - } - - ?> - - - - - - - - - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/ajaxquery.php b/sqlbuddy2986dsfez893qs2df/ajaxquery.php deleted file mode 100644 index 23ced5703a..0000000000 --- a/sqlbuddy2986dsfez893qs2df/ajaxquery.php +++ /dev/null @@ -1,37 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($_POST['query'])) { - $queryList = splitQueryText($_POST['query']); - - foreach ($queryList as $query) { - $sql = $conn->query($query); - } -} - -//return the first field from the first row -if (!isset($_POST['silent']) && $conn->isResultSet($sql)) { - $row = $conn->fetchArray($sql); - echo nl2br(htmlentities($row[0], ENT_QUOTES, 'UTF-8')); -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/ajaxsavecolumnedit.php b/sqlbuddy2986dsfez893qs2df/ajaxsavecolumnedit.php deleted file mode 100644 index 42a688c556..0000000000 --- a/sqlbuddy2986dsfez893qs2df/ajaxsavecolumnedit.php +++ /dev/null @@ -1,38 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($_POST['runQuery'])) { - $query = $_POST['runQuery']; - - $conn->query($query) or ($dbError = $conn->error()); - - echo "{\n"; - echo " \"formupdate\": \"" . $_GET['form'] . "\",\n"; - echo " \"errormess\": \""; - if (isset($dbError)) - echo $dbError; - echo "\"\n"; - echo '}'; - -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/ajaxsaveedit.php b/sqlbuddy2986dsfez893qs2df/ajaxsaveedit.php deleted file mode 100644 index 69be6d140b..0000000000 --- a/sqlbuddy2986dsfez893qs2df/ajaxsaveedit.php +++ /dev/null @@ -1,128 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) - $conn->selectDB($db); - -if ($_POST && isset($table)) { - - $insertChoice = ""; - - if (isset($_POST['SB_INSERT_CHOICE'])) { - $insertChoice = $_POST['SB_INSERT_CHOICE']; - } - - $structureSql = $conn->describeTable($table); - - if ($conn->getAdapter() == "mysql") { - while ($structureRow = $conn->fetchAssoc($structureSql)) { - $pairs[$structureRow['Field']] = ''; - $types[$structureRow['Field']] = $structureRow['Type']; - $nulls[$structureRow['Field']] = (isset($structureRow['Null'])) ? $structureRow['Null'] : "YES"; - } - } else if ($conn->getAdapter() == "sqlite") { - foreach ($structureRow as $column) { - $pairs[$column[0]] = ''; - } - } - - foreach ($_POST as $key=>$value) { - if ($key != "SB_INSERT_CHOICE") { - if (is_array($value)) { - $value = implode(",", $value); - } - - $pairs[$key] = $conn->escapeString($value); - } - } - - if (isset($pairs)) { - - if ($insertChoice != "INSERT") { - $updates = ""; - - foreach ($pairs as $keyname=>$value) { - if ($conn->getAdapter() == "mysql") { - if (isset($types) && substr($value, 0, 2) == "0x" && isset($binaryDTs) && in_array($types[$keyname], $binaryDTs)) { - $updates .= "`" . $keyname . "`=" . $value . ","; - } else if (!$value && !($value != '' && (int)$value == 0) && $nulls[$keyname] == "YES") { - $updates .= "`" . $keyname . "`=NULL,"; - } else { - $updates .= "`" . $keyname . "`='" . $value . "',"; - } - } - } - - $updates = substr($updates, 0, -1); - - if (isset($_GET['queryPart'])) - $queryPart = $_GET['queryPart']; - else - $queryPart = ""; - - if ($conn->getAdapter() == "mysql") { - $query = "UPDATE `$table` SET " . $updates . " " . $queryPart; - } else if ($conn->getAdapter() == "sqlite") { - $query = "UPDATE '$table' SET " . $updates . " " . $queryPart; - } - - } else { - $columns = ""; - $values = ""; - - foreach ($pairs as $keyname=>$value) { - - if ($conn->getAdapter() == "mysql") { - $columns .= "`" . $keyname . "`,"; - } else if ($conn->getAdapter() == "sqlite") { - $columns .= "'" . $keyname . "',"; - } - - if (isset($types) && substr($value, 0, 2) == "0x" && isset($binaryDTs) && in_array($types[$keyname], $binaryDTs)) { - $values .= $value . ","; - } else { - $values .= "'" . $value . "',"; - } - - } - - $columns = substr($columns, 0, -1); - $values = substr($values, 0, -1); - - if ($conn->getAdapter() == "mysql") { - $query = "INSERT INTO `$table` ($columns) VALUES ($values)"; - } else if ($conn->getAdapter() == "sqlite") { - $query = "INSERT INTO '$table' ($columns) VALUES ($values)"; - } - } - - $conn->query($query) or ($dbError = $conn->error()); - - echo "{\n"; - echo " \"formupdate\": \"" . $_GET['form'] . "\",\n"; - echo " \"errormess\": \""; - if (isset($dbError)) - echo $dbError; - echo "\"\n"; - echo '}'; - - } -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/ajaxsaveuseredit.php b/sqlbuddy2986dsfez893qs2df/ajaxsaveuseredit.php deleted file mode 100644 index 76b024e0d5..0000000000 --- a/sqlbuddy2986dsfez893qs2df/ajaxsaveuseredit.php +++ /dev/null @@ -1,130 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -$conn->selectDB("mysql"); - -function removeAdminPrivs($priv) { - if ($priv == "FILE" || $priv == "PROCESS" || $priv == "RELOAD" || $priv == "SHUTDOWN" || $priv == "SUPER") - return false; - else - return true; -} - -if (isset($_GET['user'])) - $user = $_GET['user']; - -if (isset($_POST['NEWPASS'])) - $newPass = $_POST['NEWPASS']; - -if (isset($_POST['CHOICE'])) - $choice = $_POST['CHOICE']; - -if (isset($_POST['ACCESSLEVEL'])) - $accessLevel = $_POST['ACCESSLEVEL']; -else - $accessLevel = "GLOBAL"; - -if ($accessLevel != "LIMITED") - $accessLevel = "GLOBAL"; - -if (isset($_POST['DBLIST'])) - $dbList = $_POST['DBLIST']; -else - $dbList = array(); - -if (isset($_POST['PRIVILEGES'])) - $privileges = $_POST['PRIVILEGES']; -else - $privileges = array(); - -if (isset($_POST['GRANTOPTION'])) - $grantOption = $_POST['GRANTOPTION']; - -if (isset($user) && ($accessLevel == "GLOBAL" || ($accessLevel == "LIMITED" && sizeof($dbList) > 0))) { - - if ($choice == "ALL") { - $privList = "ALL"; - } else { - if (isset($privileges) && count($privileges) > 0) - $privList = implode(", ", $privileges); - else - $privList = "USAGE"; - - if (sizeof($privileges) > 0) { - if ($accessLevel == "LIMITED") { - $privileges = array_filter($privileges, "removeAdminPrivs"); - } - - $privList = implode(", ", $privileges); - } else { - $privList = "USAGE"; - } - - } - - $split = explode("@", $user); - - if (isset($split[0])) - $name = $split[0]; - - if (isset($split[1])) - $host = $split[1]; - - if (isset($name) && isset($host)) { - $user = "'" . $name . "'@'" . $host . "'"; - - if ($accessLevel == "LIMITED") { - $conn->query("DELETE FROM `db` WHERE `User`='$name' AND `Host`='$host'"); - - foreach ($dbList as $theDb) { - $query = "GRANT " . $privList . " ON `$theDb`.* TO " . $user; - - if (isset($grantOption)) - $query .= " WITH GRANT OPTION"; - - $conn->query($query) or ($dbError = $conn->error()); - } - } else { - $conn->query("REVOKE ALL PRIVILEGES ON *.* FROM " . $user); - $conn->query("REVOKE GRANT OPTION ON *.* FROM " . $user); - - $query = "GRANT " . $privList . " ON *.* TO " . $user; - - if (isset($grantOption)) - $query .= " WITH GRANT OPTION"; - - $conn->query($query) or ($dbError = $conn->error()); - } - - if (isset($newPass)) - $conn->query("SET PASSWORD FOR '$name'@'$host' = PASSWORD('$newPass')") or ($dbError = $conn->error()); - - $conn->query("FLUSH PRIVILEGES") or ($dbError = $conn->error()); - - echo "{\n"; - echo " \"formupdate\": \"" . $_GET['form'] . "\",\n"; - echo " \"errormess\": \""; - if (isset($dbError)) - echo $dbError; - echo "\"\n"; - echo '}'; - } -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/browse.php b/sqlbuddy2986dsfez893qs2df/browse.php deleted file mode 100644 index 99892b4d54..0000000000 --- a/sqlbuddy2986dsfez893qs2df/browse.php +++ /dev/null @@ -1,70 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -requireDatabaseAndTableBeDefined(); - -if (isset($db)) - $conn->selectDB($db); - -//run delete queries - -if (isset($_POST['runQuery'])) { - $runQuery = $_POST['runQuery']; - - $queryList = splitQueryText($runQuery); - foreach ($queryList as $query) { - $conn->query($query); - } -} - -if ($conn->getAdapter() == "sqlite") { - $query = "SELECT * FROM '$table'"; -} else { - $query = "SELECT * FROM `$table`"; -} - -$queryTable = $table; - -if (isset($_POST['s'])) - $start = (int)($_POST['s']); -else - $start = 0; - -if (isset($_POST['sortKey'])) - $sortKey = $_POST['sortKey']; - -if (isset($_POST['sortDir'])) - $sortDir = $_POST['sortDir']; -else if (isset($sortKey)) - $sortDir = "ASC"; - -if (isset($_POST['view']) && $_POST['view'] == "1") - $view = 1; -else - $view = 0; - -if (isset($sortKey) && $sortKey != "" && isset($sortDir) && $sortDir != "") { - $sort = "ORDER BY `" . $sortKey . "` " . $sortDir; -} else { - $sort = ""; -} - -require "includes/browse.php"; - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/config.php b/sqlbuddy2986dsfez893qs2df/config.php deleted file mode 100644 index c36bfd6202..0000000000 --- a/sqlbuddy2986dsfez893qs2df/config.php +++ /dev/null @@ -1,64 +0,0 @@ - - -*/ - - -/* The values below are for the login.php page */ - -$sbconfig['DefaultAdapter'] = "mysql"; -$sbconfig['DefaultHost'] = "localhost"; -$sbconfig['DefaultUser'] = "root"; - -/* -* If you want to enable automatic login, you can include your password below. To -* automatically connect to SQLite, include the filename of the database instead. -* Note: This is generally not recommended because it means that anyone with the -* proper url will have access to your data. It should only be used on machines -* that are not accessible from the internet (local testing boxes) or if you have -* set up some other form of authentication. Use as your own discretion. -*/ - -// MySQL -// $sbconfig['DefaultPass'] = ""; - -// SQLite -// $sbconfig['DefaultDatabase'] = ""; - -/* -* By default, when you view the homepage of your SQL Buddy installation, a check is -* performed to see if a newer version of the application is available. No personal -* information is sent about your installation and the response from the server is sent -* as plain text. If, for some reason, you want to disable this behaviour, set this option -* to true to disable automatic checking for updates. To learn about new versions, you can -* always check the projects website at http://www.sqlbuddy.com/ -*/ - -$sbconfig['EnableUpdateCheck'] = true; - -/* -* This controls how many rows are displayed at once on the browse tab. If you are on a local -* machine or have a fast internet connection, you could increase this value. -*/ - -$sbconfig['RowsPerPage'] = 100; - -/* -* When set to true, the server will attempt to compress all content before it is sent to the -* browser. Although unlikely, there is a chance that using gzip will cause issues on certain setups. -* If you are having trouble getting pages to load properly, you could try disabling gzip. -*/ - -$sbconfig['EnableGzip'] = true; - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/css/common.css b/sqlbuddy2986dsfez893qs2df/css/common.css deleted file mode 100644 index b6345d75a7..0000000000 --- a/sqlbuddy2986dsfez893qs2df/css/common.css +++ /dev/null @@ -1,888 +0,0 @@ -body { -text-align: center; -background: url(../images/initLoad.png) no-repeat 50% 125px; -font: 12px/17px arial, sans-serif; -color: rgb(50, 50, 50); -} - -* { -margin: 0; padding: 0; -} - -table { -border-spacing: 0; -} - -a { -text-decoration: none; -color: #3A6D96; -cursor: pointer; -} -a:hover { -color: rgb(60, 60, 60); -} -a img { -border: 0; -display: block; -} - -p { -margin: 3px 0 5px; -} - -h3 { -font-size: 13px; -} -h4 { -font-size: 13px; -margin: 0 0 5px 0; -border-bottom: 1px solid rgb(220, 220, 220); -} - -ul { -padding-left: 20px; -} - -li { -list-style-type: square; -} - -input, textarea, select { -font-family: arial, sans-serif; -color: rgb(50, 50, 50); -} -.text, textarea { -padding: 1px; -font-size: 13px; -width: 175px; -} -textarea { -height: 80px; -line-height: 15px; -} -select { -font-size: 12px; -} -select[multiple] { -border-color: rgb(195, 195, 195) rgb(235, 235, 235) rgb(225, 225, 225) rgb(215, 215, 215); -border-width: 1px; -border-style: solid; -} -option { -padding: 1px 5px; -} -label { -margin: 0 5px 0 0; -vertical-align: middle; -} -label input { -margin: 0 5px 2px 0; -vertical-align: middle; -} -.inputbutton { -background: url(../images/button.png); -padding: 2px 5px 4px; -font-size: 12px; -line-height: 18px; -width: 60px; -height: 22px; -border: 0; -color: rgb(60, 60, 60); -outline-width: thin; -} -.inputbutton:active { -background: url(../images/button.png) 0 22px; -color: rgb(80, 80, 80); -} - -#headerlogo { -width: 161px; -padding: 10px 15px 2px; -float: left; -} -#headerlogo a { -outline: none; -} -#headerlogo img { -display: inline; -} -#headerinfo { -padding: 7px 18px 0; -width: 175px; -text-align: right; -float: right; -color: white; -} -#headerinfo a { -margin-left: 10px; -outline: none; -} - -#load { -color: rgb(190, 190, 190); -} - -#container { -width: 100%; -line-height: 18px; -text-align: left; -} - -#bottom { -width: 100%; -opacity: 0; -clear: left; -padding-top: 6px; -min-height: 350px; -} -#leftside { -vertical-align: top; -width: 180px; -float: left; -} -#rightside { -vertical-align: top; -margin-left: 180px; -padding: 0 6px 5px 0; -} -#sidemenu { -display: block; -padding: 10px 0 0 5px; -} - -#content { -width: 100%; -} -#innercontent { -padding: 8px 10px 10px; -} - -.grid { -border-width: 1px; -border-style: solid; -border-color: rgb(225, 225, 225) rgb(210, 210, 210) rgb(210, 210, 210) rgb(210, 210, 210); -background: url(../images/schemaHeader.png) top repeat-x; -} - -.gridheader { -height: 18px; -border-bottom: 1px solid rgb(150, 150, 150); -border-right: 1px solid #fff; -overflow: hidden; -} -.gridheaderinner { -padding-left: 1px; -} - -.headertitle { -background: #EEEEEE url(../images/schemaHeader.png) top; -padding: 0 5px 0 6px; -width: 200px; -cursor: pointer; -overflow: hidden; -display: block; -float: left; -color: rgb(90, 90, 90); -} - -.columnresizer { -border-right: 1px solid rgb(255, 255, 255); -border-left: 1px solid rgb(185, 185, 185); -width: 0; -height: 18px; -cursor: ew-resize; -} - -.emptyvoid { -background: #EEEEEE url(../images/schemaHeader.png) top; -height: 16px; -width: 14px; -padding: 1px 4px; -float: left; -border-bottom: 1px solid rgb(150, 150, 150); -border-right: 1px solid rgb(205, 205, 205); -} - -.impotent .headertitle, .impotent .columnresizer { -cursor: default; -} -.nosort .headertitle { -cursor: default; -} - -.browse { -line-height: 17px; -min-width: 100%; -width: 100%; -} -.browse table td { -border-right: 1px solid rgb(200, 200, 200); -vertical-align: top; -} - -.item { -padding: 2px 6px; -width: 200px; -overflow: hidden; -max-height: 16px; -} -.longtext { -width: 300px; -} -.numeric { -width: 150px; -} -.binary { -font-style: italic; -color: #AAAA8F; -} -.structure .headertitle, .structure .item, .dboverview .headertitle, .dboverview .item { -width: 150px; -} - -.leftchecks { -width: 22px; -position: absolute; -overflow: hidden; -border-right: 1px solid rgb(185, 185, 185); -} -.manip { -padding-top: 1px; -vertical-align: top; -height: 19px; -} -.manip:last-child { -border-bottom: 0 !important; -} -.manip dt { -width: 15px; -padding: 0 1px 0 5px; -float: left; -} -.manip dd { -width: 15px; -padding: 2px 0 0 0; -float: left; -} -.manip dd a { -background: url(../images/info.png) no-repeat; -width: 13px; -height: 13px; -display: block; -cursor: default; -} -.manip dd a:hover { -background: url(../images/infoHover.png) no-repeat; -} -.browsetab .leftchecks { -width: 38px; -} - -.withchecks { -margin-left: 22px; -border-left: 1px solid rgb(240, 240, 240); -} -.withinfo { -margin-left: 39px; -} - -.sort { -color: steelblue; -} -.sortasc { -background: url(../images/sortasc.gif) no-repeat right 6px; -margin-right: 1px; -} -.sortdesc { -background: url(../images/sortdesc.gif) no-repeat right 5px; -margin-right: 1px; -} - -.alternator { -border-bottom: 1px solid #f0f0ff; -} -.alternator2 { -background: #f0f0ff; -border-bottom: 1px solid transparent; -} -.highlighted { -background: #F5F5B8 !important; -border-bottom: 1px solid #E5E6AD !important; -} - -.gridscroll { -overflow: auto; -min-height: 21px; -} - -.gridscroll .browse:last-child { -border-bottom: 0 !important; -} - -.browsenav { -width: 100%; -padding: 2px 0 3px; -} -.browsenav td { -color: rgb(125, 125, 125); -} -.browsenav a { -outline: none; -} -.browsenav .options { -padding-left: 7px; -} -.browsenav .options a { -margin: 0 1px; -} -.browsenav .right { -padding-right: 8px; -text-align: right; -} -.browsenav .right a { -padding-left: 10px; -} -.browsenav .paginator { -padding: 0 3px 0 5px; -} -.browsenav .paginator a { -color: rgb(125, 125, 125); -padding-left: 5px; -} -.browsenav .paginator a.selected { -font-weight: bold; -color: rgb(150, 150, 150); -} - -.insert { -margin: 8px 6px; -width: 350px; -} -.insert td { -padding: 1px 6px 0; -} -.insert .inputarea { -padding-bottom: 8px; -} -.insert .text { -width: 325px; -} -.insert textarea { -width: 325px; -} -.insertseperator { -width: 348px; -margin: 12px 5px; -border-bottom: 2px solid #ccc; -} -.insertmessage { -margin: 1px 4px; -padding: 4px 8px; -color: rgb(75, 75, 75); -width: 332px; -} - -.edit { -border-bottom: 1px solid rgb(175, 175, 175); -margin-bottom: 17px; -} -form:last-child .edit { -border-bottom: 0 !important; -} - -.fieldheader { -color: rgb(110, 110, 110); -} -.fieldheader .fieldheadertitle { -width: 345px; -display: block; -float: left; -} -.fieldheader a.fieldclose { -width: 14px; -height: 16px; -padding-right: 4px; -display: block; -float: right; -background: url(../images/close.png) no-repeat 0 1px; -} -.fieldheader a.fieldclose:hover { -background: url(../images/closeHover.png) no-repeat 0 1px; -} -.secondaryheader { -color: rgb(100, 100, 100); -padding-right: 8px !important; -vertical-align: top; -} -.secondaryheader a { -color: rgb(100, 100, 100); -} - -#fieldlist .fieldbox:first-child .fieldclose { -display: none; -} - -.structure .inputbox { -width: 500px; -margin-top: 15px; -} -.structure .secondaryheader { -width: 65px; -} -.structure .grid { -margin-bottom: 15px; -} - -.columnheader { -color: rgb(125, 125, 125); -padding: 3px 0 0 7px; -cursor: pointer; -} -.column .text { -font-size: 12px; -} - -.paneheader { -margin: 7px 0 0; -color: rgb(115, 115, 115); -} -.paneheader a { -color: rgb(115, 115, 115); -} - -.dboverview .column1 { -width: 200px; -} -.dboverview .inputbox { -width: 500px; -} -.dboverview .inputbox .secondaryheader { -width: 80px; -} - -.overview { -margin: 0px 0 5px 0; -border-bottom: 1px solid rgb(220, 220, 220); -padding: 0 0 3px 0; -} -.inputbox .overview td { -padding: 7px 0 3px; -} -.overview .fieldheader { -border-bottom: 1px solid rgb(220, 220, 220); -padding-bottom: 2px; -} -.overview .text, .overview select, .overview option { -width: 135px; -} - -.editcolumn { -margin-left: 4px; -padding: 12px 0; -width: 430px; -} -.editcolumn table { -width: 100%; -} -.editcolumn td { -padding: 1px 6px 0; -} -.editcolumn .inputarea { -padding-bottom: 8px; -} -.editcolumn .text { -width: 325px; -font-size: 12px !important; -} - -.edituser { -margin: 0 0 4px 13px; -padding: 12px 0; -width: 335px; -border-bottom: 1px solid rgb(175, 175, 175); -} -form:last-child .edituser { -border-bottom: 0 !important; -} -.edituser .edit { -border-bottom: 0; -margin-bottom: 0; -} -.edituser .secondaryheader { -width: 110px; -} - -.users { -padding: 5px 7px 7px; -width: 550px; -} -.users .inputbox { -width: 335px; -} -.users .secondaryheader { -width: 110px; -} -.privpane { -background: rgb(240, 240, 240); -padding: 1px 0px 8px 12px; -margin-top: 5px; -} -#dbaccesspane { -padding-top: 5px !important; -} -.privpane td { -padding: 1px 0 !important; -} - -.export { -padding: 7px 7px 5px 14px; -width: 375px; -} -.export h4 { -padding-bottom: 3px; -} -.export .secondaryheader { -width: 110px; -} -.export .message { -color: rgb(100, 100, 100); -line-height: 14px; -} -.export table { -width: 100%; -} -.export td { -padding: 5px 0; -} -.export select { -width: 100%; -} -.export .text { -font-size: 12px; -width: 100px; -} -.exportseperator { -margin: 7px 0; -border-bottom: 1px solid rgb(210, 210, 210); -} -#EXPORTWRAPPER { -padding: 7px; -} -#EXPORTWRAPPER strong { -color: #646464; -} -#EXPORTRESULTS { -width: 100%; -max-width: 100%; -height: 250px; -font-size: 12px; -margin-top: 3px; -} - -.import { -padding: 7px 7px 5px 14px; -width: 350px; -} -.import h4 { -padding-bottom: 3px; -} -.import .secondaryheader { -width: 80px; -} -.import table { -width: 100%; -} -.import td { -padding: 5px 0; -} -.import .text { -font-size: 12px; -width: 100px; -} - -.inputbox { -padding: 0 7px 5px; -} -.inputbox h4 { -margin-bottom: 5px; -padding-bottom: 2px; -} -.inputbox table { -width: 100%; -} -.inputbox td { -padding: 5px 0; -} -.inputbox .text, .inputbox textarea, .inputbox select[multiple] { -font-size: 12px; -} - -.fulltextwin { -position: absolute; -text-align: left; -color: rgb(240, 240, 240); -width: 475px; -} -.fulltextheader { -height: 21px; -} -.fulltextheader td { -padding: 2px 0; -} -.headertl { -width: 19px; -background: url(../images/window-header-left.png) no-repeat; -} -.headertr { -width: 19px; -background: url(../images/window-header-right.png) no-repeat; -} -.headercenter { -background: url(../images/window-header-center.png) repeat-x; -} - -.fulltextheader p { -margin: 0 !important; -padding-left: 2px; -} -.fulltextheader img { -margin-top: 1px; -} -.mainl { -width: 13px; -background: url(../images/window-shadow-left.png) repeat-y; -} -.maincenter { -background: url(../images/window-center.png); -padding: 5px 5px 0 8px; -} -.fulltextcontent { -overflow: auto; -min-height: 100px; -padding-right: 5px; -} -.mainr { -width: 13px; -background: url(../images/window-shadow-right.png) repeat-y; -} -.fulltexttitle { -color: rgb(175, 175, 175); -font-weight: bold; -} -.fulltextbody { -margin-bottom: 10px; -line-height: 15px; -} -.fulltextfooter { -width: 100%; -} -.fulltextfooter td { -height: 19px; -} -.footerbl { -width: 15px; -background: url(../images/window-shadow-bottom-left.png) no-repeat -1px; -} -.footerbr { -width: 15px; -background: url(../images/window-shadow-bottom-right.png) no-repeat; -} -.footermiddle { -width: auto; -background: url(../images/window-shadow-bottom.png) repeat-x; -} - -.dialog { -width: 475px; -} -.dialog .fulltextcontent { -min-height: 25px; -} -.dialog .maincenter { -padding: 5px 2px 0px 8px !important -} -.buttons { -padding: 7px 0 5px; -} -.windowbutton { -background: url(../images/window-button.png); -padding: 3px 5px 4px; -width: 60px; -height: 22px; -border: 0; -color: white; -outline-color: rgb(130, 130, 130); -outline-width: thin; -} -.resizeHandle { -float: right; -margin-bottom: -1px; -} - -#QUERY { -width: 550px; -font-size: 12px; -display: block; -margin: 2px 0 0; -} - -.querybox { -font-family: "courier new"; -background: rgb(90, 90, 90); -padding: 4px 6px 2px; -margin: 10px 0 1px 0; -max-height: 75px; -overflow: auto; -font-weight: normal; -} - -.clearer { -height: 0; -line-height: 0; -clear: both; -} - -#loginform { -margin: 0 auto; -width: 330px; -margin-top: 115px; -} -#loginform .loginspacer { -padding: 13px 18px 13px 14px; -} -#loginform table { -width: 100%; -} -.loginheader { -border-bottom: 1px solid #E1E1E1; -padding-bottom: 8px !important; -float: left; -width: 100%; -margin-bottom: 10px; -} -.loginheader h3 { -font-size: 13px; -float: left; -} -.loginheader a { -float: right; -text-align: right; -} -#loginform td { -padding: 5px 5px; -line-height: 14px; -} -#loginform .field { -width: 85px; -text-align: right; -color: #4A7496; -} -#loginform select { -width: 165px; -} -#loginform .text { -width: 160px; -color: rgb(70, 70, 70); -font-size: 13px; -} -#loginform .errormess { -color: #AA3939; -padding: 0 0 5px; -text-align: center; -} - -.errormessage { -background: rgb(255, 245, 245); -border: 1px solid rgb(230, 210, 210); -padding: 7px 9px; -line-height: 15px; -color: rgb(80, 80, 80); -} -.errormessage strong { -color: #EB4A4A; -display: block; -margin-bottom: 3px; -} -.errormessage p { -margin-bottom: 0; -} -.statusmessage { -padding: 4px 0; -color: rgb(125, 125, 125); -} - -.hometable { -margin: 7px 0 0 10px; -width: 475px; -} -.hometable p { -line-height: 15px; -} -.hometable table td { -padding-top: 7px; -} -.hometable .text { -width: 130px; -} -.hometable select { -width: 135px; -} -.hometable .inputfield { -color: rgb(140, 140, 140); -width: 95px; -padding-right: 7px; -text-align: right; -} - -.keyboardtable { -width: 445px; -margin-top: 7px; -border-right: 1px solid rgb(200, 200, 200); -border-bottom: 1px solid rgb(200, 200, 200); -} -.keyboardtable td, .keyboardtable th { -padding: 1px 10px 1px 5px !important; -border-left: 1px solid rgb(200, 200, 200); -border-top: 1px solid rgb(200, 200, 200); -} -.keyboardtable th { -color: rgb(125, 125, 125); -font-weight: normal; -text-align: left; -} - -dl.information { -width: 200px; -} -dl.information dt { -float: left; -width: 100px; -clear: left; -color: rgb(125, 125, 125); -} -dl.information dd { -float: left; -width: 100px; -} - -.morelink:hover { -text-decoration: underline; -} - -.errorpage { -padding: 6px 10px 3px; -width: 450px; -} -.errorpage h4 { -font-weight: bold; -} - -.goto { -cursor: pointer; -margin-top: 2px; -opacity: 0.7; -float: right; -} -.goto:hover { -opacity: 1; -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/css/navigation.css b/sqlbuddy2986dsfez893qs2df/css/navigation.css deleted file mode 100644 index 9b5d2e69d7..0000000000 --- a/sqlbuddy2986dsfez893qs2df/css/navigation.css +++ /dev/null @@ -1,94 +0,0 @@ -.dblistheader { -padding: 0px 0px 0px 7px; -outline: none; -text-transform: uppercase; -font-size: 10px; -color: rgb(175, 175, 175); -} - -.dblist { -width: 100%; -line-height: 17px; -padding-bottom: 6px; -} -.dblist ul { -padding: 0px; -} -.dblist ul li { -list-style-type: none; -} -.dblist ul li a { -display: block; -outline: none; -border-width: 1px 0 1px 1px; -border-style: solid; -border-color: transparent; -} -.dblist ul li a .menutext { -padding: 1px 6px 0px 0px; -margin-left: 16px; -border: 0; -} -.dblist ul li a .menutoggler { -width: 12px; -height: 14px; -margin: 3px 4px 0px 2px; -float: left; -background: transparent url(../images/closedArrow.png) no-repeat 4px 3px; -} -.dblist ul li a .menuicon { -height: 14px; -margin: 0px 5px 0px 6px; -float: left; -font-size: 10px; -padding-top: 1px; -} -.dblist ul li.expanded a .menutoggler{ -background: transparent url(../images/openArrow.png) no-repeat 3px 3px; -} -.dblist ul li.expanded .sublist { -display: block; -} - -.sublist { -border: 0px !important; -overflow: hidden; -} -.sublist li a { -padding: 1px 6px 0px 22px !important; -margin-left: 7px; -overflow-x: hidden; -} -.sublist li.loading a { -background: url(../images/loading.gif) no-repeat 0 0 !important; -} -.subcount { -padding-left: 5px; -font-size: 11px; -} - -#toptabs { -padding-top: 7px; -float: left; -} -#toptabs ul { -padding: 0; -} -#toptabs ul li { -list-style-type: none; -float: left; -} -#toptabs ul li a { -margin: 0 5px 0 15px; -outline: none; -} -#toptabs ul li a .rowcount { -font-weight: normal; -padding-left: 3px; -} -#toptabs ul li.selected a { -cursor: default; -} -#toptabs ul li.deactivated a { -cursor: default; -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/css/print.css b/sqlbuddy2986dsfez893qs2df/css/print.css deleted file mode 100644 index 38d77463fd..0000000000 --- a/sqlbuddy2986dsfez893qs2df/css/print.css +++ /dev/null @@ -1,27 +0,0 @@ -#header { -display: none; -} - -.inputbutton, .inputbutton:active { -background: default !important; -border: default !important; -line-height: inherit !important; -width: auto !important; -height: auto !important; -} - -#innercontent a { -color: #3A6D96 !important; -} - -.leftchecks, .emptyvoid { -display: none !important; -} -.gridscroll, .gridheader { -max-height: none !important; -max-width: none !important; -overflow: none !important; -} -.withinfo, .withchecks { -margin-left: 0 !important; -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/dboverview.php b/sqlbuddy2986dsfez893qs2df/dboverview.php deleted file mode 100644 index f9cdf98581..0000000000 --- a/sqlbuddy2986dsfez893qs2df/dboverview.php +++ /dev/null @@ -1,577 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) { - -$conn->selectDB($db); - -//run delete queries - -if (isset($_POST['runQuery'])) { - - $runQuery = $_POST['runQuery']; - - $queryList = splitQueryText($runQuery); - - foreach ($queryList as $query) { - $query = trim($query); - - if ($query != "") { - $conn->query($query) or ($dbError = $conn->error()); - - // make a list of the tables that were dropped/emptied - if (substr($query, 0, 10) == "DROP TABLE") - $droppedList[] = substr($query, 12, -1); - - if (substr($query, 0, 10) == "TRUNCATE `") - $emptiedList[] = substr($query, 10, -1); - - if (substr($query, 0, 13) == "DELETE FROM '") - $emptiedList[] = substr($query, 13, -1); - - } - } -} - -// if tables were dropped, remove them from the side menu -if (isset($droppedList) && isset($db)) { - ?> - - - - - - - - '; - echo __("Error performing operation"); - echo '

    ' . $dbError . '

    '; -} - -?> - - - - -
    - -listTables(); - -if ($conn->isResultSet($tableSql)) { - - echo '
    '; - - echo ''; - echo ''; - echo ''; - echo ''; - echo '
    '; - - echo __("Select") . ':  ' . __("All") . '  ' . __("None") . ''; - echo '     ' . __("With selected") . ':  ' . __("Empty") . '  ' . __("Drop") . ''; - - if ($conn->getAdapter() == "mysql") { - echo '  ' . __("Optimize") . ''; - } - - echo '
    '; - - echo '
    '; - - echo '
     
    '; - - echo '
    '; - echo '
    '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - if (isset($charsetList) && isset($collationList)) { - echo ''; - echo ''; - echo ''; - echo ''; - } else if ($conn->getAdapter() == "mysql") { - echo ''; - echo ''; - } - - echo ''; - echo ''; - echo '
    ' . __("Table") . '
    ' . __("Rows") . '
    ' . __("Charset") . '
    ' . __("Overhead") . '
    ' . __("Overhead") . '
     
    '; - echo '
    '; - echo '
    '; - - echo '
    '; - - $m = 0; - - while ($tableRow = $conn->fetchArray($tableSql)) { - echo '
    '; - } - - echo '
    '; - - $tableSql = $conn->listTables(); - - echo '
    '; - - $m = 0; - - while ($tableRow = $conn->fetchArray($tableSql)) { - - $rowCount = $conn->tableRowCount($tableRow[0]); - - if ($conn->getAdapter() == "mysql") { - $infoSql = $conn->query("SHOW TABLE STATUS LIKE '" . $tableRow[0] . "'"); - $infoRow = $conn->fetchAssoc($infoSql); - - $overhead = $infoRow["Data_free"]; - - $formattedOverhead = ""; - - if ($overhead > 0) - $formattedOverhead = memoryFormat($overhead); - } - - echo '
    '; - echo ''; - echo ''; - echo ''; - echo ''; - - if (isset($collationList) && array_key_exists("Collation", $infoRow)) { - echo ''; - echo ''; - } else if ($conn->getAdapter() == "mysql") { - echo ''; - } - - echo ''; - echo '
    ' . $tableRow[0] . '
    ' . number_format($rowCount) . '
    ' . $collationList[$infoRow['Collation']] . '
    ' . $formattedOverhead . '
    ' . $formattedOverhead . '
    '; - echo '
    '; - - $m++; - } - - echo '
    '; - echo '
    '; - - echo '
    '; - -} - -if ($conn->getAdapter() != "sqlite") { - -?> - -
    -

    - - -
    - -query("SHOW VARIABLES LIKE 'character_set_database'"); - -if ($conn->isResultSet($currentCharSql)) { - $currentChar = $conn->result($currentCharSql, 0, "Value"); -} - -?> - -
    -

    - -
    -
    - - -"; - echo ""; - echo ""; - echo ''; - echo ""; - -?> - -
    "; - echo __("Charset") . ":"; - echo ""; - echo ""; - echo "'; - echo ''; - echo '
    -
    -
    - - - - - -
    -

    - -
    - - - - - - "; - echo ""; - echo ""; - echo ""; - } - - ?> - - - -
    - : - - -
    "; - echo __("Charset") . ":"; - echo ""; - echo ""; - echo "
    - : -
    -
    - -
    - - - - - getAdapter() == "mysql") { - - ?> - - - - - - - - - - - - - - - - - - - - - "; - echo __("Charset") . ":"; - echo ""; - echo ""; - } else { - echo ""; - echo ""; - } - - ?> - - - - - - getAdapter() == "sqlite") { - - ?> - - - - - - - - - - - - - - - - - - - - - - - -
    - <> - -
    - : - - - - : - - -
    - : - - - - : - - -
    - : - - - "; - echo ""; - echo "
    - : - - - - - -
    - : - - - - : - - -
    - : - - - - : - - -
    - : - - -
    - : - - - - getVersion(), "3.0.0", ">=")) { - ?> - - -
    -
    - -
    - - - - - - -
    - " /> - -
    -
    -
    - -
    - -
    - - - - - -
    -

    -

    -
    - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/edit.php b/sqlbuddy2986dsfez893qs2df/edit.php deleted file mode 100644 index 34542f39e0..0000000000 --- a/sqlbuddy2986dsfez893qs2df/edit.php +++ /dev/null @@ -1,210 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -requireDatabaseAndTableBeDefined(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($table)) - $structureSql = $conn->describeTable($table); - -if (isset($_POST['editParts'])) { - $editParts = $_POST['editParts']; - $editParts = explode("; ", $editParts); - - $totalParts = count($editParts); - $counter = 0; - - $firstField = true; - - ?> - - - -
    - - - isResultSet($structureSql) && $conn->getAdapter() == "mysql") { - - $dataSql = $conn->query("SELECT * FROM `" . $table . "` " . $part); - $dataRow = $conn->fetchAssoc($dataSql); - - while ($structureRow = $conn->fetchAssoc($structureSql)) { - - preg_match("/^([a-z]+)(.([0-9]+).)?(.*)?$/", $structureRow['Type'], $matches); - - $curtype = $matches[1]; - $cursizeQuotes = $matches[2]; - $cursize = $matches[3]; - $curextra = $matches[4]; - - echo ''; - echo ''; - echo ''; - echo ''; - echo ' - - - describeTable($table); - - } else if (sizeof($structureSql) > 0 && $conn->getAdapter() == "sqlite") { - - $dataSql = $conn->query("SELECT * FROM '" . $table . "' " . $part); - $dataRow = $conn->fetchAssoc($dataSql); - - foreach ($structureSql as $column) { - - echo ''; - echo ''; - echo ''; - echo ''; - echo ' - - - describeTable($table); - - } - - ?> - - - - - - -
    '; - if ($structureRow['Key'] == 'PRI') echo ''; - echo $structureRow['Field']; - if ($structureRow['Key'] == 'PRI') echo ''; - echo " " . $curtype . $cursizeQuotes . ' ' . $structureRow['Extra'] . '
    '; - - $showLargeEditor[] = "text"; - $showLargeEditor[] = "mediumtext"; - $showLargeEditor[] = "longtext"; - - if (in_array($curtype, $showLargeEditor)) { - echo ''; - } - elseif ($curtype == "enum") { - $trimmed = substr($structureRow['Type'], 6, -2); - $listOptions = explode("','", $trimmed); - echo ''; - } - elseif ($curtype == "set") { - $trimmed = substr($structureRow['Type'], 5, -2); - $listOptions = explode("','", $trimmed); - foreach ($listOptions as $option) { - $id = $option . rand(1, 1000); - echo '
    '; - } - } else { - echo ''; - } - - $firstField = false; - - ?> - -
    '; - if (strpos($column[1], "primary key") > 0) echo ''; - echo $column[0]; - if (strpos($column[1], "primary key") > 0) echo ''; - echo " " . $column[1] . '
    '; - - if (strpos($column[1], "text") !== false) { - echo ''; - } else { - echo ''; - } - - $firstField = false; - - ?> - -
    -
    - -
    - " />   -
    -
    - - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/editcolumn.php b/sqlbuddy2986dsfez893qs2df/editcolumn.php deleted file mode 100644 index 213aa4627d..0000000000 --- a/sqlbuddy2986dsfez893qs2df/editcolumn.php +++ /dev/null @@ -1,189 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -requireDatabaseAndTableBeDefined(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($db)) - $structureSql = $conn->query("SHOW FULL FIELDS FROM `$table`"); - -if (isset($_POST['editParts']) && $conn->isResultSet($structureSql)) { - - $editParts = $_POST['editParts']; - - $editParts = explode("; ", $editParts); - - $totalParts = count($editParts); - $counter = 0; - - $firstField = true; - - ?> - - fetchAssoc($structureSql)) { - if (in_array($structureRow['Field'], $editParts)) { - echo '
    '; - echo '
    '; - echo ''; - echo ''; - - preg_match("/^([a-z]+)(.([0-9]+).)?(.*)?$/", $structureRow['Type'], $matches); - - $curtype = $matches[1]; - $cursizeQuotes = $matches[2]; - $cursize = $matches[3]; - $curextra = $matches[4]; - - ?> - - - - - - - - '; - - ?> - - - - - - - - - - - "; - echo ""; - echo ""; - echo ""; - } - - ?> - - - - - - - - - - -
    - - - value="" style="width: 125px" /> - - - - -
    - - - " style="width: 125px" /> - -
    - - - - - - - -
    "; - echo __("Charset:"); - echo ""; - echo ""; - echo "
    - - - - - -
    - " />   -
    -
    -
    - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/edituser.php b/sqlbuddy2986dsfez893qs2df/edituser.php deleted file mode 100644 index 248b0ee96b..0000000000 --- a/sqlbuddy2986dsfez893qs2df/edituser.php +++ /dev/null @@ -1,254 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -$conn->selectDB("mysql"); - -if (isset($_POST['editParts'])) { - $editParts = $_POST['editParts']; - - $editParts = explode("; ", $editParts); - - $totalParts = count($editParts); - $counter = 0; - - $firstField = true; - - foreach ($editParts as $part) { - $part = trim($part); - - if ($part != "" && $part != ";") { - - list($user, $host) = explode("@", $part); - - $userSQL = $conn->query("SELECT * FROM `user` WHERE `User`='" . $user . "' AND `Host`='" . $host . "'"); - $dbuserSQL = $conn->query("SELECT * FROM `db` WHERE `User`='" . $user . "' AND `Host`='" . $host . "'"); - - if ($conn->isResultSet($userSQL)) { - - $allPrivs = true; - - $dbShowList = array(); - - if ($conn->isResultSet($dbuserSQL)) { - - $accessLevel = "LIMITED"; - - while ($dbuserRow = $conn->fetchAssoc($dbuserSQL)) { - $selectedPrivs = array(); - - $dbShowList[] = $dbuserRow['Db']; - - foreach ($dbuserRow as $key=>$value) { - if (substr($key, -5) == "_priv" && $key != "Grant_priv" && $value == "N") { - $allPrivs = false; - } - - if ($value == "N") - $selectedPrivs[$key] = $value; - } - - if (isset($thePrivList)) { - $thePrivList = array_merge($thePrivList, $selectedPrivs); - } else { - $thePrivList = $dbuserRow; - } - } - } else { - $accessLevel = "GLOBAL"; - - $userRow = $conn->fetchAssoc($userSQL); - - foreach ($userRow as $key=>$value) { - if (substr($key, -5) == "_priv" && $key != "Grant_priv" && $value == "N") { - $allPrivs = false; - } - } - - $thePrivList = $userRow; - } - - echo '
    '; - echo '
    '; - echo ''; - echo ''; - - ?> - - - - - - - - - - listDatabases(); - - if ($conn->isResultSet($dbList)) { - - ?> - - - - - - - - - -
    :
    :
    : -
    - - - - -
    : -
    - - -
    > -
    - -
    - - - - - - - - - - - - - - - - - - - - -
    - - - -
    - - - -
    - - - -
    - - - -
    - -
    -
    -
    - -
    - - - - - - - - - - - - - -
    - - - -
    - - - -
    - - -
    -
    -
    - -
    - - - - - - -
    : - -
    - -
    - " />   -
    -
    -
    - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/export.php b/sqlbuddy2986dsfez893qs2df/export.php deleted file mode 100644 index 5062521869..0000000000 --- a/sqlbuddy2986dsfez893qs2df/export.php +++ /dev/null @@ -1,677 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if ($_POST) { - - $outputBuffer = ""; - - if (isset($db)) { - $dbs[] = $db; - - if (isset($table)) - $tables[] = $table; - else if (isset($_POST['EXPORTTABLE'])) - $tables = $_POST['EXPORTTABLE']; - } else { - if (isset($_POST['EXPORTDB'])) - $dbs = $_POST['EXPORTDB']; - $exportDb = true; - } - - if (isset($_POST['FORMAT'])) - $format = strtoupper($_POST['FORMAT']); - - if (isset($_POST['STRUCTURE'])) - $exportStructure = $_POST['STRUCTURE']; - - if (isset($_POST['DATA'])) - $exportData = $_POST['DATA']; - - if (isset($_POST['DELIMITER'])) - $delimiter = $_POST['DELIMITER']; - - if (isset($_POST['FIELDNAMES'])) - $printFieldnames = $_POST['FIELDNAMES']; - - if (isset($_POST['INSERTTYPE'])) - $insertType = $_POST['INSERTTYPE']; - - if (isset($_POST['OUTPUT'])) - $output = $_POST['OUTPUT']; - - if (isset($_POST['OUTPUTFILETEXT'])) { - $outputFile = "exports/" . basename($_POST['OUTPUTFILETEXT']); - } - - if (!isset($delimiter) || $delimiter == "TAB") - $delimiter = "\t"; - else if ($delimiter == "SEMICOLON") - $delimiter = ";"; - else if ($delimiter == "SPACE") - $delimiter = " "; - else - $delimiter = ","; - - // for the next three - it has to be one or the other - // this way, if we get fed garbage, just go with a default - if (!isset($format) || $format != "CSV") - $format = "SQL"; - - if (!isset($output) || $output != "FILE" || !isset($outputFile)) - $output = "BROWSER"; - - if (!isset($insertType) || $insertType != "COMPLETE") - $insertType = "COMPACT"; - - if (isset($format) && $format == "SQL" && !isset($exportStructure) && !isset($exportData)) { - $error = __("You must export either structure, data, or both") . "."; - } else if (!isset($dbs)) { - $error = __("Please select the databases that you would like to export") . "."; - } else if (isset($db) && !isset($tables)) { - $error = __("Please select the tables that you would like to export") . "."; - } else { - - if ($format == "SQL") { - - $version = $conn->getVersion(); - - $outputBuffer .= "--\r\n"; - - if ($conn->getAdapter() == "mysql") - $outputBuffer .= "-- MySQL " . $version . "\r\n"; - else if ($conn->getAdapter() == "sqlite") - $outputBuffer .= "-- SQLite " . $version . "\r\n"; - - $outputBuffer .= "-- " . date("r") . "\r\n"; - $outputBuffer .= "--\r\n\r\n"; - } - - foreach ($dbs as $d) { - - $conn->selectDB($d); - - // this checks to see if we are exporting an entire db with all tables - if (isset($exportDb) && $exportDb == true) { - - if ($format == "SQL") { - - $outputBuffer .= "CREATE DATABASE `$d`"; - - if ($conn->hasCharsetSupport()) - { - $currentChar = ""; - $currentCharSql = $conn->query("SHOW VARIABLES LIKE 'character_set_database'"); - - if ($conn->isResultSet($currentCharSql)) { - $currentChar = $conn->result($currentCharSql, 0, "Value"); - - $outputBuffer .= " DEFAULT CHARSET " . $currentChar; - } - } - - $outputBuffer .= ";\r\n\r\n"; - - $outputBuffer .= "USE `$d`;\r\n\r\n"; - - } - - $tableSql = $conn->listTables(); - - $tables = ""; - - if ($conn->isResultSet($tableSql)) { - while ($tableRow = $conn->fetchArray($tableSql)) { - $tables[] = $tableRow[0]; - } - } - } - - foreach ($tables as $t) { - - if ($format == "SQL") { - - if ($conn->getAdapter() == "mysql") - $structureSQL = $conn->query("SHOW FULL FIELDS FROM `$t`"); - else - $structureSQL = $conn->describeTable($t); - - $tableEngine = ""; - $tableCharset = ""; - $autoIncrement = ""; - - if (isset($exportStructure)) { - - if ($conn->isResultSet($structureSQL)) { - - if ($conn->getAdapter() == "mysql") { - - $outputBuffer .= "CREATE TABLE `$t` ("; - - $infoSql = $conn->query("SHOW TABLE STATUS LIKE '$t'"); - - if ($conn->isResultSet($infoSql) == 1) { - - $infoRow = $conn->fetchAssoc($infoSql); - - $tableEngine = (array_key_exists("Type", $infoRow)) ? $infoRow['Type'] : $infoRow['Engine']; - - if (array_key_exists('Collation', $infoRow) && isset($collationList)) { - $tableCharset = $collationList[$infoRow['Collation']]; - } - - if (array_key_exists('Auto_increment', $infoRow)) - { - $autoIncrement = $infoRow['Auto_increment']; - } - } - - } else if ($conn->getAdapter() == "sqlite") { - - $outputBuffer .= "CREATE TABLE '$t' ("; - } - - $first = true; - - if ($conn->getAdapter() == "mysql") { - - while ($structureRow = $conn->fetchassoc($structureSQL)) { - - if (!$first) - $outputBuffer .= ","; - - $outputBuffer .= "\r\n `" . $structureRow['Field'] . "` " . $structureRow['Type']; - - if (isset($collationList) && isset($structureRow['Collation']) && $structureRow['Collation'] != "NULL" && !is_null($structureRow['Collation'])) { - if ($collationList[$structureRow['Collation']] != $tableCharset) { - $outputBuffer .= " CHARSET " . $collationList[$structureRow['Collation']]; - } - } - - if (isset($structureRow['Null']) && $structureRow['Null'] != "YES") - $outputBuffer .= " not null"; - - if (isset($structureRow['Default']) && $structureRow['Default'] == "CURRENT_TIMESTAMP") { - $outputBuffer .= " default CURRENT_TIMESTAMP"; - } else if (isset($structureRow['Default']) && $structureRow['Default'] != "") { - $outputBuffer .= " default '" . $structureRow['Default'] . "'"; - } - - if (isset($structureRow['Extra']) && $structureRow['Extra'] != "") - $outputBuffer .= " " . $structureRow['Extra']; - - $first = false; - } - - } else if ($conn->getAdapter() == "sqlite") { - - foreach ($structureSQL as $structureRow) { - - if (!$first) - $outputBuffer .= ","; - - $outputBuffer .= "\r\n " . $structureRow[0] . " " . $structureRow[1]; - - $first = false; - } - - } - - // dont forget about the keys - if ($conn->getAdapter() == "mysql") { - $keySQL = $conn->query("SHOW INDEX FROM `$t`"); - - if ($conn->isResultSet($keySQL)) { - $currentKey = ""; - while ($keyRow = $conn->fetchAssoc($keySQL)) { - // if this is the start of a key - if ($keyRow['Key_name'] != $currentKey) { - // finish off the last key first, if necessary - if ($currentKey != "") - $outputBuffer .= ")"; - - if ($keyRow['Key_name'] == "PRIMARY") - $outputBuffer .= ",\r\n PRIMARY KEY ("; - elseif ($keyRow['Non_unique'] == "0") - $outputBuffer .= ",\r\n UNIQUE KEY ("; - else - $outputBuffer .= ",\r\n KEY `" . $keyRow['Key_name'] . "` ("; - - $outputBuffer .= "`" . $keyRow['Column_name'] . "`"; - } else { - $outputBuffer .= ",`" . $keyRow['Column_name'] . "`"; - } - - $currentKey = $keyRow['Key_name']; - } - - if (isset($currentKey) && $currentKey != "") - $outputBuffer .= ")"; - } - } - - $outputBuffer .= "\r\n)"; - - if ($conn->getAdapter() == "mysql") { - if ($tableEngine) { - $outputBuffer .= ' ENGINE=' . $tableEngine; - } - - if ($tableCharset) { - $outputBuffer .= ' DEFAULT CHARSET=' . $tableCharset; - } - - if ($autoIncrement) - { - $outputBuffer .= ' AUTO_INCREMENT=' . $autoIncrement; - } - } - - $outputBuffer .= ";\r\n\r\n"; - } - } - - if ($conn->getAdapter() == "mysql") - $structureSQL = $conn->query("SHOW FULL FIELDS FROM `$t`"); - else - $structureSQL = $conn->describeTable($t); - - if (isset($exportData)) { - - $columnList = array(); - - if ($conn->getAdapter() == "mysql") { - - $dataSQL = $conn->query("SELECT * FROM `$t`"); - - // put the column names in an array - if ($conn->isResultSet($structureSQL)) { - while ($structureRow = $conn->fetchAssoc($structureSQL)) { - $columnList[] = $structureRow['Field']; - $type[] = $structureRow['Type']; - } - } - - $columnImplosion = implode("`, `", $columnList); - - if ($conn->isResultSet($dataSQL)) { - - if ($insertType == "COMPACT") - $outputBuffer .= "INSERT INTO `$t` (`$columnImplosion`) VALUES \r\n"; - - $firstLine = true; - - while ($dataRow = $conn->fetchAssoc($dataSQL)) { - - if ($insertType == "COMPLETE") { - $outputBuffer .= "INSERT INTO `$t` (`$columnImplosion`) VALUES "; - } else { - if (!$firstLine) - $outputBuffer .= ",\r\n"; - } - - $outputBuffer .= "("; - - $first = true; - - for ($i=0; $iescapeString($currentData) . "'"; - } - - $first = false; - } - - $outputBuffer .= ")"; - - if ($insertType == "COMPLETE") - $outputBuffer .= ";\r\n"; - - $firstLine = false; - - } - - if ($insertType == "COMPACT") - $outputBuffer .= ";\r\n"; - - } else { - $outputBuffer .= "-- [" . sprintf(__("Table `%s` is empty"), $t) . "]\r\n"; - } - - } else if ($conn->getAdapter() == "sqlite") { - - $dataSQL = $conn->query("SELECT * FROM '$t'"); - - // put the column names in an array - if ($conn->isResultSet($structureSQL)) { - foreach ($structureSQL as $structureRow) { - $columnList[] = $structureRow[0]; - $type[] = $structureRow[1]; - } - } - - $columnImplosion = implode("', '", $columnList); - - if ($conn->isResultSet($dataSQL)) { - - $firstLine = true; - - while ($dataRow = $conn->fetchAssoc($dataSQL)) { - - $outputBuffer .= "INSERT INTO '$t' ('$columnImplosion') VALUES ("; - - $first = true; - - for ($i=0; $iescapeString($currentData) . "'"; - - $first = false; - } - - $outputBuffer .= ");\r\n"; - - $firstLine = false; - - } - - } else { - $outputBuffer .= "-- [" . sprintf(__("Table `%s` is empty"), $t) . "]\r\n"; - } - - } - } - - $outputBuffer .= "\r\n"; - - } else if ($format == "CSV") { - - if (isset($printFieldnames)) { - $structureSQL = $conn->describeTable($t); - - if ($conn->isResultSet($structureSQL)) { - $first = true; - - if ($conn->getAdapter() == "mysql") { - - while ($structureRow = $conn->fetchArray($structureSQL)) { - if (!$first) - $outputBuffer .= $delimiter; - - $outputBuffer .= "\"" . $structureRow[0] . "\""; - - $first = false; - } - - } else if ($conn->getAdapter() == "sqlite") { - - foreach ($structureSQL as $structureRow) { - if (!$first) - $outputBuffer .= $delimiter; - - $outputBuffer .= "\"" . $structureRow[0] . "\""; - - $first = false; - } - - } - - $outputBuffer .= "\r\n"; - } - } - - if ($conn->getAdapter() == "mysql") { - $dataSQL = $conn->query("SELECT * FROM `$t`"); - } else if ($conn->getAdapter() == "sqlite") { - $dataSQL = $conn->query("SELECT * FROM '$t'"); - } - - if ($conn->isResultSet($dataSQL)) { - while ($dataRow = $conn->fetchArray($dataSQL)) { - $data = array(); - foreach ($dataRow as $each) { - $data[] = "\"" . formatDataForCSV($each) . "\""; - } - - $dataLine = implode($delimiter, $data); - - $outputBuffer .= $dataLine . "\r\n"; - } - } - - } - - } - - } - - $outputBuffer = trim($outputBuffer); - - if ($outputBuffer) { - if ($output == "BROWSER") { - echo "
    "; - echo "" . __("Results:") . " [" . __("Select all") . "]"; - echo ""; - echo "
    "; - } else { - - if (!$handle = @fopen($outputFile, "w")) { - $error = __("The file could not be opened") . "."; - } else { - if (fwrite($handle, $outputBuffer) === false) { - $error = __("Could not write to file") . "."; - } else { - echo '
    '; - echo __("Successfully wrote content to file") . '. ' . __("Download") . '
    ' . __("Note") . ': ' . __("If this is a public server, you should delete this file from the server after you download it") . '.
    '; - } - } - - @fclose($handle); - - } - } - - } -} - -if (isset($error)) { - echo '
    ' . $error . '
    '; -} - -?> - -
    - -

    - -
    - - - - - - - getAdapter() != "sqlite") { - ?> - - - - - - - - - - - -
    :
      /
    - -
    :
      /
    - -
    : -
    - -
    - -
    '; - - ?> - - > - - - - - getAdapter() == "mysql") { - - ?> - - - - - - - - > - - - - - - - - - - -
    - - - - - - - - - - - - -
    - . -
    : -
    - " style="vertical-align: middle; margin-left: 5px" /> -
    " />
    - - - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/functions.php b/sqlbuddy2986dsfez893qs2df/functions.php deleted file mode 100644 index 62def299c3..0000000000 --- a/sqlbuddy2986dsfez893qs2df/functions.php +++ /dev/null @@ -1,568 +0,0 @@ - - -*/ - -error_reporting(E_ALL); - -if (function_exists('date_default_timezone_set')) - date_default_timezone_set('Greenwich'); - -if (!session_id()) - session_start(); - -define("MAIN_DIR", dirname(__FILE__) . "/"); -define("INCLUDES_DIR", MAIN_DIR . "includes/"); - -include MAIN_DIR . "config.php"; -include INCLUDES_DIR . "types.php"; -include INCLUDES_DIR . "class/GetTextReader.php"; - -if (version_compare(PHP_VERSION, "5.0.0", "<")) - include INCLUDES_DIR . "class/Sql-php4.php"; -else - include INCLUDES_DIR . "class/Sql.php"; - -define("VERSION_NUMBER", "1.3.3"); -define("PREVIEW_CHAR_SIZE", 75); - -$adapterList[] = "mysql"; - -if (function_exists("sqlite_open") || (class_exists("PDO") && in_array("sqlite", PDO::getAvailableDrivers()))) { - $adapterList[] = "sqlite"; -} - -$cookieLength = time() + (60*24*60*60); - -$langList['id_ID'] = "Bahasa Indonesia"; -$langList['ms_ID'] = "Bahasa Melayu"; -$langList['ca_AD'] = "Català"; -$langList['cs_CZ'] = "Čeština"; -$langList['sr_RS'] = "Српски ћирилица"; -$langList['da_DK'] = "Dansk"; -$langList['de_DE'] = "Deutsch"; -$langList['et_EE'] = "Eesti keel"; -$langList['en_US'] = "English"; -$langList['es_ES'] = "Español"; -$langList['es_AR'] = "Español (Argentina)"; -$langList['eo_EO'] = "Esperanto"; -$langList['fr_FR'] = "Français"; -$langList['gl_ES'] = "Galego"; -$langList['hr_HR'] = "Hrvatski"; -$langList['it_IT'] = "Italiano"; -$langList['ko_KR'] = "한국어"; -$langList['lo_LA'] = "Lao"; -$langList['lv_LV'] = "Latviešu"; -$langList['hu_HU'] = "Magyar"; -$langList['nl_NL'] = "Nederlands"; -$langList['no_NO'] = "Norsk"; -$langList['pl_PL'] = "Polski"; -$langList['pt_BR'] = "Português (Brasil)"; -$langList['pt_PT'] = "Português (Portugal)"; -$langList['ru_RU'] = "Русский"; -$langList['ro_RO'] = "Română"; -$langList['sq_AL'] = "Shqip"; -$langList['sk_SK'] = "Slovenčina"; -$langList['sl_SL'] = "Slovenščina"; -$langList['sp_RS'] = "Srpski"; -$langList['fi_FI'] = "Suomi"; -$langList['sv_SE'] = "Svenska"; -$langList['tl_PH'] = "Tagalog"; -$langList['vi_VN'] = "Tiếng Việt"; -$langList['tr_TR'] = "Türkçe"; -$langList['uk_UA'] = "Українська"; -$langList['ar_DZ'] = "العربية"; -$langList['fa_IR'] = "فارسی"; -$langList['he_IL'] = "עִבְרִית"; -$langList['bg_BG'] = "български език"; -$langList['bn_BD'] = "বাংলা"; -$langList['el_GR'] = "ελληνικά"; -$langList['th_TH'] = "ภาษาไทย"; -$langList['zh_CN'] = "中文 (简体)"; -$langList['zh_TW'] = "中文 (繁體)"; -$langList['ja_JP'] = "日本語"; - -if (isset($_COOKIE['sb_lang']) && array_key_exists($_COOKIE['sb_lang'], $langList)) { - $lang = preg_replace("/[^a-z0-9_]/i", "", $_COOKIE['sb_lang']); -} else { - $lang = "en_US"; -} - -if ($lang != "en_US") { - // extend the cookie length - setcookie("sb_lang", $lang, $cookieLength); -} else if (isset($_COOKIE['sb_lang'])) { - // cookie not needed for en_US - setcookie("sb_lang", "", time() - 10000); -} - -$themeList["classic"] = "Classic"; -$themeList["bittersweet"] = "Bittersweet"; - -if (isset($_COOKIE['sb_theme'])) { - $currentTheme = preg_replace("/[^a-z0-9_]/i", "", $_COOKIE['sb_theme']); - - if (array_key_exists($currentTheme, $themeList)) { - $theme = $currentTheme; - - // extend the cookie length - setcookie("sb_theme", $theme, $cookieLength); - } else { - $theme = "bittersweet"; - setcookie("sb_theme", "", time() - 10000); - } -} else { - $theme = "bittersweet"; -} - -$gt = new GetTextReader($lang . ".pot"); - -if (isset($_SESSION['SB_LOGIN_STRING'])) { - $user = (isset($_SESSION['SB_LOGIN_USER'])) ? $_SESSION['SB_LOGIN_USER'] : ""; - $pass = (isset($_SESSION['SB_LOGIN_PASS'])) ? $_SESSION['SB_LOGIN_PASS'] : ""; - $conn = new SQL($_SESSION['SB_LOGIN_STRING'], $user, $pass); -} - -// unique identifer for this session, to validate ajax requests. -// document root is included because it is likely a difficult value -// for potential attackers to guess -$requestKey = substr(md5(session_id() . $_SERVER["DOCUMENT_ROOT"]), 0, 16); - -if (isset($conn) && $conn->isConnected()) { - if (isset($_GET['db'])) - $db = $conn->escapeString($_GET['db']); - - if (isset($_GET['table'])) - $table = $conn->escapeString($_GET['table']); - - if ($conn->hasCharsetSupport()) { - - $charsetSql = $conn->listCharset(); - if ($conn->isResultSet($charsetSql)) { - while ($charsetRow = $conn->fetchAssoc($charsetSql)) { - $charsetList[] = $charsetRow['Charset']; - } - } - - $collationSql = $conn->listCollation(); - if ($conn->isResultSet($collationSql)) { - while ($collationRow = $conn->fetchAssoc($collationSql)) { - $collationList[$collationRow['Collation']] = $collationRow['Charset']; - } - } - } -} - -// undo magic quotes, if necessary -if (get_magic_quotes_gpc()) { - $_GET = stripslashesFromArray($_GET); - $_POST = stripslashesFromArray($_POST); - $_COOKIE = stripslashesFromArray($_COOKIE); - $_REQUEST = stripslashesFromArray($_REQUEST); -} - -function stripslashesFromArray($value) { - $value = is_array($value) ? - array_map('stripslashesFromArray', $value) : - stripslashes($value); - - return $value; -} - -function loginCheck($validateReq = true) { - if (!isset($_SESSION['SB_LOGIN'])){ - if (isset($_GET['ajaxRequest'])) - redirect("login.php?timeout=1"); - else - redirect("login.php"); - exit; - } - if ($validateReq) { - if (!validateRequest()) { - exit; - } - } - - startOutput(); -} - -function redirect($url) { - if (isset($_GET['ajaxRequest']) || headers_sent()) { - global $requestKey; - ?> - - isConnected()) { - $conn->disconnect(); - unset($conn); - } -} - -function outputPage() { - -global $requestKey; -global $sbconfig; -global $conn; -global $lang; - -?> - - - - SQL Buddy - - " media="all" /> - " media="all" /> - " media="print" /> - " media="all" /> - - - - - - - -
    - - -
    - -
    -
    -
      - getAdapter() != "sqlite") { - - ?> -
    • -
    • -
    • -
    • -
    • - -
    • -
    • -
    • -
    • - -
    - -
    -
      -
      -
      -
      - -
      -
      -
      -
      -
      - -
      - -
      -
      - - - - - - -
      -

      -

      -
      - - - -
      -

      -

      -
      - - PREVIEW_CHAR_SIZE) { - $text = utf8_substr($text, 0, PREVIEW_CHAR_SIZE) . " [...]"; - } - return $text; -} - -function formatDataForCSV($text) { - $text = str_replace('"', '""', $text); - return $text; -} - -function splitQueryText($query) { - // the regex needs a trailing semicolon - $query = trim($query); - - if (substr($query, -1) != ";") - $query .= ";"; - - // i spent 3 days figuring out this line - preg_match_all("/(?>[^;']|(''|(?>'([^']|\\')*[^\\\]')))+;/ixU", $query, $matches, PREG_SET_ORDER); - - $querySplit = ""; - - foreach ($matches as $match) { - // get rid of the trailing semicolon - $querySplit[] = substr($match[0], 0, -1); - } - - return $querySplit; -} - -function memoryFormat($bytes) { - if ($bytes < 1024) - $dataString = $bytes . " B"; - else if ($bytes < (1024 * 1024)) - $dataString = round($bytes / 1024) . " KB"; - else if ($bytes < (1024 * 1024 * 1024)) - $dataString = round($bytes / (1024 * 1024)) . " MB"; - else - $dataString = round($bytes / (1024 * 1024 * 1024)) . " GB"; - - return $dataString; -} - -function themeFile($filename) { - global $theme; - return smartCaching("themes/" . $theme . "/" . $filename); -} - -function smartCaching($filename) { - return $filename . "?ver=" . str_replace(".", "_", VERSION_NUMBER); -} - -function __($t) { - global $gt; - return $gt->getTranslation($t); -} - -function __p($singular, $plural, $count) { - global $gt; - if ($count == 1) { - return $gt->getTranslation($singular); - } else { - return $gt->getTranslation($plural); - } -} - -function utf8_substr($str, $from, $len) { -# utf8 substr -# www.yeap.lv - return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'. - '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s', - '$1',$str); -} - -function utf8_strlen($str) { - $i = 0; - $count = 0; - $len = strlen ($str); - while ($i < $len) { - $chr = ord ($str[$i]); - $count++; - $i++; - if ($i >= $len) - break; - - if ($chr & 0x80) { - $chr <<= 1; - while ($chr & 0x80) { - $i++; - $chr <<= 1; - } - } - } - return $count; -} - -function microtime_float() { - list($usec, $sec) = explode(" ", microtime()); - return ((float)$usec + (float)$sec); -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/home.php b/sqlbuddy2986dsfez893qs2df/home.php deleted file mode 100644 index 139befefe2..0000000000 --- a/sqlbuddy2986dsfez893qs2df/home.php +++ /dev/null @@ -1,311 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -?> - - - - - - - - - - - - - -getAdapter() != "sqlite") { - -?> - - - - - - - - - - - - - - - - - - -
      -

      -
      - - getVersion(); - - if ($conn->getAdapter() == "mysql") { - - if (isset($_SESSION['SB_LOGIN_USER']) && $conn->getOptionValue("host")) { - $message = sprintf(__("You are connected to MySQL %s with the user %s."), $dbVersion, $_SESSION['SB_LOGIN_USER'] . "@" . $conn->getOptionValue("host")); - } - - } else if ($conn->getAdapter() == "sqlite") { - $message = sprintf(__("You are connected to %s."), "SQLite " . $dbVersion); - } - - echo "

      " . $message . "

      "; - - ?> - - - 0) { - $content = strip_tags($content); - - list($version, $notes) = explode("\n", $content, 2); - - ?> - - - - - - - - - - - - - -
      - : - - ")) { - echo '' . __("A new version of SQL Buddy is available!") . ' ' . __("Download") . ' »'; - } else { - echo __("There are no updates available") . "."; - } - - ?> -
      - : - - 0) { - - echo ''; - - } - - ?> -
      - : - - -
      - -
      -

      -
      - -
        -
      • -
      • -
      • -
      - -
      -

      -
      - -
      - - - - - - "; - echo ""; - echo ""; - echo ""; - } - - ?> - - - - -
      - : - - -
      "; - echo __("Charset") . ":"; - echo ""; - echo ""; - echo "
      - " /> -
      -
      - -
      -

      -
      - -

      - -
      -

      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      a
      n
      e
      d
      r
      q
      f
      l
      g
      h
      o
      -
      \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/images/button.png b/sqlbuddy2986dsfez893qs2df/images/button.png deleted file mode 100644 index 173885c8779c81d771be6ecedecd90dee2624eec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmV;d0aN~oP)tuizm(uXjkUAQDnocnW6=SJw@@tPftHlbJ?HhRBx~ z4I^1=@eGFGD2jrbrU5ZCoO28SZQF{(I_L285m{?RV`Frd0`_RkkXYmZuq?~oKt$^s zjNjj3Lhq2Gn&e8aj^S`XtQrj1U3?Kvh*Du^|KiYh8;{ zD&heEZ4G_jiw1XH_X2O&vMfbnr)k>Jv|*+0-*_MA0AP#}|2Z zinv^^6u|o_0hVRA3G2H4f=?2`WaN0BpNSo}0RM|841u3+w|hYEh>@EYJFY+!#a^q` z@=(uEc96=3N`f564a(*66UELGsDr@fWY5$JwKE}5pBZDNQaLUbi{~(B9_H=ydc9v% zw&OTlx7%f5KRU1{P9~GNh{xmCQxyR5*zfmMfQP^5k3wjeoJ=NfF?P`^E6rx}q*|?N zwOVZh7RNIhT~Afj_gF0U5DJB^fHMBNOt`)~xEf&6h_k@3?`PcXrQXJG0R{kx8^C0b S$VGAh0000ojGee(qGn==;v5*)`x@KJ#ju<6hbfCZT7xHr=P z#mQJKb|{MCUNjnwgb>8PA=>SBuiNcjLURTa+hagGD~fW2;{7#*+gNm>)9I{YX$jg> z*2&}yQmK^2imTP?ZlO>}vNg(yqczfy*3*F`Nts|U_`7qZQhCnhauQq1X0sA;l#@vy z5Xc}spEBTiUSWB$SiGYzGofPQuz^QA86g}Fhgc5bhu`o2X1^&X?mw-2guZRtAvQDG zj67t$3m}Bze2LF#HF>1$&oI28wVNctjR6 zFmMZlFeAgPITAoY_7YEDSN0n$!c5w_TldK;0)<*UT^vI=t|wcRefqLDd;2@H|NsBb zXOuLq{r4m8g4G6?iLg(Ap zi~RldwfM?ybA8#F5*HY(*`KG|F&<>&kwEgG-c2BJ3~=2TrYxXOC*u(fAzWb`;<%Rm%smQVAuI;Z@s5gX>r-l(oOM6q5>ad z4@&9_>upnR-mq@ZmSe?{`cW-R8R=jC&u!mUb2p%4c~`q(IoHv@bJ~w{Zr}Z4*Sj9? z7~hmT;hTPNs2=q7G&z&d@9XvQM$an4DL!qUrhH4K*ncp-i}f(ySyt%|^b~`qtDnm{ Hr-UW|Iq!b6 diff --git a/sqlbuddy2986dsfez893qs2df/images/info.png b/sqlbuddy2986dsfez893qs2df/images/info.png deleted file mode 100644 index c50b3ebea3a7b168e0177c9898fd3b01406fa55c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@KN#5=*3>6?~a`(b?pa^GyM`SSr z1Gg{;GcwGYBLNg-FY)wsWxv7B$;`;}zAD8VDAeic;uxZFe($8cyoVBaT;c=RIHYTo z53t>A2;?|=wd0qT*$Ix5EIkuMB_2vE_HrNb7ZT`_K5b?HGe!DZ*Q3b_nvBdBZrRyp z&5l=_Djdc1ZQJ|J6P9r8V6;|XzWsb&`M16UrKj$3r~GCL2`uYg(Bb^#pY)2pIjW|c q19X(!E7@+jmQR?Xa<#s8v0(32$s=ZSl4#o+1c=d#Wzp$PyWOI1ez diff --git a/sqlbuddy2986dsfez893qs2df/images/infoHover.png b/sqlbuddy2986dsfez893qs2df/images/infoHover.png deleted file mode 100644 index 2447a6360dd4e0c3f611ed1d7c630fb20a0d55c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@KN#5=*4F5rJ!QSPQfg+p*9+AZi z4BWyX%*Zfnjs#GUy~NYkmHh@ghaj{54b$`k3=E9So-U3d8t11@TG-d@Akem7k7X-g z;lYGgVG9jv8G|Y(u}An{I-b$=oN z{3%Xw4itHRK+=NI{Q={h##>R<(XaS|{;u3XhsD6>72-D0=Vm#*iPDxOX6fBRf^iJW%+|J*4# znMWm@Z*N;4Wuq1O+Uv4O#XNS0```C>%6ZlNaFl3U?^4cs<$$Eww|;we>hZ202In^ihl)mJwlN@2bZ}!)o Q0EQ5Qr>mdKI;Vst0L3Sn>Hq)$ diff --git a/sqlbuddy2986dsfez893qs2df/images/initLoad.png b/sqlbuddy2986dsfez893qs2df/images/initLoad.png deleted file mode 100644 index e6fc9de2a1b0644839eda83a0b7e41fb19e9ba1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5029 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 diff --git a/sqlbuddy2986dsfez893qs2df/images/loading.gif b/sqlbuddy2986dsfez893qs2df/images/loading.gif deleted file mode 100644 index d0bce1542342e912da81a2c260562df172f30d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nnmm28Kh24mmkF0U1e2Nli^nlO|14{Lk&@8WQa67~pE8 zXTZz|lvDgC+Z`3#dv5h=E26FfcG1 zbL_hF&)}42ws10s6^G;;cE1^EoUR)U5A70}d2pLv!jVIT7j&Z~EblI3x0K*v_sV|m z0kj3v921Z^em#l`(k(o@H$3ZdDRc@9NidXDNbqrumReCGv$gd8+e8WW28HVqkJ_9i zH>s*<31KtHjANIPvi2#*6BEu%3Dak5O_t&NBI)H?V$TxT}#l{vOTn5naXTfF^&~Hhq+NX@#Ccc>y7T?;vjI&jdhsDsPJyAw*m0Qz>i}K7# zL9w50Ng{fT}A5JUe8lRK1h7_Y2;BWJDd=c6f&i?Wv5(5q?6|P zQw{>maxZP<537OA37Uk}7@%_$4o$EWe_Zl>&#id|lE-BpDC#+Fn|msJ%_2h{Hg1vP z#N8WAzfWasG}yq|xqE)DrWaOofX=z|?*pgc%{ig5vl!pqDlC|q&~Z0$&Rvsft&VO- z4MZj+%-+Vx%W}v;V76hyp=;+R;x+~t^Q%*xuFTQAF2})fSfTHDAs>sO!OBw`)&)o$ c0!CNZt))x~rAZP^^P&YOFfdqy5)K#u0POD40{{R3 diff --git a/sqlbuddy2986dsfez893qs2df/images/logo.png b/sqlbuddy2986dsfez893qs2df/images/logo.png deleted file mode 100644 index a277b3490d5ce0fa5c7d06ecc09a7014e09db82e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2249 zcmV;)2sZbLP)H>3=x5K;()VI2P&G1SD_B61&siuREScw z?vGadsY;=!YC$3q@S}BOxrLVUk|X0fpgK09AsaiGmra9RKQL?K_3qw%+;+;7e~bLPx<<}P4rL}VqRpAyjk{jbFsV_N`N0aygiNkn^y=o2DJ5>cFp zE+-O+*CdXJjuX)^5$QsY#yP)i(ql=polQhHDRcW5V{Eh8hcDWQ=v5+mpNKvuqGTiz zDNEP)ESP68^mFNTGMPNi7#koW;+#hoEn1WZAiKZ6zkrAW0v3$LV!tvBqf?C8?c2A% z0l>vMKbIB=77m9`0GI~A13*c$?I5DRNU)}9{|tpf@5(XfJh^Mvt^xpA0Bm0(h+}4F zT3T9`0LTU4G$qGVG0$RXSSo03ZLK|Y=+IhC(}EKd69K#3UY?(y{~TkiLqJmP?d>Z7 zlr%InY?1RKk;qj5g=^QYoo;rhudnYkfF%GH0w@NMo$gpH7F#Ouot>S(EiEm5#jK;I zrltzOoJ@0{)`o_LvQ4T|^XAQ40^qA+QeQ)k+ibR%0U(h`T&}FFd;lOX5C}x%yzK1kg#c#FojbS4toYWgTSG#BRtCEO z0Effjk$qKFmHPVnZE_q82Cp?XHd>2|i)RfD4SkPu{uvPk0a$chuM||EYnoPWqLg_= z)J8;let!Nxq%KXo{C z%m83d4I0AY{E^MaIjbaV`e6i-xER?d=gUDtyE?8U{!&t*t91|TUOp5c9o>@+tw z|FWyAt5J^k?c4V@09IF5_kB&%J`%S64WKZUO3jzJ)2C0{0nGOM{d)v$KvmTXbLPw?Qa(C5+6}-`SXh`Th$MoS z68*=T&1Nf;{ne{if8h7~|L`cfB_-89pD*j^(W3)WHZd_VTwY#Y-Daavewqtzi-;KX`N}_7=To1Y3bLWgmF5ZS#51?zeuH0NdU;r&8-?AAD^LV+MurM zgQDo<%1o>TkY%-6f7sU6W^CNJ@w=S!H~^$lDQa$R4gv6{QmLpkq9}?2fcyP^tJCRR zXUd=t08l|e!Sm(-jgF2^0Kob4=a+EK?_}f?;3YF(Z{NN>-~7_+^*RCA6-6ll0K+h} zW5p^W_*17 zBe7=p{{8!x+3of@;c)ocV|B$a48N(mUb}bi-Z3Idi7NSL0IL90sH*y*#9g^^rGDA6 zWvj-=$4^Sx!-o$q*=#m{Q&ZCc##qwKX~AHyyRWaWnK2gOoR5eClPxI0LPS3@<2yP! zjzy!<&rP~J0aOE6Ohjxl?u^A^_W@LJ&eh20W0K1fe!!C>$(fFf~S@c^(A(WjZPj4^d=Y^-U`nl;}NL3}BhOa>TZ zp}TkQ{&DZ#y;}{#h$oZDkvn(poUg5|-3H*5{{H@7bIvtg*F)Xi-Dmpy`!6%bv`{G2 z-PF|dJDbhszj^cKVTrkZ{rcH-Om%hjx{DVt?zwvP>L#;Kkx1ljR#w(h0E+=UFOQQ2 zfCIpEL6$B6n&2&$;IJ_OW3y+^wjV!!{LNLXRvl0j#g)!$nx;K;xm>RS2#L9QqKer7 z=tV_E`oO?|Dr_bI+y@X9wz2@s1W*9LEqqYLk#U>+7!esf2Y?rVVe-`qAPyiX3Rs@F z=Rx4C;$~m~7zYp&SFb7Q7*$n&?{>Qj4a2x@x7%e=rGp0#{_P|Ci)S9^$3i`jL~)dL%ZERm2)1k z*=$|_xOC~#krgXeG>Hu!12FV|1yU>|SM1(2(U+fE77^SW0JAo1*zjU+Z*PO9X(7g# zJ~%k|@wRQ-Y5}|q;Ah}(2ki)BZ4mC0Qi3Z XU#WGJ$kMxV00000NkvXXu0mjf%BMJ1 diff --git a/sqlbuddy2986dsfez893qs2df/images/openArrow.png b/sqlbuddy2986dsfez893qs2df/images/openArrow.png deleted file mode 100644 index a19f2e62ccda80100e67142d25072eef72536547..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^96-#*!3HG%vEKg;;v{*yyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`UEW%7WGOHCk?*N4wJzX3_IIbt}Df(OX`SS7a*%BKV z;_43m_PHgcwe^lojd9(dALkl+BqbyySXf%885tTF7(_(RO5e0$!#=lbXZ1C>|hdB{ww9D_ink5kI(!gDod^(Ix=%Yuc+wsJ139p h|A>ipRuxubV^CbKENf)Af)VH#22WQ%mvv4FO#tZJP?7)u diff --git a/sqlbuddy2986dsfez893qs2df/images/schemaHeader.png b/sqlbuddy2986dsfez893qs2df/images/schemaHeader.png deleted file mode 100644 index e87ddaa8e646cd149fa55728464a7fd53dce7ad1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{R!2~4lWq$AjQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#2D_*jgK)L?MQ5Opwx^3@2*-8Zu8q753Oo%w|M%Yx yEZ88;a_-E6NlA-p!*qWUvMRVHY;O diff --git a/sqlbuddy2986dsfez893qs2df/images/sortdesc.gif b/sqlbuddy2986dsfez893qs2df/images/sortdesc.gif deleted file mode 100644 index d9d7e6a9707ead056679f6d12b6c92ae577c5432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmZ?wbhEHbR N7N2T8H)%!&YXB1XHC6xs diff --git a/sqlbuddy2986dsfez893qs2df/images/transparent.png b/sqlbuddy2986dsfez893qs2df/images/transparent.png deleted file mode 100644 index 6e5e3c1fb3908812f71c2beeaa4e1c2a7319389c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwEg`HKO*PugZ0Z@pe#5JPCIX^cyHLrx>+nH(mfnvO# kE{-7_*OL|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sf4R#q8bF0%K7yE%iD?MEtLn02pongpz*nr1%zSFaw zSxI}IwC!9cKG}DAK>LyaqspxAMf)W=JCFa**zo4}IaT!yQQ4bxxHr#SxQZ_!O))Wa zYVPejXHvTOexF>n%FeZYud~06k8#6p^$)R1pRU&~Hf~e4-Ss6L$dD6%d0cia%Q@}2 ze9I5NEU=oxr~aW_dG9*y<3W~dieTD4V; aL4V8E_zZ(7?yf*bGkCiCxvX<>&kwEgHw>3S>i_Fe4r4or;B3<$Ms|bBcm!d2Bx))wJo(b R7Xl?1JYD@<);T3K0RUmy9Nho_ diff --git a/sqlbuddy2986dsfez893qs2df/images/window-close.png b/sqlbuddy2986dsfez893qs2df/images/window-close.png deleted file mode 100644 index 0b176a81b9d878f56eb9ba236bff0dc1fe0ea78c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2@KN#5=*4F5rJ!QSPQfg+p*9+AZi z4BWyX%*Zfnjs#GUy~NYkmHh?>hmZl+bD#hAK%wWJE{-7@=ci6m%xel1XxU%;bMmcI zY>_H=mNLfXF|~iBe$R1$Nk(Dr~Wv&uGgXo8( zv|PdU4r}YZYa8MwzC5sex4cV@@#by2|1(WK@^aShdS?HX6;l%)yvt6|mToM*7-gI$ zwC2nk*%|g<{9P^Y_%5GVCiPWxhT6G(8apCh$A1bqq+H-rn4@$jFsl0Mgy5wO;*Jro la(8uT#UAKia;+jc)I$ztaD0e0sw<$ge3p~ diff --git a/sqlbuddy2986dsfez893qs2df/images/window-header-center.png b/sqlbuddy2986dsfez893qs2df/images/window-header-center.png deleted file mode 100644 index 3b2687d2c339a7882bf35f3f340c458d0a11cb15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{P!3HGTgIZXC6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS#w!NJX>Axr!#klAC^K&Rj2B+fBlwat=0BocRxOw`j z|5Odbr12x*TF$5B0)(lsEEB^4V1u-K1y(OT(+TVhx&nAg*fs(y3Y%%pn%;xfYzLvO z?b-(5r#>5%iMv;jRl|h~matyg7{=)UM(S`+wLG)jvx#YE*4WFG3(Sy&AzTL1ZpfoM dxpctk`UV5^YU*S<4k!Qs002ovPDHLkV1l+vq@w@; diff --git a/sqlbuddy2986dsfez893qs2df/images/window-header-right.png b/sqlbuddy2986dsfez893qs2df/images/window-header-right.png deleted file mode 100644 index 218a6f317d49b2b1a7d8b762b2354b506dd3b774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmV;X0a^ZuP)7O^S=)l3xJCQ)wTx#fFLC;b*%paV0KG*b*$oI7X~RK=X}?b zZL~W=j0O=Vmsu8%|Fa8#RTHz*v=M9}BN#ioqJ$A*v^_mYyA$SYYpQ@4^cged6lShg zwN)1YBg7=7NR|-XF7WpVm}_Ra_#nvKuyzwb%pkdUYD^CtQIl)hv!h6U0rn!8YykB= QBme*a07*qoM6N<$f~@DJMF0Q* diff --git a/sqlbuddy2986dsfez893qs2df/images/window-resize.png b/sqlbuddy2986dsfez893qs2df/images/window-resize.png deleted file mode 100644 index 0e114893d2b06f3a2d75b2b914c8d77328d7f45a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhY)RhkE)4%caKYZ?lYt_f1s;*b zKvlvZ%*Zfnjs#GUy~NYkmHh?>r?9f>6rR3iKp{6z7sn8Z%f07zb22Chuw4AOLBMe9 z{~(|3V#`*Zb}`TGm(q6IE6 Y_(;l6a7*jo3N(?y)78&qol`;+06CF3)&Kwi diff --git a/sqlbuddy2986dsfez893qs2df/images/window-shadow-bottom-left.png b/sqlbuddy2986dsfez893qs2df/images/window-shadow-bottom-left.png deleted file mode 100644 index 4295b83335301a8024c73225a427d574d6e2ca5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRx!3HE}ruUu)Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#1_uYfg7u4acgul7yFFbTLo80uoph1+umOh)fBdAp z3#NNKugdO@|Nr~p4*MlXk8BiHR-AB1)}N2b!DMAAlfag9QQ~j&XO&MnFY#FUf&9&@ zYtJ);1q(Nnd%a|RpxmY~V@cjTo|8EmW{X;nIh14@v_1OuVE^ULqp4@tM0ltlJD3of z!};Jy#)O-Z9}*-)S4E|KGuv|H9)tK1>t;FDKEA%W59N-YV$7+2#CmW7r}U1ZriAnh uMklw{XE)7O>#1_uYfg8HBJjTS(m>z*!-Ar_}wC*9>eWWdw1{}KnM zibE2+*b4@o(|I-}&Ht7>Q*C^3tWQ;Y;v?((mhajVEBYV*5SS>sgQ@%hTTFv-0aKrY z$4y4|AeMwK!+i~`9S7Jv3c2+BYSHN4)m?bm`5b zi7Bi%_xr6)a1YXokYT-Mz?oUFG4Zepm)E~lIvvdav?8v2(fxm=!|CzwJ@10FCU6xP z>vU`r;BDZ(B6fuFs+h+XrqwrM9!@$i%Y^Mm{|f)x8H}qYUuTJ3-K~0GIfJRVhT)+8 WNzFdgVgM))#%J}e|ZX2MGnWu|m2*>r%lN)&(40sq0cJG}i zp7@`22BVPc1<8*`P1mnFcc4w#fVsTb^nOHrnUavQAyfZ5*8E<+HD~9%yaqIZ!PC{x JWt~$(697^lFxLP8 diff --git a/sqlbuddy2986dsfez893qs2df/images/window-shadow-left.png b/sqlbuddy2986dsfez893qs2df/images/window-shadow-left.png deleted file mode 100644 index 06e2dde9058c8d4edcd3ed64c27d9a29f1943dd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp@K+MR&1|(TERoHiJ>Eal|aXmRDAt9k9Nlhay4ajIr j3S(nqGt)?GPm*I`(PFUU7j}36RLtP%>gTe~DWM4fIn&CbrGnZ!PC{xWt~$(6992_Cx8F| diff --git a/sqlbuddy2986dsfez893qs2df/import.php b/sqlbuddy2986dsfez893qs2df/import.php deleted file mode 100644 index f4789419a1..0000000000 --- a/sqlbuddy2986dsfez893qs2df/import.php +++ /dev/null @@ -1,88 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -?> - -
      - - - -

      - -
      - - - - - - - - - - - - - - - - -
      .
      : - -
      : -
      - -
      - -
      - - - - - - - - - - - - - - - -
      " />
      - -
      - -
      - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/includes/browse.php b/sqlbuddy2986dsfez893qs2df/includes/browse.php deleted file mode 100644 index 33ead330d3..0000000000 --- a/sqlbuddy2986dsfez893qs2df/includes/browse.php +++ /dev/null @@ -1,402 +0,0 @@ - - -*/ - -$totalRows = 0; -$insertCount = 0; -$queryTime = 0; - -$perPage = (isset($sbconfig) && array_key_exists("RowsPerPage", $sbconfig)) ? $sbconfig['RowsPerPage'] : 100; - -$displayLimit = 1000; - -$query = trim($query); - -if ($query) { - - if (!isset($queryTable)) { - $querySplit = splitQueryText($query); - } else { - $querySplit[] = $query; - } - - foreach ($querySplit as $q) { - $q = trim($q, "\n"); - if ($q != "") { - if (isset($queryTable)) { - $totalRows = $conn->tableRowCount($queryTable); - - if ($start > $totalRows) { - $start = 0; - } - - $q = "$q $sort LIMIT $start, $perPage"; - } - - $queryStartTime = microtime_float(); - $dataSql = $conn->query($q) or ($dbError[] = $conn->error()); - $queryFinishTime = microtime_float(); - $queryTime += round($queryFinishTime - $queryStartTime, 4); - - if ($conn->affectedRows($dataSql)) { - $insertCount += (int)($conn->affectedRows($dataSql)); - } - } - } - - if (!isset($queryTable)) { - $totalRows = (int)($conn->rowCount($dataSql)); - - // running rowCount on PDO resets the result set - // so we need to run the query again - if ($conn->getMethod() == "pdo") { - $dataSql = $conn->query($q); - } - } - -} - -//for the browse tab -if (isset($queryTable) && $conn->getAdapter() == "sqlite") { - $structure = $conn->describeTable($queryTable); - - if (sizeof($structure) > 0) { - foreach ($structure as $column) { - if (strpos($column[1], "primary key") > 0) { - $primaryKeys[] = $column[0]; - } - } - } -} else if (isset($queryTable) && $conn->getAdapter() == "mysql") { - $structureSql = $conn->describeTable($queryTable); - - if ($conn->isResultSet($structureSql)) { - while ($structureRow = $conn->fetchAssoc($structureSql)) { - $explosion = explode("(", $structureRow['Type'], 2); - - $tableTypes[] = $explosion[0]; - - if ($structureRow['Key'] == "PRI") { - $primaryKeys[] = $structureRow['Field']; - } - } - } -} - -echo '
      '; - -if (isset($dbError)) { - echo '
      ' . __("The following errors were reported") . ':'; - foreach ($dbError as $error) { - echo $error . "
      "; - } - echo '
      '; -} else { - - if (isset($totalRows) && $totalRows > 0) { - - if (isset($queryTable)) { - - echo ''; - echo ''; - echo ''; - - echo ''; - echo ''; - echo '
      '; - - if (isset($primaryKeys) && count($primaryKeys)) { - - echo __("Select") . ':  ' . __("All") . '  ' . __("None") . ''; - echo '     ' . __("With selected") . ':  ' . __("Edit") . '  ' . __("Delete") . ''; - - echo '       ' . __("Refresh") . ''; - - } else { - echo '[' . __("No primary key defined") . ']'; - } - - echo ''; - - $totalPages = ceil($totalRows / $perPage); - $currentPage = floor($start / $perPage) + 1; - - if ($currentPage > 1) { - echo '' . __("First") . ''; - echo '' . __("Prev") . ''; - } - - echo ''; - - if ($currentPage == 1) { - $startPage = 1; - $finishPage = 3; - - if ($finishPage > $totalPages) - $finishPage = $totalPages; - - } else if ($currentPage == $totalPages) { - $startPage = $totalPages - 2; - $finishPage = $totalPages; - - if ($startPage < 1) - $startPage = 1; - } else { - $startPage = $currentPage - 1; - $finishPage = $currentPage + 1; - } - - if ($startPage != $finishPage) { - for ($bnav=$startPage; $bnav<=$finishPage; $bnav++) { - echo '' . number_format($bnav) . ''; - } - } - - echo ''; - - if ($currentPage < $totalPages) { - echo '' . __("Next") . ''; - echo '' . __("Last") . ''; - } - - echo '
      '; - - } else { - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      '; - - printf(__p("Your query returned %d result.", "Your query returned %d results.", $totalRows), $totalRows); - echo " " . sprintf(__("(%.4f seconds)"), $queryTime); - - if ($totalRows > $displayLimit) - echo ' (' . sprintf(__("Note: To avoid crashing your browser, only the first %d results have been displayed"), $displayLimit) . '.)'; - echo '
      '; - } - - echo '
      '; - - if (isset($primaryKeys) && count($primaryKeys)) { - echo '
       
      '; - } - - echo '
      '; - - echo '
      '; - echo ''; - echo ''; - - if ($conn->isResultSet($dataSql)) { - $dataRow = $conn->fetchAssoc($dataSql); - $g = 0; - $numFields = 0; - - foreach ($dataRow as $key=>$value) { - - if ((isset($sortKey) && $sortKey == $key) && (isset($sortDir) && $sortDir == "ASC")) { - $outputDir = "DESC"; - } elseif (isset($sortKey) && $sortKey == $key) { - $outputDir = "ASC"; - } elseif (isset($sortDir) && $sortDir) { - $outputDir = $sortDir; - } else { - $outputDir = "ASC"; - } - echo ''; - echo ''; - $numFields++; - } - echo ''; - echo ''; - echo '
      '; - - if ((isset($sortKey) && $sortKey == $key) && (isset($sortDir) && $sortDir == "DESC")) { - echo '
      ' . $key . '
      '; - } elseif ((isset($sortKey) && $sortKey == $key) && (isset($sortDir) && $sortDir == "ASC")) { - echo '
      ' . $key . '
      '; - } else { - echo $key; - } - - $fieldList[] = $key; - - echo '
      '; - echo '
       
      '; - - } - - echo '
      '; - echo '
      '; - - $dataSql = $conn->query($q); - - $queryBuilder = ""; - - if (isset($primaryKeys) && count($primaryKeys) > 0) { - - echo '
      '; - - $m = 0; - - while (($dataRow = $conn->fetchAssoc($dataSql)) && ($m < $displayLimit)) { - - $queryBuilder = "WHERE "; - foreach ($primaryKeys as $primary) { - if ($conn->getAdapter() == "sqlite") { - $queryBuilder .= "" . $primary . "='" . $dataRow[$primary] . "' AND "; - } else { - $queryBuilder .= "`" . $primary . "`='" . $dataRow[$primary] . "' AND "; - } - } - $queryBuilder = substr($queryBuilder, 0, -5); - - if ($conn->getAdapter() == "mysql") { - $queryBuilder .= " LIMIT 1"; - } - - echo '
      '; - echo '
      '; - echo '
      '; - echo '
      '; - - $m++; - } - - echo '
      '; - - $dataSql = $conn->query($q); - - } - - if (isset($primaryKeys) && count($primaryKeys)) - echo '
      '; - else - echo '
      '; - - $m = 0; - - while (($dataRow = $conn->fetchArray($dataSql)) && ($m < $displayLimit)) { - - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      '; - - echo ''; - echo ''; - - for ($i=0; $i<$numFields; $i++) { - echo ''; - } - echo ''; - echo '
      '; - - if (isset($tableTypes) && in_array($tableTypes[$i], $binaryDTs)) { - echo '(' . __("binary data") . ')'; - } else if (is_numeric($dataRow[$i]) && stristr($fieldList[$i], "Date") !== false && strlen($dataRow[$i]) > 7 && strlen($dataRow[$i]) < 14) { - echo '' . formatForOutput($dataRow[$i]) . ''; - } else { - echo formatForOutput($dataRow[$i]); - } - - echo '
      '; - echo '
      '; - - $m++; - } - echo '
      '; - echo '
      '; - - ?> - - - - ' . sprintf(__("Your query affected %d rows."), $insertCount) . '
      '; - - if (isset($queryTable) && $queryTable) { - ?> - - - - ' . __("Your query did not return any results.") . " " . sprintf(__("(%.4f seconds)"), $queryTime) . '
      '; - } - } -} - -echo ''; - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/includes/class/GetTextReader.php b/sqlbuddy2986dsfez893qs2df/includes/class/GetTextReader.php deleted file mode 100644 index b63dc7c4ef..0000000000 --- a/sqlbuddy2986dsfez893qs2df/includes/class/GetTextReader.php +++ /dev/null @@ -1,78 +0,0 @@ - - -*/ - -class GetTextReader { - - var $translationIndex = array(); - var $basePath = "locale/"; - - function GetTextReader($inputFile) { - - $msgId = ""; - $msgIdPlural = ""; - $msgStr = ""; - $msgStrPlural = ""; - - $readFile = $this->basePath . $inputFile; - - if (file_exists($readFile)) { - $handle = fopen($readFile, "r"); - if ($handle) { - while (!feof($handle)) - { - $lines[] = trim(fgets($handle, 4096)); - } - fclose($handle); - } - - foreach ($lines as $line) { - if (substr($line, 0, 6) == "msgid:") { - $msgId = substr($line, 8, -1); - $msgStr = ""; - } else if (substr($line, 0, 13) == "msgid_plural:") { - $msgIdPlural = substr($line, 15, -1); - } else if (substr($line, 0, 7) == "msgstr:") { - $msgStr = substr($line, 9, -1); - } else if (substr($line, 0, 10) == "msgstr[0]:") { - $msgStr = substr($line, 12, -1); - } else if (substr($line, 0, 10) == "msgstr[1]:") { - $msgStrPlural = substr($line, 12, -1); - } - - if ($msgId && $msgStr) { - $this->translationIndex[$msgId] = $msgStr; - if ($msgIdPlural) - $this->translationIndex[$msgIdPlural] = $msgStrPlural; - - $msgId = ""; - $msgIdPlural = ""; - $msgStr = ""; - $msgStrPlural = ""; - } - } - } - } - - function getTranslation($lookup) { - if (array_key_exists($lookup, $this->translationIndex)) { - return $this->translationIndex[$lookup]; - } else { - return $lookup; - } - } - -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/includes/class/Sql-php4.php b/sqlbuddy2986dsfez893qs2df/includes/class/Sql-php4.php deleted file mode 100644 index 59cf14eb18..0000000000 --- a/sqlbuddy2986dsfez893qs2df/includes/class/Sql-php4.php +++ /dev/null @@ -1,424 +0,0 @@ - - -*/ - -class SQL { - - var $adapter = ""; - var $method = ""; - var $version = ""; - var $conn = ""; - var $options = ""; - var $errorMessage = ""; - var $db = ""; - - function SQL($connString, $user = "", $pass = "") { - list($this->adapter, $options) = explode(":", $connString, 2); - - if ($this->adapter != "sqlite") { - $this->adapter = "mysql"; - } - - $optionsList = explode(";", $options); - - foreach ($optionsList as $option) { - list($a, $b) = explode("=", $option); - $opt[$a] = $b; - } - - $this->options = $opt; - $database = (array_key_exists("database", $opt)) ? $opt['database'] : ""; - - if ($this->adapter == "sqlite") { - $this->method = "sqlite"; - $this->conn = sqlite_open($database, 0666, $sqliteError); - } else { - $this->method = "mysql"; - $host = (array_key_exists("host", $opt)) ? $opt['host'] : ""; - $this->conn = @mysql_connect($host, $user, $pass); - } - - if ($this->conn && $this->adapter == "mysql") { - $this->query("SET NAMES 'utf8'"); - } - } - - function isConnected() { - return ($this->conn !== false); - } - - function disconnect() { - if ($this->conn) { - if ($this->method == "mysql") { - mysql_close($this->conn); - $this->conn = null; - } else if ($this->method == "sqlite") { - sqlite_close($this->conn); - $this->conn = null; - } - } - } - - function getAdapter() { - return $this->adapter; - } - - function getMethod() { - return $this->method; - } - - function getOptionValue($optKey) { - if (array_key_exists($optKey, $this->options)) { - return $this->options[$optKey]; - } else { - return false; - } - } - - function selectDB($db) { - if ($this->conn) { - - $this->db = $db; - - if ($this->method == "mysql") { - return (mysql_select_db($db)); - } else { - return true; - } - } else { - return false; - } - } - - function query($queryText) { - if ($this->conn) { - if ($this->method == "mysql") { - $queryResult = @mysql_query($queryText, $this->conn); - - if (!$queryResult) { - $this->errorMessage = mysql_error(); - } - - return $queryResult; - } else if ($this->method == "sqlite") { - $queryResult = sqlite_query($this->conn, $queryText); - - if (!$queryResult) { - $this->errorMessage = sqlite_error_string(sqlite_last_error($this->conn)); - } - - return $queryResult; - } - } else { - return false; - } - } - - function rowCount($resultSet) { - if ($this->conn) { - if ($this->method == "mysql") { - return @mysql_num_rows($resultSet); - } else if ($this->method == "sqlite") { - return @sqlite_num_rows($resultSet); - } - } - } - - function isResultSet($resultSet) { - if ($this->conn) { - return ($this->rowCount($resultSet) > 0); - } - } - - function fetchArray($resultSet) { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "mysql") { - return mysql_fetch_row($resultSet); - } else if ($this->method == "sqlite") { - return sqlite_fetch_array($resultSet, SQLITE_NUM); - } - } - } - - function fetchAssoc($resultSet) { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "mysql") { - return mysql_fetch_assoc($resultSet); - } else if ($this->method == "sqlite") { - return sqlite_fetch_array($resultSet, SQLITE_ASSOC); - } - } - } - - function affectedRows($resultSet) { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "mysql") { - return @mysql_affected_rows($resultSet); - } else if ($this->method == "sqlite") { - return sqlite_changes($resultSet); - } - } - } - - function result($resultSet, $targetRow, $targetColumn = "") { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "mysql") { - return mysql_result($resultSet, $targetRow, $targetColumn); - } else if ($this->method == "sqlite") { - return sqlite_column($resultSet, $targetColumn); - } - } - } - - function listDatabases() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW DATABASES"); - } else if ($this->adapter == "sqlite") { - $database = (array_key_exists("database", $this->options)) ? $this->options['database'] : ""; - return $database; - } - } - } - - function listTables() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW TABLES"); - } else if ($this->adapter == "sqlite") { - return $this->query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name"); - } - } - } - - function hasCharsetSupport() - { - if ($this->conn) { - if ($this->adapter == "mysql" && version_compare($this->getVersion(), "4.1", ">")) { - return true; - } else { - return false; - } - } - } - - function listCharset() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW CHARACTER SET"); - } else if ($this->adapter == "sqlite") { - return ""; - } - } - } - - function listCollation() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW COLLATION"); - } else if ($this->adapter == "sqlite") { - return ""; - } - } - } - - function insertId($resultSet = null) { - if ($this->conn) { - if ($this->method == "mysql") { - return mysql_insert_id($resultSet); - } else if ($this->method == "sqlite") { - return sqlite_last_insert_rowid($resultSet); - } - } - } - - function escapeString($toEscape) { - if ($this->conn) { - if ($this->adapter == "mysql") { - return mysql_real_escape_string($toEscape); - } else if ($this->adapter == "sqlite") { - return sqlite_escape_string($toEscape); - } - } - } - - function getVersion() { - if ($this->conn) { - // cache - if ($this->version) { - return $this->version; - } - - if ($this->adapter == "mysql") { - $verSql = mysql_get_server_info(); - $version = explode("-", $verSql); - $this->version = $version[0]; - return $this->version; - } else if ($this->adapter == "sqlite") { - $this->version = sqlite_libversion(); - return $this->version; - } - } - - } - - // returns the number of rows in a table - function tableRowCount($table) { - if ($this->conn) { - if ($this->adapter == "mysql") { - $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table . "`"); - $count = (int)($this->result($countSql, 0, "RowCount")); - return $count; - } else if ($this->adapter == "sqlite") { - $countSql = $this->query("SELECT COUNT(*) AS 'RowCount' FROM '" . $table . "'"); - $count = (int)($this->result($countSql, 0, "RowCount")); - return $count; - } - } - } - - // gets column info for a table - function describeTable($table) { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("DESCRIBE `" . $table . "`"); - } else if ($this->adapter == "sqlite") { - $columnSql = $this->query("SELECT sql FROM sqlite_master where tbl_name = '" . $table . "'"); - $columnInfo = $this->result($columnSql, 0, "sql"); - $columnStart = strpos($columnInfo, '('); - $columns = substr($columnInfo, $columnStart+1, -1); - $columns = split(',[^0-9]', $columns); - - $columnList = array(); - - foreach ($columns as $column) { - $column = trim($column); - $columnSplit = explode(" ", $column, 2); - $columnName = $columnSplit[0]; - $columnType = (sizeof($columnSplit) > 1) ? $columnSplit[1] : ""; - $columnList[] = array($columnName, $columnType); - } - - return $columnList; - } - } - } - - /* - Return names, row counts etc for every database, table and view in a JSON string - */ - function getMetadata() { - $output = ''; - if ($this->conn) { - if ($this->adapter == "mysql" && version_compare($this->getVersion(), "5.0.0", ">=")) { - $this->selectDB("information_schema"); - $schemaSql = $this->query("SELECT `SCHEMA_NAME` FROM `SCHEMATA` ORDER BY `SCHEMA_NAME`"); - if ($this->rowCount($schemaSql)) { - while ($schema = $this->fetchAssoc($schemaSql)) { - $output .= '{"name": "' . $schema['SCHEMA_NAME'] . '"'; - // other interesting columns: TABLE_TYPE, ENGINE, TABLE_COLUMN and many more - $tableSql = $this->query("SELECT `TABLE_NAME`, `TABLE_ROWS` FROM `TABLES` WHERE `TABLE_SCHEMA`='" . $schema['SCHEMA_NAME'] . "' ORDER BY `TABLE_NAME`"); - if ($this->rowCount($tableSql)) { - $output .= ',"items": ['; - while ($table = $this->fetchAssoc($tableSql)) { - - if ($schema['SCHEMA_NAME'] == "information_schema") { - $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table['TABLE_NAME'] . "`"); - $rowCount = (int)($this->result($countSql, 0, "RowCount")); - } else { - $rowCount = (int)($table['TABLE_ROWS']); - } - - $output .= '{"name":"' . $table['TABLE_NAME'] . '","rowcount":' . $rowCount . '},'; - } - - if (substr($output, -1) == ",") - $output = substr($output, 0, -1); - - $output .= ']'; - } - $output .= '},'; - } - $output = substr($output, 0, -1); - } - } else if ($this->adapter == "mysql") { - $schemaSql = $this->listDatabases(); - - if ($this->rowCount($schemaSql)) { - while ($schema = $this->fetchArray($schemaSql)) { - $output .= '{"name": "' . $schema[0] . '"'; - - $this->selectDB($schema[0]); - $tableSql = $this->listTables(); - - if ($this->rowCount($tableSql)) { - $output .= ',"items": ['; - while ($table = $this->fetchArray($tableSql)) { - $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table[0] . "`"); - $rowCount = (int)($this->result($countSql, 0, "RowCount")); - $output .= '{"name":"' . $table[0] . '","rowcount":' . $rowCount . '},'; - } - - if (substr($output, -1) == ",") - $output = substr($output, 0, -1); - - $output .= ']'; - } - $output .= '},'; - } - $output = substr($output, 0, -1); - } - } else if ($this->adapter == "sqlite") { - $database = (array_key_exists("database", $this->options)) ? $this->options['database'] : ""; - - $output .= '{"name": "' . $database . '"'; - - $tableSql = $this->listTables(); - - if ($this->rowCount($tableSql)) { - $output .= ',"items": ['; - while ($tableRow = $this->fetchArray($tableSql)) { - $countSql = $this->query("SELECT COUNT(*) AS 'RowCount' FROM '" . $tableRow[0] . "'"); - $rowCount = (int)($this->result($countSql, 0, "RowCount")); - $output .= '{"name":"' . $tableRow[0] . '","rowcount":' . $rowCount . '},'; - } - - if (substr($output, -1) == ",") - $output = substr($output, 0, -1); - - $output .= ']'; - } - $output .= '}'; - } - } - return $output; - } - - function error() { - return $this->errorMessage; - } - -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/includes/class/Sql.php b/sqlbuddy2986dsfez893qs2df/includes/class/Sql.php deleted file mode 100644 index f42980c272..0000000000 --- a/sqlbuddy2986dsfez893qs2df/includes/class/Sql.php +++ /dev/null @@ -1,495 +0,0 @@ - - -*/ - -class SQL { - - var $adapter = ""; - var $method = ""; - var $version = ""; - var $conn = ""; - var $options = ""; - var $errorMessage = ""; - var $db = ""; - - function SQL($connString, $user = "", $pass = "") { - list($this->adapter, $options) = explode(":", $connString, 2); - - if ($this->adapter != "sqlite") { - $this->adapter = "mysql"; - } - - $optionsList = explode(";", $options); - - foreach ($optionsList as $option) { - list($a, $b) = explode("=", $option); - $opt[$a] = $b; - } - - $this->options = $opt; - $database = (array_key_exists("database", $opt)) ? $opt['database'] : ""; - - if ($this->adapter == "sqlite" && substr(sqlite_libversion(), 0, 1) == "3" && class_exists("PDO") && in_array("sqlite", PDO::getAvailableDrivers())) { - $this->method = "pdo"; - - try - { - $this->conn = new PDO("sqlite:" . $database, null, null, array(PDO::ATTR_PERSISTENT => true)); - } - catch (PDOException $error) { - $this->conn = false; - $this->errorMessage = $error->getMessage(); - } - } else if ($this->adapter == "sqlite" && substr(sqlite_libversion(), 0, 1) == "2" && class_exists("PDO") && in_array("sqlite2", PDO::getAvailableDrivers())) { - $this->method = "pdo"; - - try - { - $this->conn = new PDO("sqlite2:" . $database, null, null, array(PDO::ATTR_PERSISTENT => true)); - } - catch (PDOException $error) { - $this->conn = false; - $this->errorMessage = $error->getMessage(); - } - } else if ($this->adapter == "sqlite") { - $this->method = "sqlite"; - $this->conn = sqlite_open($database, 0666, $sqliteError); - } else { - $this->method = "mysql"; - $host = (array_key_exists("host", $opt)) ? $opt['host'] : ""; - $this->conn = @mysql_connect($host, $user, $pass); - } - - if ($this->conn && $this->method == "pdo") { - $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); - } - - if ($this->conn && $this->adapter == "mysql") { - $this->query("SET NAMES 'utf8'"); - } - - if ($this->conn && $database) { - $this->db = $database; - } - } - - function isConnected() { - return ($this->conn !== false); - } - - function disconnect() { - if ($this->conn) { - if ($this->method == "pdo") { - $this->conn = null; - } else if ($this->method == "mysql") { - mysql_close($this->conn); - $this->conn = null; - } else if ($this->method == "sqlite") { - sqlite_close($this->conn); - $this->conn = null; - } - } - } - - function getAdapter() { - return $this->adapter; - } - - function getMethod() { - return $this->method; - } - - function getOptionValue($optKey) { - if (array_key_exists($optKey, $this->options)) { - return $this->options[$optKey]; - } else { - return false; - } - } - - function selectDB($db) { - if ($this->conn) { - if ($this->method == "mysql") { - $this->db = $db; - return (mysql_select_db($db)); - } else { - return true; - } - } else { - return false; - } - } - - function query($queryText) { - if ($this->conn) { - if ($this->method == "pdo") { - $queryResult = $this->conn->prepare($queryText); - - if ($queryResult) - $queryResult->execute(); - - if (!$queryResult) { - $errorInfo = $this->conn->errorInfo(); - $this->errorMessage = $errorInfo[2]; - } - - return $queryResult; - } else if ($this->method == "mysql") { - $queryResult = @mysql_query($queryText, $this->conn); - - if (!$queryResult) { - $this->errorMessage = mysql_error(); - } - - return $queryResult; - } else if ($this->method == "sqlite") { - $queryResult = sqlite_query($this->conn, $queryText); - - if (!$queryResult) { - $this->errorMessage = sqlite_error_string(sqlite_last_error($this->conn)); - } - - return $queryResult; - } - } else { - return false; - } - } - - // Be careful using this function - when used with pdo, the pointer is moved - // to the end of the result set and the query needs to be rerun. Unless you - // actually need a count of the rows, use the isResultSet() function instead - function rowCount($resultSet) { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "pdo") { - return count($resultSet->fetchAll()); - } else if ($this->method == "mysql") { - return @mysql_num_rows($resultSet); - } else if ($this->method == "sqlite") { - return @sqlite_num_rows($resultSet); - } - } - } - - function isResultSet($resultSet) { - if ($this->conn) { - if ($this->method == "pdo") { - return ($resultSet == true); - } else { - return ($this->rowCount($resultSet) > 0); - } - } - } - - function fetchArray($resultSet) { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "pdo") { - return $resultSet->fetch(PDO::FETCH_NUM); - } else if ($this->method == "mysql") { - return mysql_fetch_row($resultSet); - } else if ($this->method == "sqlite") { - return sqlite_fetch_array($resultSet, SQLITE_NUM); - } - } - } - - function fetchAssoc($resultSet) { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "pdo") { - return $resultSet->fetch(PDO::FETCH_ASSOC); - } else if ($this->method == "mysql") { - return mysql_fetch_assoc($resultSet); - } else if ($this->method == "sqlite") { - return sqlite_fetch_array($resultSet, SQLITE_ASSOC); - } - } - } - - function affectedRows($resultSet) { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "pdo") { - return $resultSet->rowCount(); - } else if ($this->method == "mysql") { - return @mysql_affected_rows($resultSet); - } else if ($this->method == "sqlite") { - return sqlite_changes($resultSet); - } - } - } - - function result($resultSet, $targetRow, $targetColumn = "") { - if (!$resultSet) - return false; - - if ($this->conn) { - if ($this->method == "pdo") { - if ($targetColumn) { - $resultRow = $resultSet->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $targetRow); - return $resultRow[$targetColumn]; - } else { - $resultRow = $resultSet->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_ABS, $targetRow); - return $resultRow[0]; - } - } else if ($this->method == "mysql") { - return mysql_result($resultSet, $targetRow, $targetColumn); - } else if ($this->method == "sqlite") { - return sqlite_column($resultSet, $targetColumn); - } - } - } - - function listDatabases() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW DATABASES"); - } else if ($this->adapter == "sqlite") { - return $this->db; - } - } - } - - function listTables() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW TABLES"); - } else if ($this->adapter == "sqlite") { - return $this->query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name"); - } - } - } - - function hasCharsetSupport() - { - if ($this->conn) { - if ($this->adapter == "mysql" && version_compare($this->getVersion(), "4.1", ">")) { - return true; - } else { - return false; - } - } - } - - function listCharset() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW CHARACTER SET"); - } else if ($this->adapter == "sqlite") { - return ""; - } - } - } - - function listCollation() { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("SHOW COLLATION"); - } else if ($this->adapter == "sqlite") { - return ""; - } - } - } - - function insertId() { - if ($this->conn) { - if ($this->method == "pdo") { - return $this->conn->lastInsertId(); - } else if ($this->method == "mysql") { - return @mysql_insert_id($this->conn); - } else if ($this->method == "sqlite") { - return sqlite_last_insert_rowid($this-conn); - } - } - } - - function escapeString($toEscape) { - if ($this->conn) { - if ($this->method == "pdo") { - $toEscape = $this->conn->quote($toEscape); - $toEscape = substr($toEscape, 1, -1); - return $toEscape; - } else if ($this->adapter == "mysql") { - return mysql_real_escape_string($toEscape); - } else if ($this->adapter == "sqlite") { - return sqlite_escape_string($toEscape); - } - } - } - - function getVersion() { - if ($this->conn) { - // cache - if ($this->version) { - return $this->version; - } - - if ($this->adapter == "mysql") { - $verSql = mysql_get_server_info(); - $version = explode("-", $verSql); - $this->version = $version[0]; - return $this->version; - } else if ($this->adapter == "sqlite") { - $this->version = sqlite_libversion(); - return $this->version; - } - } - - } - - // returns the number of rows in a table - function tableRowCount($table) { - if ($this->conn) { - if ($this->adapter == "mysql") { - $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table . "`"); - $count = (int)($this->result($countSql, 0, "RowCount")); - return $count; - } else if ($this->adapter == "sqlite") { - $countSql = $this->query("SELECT COUNT(*) AS 'RowCount' FROM '" . $table . "'"); - $count = (int)($this->result($countSql, 0, "RowCount")); - return $count; - } - } - } - - // gets column info for a table - function describeTable($table) { - if ($this->conn) { - if ($this->adapter == "mysql") { - return $this->query("DESCRIBE `" . $table . "`"); - } else if ($this->adapter == "sqlite") { - $columnSql = $this->query("SELECT sql FROM sqlite_master where tbl_name = '" . $table . "'"); - $columnInfo = $this->result($columnSql, 0, "sql"); - $columnStart = strpos($columnInfo, '('); - $columns = substr($columnInfo, $columnStart+1, -1); - $columns = split(',[^0-9]', $columns); - - $columnList = array(); - - foreach ($columns as $column) { - $column = trim($column); - $columnSplit = explode(" ", $column, 2); - $columnName = $columnSplit[0]; - $columnType = (sizeof($columnSplit) > 1) ? $columnSplit[1] : ""; - $columnList[] = array($columnName, $columnType); - } - - return $columnList; - } - } - } - - /* - Return names, row counts etc for every database, table and view in a JSON string - */ - function getMetadata() { - $output = ''; - if ($this->conn) { - if ($this->adapter == "mysql" && version_compare($this->getVersion(), "5.0.0", ">=")) { - $this->selectDB("information_schema"); - $schemaSql = $this->query("SELECT `SCHEMA_NAME` FROM `SCHEMATA` ORDER BY `SCHEMA_NAME`"); - if ($this->rowCount($schemaSql)) { - while ($schema = $this->fetchAssoc($schemaSql)) { - $output .= '{"name": "' . $schema['SCHEMA_NAME'] . '"'; - // other interesting columns: TABLE_TYPE, ENGINE, TABLE_COLUMN and many more - $tableSql = $this->query("SELECT `TABLE_NAME`, `TABLE_ROWS` FROM `TABLES` WHERE `TABLE_SCHEMA`='" . $schema['SCHEMA_NAME'] . "' ORDER BY `TABLE_NAME`"); - if ($this->rowCount($tableSql)) { - $output .= ',"items": ['; - while ($table = $this->fetchAssoc($tableSql)) { - - if ($schema['SCHEMA_NAME'] == "information_schema") { - $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table['TABLE_NAME'] . "`"); - $rowCount = (int)($this->result($countSql, 0, "RowCount")); - } else { - $rowCount = (int)($table['TABLE_ROWS']); - } - - $output .= '{"name":"' . $table['TABLE_NAME'] . '","rowcount":' . $rowCount . '},'; - } - - if (substr($output, -1) == ",") - $output = substr($output, 0, -1); - - $output .= ']'; - } - $output .= '},'; - } - $output = substr($output, 0, -1); - } - } else if ($this->adapter == "mysql") { - $schemaSql = $this->listDatabases(); - - if ($this->rowCount($schemaSql)) { - while ($schema = $this->fetchArray($schemaSql)) { - $output .= '{"name": "' . $schema[0] . '"'; - - $this->selectDB($schema[0]); - $tableSql = $this->listTables(); - - if ($this->rowCount($tableSql)) { - $output .= ',"items": ['; - while ($table = $this->fetchArray($tableSql)) { - $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table[0] . "`"); - $rowCount = (int)($this->result($countSql, 0, "RowCount")); - $output .= '{"name":"' . $table[0] . '","rowcount":' . $rowCount . '},'; - } - - if (substr($output, -1) == ",") - $output = substr($output, 0, -1); - - $output .= ']'; - } - $output .= '},'; - } - $output = substr($output, 0, -1); - } - } else if ($this->adapter == "sqlite") { - $output .= '{"name": "' . $this->db . '"'; - - $tableSql = $this->listTables(); - - if ($tableSql) { - $output .= ',"items": ['; - while ($tableRow = $this->fetchArray($tableSql)) { - $countSql = $this->query("SELECT COUNT(*) AS 'RowCount' FROM '" . $tableRow[0] . "'"); - $rowCount = (int)($this->result($countSql, 0, "RowCount")); - $output .= '{"name":"' . $tableRow[0] . '","rowcount":' . $rowCount . '},'; - } - - if (substr($output, -1) == ",") - $output = substr($output, 0, -1); - - $output .= ']'; - } - $output .= '}'; - } - } - return $output; - } - - function error() { - return $this->errorMessage; - } - -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/includes/types.php b/sqlbuddy2986dsfez893qs2df/includes/types.php deleted file mode 100644 index 47cb55384d..0000000000 --- a/sqlbuddy2986dsfez893qs2df/includes/types.php +++ /dev/null @@ -1,80 +0,0 @@ - - -*/ - -$typeList[] = "varchar"; -$typeList[] = "char"; -$typeList[] = "text"; -$typeList[] = "tinytext"; -$typeList[] = "mediumtext"; -$typeList[] = "longtext"; -$typeList[] = "tinyint"; -$typeList[] = "smallint"; -$typeList[] = "mediumint"; -$typeList[] = "int"; -$typeList[] = "bigint"; -$typeList[] = "real"; -$typeList[] = "double"; -$typeList[] = "float"; -$typeList[] = "decimal"; -$typeList[] = "numeric"; -$typeList[] = "date"; -$typeList[] = "time"; -$typeList[] = "datetime"; -$typeList[] = "timestamp"; -$typeList[] = "tinyblob"; -$typeList[] = "blob"; -$typeList[] = "mediumblob"; -$typeList[] = "longblob"; -$typeList[] = "binary"; -$typeList[] = "varbinary"; -$typeList[] = "bit"; -$typeList[] = "enum"; -$typeList[] = "set"; - -$textDTs[] = "text"; -$textDTs[] = "mediumtext"; -$textDTs[] = "longtext"; - -$numericDTs[] = "tinyint"; -$numericDTs[] = "smallint"; -$numericDTs[] = "mediumint"; -$numericDTs[] = "int"; -$numericDTs[] = "bigint"; -$numericDTs[] = "real"; -$numericDTs[] = "double"; -$numericDTs[] = "float"; -$numericDTs[] = "decimal"; -$numericDTs[] = "numeric"; - -$binaryDTs[] = "tinyblob"; -$binaryDTs[] = "blob"; -$binaryDTs[] = "mediumblob"; -$binaryDTs[] = "longblob"; -$binaryDTs[] = "binary"; -$binaryDTs[] = "varbinary"; - -$sqliteTypeList[] = "varchar"; -$sqliteTypeList[] = "integer"; -$sqliteTypeList[] = "float"; -$sqliteTypeList[] = "varchar"; -$sqliteTypeList[] = "nvarchar"; -$sqliteTypeList[] = "text"; -$sqliteTypeList[] = "boolean"; -$sqliteTypeList[] = "clob"; -$sqliteTypeList[] = "blob"; -$sqliteTypeList[] = "timestamp"; -$sqliteTypeList[] = "numeric"; - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/index.php b/sqlbuddy2986dsfez893qs2df/index.php deleted file mode 100644 index 079c797e80..0000000000 --- a/sqlbuddy2986dsfez893qs2df/index.php +++ /dev/null @@ -1,22 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(false); - -outputPage(); - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/insert.php b/sqlbuddy2986dsfez893qs2df/insert.php deleted file mode 100644 index 1ac68f9680..0000000000 --- a/sqlbuddy2986dsfez893qs2df/insert.php +++ /dev/null @@ -1,249 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -requireDatabaseAndTableBeDefined(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($table)) - $structureSql = $conn->describeTable($table); - -if ($conn->isResultSet($structureSql) && $conn->getAdapter() == "mysql") { - while ($structureRow = $conn->fetchAssoc($structureSql)) { - $types[$structureRow['Field']] = $structureRow['Type']; - } - $structureSql = $conn->describeTable($table); -} - -if ($conn->isResultSet($structureSql) || sizeof($structureSql) > 0) { - - if ($_POST) { - - $insertFields = ""; - $insertValues = ""; - - foreach ($_POST as $key=>$value) { - - if ($conn->getAdapter() == "sqlite") { - $insertFields .= $key . ","; - } else { - $insertFields .= "`" . $key . "`,"; - } - - if (is_array($value)) { - $value = implode(",", $value); - } - - if (isset($types) && substr($value, 0, 2) == "0x" && isset($binaryDTs) && in_array($types[$key], $binaryDTs)) { - $insertValues .= $conn->escapeString(urldecode($value)) . ","; - } else { - $insertValues .= "'" . $conn->escapeString(urldecode($value)) . "',"; - } - - } - - $insertFields = substr($insertFields, 0, -1); - $insertValues = substr($insertValues, 0, -1); - - if ($conn->getAdapter() == "sqlite") { - $insertQuery = "INSERT INTO $table (" . $insertFields . ") VALUES (" . $insertValues . ")"; - } else { - $insertQuery = "INSERT INTO `$table` (" . $insertFields . ") VALUES (" . $insertValues . ")"; - } - - $conn->query($insertQuery) or ($dbError = $conn->error()); - - $insertId = $conn->insertId(); - - if (isset($dbError)) { - echo '
      ' . $dbError . '
      '; - } else { - echo '
      '; - echo __("Your data has been inserted into the database."); - if ($insertId) - echo ' (Id: ' . $insertId . ')'; - echo '
      '; - - ?> - - - - - -
      - - getAdapter() == "sqlite") { - - if (sizeof($structureSql) > 0) { - foreach ($structureSql as $column) { - - echo ''; - echo ''; - echo ""; - echo ""; - echo ' - - - getAdapter() == "mysql") { - - if ($conn->isResultSet($structureSql)) { - while ($structureRow = $conn->fetchAssoc($structureSql)) { - - preg_match("/^([a-z]+)(.([0-9]+).)?(.*)?$/", $structureRow['Type'], $matches); - - $curtype = $matches[1]; - $cursizeQuotes = $matches[2]; - $cursize = $matches[3]; - $curextra = $matches[4]; - - echo ''; - echo ''; - echo ""; - echo ""; - echo ' - - - - - - -
      '; - if (strpos($column[1], "primary key") > 0) echo ''; - echo $column[0]; - if (strpos($column[1], "primary key") > 0) echo ''; - echo " " . $column[1] . '
      '; - - if (strpos($column[1], "text") !== false) { - echo ''; - } else { - echo ''; - } - - ?> - -
      '; - if ($structureRow['Key'] == 'PRI') echo ''; - echo $structureRow['Field']; - if ($structureRow['Key'] == 'PRI') echo ''; - echo " " . $curtype . $cursizeQuotes . ' ' . $structureRow['Extra'] . '
      '; - if ($structureRow['Type'] == "text") { - echo ''; - } - elseif (substr($structureRow['Type'], 0, 4) == "enum") { - $trimmed = substr($structureRow['Type'], 6, -2); - $listOptions = explode("','", $trimmed); - echo ''; - } - elseif (substr($structureRow['Type'], 0, 3) == "set") { - $trimmed = substr($structureRow['Type'], 5, -2); - $listOptions = explode("','", $trimmed); - foreach ($listOptions as $option) { - $id = $option . rand(1, 1000); - echo '
      '; - } - } else { - echo ''; - } - - ?> - -
      - " /> -
      -
      - - - - - -
      -

      -

      -
      - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/js/core.js b/sqlbuddy2986dsfez893qs2df/js/core.js deleted file mode 100644 index 466d40a4ca..0000000000 --- a/sqlbuddy2986dsfez893qs2df/js/core.js +++ /dev/null @@ -1,839 +0,0 @@ -var sb; - -var shiftPressed; -var lastActiveRow = -1; -var clearPanesOnLoad = false; - -var activeWindow; -var animationStack = []; - -var viewportSize = [0, 0]; - -function f(g) { - if (g == undefined || g == "undefined" || g == null) - return ""; - else - return g; -} - -var $E = function(selector, filter) { - return ($(filter) || document).getElement(selector); -}; - -var $ES = function(selector, filter) { - return ($(filter) || document).getElements(selector); -}; - -window.addEvent("domready", function() { - document.addEvent("keydown", function(e) { - var ev = new Event(e); - if (ev.shift) - shiftPressed = true; - }); - - document.addEvent("keyup", function() { - shiftPressed = false; - }); - - // to disable keyboard shortcuts, comment out the following line - window.addEvent("keydown", runKeyboardShortcuts); - - sb = new Page(); - - initializeSidemenu(); - - sb.loadHash(); - sb.loadPage(); - - (function(){ sb.preload(); }).delay(500); - (function(){ sb.checkHashState(); }).periodical(75); - (function(){ - var winWidth = getWindowWidth(); - var winHeight = getWindowHeight(); - if (viewportSize[0] != winWidth || viewportSize[1] != winHeight) { - viewportSize = [winWidth, winHeight]; - sizePage(); - } - }).periodical(175); - (function(){ autoExpandTextareas(); }).periodical(500); -}); - -function Page() { - this.page = "home.php"; - this.db; - this.table; - this.topTabSet = 0; - this.topTab = 0; - this.s; - this.view; - this.sortDir; - this.sortKey; - - this.$GUID = 1; - - this.pane; - this.grid; - this.gridHeader; - this.leftChecks; - - this.hashMemory = ""; - - this.submenuHeights = []; - this.submenuIds = []; - this.tableRowCounts = []; - - this.topTabs = [new TopTabGroup("Main"), new TopTabGroup("Database"), new TopTabGroup("Table")]; - - if (showUsersMenu) { - this.topTabs[0].addTab(gettext("Home"), "home.php").addTab(gettext("Users"), "users.php").addTab(gettext("Query"), "query.php").addTab(gettext("Import"), "import.php").addTab(gettext("Export"), "export.php"); - } else { - this.topTabs[0].addTab(gettext("Home"), "home.php").addTab(gettext("Query"), "query.php").addTab(gettext("Import"), "import.php").addTab(gettext("Export"), "export.php"); - } - - this.topTabs[1].addTab(gettext("Overview"), "dboverview.php").addTab(gettext("Query"), "query.php").addTab(gettext("Import"), "import.php").addTab(gettext("Export"), "export.php"); - this.topTabs[2].addTab(gettext("Browse"), "browse.php").addTab(gettext("Structure"), "structure.php").addTab(gettext("Insert"), "insert.php").addTab(gettext("Query"), "query.php").addTab(gettext("Import"), "import.php").addTab(gettext("Export"), "export.php"); - -} - -Page.prototype.loadPage = function() { - if (this.page == "browse.php" && parseInt(this.tableRowCounts[this.db + "_" + this.table]) == 0) { - this.page = "structure.php"; - this.topTab = 1; - } - - var pageUrl = ""; - if (f(this.s)) - pageUrl += "s=" + this.s + "&"; - if (f(this.sortDir)) - pageUrl += "sortDir=" + this.sortDir + "&"; - if (f(this.sortKey)) - pageUrl += "sortKey=" + this.sortKey + "&"; - pageUrl = pageUrl.substring(0, pageUrl.length - 1); - - if (this.page == "editcolumn.php") { - this.page = "structure.php"; - this.topTab = 1; - } else if (this.page == "edituser.php") { - this.page = "users.php"; - this.topTab = 1; - } else if (this.page == "edit.php") { - this.page = "browse.php"; - this.topTab = 0; - } - - clearPanesOnLoad = true; - var x = new XHR({url: this.page, onSuccess: finishTabLoad}).send(pageUrl); -} - -Page.prototype.refreshTopTabSet = function(setNum) { - if (f(setNum)) - this.topTabSet = setNum; - - var topTabsElem = $E('#toptabs ul'); - topTabsElem.empty(); - var loopStop = this.topTabs[this.topTabSet].tabCounter; - var browseIsActive = true; - var currentTab, rowCount, tabId, tabLiObj, tabAObj, tabACount; - - for (var i=0; i"); - - if (m == 1) - prompter += gettext("The following query will be run:"); - else - prompter += gettext("The following queries will be run:"); - - prompter += "
      " + formattedQuery + "
      "; - } - - buildList = encodeURIComponent(buildList.replace(/\n/g, "")); - buildList = buildList.replace(/'/g, "\\'"); - - buildUrl = parameter + "=" + buildList; - - if (sb.page == "browse.php") { - if (f(sb.view)) - buildUrl += "&view=" + sb.view; - - if (f(sb.s)) - buildUrl += "&s=" + sb.s; - - if (f(sb.sortKey)) - buildUrl += "&sortKey=" + sb.sortKey - - if (f(sb.sortDir)) - buildUrl += "&sortDir=" + sb.sortDir; - } - - showDialog(gettext("Confirm"), - prompter, - "var x = new XHR({url: \"" + sb.page + "\", onSuccess: finishTabLoad}).send(\"" + buildUrl + "\");" - ); - } - } -} - -function showDialog(title, content, action) { - createWindow(title, content, {isDialog: true, dialogAction: action}); -} - -function submitForm(formId) { - var theForm = $(formId); - var action = theForm.get("action"); - - if (!action) - action = sb.page; - - var x = new XHR({url: action, onSuccess: finishTabLoad}).send(theForm.toQueryString()); -} - -var XHR = new Class({ - - Extends: Request, - - initialize: function(options) { - - if (!options.url) - options.url = sb.page; - - if (options.url.indexOf("?") == -1) - options.url += "?ajaxRequest=" + sb.$GUID++; - else - options.url += "&ajaxRequest=" + sb.$GUID++; - - options.url += "&requestKey=" + requestKey; - - if (f(sb.db)) - options.url += "&db=" + sb.db; - if (f(sb.table)) - options.url += "&table=" + sb.table; - - this.parent(options); - - if (options && options.showLoader != false) { - show('load'); - - this.addEvent("onSuccess", function() { - hide('load'); - }); - - this.addEvent("onFailure", function() { - hide('load'); - createWindow(gettext("Error"), gettext("There was an error receiving data from the server."), {isDismissible: true}); - }); - } - }, - - // redefined to avoid auto script execution - success: function(text, xml) { - this.onSuccess(text, xml); - } - -}); - -function gettext(str) { - if (f(getTextArr[str]) != "") - return getTextArr[str]; - else - return str; -} - -function printf() { - var argv = printf.arguments; - var argc = parseInt(argv.length); - - var inputString = argv[0]; - - for (var i=1; i' + title + '

      '; - windowHeader.set('html', windowHeaderContent); - windowMain.appendChild(windowHeader); - - if (options.isDialog && f(options.dialogAction) != "") { - content += '
       
      '; - } else if (options.isDismissible) { - content += '
       
      '; - } - - var windowInner = new Element('div'); - windowInner.className = 'fulltextinner'; - var innerContent = '
      ' + content + '
      '; - - if (!(options.isDialog || options.isDismissible)) { - innerContent += '
      '; - } - - innerContent += '
      '; - - windowInner.set('html', innerContent); - windowMain.appendChild(windowInner); - textWindow.appendChild(windowMain); - - var windowFooter = new Element('div'); - windowFooter.className = 'fulltextfooter'; - var footerCode = '
       
      '; - windowFooter.set('html', footerCode); - - textWindow.appendChild(windowFooter); - document.body.appendChild(textWindow); - - if (options.isDialog == true && f(options.dialogAction) != "") { - var okayClick = $(windowId + 'Click'); - okayClick.addEvent("click", function() { - closeWindow(windowId); - eval(options.dialogAction); - }); - okayClick.focus(); - } else if (options.isDismissible == true) { - var okayClick = $(windowId + 'Click'); - okayClick.focus(); - } else if (!(options.isDialog || options.isDismissible)) { - var resizeHandle = $('resize' + windowId); - resizeHandle.addEvent("mousedown", startResize); - } - - return windowId; -} - -function show(a) { - $(a).style.display = ''; -} - -function hide(a) { - $(a).style.display = 'none'; -} - -function runKeyboardShortcuts(e) { - var event = new Event(e); - if (!((event.target.nodeName == "INPUT" && (event.target.type == "text" || event.target.type == "password")) || (event.target.nodeName == "TEXTAREA") || event.meta || event.control)) { - if (event.key == "a") { - checkAll(); - } else if (event.key == "n") { - checkNone(); - } else if (event.key == "e") { - if (sb.page == "browse.php" || sb.page == "structure.php" || sb.page == "users.php") - editSelectedRows(); - } else if (event.key == "d") { - if (sb.page == "structure.php") - deleteSelectedColumns(); - else if (sb.page == "users.php") - deleteSelectedUsers(); - else if (sb.page == "browse.php") - deleteSelectedRows(); - else if (sb.page == "dboverview.php") - dropSelectedTables(); - } else if (event.key == "r") { - sb.loadPage(); - } else if (event.key == "f" && sb.page == "browse.php") { - if ($('firstNav')) - eval($('firstNav').get("onclick")); - } else if (event.key == "g" && sb.page == "browse.php") { - if ($('prevNav')) - eval($('prevNav').get("onclick")); - } else if (event.key == "h" && sb.page == "browse.php") { - if ($('nextNav')) - eval($('nextNav').get("onclick")); - } else if (event.key == "l" && sb.page == "browse.php") { - if ($('lastNav')) - eval($('lastNav').get("onclick")); - } else if (event.key == "q") { - var tabId = 0; - while (sb.getTabUrl(tabId) != "query.php") { - tabId++; - } - topTabLoad(tabId); - - event.stop(); - event.stopPropagation(); - } else if (event.key == "o" && sb.page == "dboverview.php") { - optimizeSelectedTables(); - } - - } else if (event.target.nodeName == "TEXTAREA" && event.control && event.key == "enter") { - var curr = $(event.target); - while (curr && curr.get('tag') != "form") { - curr = $(curr.parentNode); - } - - if (curr) { - currButton = $E("input[type=submit]", curr); - if (currButton) { - currButton.click(); - } - } - } -} - -function getWindowWidth() { - if (window.innerWidth) - return window.innerWidth; - else - return document.documentElement.clientWidth; -} - -function getWindowHeight() { - if (window.innerHeight) - return window.innerHeight; - else - return document.documentElement.clientHeight; -} - -function getScrollbarWidth() { - - var outer = new Element('div'); - outer.style.position = 'absolute'; - outer.style.top = '-1000px'; - outer.style.left = '-1000px'; - outer.style.width = '100px'; - outer.style.height = '50px'; - outer.style.overflow = 'hidden'; - - var inner = new Element('div'); - inner.style.width = '100%'; - inner.style.height = '200px'; - - outer.appendChild(inner); - document.body.appendChild(outer); - - var w1 = inner.offsetWidth; - outer.style.overflow = "auto"; - var w2 = inner.offsetWidth; - - document.body.removeChild(outer); - - return (w1 - w2); -}; - -function addAnimation(id, finish) { - var elem = $(id); - - //remove duplicates - for (var i in animationStack) { - if (animationStack[i][0] == elem) - animationStack.splice(i, 1); - } - - var start = elem.offsetHeight; - - var change = finish - start; - - var totalFrames = 15; - - if (window.gecko) - totalFrames -= 5; - - animationStack.push([elem, start, change, 0, totalFrames]); - if (animationStack.length == 1) - animate(); -} - -function animate() { - var j, elem, start, change, currentFrame, totalFrames; - for (var i = 0; i < animationStack.length; i++) { - - j = parseInt(i); - - elem = animationStack[j][0]; - start = animationStack[j][1]; - change = animationStack[j][2]; - animationStack[j][3] += 1; - currentFrame = animationStack[j][3]; - totalFrames = animationStack[j][4]; - - var newHeight = sineInOut(currentFrame, start, change, totalFrames); - - elem.style.height = newHeight + "px"; - - if (currentFrame >= totalFrames) { - animationStack.splice(j, 1); - - //if the menu is expanded, take off the explicit height attribute - if (elem.style.height != "0px") { - elem.style.height = ''; - } - } - } - if (animationStack.length > 0) - setTimeout('animate()', 25); -} - -function sineInOut(t, b, c, d) { - return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/js/helpers.js b/sqlbuddy2986dsfez893qs2df/js/helpers.js deleted file mode 100644 index 7cb8294ac1..0000000000 --- a/sqlbuddy2986dsfez893qs2df/js/helpers.js +++ /dev/null @@ -1,1240 +0,0 @@ -function clearPanes() { - $('innercontent').empty(); -} - -function toggleMenuClick(e) { - var event = new Event(e); - var menuId = event.target.parentNode.parentNode.id; - toggleMenu(menuId.substring(2)); -} - -function toggleMenu(b, forceExpand) { - b = parseInt(b); - var menuId = "db" + b; - var menu = $(menuId); - var sub = "sublist" + b; - - if (!menu.hasClass("expanded")) { - // accordion - var openMenus = $ES(".expanded"); - for (var m=0; m= 0 && lastActiveRow != rowId) { - if (context) { - var grid = $E('.gridscroll', $(context)); - var checks = $E('.leftchecks', $(context)).childNodes; - } else { - var grid = sb.grid; - var checks = sb.leftChecks.childNodes; - } - - if (rowId < lastActiveRow) { - for (var i=rowId+1; ilastActiveRow; i--) { - checks[i].firstChild.firstChild.checked = checks[rowId].firstChild.firstChild.checked; - highlightDataRow(i, context); - } - } - } - lastActiveRow = rowId; -} - -function highlightDataRow(i, context) { - if (context) { - var grid = $(context); - var rows = $E('.gridscroll', grid).childNodes; - var lc = $E('.leftchecks', grid).childNodes; - } else { - var rows = sb.grid.childNodes; - var lc = sb.leftChecks.childNodes; - } - - if (lc[i].firstChild.firstChild.checked == true) { - if (rows[i].className.indexOf("highlighted") == -1) { - rows[i].className += " highlighted"; - lc[i].className += " highlighted"; - } - } else { - if (rows[i].className.indexOf("highlighted") != -1) { - rows[i].className = rows[i].className.replace("highlighted", ""); - lc[i].className = lc[i].className.replace("highlighted", ""); - } - } -} - -function editSelectedRows() { - var grid = sb.grid; - if (f(grid)) { - var editParts = ""; - var count = 0; - var inputs = $ES("input", sb.leftChecks); - for (var i=0; i 0) { - if (sb.page == "structure.php") - var loadPage = "editcolumn.php"; - else if (sb.page == "users.php") - var loadPage = "edituser.php"; - else - var loadPage = "edit.php"; - - editParts = editParts.substring(0, editParts.length - 2); - sb.topTabs[sb.topTabSet].addTab("Edit", loadPage, true); - sb.page = loadPage; - var x = new XHR({url: loadPage, onSuccess: finishTabLoad}).send("editParts=" + editParts); - } - } -} - -function saveEdit(formId) { - var form = $(formId); - var queryPart = form.get("querypart"); - var x = new XHR({url: "ajaxsaveedit.php?queryPart=" + queryPart + "&form=" + formId, onSuccess: updateAfterEdit}).send(form.toQueryString()); -} - -function saveColumnEdit(formId) { - var form = $(formId); - var changes = getFieldSummary(form); - var columnQuery = "ALTER TABLE `" + sb.table + "` CHANGE `" + form.get("querypart") + "` " + changes; - var x = new XHR({url: "ajaxsavecolumnedit.php?form=" + formId, onSuccess: updateAfterEdit}).send("runQuery=" + columnQuery); -} - -function saveUserEdit(formId) { - var form = $(formId); - var x = new XHR({url: "ajaxsaveuseredit.php?form=" + formId + "&user=" + form.get("querypart"), onSuccess: updateAfterEdit}).send(form.toQueryString()); -} - -function updateAfterEdit(json) { - var response = eval('(' + json + ')'); - var formu = $(response.formupdate); - if (response.errormess == "") { - showUpdateMessage(formu); - } else { - var errHandle = $E('.errormessage', formu); - errHandle.style.display = ''; - errHandle.set('text', response.errormess); - } - sizePage(); - clearPanesOnLoad = true; -} - -function showUpdateMessage(formu) { - // hide other messages - hideUpdateMessages(); - - formu.innerHTML = ""; - var updateId = sb.$GUID++; - var updateDiv = new Element("div", { - 'class': 'insertmessage', - 'id': 'update' + updateId - }).set('text', gettext("Your changes were saved to the database.")); - formu.appendChild(updateDiv); - yellowFade($('update' + updateId)); - setTimeout(hideUpdateMessages, 1250); -} - -function hideUpdateMessages() { - var updates = $ES(".insertmessage"); - var edits = $ES(".edit"); - - if (edits.length == 0) { - updates[0].set('text', gettext("Redirecting...")); - - for (var i=1; i" + emptyQuery + "", - "var x = new XHR({url: \"ajaxquery.php\", onSuccess: emptyTableCallback}).send(\"query=" + encodeURIComponent(emptyQuery) + "&silent=1\")" - ); - } -} - -function emptyTableCallback() { - sb.tableRowCounts[sb.db + "_" + sb.table] = "0"; - subTabLoad(sb.db, sb.table); -} - -function confirmDropTable() { - var table = sb.table; - if (f(table)) { - var dropQuery = "DROP TABLE " + returnQuote() + table + returnQuote(); - var targ = $(getSubMenuId(sb.db, sb.table)); - while (!targ.hasClass("sublist")) { - targ = targ.parentNode; - } - var toRecalculate = targ.id; - showDialog(gettext("Confirm"), - printf(gettext("Are you sure you want to drop the '%s' table? This will delete the table and all data inside of it. The following query will be run:"), table) + "
      " + dropQuery + "
      ", - "var x = new XHR({url: \"ajaxquery.php\"}).send(\"query=" + dropQuery + "&silent=1\"); $(getSubMenuId(sb.db, sb.table)).dispose(); databaseLoad(sb.db); recalculateSubmenuHeight(\"" + toRecalculate + "\");" - ); - } -} - -function optimizeTable() { - if (sb.table) { - var optimizeQuery = "OPTIMIZE TABLE `" + sb.table + "`;"; - var x = new XHR({url: "ajaxquery.php", onSuccess: function(){ sb.loadPage() } }).send("query=" + optimizeQuery + "&silent=1"); - } -} - -function confirmDropDatabase() { - var db = sb.db; - if (f(db)) { - var dropQuery = "DROP DATABASE `" + db + "`"; - showDialog(gettext("Confirm"), - printf(gettext("Are you sure you want to drop the database '%s'? This will delete the database, the tables inside the database, and all data inside of the tables. The following query will be run:"), db) + "
      " + dropQuery + "
      ", - "var x = new XHR({url: \"ajaxquery.php\"}).send(\"query=" + dropQuery + "&silent=1\"); $(getSubMenuId(sb.db, sb.table)).dispose(); sideMainClick(\"home.php\",\"hometab\");" - ); - } -} - -function editTable() { - var newName = $('RENAME').value; - var charSelect = $('RECHARSET'); - if (charSelect) - var newCharset = charSelect.options[charSelect.selectedIndex].value; - - var runQuery = ""; - - if (newName != sb.table && adapter == "mysql") { - runQuery += "RENAME TABLE `" + sb.table + "` TO `" + newName + "`;"; - } else if (newName != sb.table && adapter == "sqlite") { - runQuery += "ALTER TABLE '" + sb.table + "' RENAME TO '" + newName + "';"; - } - - if (f(newCharset) != "") { - runQuery += "ALTER TABLE `" + sb.table + "` CHARSET " + newCharset + ";"; - } - - if (f(runQuery) != "") { - $('RENAME').blur(); - var x = new XHR({url: "ajaxquery.php", onSuccess: editTableCallback}).send("query=" + runQuery + "&silent=1"); - } - - // defined interally on purpose - function editTableCallback() { - if (f(newName) != "" && newName != sb.table) { - var submenuItem = $(sb.submenuIds[sb.db + '_' + sb.table]); - submenuItem.firstChild.set('text', newName); - submenuItem.firstChild.href = "#page=browse&db=" + sb.db + "&table=" + newName + "&topTabSet=2"; - var subacount = new Element('span'); - subacount.className = "subcount"; - subacount.appendText("(" + approximateNumber(sb.tableRowCounts[sb.db + '_' + sb.table]) + ")"); - submenuItem.firstChild.appendChild(subacount); - - sb.submenuIds[sb.db + '_' + newName] = sb.submenuIds[sb.db + '_' + sb.table]; - sb.submenuIds[sb.db + '_' + sb.table] = ''; - sb.tableRowCounts[sb.db + '_' + newName] = sb.tableRowCounts[sb.db + '_' + sb.table]; - sb.tableRowCounts[sb.db + '_' + sb.table] = ''; - sb.table = newName; - sb.setHash(); - } - - $('editTableMessage').set('text', gettext("Successfully saved changes.")); - yellowFade($('editTableMessage')); - var clearTable = function() { - $('editTableMessage').empty(); - }; - - clearTable.delay(2000); - - clearPanesOnLoad = true; - } -} - -function editDatabase() { - var charSelect = $('DBRECHARSET'); - var newCharset = charSelect.options[charSelect.selectedIndex].value; - - if (f(newCharset) != "") { - var runQuery = "ALTER DATABASE `" + sb.db + "` CHARSET " + newCharset + ";"; - var x = new XHR({url: "ajaxquery.php", onSuccess: editDatabaseCallback}).send("query=" + runQuery + "&silent=1"); - } - - function editDatabaseCallback() { - $('editDatabaseMessage').set('text', gettext("Successfully saved changes.")); - yellowFade($('editDatabaseMessage')); - - var clearDatabase = function() { - $('editDatabaseMessage').empty(); - }; - - clearDatabase.delay(2000); - - clearPanesOnLoad = true; - } -} - -function runJavascriptContent() { - var scripts = $ES("script", sb.pane); - for (var i=0; i 0) { - for (var i=0; i" + name + ""; - else if (adapter == "sqlite") - fieldBuild = name; - else - fieldBuild = "`" + name + "`"; - - if (adapter == "sqlite") { - if (f(type)) - fieldBuild += " " + type; - if (f(size) && f(type)) - fieldBuild += "(" + size + ")"; - if (f(notnull)) - fieldBuild += " not null"; - if (f(key)) - fieldBuild += " " + key + " key"; - if (f(auto)) - fieldBuild += " autoincrement"; - if (f(unique)) - fieldBuild += " unique"; - if (f(defaultval)) - fieldBuild += " default '" + defaultval + "'"; - } else { - if (f(type)) - fieldBuild += " " + type; - if (f(values) && (type == "set" || type == "enum")) - fieldBuild += values + ""; - if (f(size) && f(type)) - fieldBuild += "(" + size + ")"; - if (f(unsign)) - fieldBuild += " unsigned"; - if (f(binary)) - fieldBuild += " binary"; - if (f(charset)) - fieldBuild += " charset " + charset; - if (f(notnull)) - fieldBuild += " not null"; - if (f(defaultval)) - fieldBuild += " default '" + defaultval + "'"; - if (f(auto)) - fieldBuild += " auto_increment"; - if (f(key)) - fieldBuild += " " + key + " key"; - } - - } - } - return fieldBuild; -} - -function addTableField() { - var fieldList = $('fieldlist'); - var toCopy = $E('.fieldbox', fieldList).innerHTML; - - if (f(toCopy)) { - var newField = new Element('div'); - newField.set('html', toCopy); - newField.className = "fieldbox"; - fieldList.appendChild(newField); - - clearForm(newField); - - var valueLine = $E(".valueline", newField); - if (f(valueLine)) - valueLine.style.display = 'none'; - - if (!Browser.Engine.trident) { - var newHeader = $E(".fieldheader", newField).childNodes[1]; - newHeader.set('html', '<' + gettext("New field") + '>'); - } - - } - sizePage(); -} - -function clearForm(elem) { - var inputs = elem.getElementsByTagName("input"); - for (var i=0; i 0) { - - $('TABLENAME').style.border = ""; - - if (adapter == "sqlite") { - var createQuery = "CREATE TABLE " + tableName + " ("; - } else { - var createQuery = "CREATE TABLE `" + tableName + "` ("; - } - - for (var i=0; i= 0 || obj.value.indexOf("text") >= 0 || obj.value == "enum" || obj.value == "set") { - charsetToggle[0].style.display = ''; - charsetToggle[1].style.display = ''; - } else { - charsetToggle[0].style.display = 'none'; - charsetToggle[1].style.display = 'none'; - } - } - - sizePage(); -} - -function exportFilePrep() { - var oft = $('OUTPUTFILETEXT'); - if ($('OUTPUTFILE').checked) { - - defaultFilename = gettext("Export").toLowerCase(); - - if ($('SQLTOGGLE').checked) { - if (oft.value == "" || oft.value == defaultFilename + ".csv") - oft.value = defaultFilename + ".sql"; - oft.focus(); - } else { - if (oft.value == "" || oft.value == defaultFilename + ".sql") - oft.value = defaultFilename + ".csv"; - oft.focus(); - } - } -} - -function startImport() { - $('importLoad').style.display = ''; - $('importForm').setAttribute("target", "importFrame"); -} - -function updateAfterImport(message) { - $('importLoad').style.display = 'none'; - $('importMessage').style.display = ''; - $('importMessage').innerHTML = message; - clearPanesOnLoad = true; -} - -function paneCheckAll(elemId) { - var elem = $(elemId); - var inputs = elem.getElementsByTagName("input"); - for (var i=0; i 0) { - win.style.opacity = opacities.pop(); - var nextWin = function(){ closeWindowCallback(winId, speed, opacities); }; - nextWin.delay(speed); - } else { - win.dispose(); - } -} - -function switchLanguage() { - var langSelect = $('langSwitcher'); - var lang = langSelect.options[langSelect.selectedIndex].value; - var defaultLang = "en_US"; - - if (lang != defaultLang) { - var co = Cookie.write("sb_lang", lang, {duration: 60}); - } else if (Cookie.read("sb_lang")) { - Cookie.dispose("sb_lang"); - } - location.reload(true); -} - -function switchTheme() { - var themeSelect = $('themeSwitcher'); - var theme = themeSelect.options[themeSelect.selectedIndex].value; - var defaultTheme = "bittersweet"; - - if (theme != defaultTheme) { - var co = Cookie.write("sb_theme", theme, {duration: 60}); - } else if (Cookie.read("sb_theme")) { - Cookie.dispose("sb_theme"); - } - location.reload(true); -} - -function quoteModifier(mod) { - return returnQuote() + mod + returnQuote(); -} - -function returnQuote() { - if (adapter == "sqlite") { - return "'"; - } else if (adapter == "mysql") { - return "`"; - } -} - -function autoExpandTextareas() { - var taList = document.getElementsByTagName("textarea"); - if (taList.length > 0 && sb.page != "export.php") { - var sizeDiv = new Element('div'); - sizeDiv.id = "sizeDiv"; - sizeDiv.style.visibility = "hidden"; - sizeDiv.style.position = "absolute"; - sizeDiv.style.lineHeight = "15px"; - sizeDiv.style.fontSize = "13px"; - sizeDiv.style.padding = "2px"; - document.body.appendChild(sizeDiv); - - for (var i=0; i') + ' '); - - var newHeight = theDiv.clientHeight + 5; - - if (newHeight < 80) { - newHeight = 80; - } else if (newHeight > 300) { - newHeight = 300; - } - - taList[i].style.height = newHeight + "px"; - } - - document.body.removeChild(sizeDiv); - } -} - -function yellowFade(el, curr) { - if (!curr) - curr = 175; - - el.style.background = 'rgb(255, 255, '+ (curr+=3) +')'; - - if (curr < 255) - setTimeout(function(){ yellowFade(el, curr) }, 25); -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/js/mootools-1.2-core.js b/sqlbuddy2986dsfez893qs2df/js/mootools-1.2-core.js deleted file mode 100644 index da8b02170f..0000000000 --- a/sqlbuddy2986dsfez893qs2df/js/mootools-1.2-core.js +++ /dev/null @@ -1,242 +0,0 @@ -//MooTools, , My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2008 Valerio Proietti, , MIT Style License. - -var MooTools={version:"1.2.0",build:""};var Native=function(J){J=J||{};var F=J.afterImplement||function(){};var G=J.generics;G=(G!==false);var H=J.legacy; -var E=J.initialize;var B=J.protect;var A=J.name;var C=E||H;C.constructor=Native;C.$family={name:"native"};if(H&&E){C.prototype=H.prototype;}C.prototype.constructor=C; -if(A){var D=A.toLowerCase();C.prototype.$family={name:D};Native.typize(C,D);}var I=function(M,K,N,L){if(!B||L||!M.prototype[K]){M.prototype[K]=N;}if(G){Native.genericize(M,K,B); -}F.call(M,K,N);return M;};C.implement=function(L,K,N){if(typeof L=="string"){return I(this,L,K,N);}for(var M in L){I(this,M,L[M],K);}return this;};C.alias=function(M,K,N){if(typeof M=="string"){M=this.prototype[M]; -if(M){I(this,K,M,N);}}else{for(var L in M){this.alias(L,M[L],K);}}return this;};return C;};Native.implement=function(D,C){for(var B=0,A=D.length;B-1:this.indexOf(A)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,"");},clean:function(){return this.replace(/\s+/g," ").trim(); -},camelCase:function(){return this.replace(/-\D/g,function(A){return A.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(A){return("-"+A.charAt(0).toLowerCase()); -});},capitalize:function(){return this.replace(/\b[a-z]/g,function(A){return A.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1"); -},toInt:function(A){return parseInt(this,A||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(B){var A=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); -return(A)?A.slice(1).hexToRgb(B):null;},rgbToHex:function(B){var A=this.match(/\d{1,3}/g);return(A)?A.rgbToHex(B):null;},stripScripts:function(B){var A=""; -var C=this.replace(/]*>([\s\S]*?)<\/script>/gi,function(){A+=arguments[1]+"\n";return"";});if(B===true){$exec(A);}else{if($type(B)=="function"){B(A,C); -}}return C;},substitute:function(A,B){return this.replace(B||(/\\?\{([^}]+)\}/g),function(D,C){if(D.charAt(0)=="\\"){return D.slice(1);}return(A[C]!=undefined)?A[C]:""; -});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(B){for(var A in this){if(this.hasOwnProperty(A)&&this[A]===B){return A;}}return null; -},hasValue:function(A){return(Hash.keyOf(this,A)!==null);},extend:function(A){Hash.each(A,function(C,B){Hash.set(this,B,C);},this);return this;},combine:function(A){Hash.each(A,function(C,B){Hash.include(this,B,C); -},this);return this;},erase:function(A){if(this.hasOwnProperty(A)){delete this[A];}return this;},get:function(A){return(this.hasOwnProperty(A))?this[A]:null; -},set:function(A,B){if(!this[A]||this.hasOwnProperty(A)){this[A]=B;}return this;},empty:function(){Hash.each(this,function(B,A){delete this[A];},this); -return this;},include:function(B,C){var A=this[B];if(A==undefined){this[B]=C;}return this;},map:function(B,C){var A=new Hash;Hash.each(this,function(E,D){A.set(D,B.call(C,E,D,this)); -},this);return A;},filter:function(B,C){var A=new Hash;Hash.each(this,function(E,D){if(B.call(C,E,D,this)){A.set(D,E);}},this);return A;},every:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&!B.call(C,this[A],A)){return false; -}}return true;},some:function(B,C){for(var A in this){if(this.hasOwnProperty(A)&&B.call(C,this[A],A)){return true;}}return false;},getKeys:function(){var A=[]; -Hash.each(this,function(C,B){A.push(B);});return A;},getValues:function(){var A=[];Hash.each(this,function(B){A.push(B);});return A;},toQueryString:function(A){var B=[]; -Hash.each(this,function(F,E){if(A){E=A+"["+E+"]";}var D;switch($type(F)){case"object":D=Hash.toQueryString(F,E);break;case"array":var C={};F.each(function(H,G){C[G]=H; -});D=Hash.toQueryString(C,E);break;default:D=E+"="+encodeURIComponent(F);}if(F!=undefined){B.push(D);}});return B.join("&");}});Hash.alias({keyOf:"indexOf",hasValue:"contains"}); -var Event=new Native({name:"Event",initialize:function(A,F){F=F||window;var K=F.document;A=A||F.event;if(A.$extended){return A;}this.$extended=true;var J=A.type; -var G=A.target||A.srcElement;while(G&&G.nodeType==3){G=G.parentNode;}if(J.test(/key/)){var B=A.which||A.keyCode;var M=Event.Keys.keyOf(B);if(J=="keydown"){var D=B-111; -if(D>0&&D<13){M="f"+D;}}M=M||String.fromCharCode(B).toLowerCase();}else{if(J.match(/(click|mouse|menu)/i)){K=(!K.compatMode||K.compatMode=="CSS1Compat")?K.html:K.body; -var I={x:A.pageX||A.clientX+K.scrollLeft,y:A.pageY||A.clientY+K.scrollTop};var C={x:(A.pageX)?A.pageX-F.pageXOffset:A.clientX,y:(A.pageY)?A.pageY-F.pageYOffset:A.clientY}; -if(J.match(/DOMMouseScroll|mousewheel/)){var H=(A.wheelDelta)?A.wheelDelta/120:-(A.detail||0)/3;}var E=(A.which==3)||(A.button==2);var L=null;if(J.match(/over|out/)){switch(J){case"mouseover":L=A.relatedTarget||A.fromElement; -break;case"mouseout":L=A.relatedTarget||A.toElement;}if(!(function(){while(L&&L.nodeType==3){L=L.parentNode;}return true;}).create({attempt:Browser.Engine.gecko})()){L=false; -}}}}return $extend(this,{event:A,type:J,page:I,client:C,rightClick:E,wheel:H,relatedTarget:L,target:G,code:B,key:M,shift:A.shiftKey,control:A.ctrlKey,alt:A.altKey,meta:A.metaKey}); -}});Event.Keys=new Hash({enter:13,up:38,down:40,left:37,right:39,esc:27,space:32,backspace:8,tab:9,"delete":46});Event.implement({stop:function(){return this.stopPropagation().preventDefault(); -},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); -}else{this.event.returnValue=false;}return this;}});var Class=new Native({name:"Class",initialize:function(B){B=B||{};var A=function(E){for(var D in this){this[D]=$unlink(this[D]); -}for(var F in Class.Mutators){if(!this[F]){continue;}Class.Mutators[F](this,this[F]);delete this[F];}this.constructor=A;if(E===$empty){return this;}var C=(this.initialize)?this.initialize.apply(this,arguments):this; -if(this.options&&this.options.initialize){this.options.initialize.call(this);}return C;};$extend(A,this);A.constructor=Class;A.prototype=B;return A;}}); -Class.implement({implement:function(){Class.Mutators.Implements(this.prototype,Array.slice(arguments));return this;}});Class.Mutators={Implements:function(A,B){$splat(B).each(function(C){$extend(A,($type(C)=="class")?new C($empty):C); -});},Extends:function(self,klass){var instance=new klass($empty);delete instance.parent;delete instance.parentOf;for(var key in instance){var current=self[key],previous=instance[key]; -if(current==undefined){self[key]=previous;continue;}var ctype=$type(current),ptype=$type(previous);if(ctype!=ptype){continue;}switch(ctype){case"function":if(!arguments.callee.caller){self[key]=eval("("+String(current).replace(/\bthis\.parent\(\s*(\))?/g,function(full,close){return"arguments.callee._parent_.call(this"+(close||", "); -})+")");}self[key]._parent_=previous;break;case"object":self[key]=$merge(previous,current);}}self.parent=function(){return arguments.callee.caller._parent_.apply(this,arguments); -};self.parentOf=function(descendant){return descendant._parent_.apply(this,Array.slice(arguments,1));};}};var Chain=new Class({chain:function(){this.$chain=(this.$chain||[]).extend(arguments); -return this;},callChain:function(){return(this.$chain&&this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){if(this.$chain){this.$chain.empty(); -}return this;}});var Events=new Class({addEvent:function(C,B,A){C=Events.removeOn(C);if(B!=$empty){this.$events=this.$events||{};this.$events[C]=this.$events[C]||[]; -this.$events[C].include(B);if(A){B.internal=true;}}return this;},addEvents:function(A){for(var B in A){this.addEvent(B,A[B]);}return this;},fireEvent:function(C,B,A){C=Events.removeOn(C); -if(!this.$events||!this.$events[C]){return this;}this.$events[C].each(function(D){D.create({bind:this,delay:A,"arguments":B})();},this);return this;},removeEvent:function(B,A){B=Events.removeOn(B); -if(!this.$events||!this.$events[B]){return this;}if(!A.internal){this.$events[B].erase(A);}return this;},removeEvents:function(C){for(var D in this.$events){if(C&&C!=D){continue; -}var B=this.$events[D];for(var A=B.length;A--;A){this.removeEvent(D,B[A]);}}return this;}});Events.removeOn=function(A){return A.replace(/^on([A-Z])/,function(B,C){return C.toLowerCase(); -});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));if(!this.addEvent){return this;}for(var A in this.options){if($type(this.options[A])!="function"||!(/^on[A-Z]/).test(A)){continue; -}this.addEvent(A,this.options[A]);delete this.options[A];}return this;}});Document.implement({newElement:function(A,B){if(Browser.Engine.trident&&B){["name","type","checked"].each(function(C){if(!B[C]){return ; -}A+=" "+C+'="'+B[C]+'"';if(C!="checked"){delete B[C];}});A="<"+A+">";}return $.element(this.createElement(A)).set(B);},newTextNode:function(A){return this.createTextNode(A); -},getDocument:function(){return this;},getWindow:function(){return this.defaultView||this.parentWindow;},purge:function(){var C=this.getElementsByTagName("*"); -for(var B=0,A=C.length;B1);A.each(function(E){var F=this.getElementsByTagName(E.trim());(B)?C.extend(F):C=F;},this);return new Elements(C,{ddup:B,cash:!D}); -}});Element.Storage={get:function(A){return(this[A]||(this[A]={}));}};Element.Inserters=new Hash({before:function(B,A){if(A.parentNode){A.parentNode.insertBefore(B,A); -}},after:function(B,A){if(!A.parentNode){return ;}var C=A.nextSibling;(C)?A.parentNode.insertBefore(B,C):A.parentNode.appendChild(B);},bottom:function(B,A){A.appendChild(B); -},top:function(B,A){var C=A.firstChild;(C)?A.insertBefore(B,C):A.appendChild(B);}});Element.Inserters.inside=Element.Inserters.bottom;Element.Inserters.each(function(C,B){var A=B.capitalize(); -Element.implement("inject"+A,function(D){C(this,$(D,true));return this;});Element.implement("grab"+A,function(D){C($(D,true),this);return this;});});Element.implement({getDocument:function(){return this.ownerDocument; -},getWindow:function(){return this.ownerDocument.getWindow();},getElementById:function(D,C){var B=this.ownerDocument.getElementById(D);if(!B){return null; -}for(var A=B.parentNode;A!=this;A=A.parentNode){if(!A){return null;}}return $.element(B,C);},set:function(D,B){switch($type(D)){case"object":for(var C in D){this.set(C,D[C]); -}break;case"string":var A=Element.Properties.get(D);(A&&A.set)?A.set.apply(this,Array.slice(arguments,1)):this.setProperty(D,B);}return this;},get:function(B){var A=Element.Properties.get(B); -return(A&&A.get)?A.get.apply(this,Array.slice(arguments,1)):this.getProperty(B);},erase:function(B){var A=Element.Properties.get(B);(A&&A.erase)?A.erase.apply(this,Array.slice(arguments,1)):this.removeProperty(B); -return this;},match:function(A){return(!A||Element.get(this,"tag")==A);},inject:function(B,A){Element.Inserters.get(A||"bottom")(this,$(B,true));return this; -},wraps:function(B,A){B=$(B,true);return this.replaces(B).grab(B,A);},grab:function(B,A){Element.Inserters.get(A||"bottom")($(B,true),this);return this; -},appendText:function(B,A){return this.grab(this.getDocument().newTextNode(B),A);},adopt:function(){Array.flatten(arguments).each(function(A){A=$(A,true); -if(A){this.appendChild(A);}},this);return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},clone:function(D,C){switch($type(this)){case"element":var H={}; -for(var G=0,E=this.attributes.length;G1),cash:!G});}});Element.implement({match:function(B){if(!B){return true; -}var D=Selectors.Utils.parseTagAndID(B);var A=D[0],E=D[1];if(!Selectors.Filters.byID(this,E)||!Selectors.Filters.byTag(this,A)){return false;}var C=Selectors.Utils.parseSelector(B); -return(C)?Selectors.Utils.filter(this,C,{}):true;}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)["']?(.*?)["']?)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)}; -Selectors.Utils={chk:function(B,C){if(!C){return true;}var A=$uid(B);if(!C[A]){return C[A]=true;}return false;},parseNthArgument:function(F){if(Selectors.Cache.nth[F]){return Selectors.Cache.nth[F]; -}var C=F.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!C){return false;}var E=parseInt(C[1]);var B=(E||E===0)?E:1;var D=C[2]||false;var A=parseInt(C[3])||0; -if(B!=0){A--;while(A<1){A+=B;}while(A>=B){A-=B;}}else{B=A;D="index";}switch(D){case"n":C={a:B,b:A,special:"n"};break;case"odd":C={a:2,b:0,special:"n"}; -break;case"even":C={a:2,b:1,special:"n"};break;case"first":C={a:0,special:"index"};break;case"last":C={special:"last-child"};break;case"only":C={special:"only-child"}; -break;default:C={a:(B-1),special:"index"};}return Selectors.Cache.nth[F]=C;},parseSelector:function(E){if(Selectors.Cache.parsed[E]){return Selectors.Cache.parsed[E]; -}var D,H={classes:[],pseudos:[],attributes:[]};while((D=Selectors.RegExps.combined.exec(E))){var I=D[1],G=D[2],F=D[3],B=D[4],C=D[5],J=D[6];if(I){H.classes.push(I); -}else{if(C){var A=Selectors.Pseudo.get(C);if(A){H.pseudos.push({parser:A,argument:J});}else{H.attributes.push({name:C,operator:"=",value:J});}}else{if(G){H.attributes.push({name:G,operator:F,value:B}); -}}}}if(!H.classes.length){delete H.classes;}if(!H.attributes.length){delete H.attributes;}if(!H.pseudos.length){delete H.pseudos;}if(!H.classes&&!H.attributes&&!H.pseudos){H=null; -}return Selectors.Cache.parsed[E]=H;},parseTagAndID:function(B){var A=B.match(Selectors.RegExps.tag);var C=B.match(Selectors.RegExps.id);return[(A)?A[1]:"*",(C)?C[1]:false]; -},filter:function(F,C,E){var D;if(C.classes){for(D=C.classes.length;D--;D){var G=C.classes[D];if(!Selectors.Filters.byClass(F,G)){return false;}}}if(C.attributes){for(D=C.attributes.length; -D--;D){var B=C.attributes[D];if(!Selectors.Filters.byAttribute(F,B.name,B.operator,B.value)){return false;}}}if(C.pseudos){for(D=C.pseudos.length;D--;D){var A=C.pseudos[D]; -if(!Selectors.Filters.byPseudo(F,A.parser,A.argument,E)){return false;}}}return true;},getByTagAndID:function(B,A,D){if(D){var C=(B.getElementById)?B.getElementById(D,true):Element.getElementById(B,D,true); -return(C&&Selectors.Filters.byTag(C,A))?[C]:[];}else{return B.getElementsByTagName(A);}},search:function(J,I,O){var B=[];var C=I.trim().replace(Selectors.RegExps.splitter,function(Z,Y,X){B.push(Y); -return":)"+X;}).split(":)");var K,F,E,V;for(var U=0,Q=C.length;U":function(H,G,I,A,F){var C=Selectors.Utils.getByTagAndID(G,I,A);for(var E=0,D=C.length;EA){return false; -}}return(C==A);},even:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n+1",A);},odd:function(B,A){return Selectors.Pseudo["nth-child"].call(this,"2n",A); -}});Element.Events.domready={onAdd:function(A){if(Browser.loaded){A.call(this);}}};(function(){var B=function(){if(Browser.loaded){return ;}Browser.loaded=true; -window.fireEvent("domready");document.fireEvent("domready");};switch(Browser.Engine.name){case"webkit":(function(){(["loaded","complete"].contains(document.readyState))?B():arguments.callee.delay(50); -})();break;case"trident":var A=document.createElement("div");(function(){($try(function(){A.doScroll("left");return $(A).inject(document.body).set("html","temp").dispose(); -}))?B():arguments.callee.delay(50);})();break;default:window.addEvent("load",B);document.addEvent("DOMContentLoaded",B);}})();var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(B,A){this.key=B; -this.setOptions(A);},write:function(B){B=encodeURIComponent(B);if(this.options.domain){B+="; domain="+this.options.domain;}if(this.options.path){B+="; path="+this.options.path; -}if(this.options.duration){var A=new Date();A.setTime(A.getTime()+this.options.duration*24*60*60*1000);B+="; expires="+A.toGMTString();}if(this.options.secure){B+="; secure"; -}this.options.document.cookie=this.key+"="+B;return this;},read:function(){var A=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); -return(A)?decodeURIComponent(A[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write("");return this;}});Cookie.write=function(B,C,A){return new Cookie(B,A).write(C); -};Cookie.read=function(A){return new Cookie(A).read();};Cookie.dispose=function(B,A){return new Cookie(B,A).dispose();};var Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false},initialize:function(A){this.xhr=new Browser.Request(); -this.setOptions(A);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running){return ; -}this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML}; -this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}this.xhr.onreadystatechange=$empty;},isSuccess:function(){return((this.status>=200)&&(this.status<300)); -},processScripts:function(A){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return $exec(A);}return A.stripScripts(this.options.evalScripts); -},success:function(B,A){this.onSuccess(this.processScripts(B),A);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); -},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},setHeader:function(A,B){this.headers.set(A,B); -return this;},getHeader:function(A){return $try(function(){return this.xhr.getResponseHeader(A);}.bind(this));},check:function(A){if(!this.running){return true; -}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(A.bind(this,Array.slice(arguments,1)));return false;}return false; -},send:function(I){if(!this.check(arguments.callee,I)){return this;}this.running=true;var G=$type(I);if(G=="string"||G=="element"){I={data:I};}var D=this.options; -I=$extend({data:D.data,url:D.url,method:D.method},I);var E=I.data,B=I.url,A=I.method;switch($type(E)){case"element":E=$(E).toQueryString();break;case"object":case"hash":E=Hash.toQueryString(E); -}if(this.options.format){var H="format="+this.options.format;E=(E)?H+"&"+E:H;}if(this.options.emulation&&["put","delete"].contains(A)){var F="_method="+A; -E=(E)?F+"&"+E:F;A="post";}if(this.options.urlEncoded&&A=="post"){var C=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers.set("Content-type","application/x-www-form-urlencoded"+C); -}if(E&&A=="get"){B=B+(B.contains("?")?"&":"?")+E;E=null;}this.xhr.open(A.toUpperCase(),B,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this); -this.headers.each(function(K,J){if(!$try(function(){this.xhr.setRequestHeader(J,K);return true;}.bind(this))){this.fireEvent("exception",[J,K]);}},this); -this.fireEvent("request");this.xhr.send(E);if(!this.options.async){this.onStateChange();}return this;},cancel:function(){if(!this.running){return this; -}this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});(function(){var A={}; -["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(B){A[B]=function(){var C=Array.link(arguments,{url:String.type,data:$defined}); -return this.send($extend(C,{method:B.toLowerCase()}));};});Request.implement(A);})();Element.Properties.send={set:function(A){var B=this.retrieve("send"); -if(B){B.cancel();}return this.eliminate("send").store("send:options",$extend({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")},A)); -},get:function(A){if(A||!this.retrieve("send")){if(A||!this.retrieve("send:options")){this.set("send",A);}this.store("send",new Request(this.retrieve("send:options"))); -}return this.retrieve("send");}};Element.implement({send:function(A){var B=this.get("send");B.send({data:this,url:A||B.options.url});return this;}}); \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/js/movement.js b/sqlbuddy2986dsfez893qs2df/js/movement.js deleted file mode 100644 index af2ea1959f..0000000000 --- a/sqlbuddy2986dsfez893qs2df/js/movement.js +++ /dev/null @@ -1,206 +0,0 @@ -var mouseX = -1; -var mouseY = -1; -var lastWidth = -1; -var lastHeight = -1; -var lastLeft = -1; -var lastTop = -1; -var activeContent; -var compX = 0; -var compY = 0; -var activeColumnId = -1; -var activeColumn; -var styleNodeKeys = []; -var styleNodes = []; - -function startResize(e) { - var event = new Event(e); - - activeWindow = event.target; - while (activeWindow != null && activeWindow.className.indexOf("fulltextwin") == -1) { - activeWindow = activeWindow.parentNode; - } - - activeContent = $E(".fulltextcontent", activeWindow); - - lastWidth = parseInt(activeWindow.offsetWidth); - lastHeight = parseInt(activeContent.offsetHeight); - mouseX = event.page.x; - mouseY = event.page.y; - - activeContent.style.height = lastHeight + "px"; - activeContent.style.maxHeight = ''; - - window.addEvent("mousemove", doResize); - window.addEvent("mouseup", endResize); - - return false; -} - -function doResize(e) { - if (activeWindow) { - var event = new Event(e); - - var diffX = event.page.x - mouseX; - var diffY = event.page.y - mouseY; - - if (compX > 0 && compX > diffX) { - compX -= diffX; - diffX = 0; - } else if (compX > 0) { - diffX -= compX; - compX = 0; - } - - if (compY > 0 && compY > diffY) { - compY -= diffY; - diffY = 0; - } else if (compY > 0) { - diffY -= compY; - compY = 0; - } - - lastWidth = lastWidth + diffX; - lastHeight = lastHeight + diffY; - - if (lastWidth < 175) { - compX += 175 - lastWidth; - lastWidth = 175; - } - - if (lastHeight < 100) { - compY += 100 - lastHeight; - lastHeight = 100; - } - - mouseX = event.page.x; - mouseY = event.page.y; - - activeWindow.style.width = lastWidth + "px"; - activeContent.style.height = lastHeight + "px"; - } -} - -function endResize() { - activeWindow = null; - activeContent = null; - compX = 0; - compY = 0; - window.removeEvent("mousemove", doResize); - window.removeEvent("mouseup", endResize); -} - -function startDrag(e) { - var event = new Event(e); - - activeWindow = event.target; - while (activeWindow != null && activeWindow.className.indexOf("fulltextwin") == -1) { - activeWindow = activeWindow.parentNode; - } - - lastLeft = activeWindow.style.left; - lastLeft = parseInt(lastLeft.substring(0, lastLeft.length - 2)); - lastTop = activeWindow.style.top; - lastTop = parseInt(lastTop.substring(0, lastTop.length - 2)); - mouseX = event.page.x; - mouseY = event.page.y; - - window.addEvent("mousemove", doDrag); - window.addEvent("mouseup", endDrag); - - return false; -} - -function doDrag(e) { - if (activeWindow) { - var event = new Event(e); - - var diffX = event.page.x - mouseX; - var diffY = event.page.y - mouseY; - - lastLeft = lastLeft + diffX; - lastTop = lastTop + diffY; - mouseX = event.page.x; - mouseY = event.page.y; - - activeWindow.style.left = lastLeft + "px"; - activeWindow.style.top = lastTop + "px"; - } -} - -function endDrag() { - activeWindow = null; - window.removeEvent("mousemove", doDrag); - window.removeEvent("mouseup", endDrag); -} - -function startColumnResize(e) { - var event = new Event(e); - - activeColumn = $(event.target.offsetParent.previousSibling.firstChild); - - activeColumnId = parseInt(activeColumn.getProperty("column")); - - lastWidth = parseInt(activeColumn.clientWidth) - 11; // -11 to account for padding - mouseX = event.page.x; - - document.body.style.cursor = "ew-resize"; - - window.addEvent("mousemove", columnResize); - window.addEvent("mouseup", endColumnResize); - - return false; -} - -function columnResize(e) { - if (activeColumn) { - var event = new Event(e); - - var diff = (event.page.x - mouseX); - - lastWidth = (lastWidth + diff); - mouseX = event.page.x; - - var removeLater = -1; - var keyName = 'pane' + sb.topTab + '_' + activeColumnId; - - for (var i=0; i= 0) { - styleNodes.splice(removeLater, 1); - styleNodeKeys.splice(removeLater, 1); - } - - var newNode = new Element("style"); - newNode.setAttribute("type", "text/css"); - - newNode.appendText("#pane" + sb.topTab + " .column" + activeColumnId + " { width: " + lastWidth + "px !important }"); - document.getElementsByTagName("head")[0].appendChild(newNode); - - styleNodes.push(newNode); - styleNodeKeys.push(keyName); - } -} - -function endColumnResize() { - document.body.style.cursor = ""; - activeColumn = null; - window.removeEvent("mousemove", columnResize); - window.removeEvent("mouseup", endColumnResize); -} - -function clearColumnSizes() { - if (styleNodes.length > 0) { - for (var i=0; i - -*/ - -include "functions.php"; - -$adapter = (isset($sbconfig['DefaultAdapter'])) ? $sbconfig['DefaultAdapter'] : "mysql"; -$host = (isset($sbconfig['DefaultHost'])) ? $sbconfig['DefaultHost'] : "localhost"; -$user = (isset($sbconfig['DefaultUser'])) ? $sbconfig['DefaultUser'] : "root"; -$pass = (isset($sbconfig['DefaultPass'])) ? $sbconfig['DefaultPass'] : ""; - -// SQLite only -$database = (isset($sbconfig['DefaultDatabase'])) ? $sbconfig['DefaultDatabase'] : ""; - -if ($_POST) { - if (isset($_POST['ADAPTER'])) - $adapter = $_POST['ADAPTER']; - - if (isset($_POST['HOST'])) - $host = $_POST['HOST']; - - if (isset($_POST['USER'])) - $user = $_POST['USER']; - - if (isset($_POST['PASS'])) - $pass = $_POST['PASS']; - - if (isset($_POST['DATABASE'])) - $database = $_POST['DATABASE']; -} - -if (!in_array($adapter, $adapterList)) { - $adapter = "mysql"; -} - -if (($adapter != "sqlite" && $host && $user && ($pass || $_POST)) || ($adapter == "sqlite" && $database)) { - - if ($adapter == "sqlite") { - $connString = "sqlite:database=$database"; - $connCheck = new SQL($connString); - $user = ""; - $pass = ""; - } else { - $connString = "$adapter:host=$host"; - $connCheck = new SQL($connString, $user, $pass); - } - - if ($connCheck->isConnected()) { - $_SESSION['SB_LOGIN'] = true; - $_SESSION['SB_LOGIN_STRING'] = $connString; - $_SESSION['SB_LOGIN_USER'] = $user; - $_SESSION['SB_LOGIN_PASS'] = $pass; - - $path = $_SERVER["SCRIPT_NAME"]; - $pathSplit = explode("/", $path); - - $redirect = ""; - - for ($i=0; $i - - - - SQL Buddy - - " /> - " /> - " media="print" /> - " /> - - - - - - -
      -
      -
      -
      - - - - - - - - -

      - - - - - - '; - } - if (isset($_GET['timeout'])) { - echo ''; - } - - if (sizeof($adapterList) > 1) { - - ?> - - - - - -

      ' . $error . '
      ' . __("Your session has timed out. Please login again.") . '
      - -
      - > - - - - - - - - - - - - - - > - - - - - - - - - - -
      " />
      - -
      -
      -
      -
      - - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/logout.php b/sqlbuddy2986dsfez893qs2df/logout.php deleted file mode 100644 index 8138354238..0000000000 --- a/sqlbuddy2986dsfez893qs2df/logout.php +++ /dev/null @@ -1,41 +0,0 @@ - - -*/ - -if (!session_id()) - session_start(); - -if (isset($_SESSION['SB_LOGIN'])) { - $_SESSION['SB_LOGIN'] = null; - unset($GLOBALS['_SESSION']['SB_LOGIN']); -} - -if (isset($_SESSION['SB_LOGIN_STRING'])) { - $_SESSION['SB_LOGIN_STRING'] = null; - unset($GLOBALS['_SESSION']['SB_LOGIN_STRING']); -} - -if (isset($_SESSION['SB_LOGIN_USER'])) { - $_SESSION['SB_LOGIN_USER'] = null; - unset($GLOBALS['_SESSION']['SB_LOGIN_USER']); -} - -if (isset($_SESSION['SB_LOGIN_PASS'])) { - $_SESSION['SB_LOGIN_PASS'] = null; - unset($GLOBALS['_SESSION']['SB_LOGIN_PASS']); -} - -header("Location: login.php"); - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/query.php b/sqlbuddy2986dsfez893qs2df/query.php deleted file mode 100644 index 81e58e7f69..0000000000 --- a/sqlbuddy2986dsfez893qs2df/query.php +++ /dev/null @@ -1,78 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($_POST['query'])) - $query = $_POST['query']; - -echo '
      '; - -if (isset($db)) { - echo '' . sprintf(__("Run a query on the %s database"), $db) . '.'; -} - -if (isset($query)) { - $displayQuery = $query; -} else if (isset($db) && isset($table) && $conn->getAdapter() == "mysql") { - $displayQuery = "SELECT * FROM `$table` LIMIT 100"; -} else if (isset($db) && isset($table) && $conn->getAdapter() == "sqlite") { - $displayQuery = "SELECT * FROM '$table' LIMIT 100"; -} - -?> - -
      - - - - - -
      - - - " /> -
      -
      - -
      - -'; - - require "includes/browse.php"; - - echo ''; -} - -?> - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/serve.php b/sqlbuddy2986dsfez893qs2df/serve.php deleted file mode 100644 index fcec1b681d..0000000000 --- a/sqlbuddy2986dsfez893qs2df/serve.php +++ /dev/null @@ -1,116 +0,0 @@ - - -*/ - -include "config.php"; - -function compressCSS($input) { - // remove comments - $input = preg_replace("/\/\*.*\*\//Us", "", $input); - - // remove unnecessary characters - $input = str_replace(":0px", ":0", $input); - $input = str_replace(":0em", ":0", $input); - $input = str_replace(" 0px", " 0", $input); - $input = str_replace(" 0em", " 0", $input); - $input = str_replace(";}", "}", $input); - - // remove spaces, etc - $input = preg_replace('/\s\s+/', ' ', $input); - $input = str_replace(" {", "{", $input); - $input = str_replace("{ ", "{", $input); - $input = str_replace("\n{", "{", $input); - $input = str_replace("{\n", "{", $input); - $input = str_replace(" }", "}", $input); - $input = str_replace("} ", "}", $input); - $input = str_replace(": ", ":", $input); - $input = str_replace(" :", ":", $input); - $input = str_replace(";\n", ";", $input); - $input = str_replace(" ;", ";", $input); - $input = str_replace("; ", ";", $input); - $input = str_replace(", ", ",", $input); - - return trim($input); -} - -function compressJS($input) { - - // remove comments - $input = preg_replace("/\/\/.*\n/Us", "", $input); - $input = preg_replace("/\/\*.*\*\//Us", "", $input); - - // remove spaces, etc - $input = preg_replace("/\t/", "", $input); - $input = preg_replace("/\n\n+/m", "\n", $input); - $input = str_replace(";\n", ";", $input); - $input = str_replace(" = ", "=", $input); - $input = str_replace(" == ", "==", $input); - $input = str_replace(" || ", "||", $input); - $input = str_replace(" && ", "&&", $input); - $input = str_replace(")\n{", "){", $input); - $input = str_replace("if (", "if(", $input); - - return trim($input); -} - -if (isset($_GET['file'])) { - - $filename = $_GET['file']; - - if (!(strpos($filename, "css/") === 0 || strpos($filename, "themes/") === 0 || strpos($filename, "js/") === 0)) - exit; - - if (strpos($filename, "..") !== false) - exit; - - if (file_exists($filename)) { - if (extension_loaded('zlib') && ((isset($sbconfig['EnableGzip']) && $sbconfig['EnableGzip'] == true) || !isset($sbconfig['EnableGzip']))) { - ob_start("ob_gzhandler"); - } else { - ob_start(); - } - - $last_modified_time = filemtime($filename); - $etag = md5_file($filename); - - header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified_time) . " GMT"); - header("Expires: " . gmdate("D, d M Y H:i:s", time()+24*60*60*60) . " GMT"); - header("Etag: $etag"); - - if ((array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER) && @strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time) || (array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)) { - header("HTTP/1.1 304 Not Modified"); - exit; - } - - $contents = file_get_contents($filename); - - if (substr($filename, -4) == ".css") { - header("Content-Type: text/css; charset=utf-8"); - $contents = compressCSS($contents); - } else if (substr($filename, -3) == ".js" && strpos($filename, "mootools") === false) { - header("Content-Type: application/x-javascript; charset=utf-8"); - $contents = compressJS($contents); - } else if (substr($filename, -3) == ".js") { - header("Content-Type: application/x-javascript; charset=utf-8"); - } - - echo $contents; - - ob_end_flush(); - } else { - echo "File doesn't exist!"; - } -} - -?> \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/structure.php b/sqlbuddy2986dsfez893qs2df/structure.php deleted file mode 100644 index 827de5ab6a..0000000000 --- a/sqlbuddy2986dsfez893qs2df/structure.php +++ /dev/null @@ -1,775 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -requireDatabaseAndTableBeDefined(); - -if (isset($db)) - $conn->selectDB($db); - -if (isset($_POST)) { - - // process form - add index - if (isset($_POST['INDEXTYPE'])) - $indexType = $_POST['INDEXTYPE']; - - if (isset($_POST['INDEXCOLUMNLIST'])) - $indexColumnList = $_POST['INDEXCOLUMNLIST']; - - if (isset($indexType) && isset($indexColumnList) && $indexType && $indexColumnList) { - $indexColumnList = implode("`, `", $indexColumnList); - - $indexQuery = "ALTER TABLE `$table` ADD "; - - if ($indexType == "INDEX") - $indexQuery .= "INDEX"; - else if ($indexType == "UNIQUE") - $indexQuery .= "UNIQUE"; - - $indexQuery .= " (`" . $indexColumnList . "`)"; - - $conn->query($indexQuery) or ($dbError = $conn->error()); - } - - ?> - - - - query($query) or ($dbError = $conn->error()); - } -} - -if (isset($dbError)) { - echo '
      ' . __("Error performing operation") . '

      ' . $dbError . '

      '; -} - -$structureSql = $conn->describeTable($table); - -if ($conn->getAdapter() == "mysql" && $conn->isResultSet($structureSql)) { - -?> - - - - - - -
      - - - - - -
      - - ' . __("Columns") . '    '; - - echo __("Select") . ':  ' . __("All") . '  ' . __("None") . ''; - echo '     ' . __("With selected") . ':  ' . __("Edit") . '  ' . __("Delete") . ''; - - ?> - -
      - - '; - - echo '
       
      '; - - echo '
      '; - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . __("Name") . '
      ' . __("Type") . '
      ' . __("Default") . '
      '; - echo '
      '; - echo '
      '; - - echo '
      '; - - $m = 0; - - while ($structureRow = $conn->fetchAssoc($structureSql)) { - echo '
      '; - } - - echo '
      '; - - $structureSql = $conn->describeTable($table); - - echo '
      '; - - $m = 0; - - while ($structureRow = $conn->fetchAssoc($structureSql)) { - - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . $structureRow['Field'] . '
      ' . $structureRow['Type'] . '
      ' . $structureRow['Default'] . '
      '; - echo '
      '; - - $fieldList[] = $structureRow['Field']; - - $m++; - } - - echo '
      '; - echo ''; - - ?> - -
      -

      - -
      - - - - - - - - - - - - - - - - - - - - - "; - echo __("Charset") . ":"; - echo ""; - echo ""; - } else { - echo ""; - echo ""; - } - - ?> - - - - - - - - - -
      - : - - - - : - - -
      - : - - - - : - - -
      - : - - - "; - echo ""; - echo "
      - : - - - - - -
      - :   - - " /> -
      -
      -
      - -
      -

      - -
      -
      - - - - - - query("SHOW TABLE STATUS LIKE '$table'"); - - if ($conn->isResultSet($infoSql) == 1) { - - $infoRow = $conn->fetchAssoc($infoSql); - - echo ""; - echo ""; - echo ""; - echo ""; - - } - } - - echo ''; - echo ''; - echo ''; - echo ''; - - ?> -
      - : - - -
      "; - echo __("Charset") . ":"; - echo ""; - echo ""; - echo "
      '; - echo ''; - echo '
      -
      -
      - - query("SHOW INDEX FROM `$table`"); - - if ($conn->isResultSet($indexListSQL)) { - - ?> - -
      - - - - - -
      - - ' . __("Indexes") . '    '; - - echo __("Select") . ':  ' . __("All") . '  ' . __("None") . ''; - echo '     ' . __("With selected") . ':  ' . __("Delete") . ''; - - ?> - -
      - - fetchAssoc($indexListSQL)) { - if (!array_key_exists($indexListRow['Key_name'], $indexList)) { - $indexList[$indexListRow['Key_name']] = $indexListRow['Column_name']; - } else { - $indexList[$indexListRow['Key_name']] .= ", " . $indexListRow['Column_name']; - } - } - - echo '
      '; - - echo '
       
      '; - - echo '
      '; - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . __("Key") . '
      ' . __("Columns") . '
      '; - echo '
      '; - echo '
      '; - - echo '
      '; - - $m = 0; - - foreach ($indexList as $keyName => $columns) { - echo '
      '; - } - - echo '
      '; - - echo '
      '; - - $m = 0; - - foreach ($indexList as $keyName => $columns) { - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . $keyName . '
      ' . $columns . '
      '; - echo '
      '; - - - $m++; - } - - echo '
      '; - echo '
      '; - - $m++; - - } - - ?> - -
      -

      -
      -
      - - - - - - - - - - - - - -
      - : - - -
      - : - - ' . $fieldList[$i] . '
      '; - } - - if (count($fieldList) > 5) { - echo '' . sprintf(__("Show %d more..."), count($fieldList) - 5) . ''; - echo ''; - } - - ?> -
      - " /> -
      -
      -
      -
      - -
      -
      - -

      - -
      -
      -
      - -
      - - query("SHOW TABLE STATUS LIKE '$table'"); - - if ($conn->isResultSet($infoSql) == 1) { - - $infoRow = $conn->fetchAssoc($infoSql); - - ?> - -

      -
      - ' . __("Storage engine") . ':
      ' . $engine . '
      '; - - if (array_key_exists('Collation', $infoRow) && isset($collationList)) { - echo '
      ' . ("Charset") . ':
      ' . $collationList[$infoRow['Collation']] . '
      '; - } - - echo '
      ' . __("Rows") . ':
      ' . number_format($infoRow['Rows']) . '
      '; - echo '
      ' . __("Size") . ':
      ' . memoryFormat($infoRow['Data_length']) . '
      '; - echo '
      ' . __("Overhead") . ':
      ' . memoryFormat($infoRow['Data_free']) . '
      '; - echo '
      ' . __("Auto Increment") . ':
      ' . number_format($infoRow['Auto_increment']) . '
      '; - - ?> -
      -
      - - - - - -
      -
      - -getAdapter() == "sqlite" && sizeof($structureSql) > 0) { - -?> - - - - - -
      - - - - - -
      - - ' . __("Columns") . ''; - - ?> - -
      - - '; - - echo '
      '; - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . __("Name") . '
      ' . __("Type") . '
      '; - echo '
      '; - echo '
      '; - - echo '
      '; - - $m = 0; - - foreach ($structureSql as $column) { - - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . $column[0] . '
      ' . $column[1] . '
      '; - echo '
      '; - - $fieldList[] = $column[0]; - - $m++; - } - - echo '
      '; - echo ''; - - if (version_compare($conn->getVersion(), "3.1.3", ">")) { - - ?> - -
      -

      - -
      - - - - - - - - - - - - - - - - - - - - -
      - : - - - - : - - -
      - : - - - - : - - -
      - : - - - -
      - " /> -
      -
      -
      - -
      -

      - -
      -
      - - - - - - - - - -
      - : - - -
      - " /> -
      -
      -
      - - - -
      -
      - -

      - -
      -
      -
      -
      - - tableRowCount($table); - - ?> - -

      -
      - ' . __("Rows") . ':
      ' . number_format($rowCount) . '
      '; - - ?> -
      -
      - - - -
      -
      - - - -
      -

      -

      -
      - - \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/ie.css b/sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/ie.css deleted file mode 100644 index 7965211c35..0000000000 --- a/sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/ie.css +++ /dev/null @@ -1,44 +0,0 @@ -#header { -padding-bottom: 4px; -} - -#rightside { -padding-bottom: 0 !important; -} - -.leftchecks { -margin-left: -22px !important; -} -.browsetab .leftchecks { -margin-left: -38px !important; -} - -.manip { -padding-top: 0 !important; -padding-bottom: 1px !important; -} -.manip dt { -padding: 0 5px 0 1px !important; -} - -.browsetab .gridheader, .users .gridheader { -margin-top: -15px; -} - -.dblist { -float: none !important; -} -.dblist ul li { -float: none !important; -} - -.sublist { -width: 225px; -} - -#leftside { -width: 225px !important; -} -#rightside { -margin-left: 225px !important; -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/main.css b/sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/main.css deleted file mode 100644 index 4937196e9f..0000000000 --- a/sqlbuddy2986dsfez893qs2df/themes/bittersweet/css/main.css +++ /dev/null @@ -1,155 +0,0 @@ -body { -background: rgb(255, 255, 255) url(../images/initLoad-dark.png) no-repeat 50% 125px; -} - -#header { -background: rgb(80, 80, 80) url(../images/header.png) repeat-x; -} - -#headerlogo { -width: 185px !important; -} -#leftside { -width: 205px !important; -overflow-y: hidden; -} -#rightside { -margin-left: 205px !important; -} -#sidemenu { -overflow-x: hidden; -} - -#bottom { -background: transparent url(../../../images/window-shadow-bottom.png) repeat-x scroll 0px -7px; -} - -#innercontent a { -color: steelBlue; -} -#innercontent a:hover { -color: rgb(50, 50, 50); -} - -h3, h4 { -color: rgb(135, 135, 115); -text-transform: uppercase; -font-weight: normal; -} -h3 { -font-size: 12px; -} -h4 { -border-bottom: 1px solid rgb(210, 210, 210); -line-height: 1.3; -font-size: 14px; -} - -#headerinfo a { -color: rgb(200, 200, 200) !important; -text-decoration: none; -} -#headerinfo a:hover { -color: rgb(250, 250, 250) !important; -} - -.grid { -border-color: rgb(220, 220, 220) rgb(190, 190, 190) rgb(190, 190, 190) rgb(190, 190, 190); -} - -.alternator { -border-bottom-color: transparent; -background: white; -} -.alternator2 { -background: rgb(245, 245, 245); -} -.highlighted { -border-bottom-color: rgb(210, 210, 210) !important; -background: rgb(230, 230, 215) !important; -} - -.paginator a { -color: rgb(125, 125, 125) !important; -} - -.dblistheader { -color: rgb(150, 150, 150) !important; -} -.dblist { -float: left; -} -.dblist ul li { -float: left; -clear: left; -} -.dblist ul li a { -display: inline !important; -border-width: 0 !important; -} -.dblist ul li a .menutext { -color: rgb(80, 80, 80); -margin-left: 0 !important; -float: left; -} -.dblist ul li a:hover .menutext { -color: rgb(40, 40, 40); -} -.dblist ul li a .menuicon { -color: rgb(150, 150, 150) !important; -} -.dblist ul li.selected>a { -font-weight: bold; -} -.sublist { -float: left; -clear: left; -line-height: 18px; -} -.sublist li a { -color: rgb(80, 80, 80); -} -.sublist li a:hover { -color: rgb(40, 40, 40); -} -.subcount { -color: rgb(150, 150, 150); -} - -#loginform { -padding: 3px; -border: 1px solid rgb(200, 200, 200); -} -#loginform .loginspacer { -background: #E9EBDF !important; -padding: 10px 15px 10px 11px !important; -} -.loginheader { -border-bottom-color: rgb(200, 200, 200); -} -#loginform .field { -color: #777; -} - -#toptabs ul li a { -color: rgb(220, 220, 220); -} -#toptabs ul li a .rowcount { -color: rgb(175, 175, 175); -} -#toptabs ul li a:hover { -color: rgb(250, 250, 250); -} -#toptabs ul li.selected a { -color: rgb(250, 250, 250); -font-weight: bold; -} -#toptabs ul li.selected a .rowcount { -color: rgb(225, 225, 225); -} -#toptabs ul li.deactivated a { -color: rgb(135, 135, 135) !important; -} -#toptabs ul li.deactivated a .rowcount { -color: rgb(175, 175, 175) !important; -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/themes/bittersweet/images/header.png b/sqlbuddy2986dsfez893qs2df/themes/bittersweet/images/header.png deleted file mode 100644 index 1f435113154ab8e16b63fd97c400e6d0204dd209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 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 { -background: rgb(90, 90, 90) !important; -border-color: rgb(70, 70, 70); -} -.sublist li a { -color: #fff; -} -.subcount { -color: rgb(200, 200, 200); -} - -#toptabs ul li a { -color: rgb(215, 215, 215); -text-shadow: rgb(50, 50, 50) 0 1px 0; -font-weight: bold; -} -#toptabs ul li a .rowcount { -color: rgb(235, 235, 235); -} -#toptabs ul li a:hover { -color: #fff; -} -#toptabs ul li.selected a { -color: #fff; -font-weight: bold; -text-shadow: rgb(50, 50, 50) 0 1px 0; -} -#toptabs ul li.selected a .rowcount { -color: rgb(235, 235, 235); -} -#toptabs ul li.deactivated a { -color: rgb(175, 175, 175) !important; -} -#toptabs ul li.deactivated a .rowcount { -color: rgb(175, 175, 175) !important; -} \ No newline at end of file diff --git a/sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-bl.png b/sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-bl.png deleted file mode 100644 index 80510326f477b0452c408eec9f70df615c83eeea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=I14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sf4OU4u5o4#_nPosBdrud~5RU7t2RHIEC~&wQY*$Q_{kEY%)!JQoW08E`sf4OU4u5#@NEN+F<-t*47)2*-8SgMqvZiaag{ufI-eSNLe>k+t?9htaf|8{WQ4 zd*7?Fub3~C)xl-L_j~uvl6kI0c?iusIY+pGy=tFuZ0q(s9-u)Cp00i_>zopr07lX+ AXaE2J diff --git a/sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-tl.png b/sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-tl.png deleted file mode 100644 index 7b291c3f12fc03bbfc6c31dfb0a2ec7b98da33b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=I14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sf4OU4uE?F;~=ro{^g{O;S2*-8P;~RMoDDW^CY%dVruPEl%^NG*tWk`PAw|lHJ wU*22o>|*h};otJDX=|UZ)iQW)a_j@+h8>c2xxF(Yfo3pxy85}Sb4q9e0HP=@&j0`b diff --git a/sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-tr.png b/sqlbuddy2986dsfez893qs2df/themes/classic/images/corner-tr.png deleted file mode 100644 index c7b8884ca3cd70a271d932be28a079ee78ab465e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=I14-?iy0WWg+Z8+Vb&Z8pdfpR zr>`sf4OU4u5zz_T-gEAZtWV6)a89;*=JYD@<);T3K0RTkJ BEZ+bC diff --git a/sqlbuddy2986dsfez893qs2df/themes/classic/images/header.png b/sqlbuddy2986dsfez893qs2df/themes/classic/images/header.png deleted file mode 100644 index 67f369be6b37598f29910cbf2ba6befd123c3f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^j6iJ5!2~29pP#}3q}Y|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sf4R%(31s1(e``v&-0iG_7Asp9p`wsFRFyLVJm)rWg zWFg=2uYxOtR`RPP^D$rl%fcb0nDBkhK9}o0uajlg-3&e3ckI9uiLRyDM!b`E-oO97 l{c!HH^ZT#v@~hwUlr_26?Ycml>H?tI44$rjF6*2UngCYRLC^pI diff --git a/sqlbuddy2986dsfez893qs2df/themes/classic/images/shading.png b/sqlbuddy2986dsfez893qs2df/themes/classic/images/shading.png deleted file mode 100644 index 18c505dc2cfca7a0989e68aff16d6a264c2cf0e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3638 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 ITX^dK19V;BLjV8( diff --git a/sqlbuddy2986dsfez893qs2df/users.php b/sqlbuddy2986dsfez893qs2df/users.php deleted file mode 100644 index 910a68a5dc..0000000000 --- a/sqlbuddy2986dsfez893qs2df/users.php +++ /dev/null @@ -1,440 +0,0 @@ - - -*/ - -include "functions.php"; - -loginCheck(); - -function removeAdminPrivs($priv) { - if ($priv == "FILE" || $priv == "PROCESS" || $priv == "RELOAD" || $priv == "SHUTDOWN" || $priv == "SUPER") - return false; - else - return true; -} - -if ($_POST) { - - if (isset($_POST['NEWHOST'])) - $newHost = $_POST['NEWHOST']; - else - $newHost = "localhost"; - - if (isset($_POST['NEWNAME'])) - $newName = $_POST['NEWNAME']; - - if (isset($_POST['NEWPASS'])) - $newPass = $_POST['NEWPASS']; - - if (isset($_POST['ACCESSLEVEL'])) - $accessLevel = $_POST['ACCESSLEVEL']; - else - $accessLevel = "GLOBAL"; - - if ($accessLevel != "LIMITED") - $accessLevel = "GLOBAL"; - - if (isset($_POST['DBLIST'])) - $dbList = $_POST['DBLIST']; - else - $dbList = array(); - - if (isset($_POST['NEWCHOICE'])) - $newChoice = $_POST['NEWCHOICE']; - - if (isset($_POST['NEWPRIVILEGES'])) - $newPrivileges = $_POST['NEWPRIVILEGES']; - - if (isset($newName) && ($accessLevel == "GLOBAL" || ($accessLevel == "LIMITED" && sizeof($dbList) > 0))) { - - if ($newChoice == "ALL") { - $privList = "ALL"; - } else { - - if (sizeof($newPrivileges) > 0) { - if ($accessLevel == "LIMITED") { - $newPrivileges = array_filter($newPrivileges, "removeAdminPrivs"); - } - - $privList = implode(", ", $newPrivileges); - - } else { - $privList = "USAGE"; - } - } - - if ($accessLevel == "LIMITED") { - foreach ($dbList as $theDb) { - $newQuery = "GRANT " . $privList; - - $newQuery .= " ON `$theDb`.*"; - - $newQuery .= " TO '" . $newName . "'@'" . $newHost . "'"; - - if ($newPass) - $newQuery .= " IDENTIFIED BY '" . $newPass . "'"; - - if (isset($_POST['GRANTOPTION'])) - $newQuery .= " WITH GRANT OPTION"; - - $conn->query($newQuery) or ($dbError = $conn->error()); - } - } else { - $newQuery = "GRANT " . $privList; - - $newQuery .= " ON *.*"; - - $newQuery .= " TO '" . $newName . "'@'" . $newHost . "'"; - - if ($newPass) - $newQuery .= " IDENTIFIED BY '" . $newPass . "'"; - - if (isset($_POST['GRANTOPTION'])) - $newQuery .= " WITH GRANT OPTION"; - - $conn->query($newQuery) or ($dbError = $conn->error()); - } - - $conn->query("FLUSH PRIVILEGES") or ($dbError = $conn->error()); - - } -} - -$connected = $conn->selectDB("mysql"); - -// delete users -if (isset($_POST['deleteUsers']) && $connected) { - $deleteUsers = $_POST['deleteUsers']; - - // boom! - $userList = explode(";", $deleteUsers); - - foreach ($userList as $each) { - $split = explode("@", $each, 2); - - if (isset($split[0])) - $user = trim($split[0]); - - if (isset($split[1])) - $host = trim($split[1]); - - if (isset($user) && isset($host)) { - $conn->query("REVOKE ALL PRIVILEGES ON *.* FROM '$user'@'$host'"); - $conn->query("REVOKE GRANT OPTION ON *.* FROM '$user'@'$host'"); - $conn->query("DELETE FROM `user` WHERE `User`='$user' AND `Host`='$host'"); - $conn->query("DELETE FROM `db` WHERE `User`='$user' AND `Host`='$host'"); - $conn->query("DELETE FROM `tables_priv` WHERE `User`='$user' AND `Host`='$host'"); - $conn->query("DELETE FROM `columns_priv` WHERE `User`='$user' AND `Host`='$host'"); - } - } - $conn->query("FLUSH PRIVILEGES"); -} - -if (isset($dbError)) { - echo '
      '; - echo '' . __("Error performing operation") . '

      ' . $dbError . '

      '; - echo '
      '; -} - -?> - -
      - -query("SELECT * FROM `user`"); - - if ($conn->isResultSet($userSql)) { - - ?> - - - - - -
      - ' . __("All") . '  ' . __("None") . ''; - echo '     ' . __("With selected") . ':  ' . __("Edit") . '  ' . __("Delete") . ''; - - ?> - -
      - - '; - - echo '
       
      '; - - echo '
      '; - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . __("Host") . '
      ' . __("User") . '
      '; - echo '
      '; - echo '
      '; - - echo '
      '; - - $m = 0; - - while ($userRow = $conn->fetchAssoc($userSql)) { - $queryBuilder = $userRow['User'] . "@" . $userRow['Host']; - echo '
      '; - } - - echo '
      '; - - $userSql = $conn->query("SELECT * FROM `user`"); - - echo '
      '; - - if ($conn->isResultSet($userSql)) { - $m = 0; - - while ($userRow = $conn->fetchAssoc($userSql)) { - - echo '
      '; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo '
      ' . $userRow['Host'] . '
      ' . $userRow['User'] . '
      '; - echo '
      '; - - $m++; - } - } - - echo '
      '; - echo '
      '; - - } - - $hasPermissions = false; - - // check to see if this user has proper permissions to manage users - $checkSql = $conn->query("SELECT `Grant_priv` FROM `user` WHERE `Host`='" . $conn->getOptionValue("host") . "' AND `User`='" . $_SESSION['SB_LOGIN_USER'] . "' LIMIT 1"); - - if ($conn->isResultSet($checkSql)) { - $grantValue = $conn->result($checkSql, 0, "Grant_priv"); - - if ($grantValue == "Y") { - $hasPermissions = true; - } - } - - if ($hasPermissions) { - - ?> - -
      -

      - -
      - - - - - - - - - - - - - - listDatabases(); - - if ($conn->isResultSet($dbList)) { - - ?> - - - - - - - - - -
      :
      :
      :
      : -
      - - - - -
      : -
      - - - - -
      - - - - - - -
      : - -
      - -
      - " /> -
      -
      -
      - -

      -

      - -
      -

      -

      -
      - - - - \ No newline at end of file From 43365d5f3e4b11f81ce2bf4211259772f747bd94 Mon Sep 17 00:00:00 2001 From: leberny Date: Tue, 5 May 2015 11:58:38 +0200 Subject: [PATCH 108/110] Ajout de la doc pour lastChangeStateDuration Ajout de la doc pour lastChangeStateDuration --- doc/fr_FR/scenario.asciidoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/fr_FR/scenario.asciidoc b/doc/fr_FR/scenario.asciidoc index 2bac76ba1a..41b84f8e67 100644 --- a/doc/fr_FR/scenario.asciidoc +++ b/doc/fr_FR/scenario.asciidoc @@ -112,6 +112,8 @@ Vous pouvez aussi utiliser les tags suivants : * Ex : scenario(\#[Salle de bain][Lumière][Auto]#) : Renvoi 1 en cours, 0 si arreté et -1 si desactivé, -2 si le scénario n'éxiste pas et -3 si l'état n'est pas cohérent - stateDuration(commande,[valeur]) : donne la durée en seconde depuis le dernier changement de valeur * Ex : stateDuration(\#[Salle de bain][Hydrometrie][Humidité]#) : Renvoi 300 si cette valeur est la depuis 5min +- lastChangeStateDuration(commande,valeur) : renvoi la durée en secondes depuis le dernier changement d'état à la valeur passée en paramètre. + * Ex : lastChangeStateDuration(\#[Salle de bain][Hydrometrie][Humidité]#,0) : Renvoi 300 si cette valeur est passée à 0 la depuis 5 minutes (même si depuis sa valeur a changé). - lastScenarioExecution(scenario) : donne la durée en seconde depuis le dernier lancement du scénario * Ex : lastScenarioExecution(\#[Salle de bain][Lumière][Auto]#) : Renvoi 300 si le scénario c'est lancé pour la derniere fois il y a 5min - randomColor(min,max) : donne une couleur aléatoire compris entre 2 bornes ( 0 => rouge, 50 => vert, 100 => bleu) From e95df8c45fda011b5214e4cfbdc3fa17281f5707 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 17:12:40 +0200 Subject: [PATCH 109/110] Sync list of object with marke --- desktop/modal/market.send.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/desktop/modal/market.send.php b/desktop/modal/market.send.php index 06dc91f7a0..5402c0e4b7 100644 --- a/desktop/modal/market.send.php +++ b/desktop/modal/market.send.php @@ -92,9 +92,6 @@ - - - From 6b630fa63538a0fb8b5f6e6dbae94b457415b9cf Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 5 May 2015 17:19:07 +0200 Subject: [PATCH 110/110] Auto clean update table --- core/class/update.class.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/class/update.class.php b/core/class/update.class.php index acd0f536ad..9f01deac72 100644 --- a/core/class/update.class.php +++ b/core/class/update.class.php @@ -234,6 +234,13 @@ public static function findNewUpdateObject() { $update->remove(); } } + } else { + $values = array( + 'type' => $plugin_id, + ); + $sql = 'DELETE FROM `update` + WHERE type=:type'; + DB::Prepare($sql, $values, DB::FETCH_TYPE_ROW); } } }