From c9eebd3a56b411ed9c027253a11ae46d3e94c9e1 Mon Sep 17 00:00:00 2001 From: Frank Vanden Berghen Date: Thu, 12 Dec 2019 02:32:53 +0100 Subject: [PATCH] release v3 release v3 issues 8,10,14,38,27,34 are now fixed --- JSON_SQL_Bridge/classes.php | 2 +- JSON_SQL_Bridge/config.php | 2 +- JSON_SQL_Bridge/configdbconnections.php | 11 + JSON_SQL_Bridge/configreadinifile.php | 2 +- JSON_SQL_Bridge/constants.php | 2 +- JSON_SQL_Bridge/constantscfg.php | 2 +- .../dashboard/actions/changeShared.php | 9 +- .../dashboard/actions/isShared.php | 9 +- JSON_SQL_Bridge/dashboard/dashboard.php | 54 +- .../formAccelerateDashboardsSubmit.php | 2 +- .../formAccelerateTopQueriesSubmit.php | 2 +- JSON_SQL_Bridge/formDeleteCacheOldSubmit.php | 40 - JSON_SQL_Bridge/formDeleteCacheSubmit.php | 26 - JSON_SQL_Bridge/formRegisterTableSubmit.php | 216 ++- JSON_SQL_Bridge/functionsaux.php | 4 +- JSON_SQL_Bridge/functionsauxkibella.php | 2 +- JSON_SQL_Bridge/functionscfg.php | 2 +- JSON_SQL_Bridge/functionsdashaccelerate.php | 2 +- JSON_SQL_Bridge/functionsdb.php | 18 +- JSON_SQL_Bridge/functionsmsg.php | 2 +- JSON_SQL_Bridge/functionsparse.php | 6 +- JSON_SQL_Bridge/functionsquery.php | 2 +- JSON_SQL_Bridge/functionsserver.php | 18 +- JSON_SQL_Bridge/functionsstatic.php | 2 +- JSON_SQL_Bridge/geohash.php | 2 +- JSON_SQL_Bridge/globals.php | 2 +- JSON_SQL_Bridge/requests.php | 2 +- JSON_SQL_Bridge/reset.php | 2 +- JSON_SQL_Bridge/table/actions/insert.php | 98 -- JSON_SQL_Bridge/users/manager.php | 111 +- JSON_SQL_Bridge/users/session.php | 10 +- JSON_SQL_Bridge/users/user.php | 14 +- README.md | 12 +- interface/components/agg_types/_agg_type.js | 2 +- .../components/agg_types/buckets/terms.js | 3 - .../components/agg_types/controls/field.html | 6 +- .../agg_types/controls/raw_json.html | 2 +- interface/components/config/defaults.js | 8 +- .../data_source/_root_search_source.js | 4 +- .../components/courier/fetch/_call_client.js | 2 +- .../components/courier/fetch/strategy/doc.js | 4 +- .../courier/fetch/strategy/search.js | 2 +- .../courier/saved_object/saved_object.js | 4 +- .../components/doc_table/lib/get_sort.js | 2 +- interface/components/errors.js | 10 +- .../field_editor/scripting_warning.html | 2 +- .../components/highlight/highlight_tags.js | 2 +- .../index_patterns/_index_pattern.js | 2 +- .../components/index_patterns/_map_field.js | 6 +- .../components/index_patterns/_mapper.js | 2 +- .../setup/steps/check_es_version.js | 5 +- .../components/setup/steps/check_for_es.js | 2 +- .../setup/steps/check_for_kibana_index.js | 2 +- .../setup/steps/create_kibana_index.js | 4 +- .../components/time_buckets/time_buckets.js | 4 +- .../components/vis/_agg_config_result.js | 4 +- interface/components/vislib/lib/data.js | 2 +- .../components/vislib/lib/layout/layout.js | 2 +- interface/components/vislib/vis.js | 2 +- .../vislib/visualizations/_chart.js | 2 +- .../visualizations/_point_series_chart.js | 2 +- .../vislib/visualizations/area_chart.js | 2 +- .../vislib/visualizations/column_chart.js | 2 +- .../vislib/visualizations/line_chart.js | 2 +- .../vislib/visualizations/pie_chart.js | 2 +- .../vislib/visualizations/tile_map.js | 2 +- .../visualize/spy/_req_resp_stats.html | 4 +- interface/config | 2 +- interface/index.html | 4 +- interface/kibana.js | 2 +- interface/plugins/admin/index.html | 2 +- .../plugins/admin/sections/insert/index.html | 4 +- interface/plugins/discover/_hit_sort_fn.js | 2 +- .../field_chooser/lib/field_calculator.js | 2 +- interface/plugins/discover/index.html | 2 +- interface/plugins/doc/index.html | 2 +- .../plugins/enhanced_tilemap/geoserver.md | 10 +- .../enhanced_tilemap/vislib/geoFilter.js | 4 +- .../extended_metric_vis.js | 2 +- interface/plugins/kbn_dotplot/kbn_dotplot.js | 4 +- .../lib/directives/kibi_select.html | 2 +- .../metric_vis_colors/metric_vis_colors.js | 2 +- interface/plugins/pie/c3_vis.js | 4 +- .../settings/sections/about/index.html | 8 +- .../settings/sections/indices/_create.html | 7 +- .../settings/sections/indices/_create.js | 2 +- .../settings/sections/indices/_edit.html | 12 +- .../sections/indices/_index_header.html | 8 +- .../settings/sections/indices/index.html | 4 +- .../settings/sections/indices/index.js | 2 +- .../settings/sections/objects/_view.html | 4 +- interface/plugins/vis_types/_renderbot.js | 4 +- interface/plugins/vis_types/index.js | 2 +- interface/plugins/vis_types/vislib/pie.js | 58 - interface/plugins/vis_types/vislib/pie.zip | Bin 0 -> 786 bytes .../plugins/visualize/wizard/step_1.html | 2 +- .../plugins/visualize/wizard/step_2.html | 2 +- interface/ui/Vis/AggConfigResult.js | 4 +- interface/utils/mapping_setup.js | 2 +- interface/utils/routes/index.js | 2 +- public/users/login/views/login.php | 4 +- tempdata/T___1_1566657451_4670_T0 | 1240 ----------------- tempdata/T___1_1566657622_1592_T0 | 696 --------- tempdata/T___1_1566657839_3942_T0 | 306 ---- tempdata/T___1_1566775130_3232_T0 | 31 - tempdata/T___1_1566775130_8449_T0 | 31 - tempdata/kibella.sqlite | Bin 333824 -> 337920 bytes 107 files changed, 437 insertions(+), 2842 deletions(-) create mode 100644 JSON_SQL_Bridge/configdbconnections.php delete mode 100644 JSON_SQL_Bridge/formDeleteCacheOldSubmit.php delete mode 100644 JSON_SQL_Bridge/formDeleteCacheSubmit.php delete mode 100644 JSON_SQL_Bridge/table/actions/insert.php delete mode 100644 interface/plugins/vis_types/vislib/pie.js create mode 100644 interface/plugins/vis_types/vislib/pie.zip delete mode 100644 tempdata/T___1_1566657451_4670_T0 delete mode 100644 tempdata/T___1_1566657622_1592_T0 delete mode 100644 tempdata/T___1_1566657839_3942_T0 delete mode 100644 tempdata/T___1_1566775130_3232_T0 delete mode 100644 tempdata/T___1_1566775130_8449_T0 diff --git a/JSON_SQL_Bridge/classes.php b/JSON_SQL_Bridge/classes.php index 71cac3e..9fa88ad 100644 --- a/JSON_SQL_Bridge/classes.php +++ b/JSON_SQL_Bridge/classes.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; class l0 extends \sqlite3 { function __construct($O0) { try { $this->open($O0); } catch ( \exception $l1) { $l1->getmessage(); } } } class O1 extends \thread { private $l2; private $O2; private $l3; public function __construct($l2,$O2=FALSE) { $this->l2 =$l2; $this->O2 =$O2; } public function run() { $O3=l4($this->l2 ,$O2=$this->O2); $this->l3 =$O3["responseFile"]; $this->O4 =TRUE; } public function l5() { return $this->l2; } public function O5() { return $this->O2; } public function l6() { return $this->l3; } } \ No newline at end of file +namespace kibella; class O8 extends \sqlite3 { function __construct($l9) { try { $this->open($l9); } catch ( \exception $O9) { echo $O9->getmessage().PHP_EOL; showmessage( __FILE__ ,"error","Connection to the SQLite database $l9 could not be established."); } } } class la { private $Oa; function __construct($lb,$Ob="/\t+/") { try { $this->Oa =$this->lc($lb,$Ob); foreach ($this->Oa as $Oc => $ld) { $Od=$this->le($ld); $this->Oa[$Oc]=array("connectionString" => $ld,"dbengine" => $Od["odbc:Driver"],"server" => $Od["Server"],"dbname" => $Od["Database"]); } } catch ( \exception $O9) { echo $O9->getmessage().PHP_EOL; showmessage( __FILE__ ,"warning","The connection to the database has NOT been set."); } } private function lc($Oe,$Ob="/\t+/") { $lf=array(); if (($Of=fopen($Oe,"r")) === FALSE) throw new \exception( __FUNCTION__."Cannot open configuration file ($Oe)."); while (($lg=fgets($Of,02000)) !== FALSE) { $lg=preg_replace("/(^\\s+)|(\\s+\$)/","",$lg); if (preg_match("/^#/",$lg) == 0) { $Og=preg_split($Ob,$lg); if (count($Og)>1) { $lf[$Og[0]]=trim($Og[1]); } } } return $lf; } private function le($ld,$lh=";") { $Oh=preg_split( "/$lh/" ,$ld,-1,PREG_SPLIT_NO_EMPTY); $Od=array(); foreach ($Oh as $Oi) { $lj=strpos($Oi,"="); if ($lj>=0) { $Oj=substr($Oi,0,$lj); $lk=strtolower(substr($Oi,$lj+1)); $lk=preg_replace("/[{}\\s]+/","",$lk); $Od[$Oj]=$lk; } else { showmessage( __FILE__ ,"warning","The currently analyzed database connection string is not properly formed:\n$ld\n"."Caught while analyzing the following part of the connection string: '$Oi'\n"."Check the specified database connections file:\n$lb\n"); } } return $Od; } public function Ok() { return $this->Oa; } public function ll($Oc) { if (array_key_exists($Oc,$this->Oa)) { return $this->Oa[$Oc]["connectionString"]; } return NULL; } public function lm($Oc) { if (array_key_exists($Oc,$this->Oa)) { return $this->Oa[$Oc]["dbengine"]; } return NULL; } public function Om($Oc) { if (array_key_exists($Oc,$this->Oa)) { return $this->Oa[$Oc]["server"]; } return NULL; } public function ln($Oc) { if (array_key_exists($Oc,$this->Oa)) { return $this->Oa[$Oc]["dbname"]; } return NULL; } } class On { public $lo; public $Oo; public $lp; private $Op; private $lq; private $Oq; private $lr=0; function __construct($ls,$lq,$Oo,$lp,$Os) { $this->lo =$ls; $this->lq =$lq; $this->Oo =$Oo; $this->lp =$lp; $this->Oq =lt; try { $this->Op =new \pdo($this->lq ,"","",$Os); } catch ( \pdoexception $O9) { echo $O9->getmessage().PHP_EOL; showmessage( __FILE__ ,"error","The connection to the database could not be established.\n\t\t\t\t\t\t\t\t\t\t\tConnection string: $this->lq"); $this->Op =FALSE; $this->lr =RC_ERROR_NOTFOUND_DB; } } function getdbhandle() { return $this->Op; } function close() { if ($this->Op) { Ot($this->Op ,$this->Oq); } } function lu() { return $this->lr; } } class Ou { private static $Op; public $lo; public $Oo; public $lp; private $lq; private $Os; private $Oq; private $lr=0; function __construct($ls,$lq,$Oo,$lp,$Os) { $this->lo =$ls; $this->lq =$lq; $this->Oo =$Oo; $this->lp =$lp; $this->Os =$Os; $this->Oq =lt; } public function getdbhandle() { if (! isset (self::$Op)) { try { self::$Op=new \pdo($this->lq ,"","",$this->Os); } catch ( \pdoexception $O9) { echo $O9->getmessage().PHP_EOL; showmessage( __FILE__ ,"error","The connection to the database could not be established.\n\t\t\t\t\t\t\t\t\t\t\t\tConnection string: $this->lq"); self::$Op=FALSE; $this->lr =RC_ERROR_NOTFOUND_DB; } } return self::$Op; } function close() { if (self::$Op) { Ot(self::$Op,$this->Oq); } } function lu() { return $this->lr; } } class lv extends \thread { public static $Ov=0; private $lw; private $Ow; private $lx; private $Ox; private $ly; public function __construct($Ow,$lx=FALSE) { self::$Ov=self::$Ov+1; $this->lw =self::$Ov; $this->Ow =$Ow; $this->lx =$lx; $this->Ox =FALSE; } public function run() { $Oy=lz($this->Ow ,$lx=$this->lx); usleep(.1E6); $this->synchronized( function ($ly) { $this->ly =$ly; } ,$Oy["responseFile"]); $this->Ox =TRUE; } public function Oz() { return $this->Ow; } public function l10() { return $this->lx; } public function O10() { return $this->ly; } public function l11() { return $this->Ox; } } \ No newline at end of file diff --git a/JSON_SQL_Bridge/config.php b/JSON_SQL_Bridge/config.php index 47bdf3b..7f0b0e8 100644 --- a/JSON_SQL_Bridge/config.php +++ b/JSON_SQL_Bridge/config.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; error_reporting( E_ALL); const O6=01123240; ini_set("session.gc_maxlifetime",O6); ini_set("session.gc_probability",1); ini_set("session.gc_divisor",1); ini_set("session.cookie_lifetime",O6); session_set_cookie_params(O6); ini_set("time_limit",0454); if ( isset ($_COOKIE[session_name()])) setcookie(session_name(),$_COOKIE[session_name()],time()+O6,"/"); require_once "configreadinifile.php"; require_once "functionsaux.php"; require_once "constants.php"; require_once "geohash.php"; require_once "globals.php"; require_once "functionsauxkibella.php"; require_once "functionsdashaccelerate.php"; require_once "functionsdb.php"; require_once "functionsparse.php"; require_once "functionsmsg.php"; require_once "functionsquery.php"; require_once "functionsserver.php"; require_once "functionsstatic.php"; require_once "classes.php"; \ No newline at end of file +namespace kibella; error_reporting( E_ALL); const O11=01123240; ini_set("session.gc_maxlifetime",O11); ini_set("session.gc_probability",1); ini_set("session.gc_divisor",1); ini_set("session.cookie_lifetime",O11); session_set_cookie_params(O11); ini_set("time_limit",0454); ini_set("date.timezone","UTC"); if ( isset ($_COOKIE[session_name()])) setcookie(session_name(),$_COOKIE[session_name()],time()+O11,"/"); require_once __DIR__."/configreadinifile.php"; require_once __DIR__."/configdbconnections.php"; require_once __DIR__."/functionsaux.php"; require_once __DIR__."/constants.php"; require_once __DIR__."/geohash.php"; require_once __DIR__."/globals.php"; require_once __DIR__."/functionsauxkibella.php"; require_once __DIR__."/functionsdashaccelerate.php"; require_once __DIR__."/functionsdb.php"; require_once __DIR__."/functionsparse.php"; require_once __DIR__."/functionsmsg.php"; require_once __DIR__."/functionsquery.php"; require_once __DIR__."/functionsserver.php"; require_once __DIR__."/functionsstatic.php"; require_once __DIR__."/classes.php"; require_once __DIR__."/users/user.php"; \ No newline at end of file diff --git a/JSON_SQL_Bridge/configdbconnections.php b/JSON_SQL_Bridge/configdbconnections.php new file mode 100644 index 0000000..c044893 --- /dev/null +++ b/JSON_SQL_Bridge/configdbconnections.php @@ -0,0 +1,11 @@ +changeShared($data->id, $data->sharedValue); \ No newline at end of file +namespace kibella; require_once ( __DIR__."/../dashboard.php"); $O7=json_decode(file_get_contents("php://input"),TRUE); $l8=new l0(); $l5=$l8->l6($O7["id"],$O7["sharedValue"]); echo $l5; \ No newline at end of file diff --git a/JSON_SQL_Bridge/dashboard/actions/isShared.php b/JSON_SQL_Bridge/dashboard/actions/isShared.php index 8cd71d9..4af5de6 100644 --- a/JSON_SQL_Bridge/dashboard/actions/isShared.php +++ b/JSON_SQL_Bridge/dashboard/actions/isShared.php @@ -8,11 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; - -require_once(__DIR__ . '/../dashboard.php'); - -$data = json_decode(file_get_contents("php://input")); -$dashboard = new Dashboard(); - -echo $dashboard->isShared($data->id); \ No newline at end of file +namespace kibella; require_once ( __DIR__."/../dashboard.php"); $O7=json_decode(file_get_contents("php://input"),TRUE); $l8=new l0(); echo $l8->l1($O7["id"]); \ No newline at end of file diff --git a/JSON_SQL_Bridge/dashboard/dashboard.php b/JSON_SQL_Bridge/dashboard/dashboard.php index c530833..c904c72 100644 --- a/JSON_SQL_Bridge/dashboard/dashboard.php +++ b/JSON_SQL_Bridge/dashboard/dashboard.php @@ -8,56 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; - -require_once(__DIR__ . '/../constants.php'); -require_once(__DIR__ . '/../functionsdb.php'); -require_once(__DIR__ . '/../classes.php'); - -require_once(__DIR__ . '/../users/user.php'); - -class Dashboard { - - private $db_connection = null; - - public function isShared($id) { - $id = addslashes(htmlentities($id, ENT_QUOTES)); - - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); - - $sql = 'SELECT ' . OBJ_COLUMN_SHARED . ' - FROM ' . OBJTABLE . ' - WHERE ' . ALL_COLUMN_ID . ' = "' . $id . '" AND ' . OBJ_COLUMN_TYPE . ' = "' . NAME_DASHBOARD . '" - LIMIT 1'; - - $result = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="sqlite"); - - return $result[0][OBJ_COLUMN_SHARED]; - } - - public function changeShared($id, $newValue) { - $tuser = new User(); - - if($tuser->isLoggedIn() && is_bool($newValue)) { - $id = addslashes(htmlentities($id, ENT_QUOTES)); - - if($newValue) - $newValue = 1; - else - $newValue = 0; - - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); - - $sql = 'UPDATE ' . OBJTABLE . ' - SET ' . OBJ_COLUMN_SHARED . ' = "' . $newValue . '" - WHERE ' . ALL_COLUMN_ID . ' = "' . $id . '" AND ' . OBJ_COLUMN_TYPE . ' = "' . NAME_DASHBOARD . '" - LIMIT 1'; - - $result = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="exec"); - - return $result; - } - - return false; - } -} \ No newline at end of file +namespace kibella; require_once __DIR__."/../config.php"; class l0 { private $O0=NULL; public function l1($O1) { $O1=addslashes(htmlentities($O1,ENT_QUOTES)); $this->O0 =dbcreatedbh(KIBELLADB); $l2="SELECT ".O2."\n FROM ".l3."\n WHERE ".O3." = \"".$O1."\" AND ".l4." = \"".O4."\""; $l5=dbdbhexecutesqlquery($this->O0->getdbhandle(),$l2,$O5="query"); if (count($l5)>1) { showmessage("dashboard.php","warning","While checking the shared property for dashboard with ID '$O1',\n \t\tit was found that there are more than one record associated to the dashboard.\n \t\tThis can cause unexpected results.\nPlease contact technical support to solve this issue.\n"); } return $l5[0][O2]; } public function l6($O1,$O6) { $l7=new user(); if ($l7->isloggedin() && is_bool($O6)) { $O1=addslashes(htmlentities($O1,ENT_QUOTES)); if ($O6) $O6=1; else $O6=0; $this->O0 =dbcreatedbh(KIBELLADB); $l2="UPDATE ".l3."\n SET ".O2." = ".$O6."\n WHERE ".O3." = \"".$O1."\" AND ".l4." = \"".O4."\""; $l5=dbdbhexecutesqlquery($this->O0->getdbhandle(),$l2,$O5="exec"); return $l5; } return FALSE; } } \ No newline at end of file diff --git a/JSON_SQL_Bridge/formAccelerateDashboardsSubmit.php b/JSON_SQL_Bridge/formAccelerateDashboardsSubmit.php index e63ae68..bc74773 100644 --- a/JSON_SQL_Bridge/formAccelerateDashboardsSubmit.php +++ b/JSON_SQL_Bridge/formAccelerateDashboardsSubmit.php @@ -1 +1 @@ -The following pieces of information were not found in the POST data received from the acceleration form: 'db', 'table'"; echo "
No accelerations carried out.
"; exit (-1); } $O21=$_POST["db"]; $l22=$_POST["table"]; $O22=l23($l22,$O21); ob_implicit_flush(TRUE); ob_start(); $O23=ini_get("max_execution_time"); ini_set("max_execution_time",043120); echo "
Accelarting dashboards for table $O22...
"; ob_flush(); dashacceleratealldashboards($O22,$O2=TRUE); echo "
DONE!
"; ini_set("max_execution_time",$O23); ob_end_flush(); \ No newline at end of file +The following pieces of information were not found in the POST data received from the acceleration form: 'db', 'table'"; echo "
No accelerations carried out.
"; exit (-1); } $l30=$_POST["db"]; $O30=$_POST["table"]; $l31=O31($O30,$l30); ob_implicit_flush(TRUE); ob_start(); $l32=ini_get("max_execution_time"); ini_set("max_execution_time",043120); echo "
Accelarting dashboards for table $l31...
"; ob_flush(); dashacceleratealldashboards($l31,$lx=TRUE); echo "
DONE!
"; ini_set("max_execution_time",$l32); ob_end_flush(); \ No newline at end of file diff --git a/JSON_SQL_Bridge/formAccelerateTopQueriesSubmit.php b/JSON_SQL_Bridge/formAccelerateTopQueriesSubmit.php index 5f736a7..03629e0 100644 --- a/JSON_SQL_Bridge/formAccelerateTopQueriesSubmit.php +++ b/JSON_SQL_Bridge/formAccelerateTopQueriesSubmit.php @@ -1 +1 @@ -The following pieces of information were not found in the POST data received from the acceleration form: 'db', 'table'"; echo "
No accelerations carried out.
"; exit (-1); } $O21=$_POST["db"]; $l22=$_POST["table"]; $O22=l23($l22,$O21); ob_implicit_flush(TRUE); ob_start(); $O23=ini_get("max_execution_time"); ini_set("max_execution_time",043120); echo "
Accelerating top ".ACCELERATETOP."% run queries for table $O22...
"; ob_flush(); dashacceleratetopqueries($O22,$l24=ACCELERATETOP,$O2=TRUE); echo "
DONE!
"; ini_set("max_execution_time",$O23); ob_end_flush(); \ No newline at end of file +The following pieces of information were not found in the POST data received from the acceleration form: 'db', 'table'"; echo "
No accelerations carried out.
"; exit (-1); } $l30=$_POST["db"]; $O30=$_POST["table"]; $l31=O31($O30,$l30); ob_implicit_flush(TRUE); ob_start(); $l32=ini_get("max_execution_time"); ini_set("max_execution_time",043120); echo "
Accelerating top ".ACCELERATETOP."% run queries for table $l31...
"; ob_flush(); dashacceleratetopqueries($l31,$O32=ACCELERATETOP,$lx=TRUE); echo "
DONE!
"; ini_set("max_execution_time",$l32); ob_end_flush(); \ No newline at end of file diff --git a/JSON_SQL_Bridge/formDeleteCacheOldSubmit.php b/JSON_SQL_Bridge/formDeleteCacheOldSubmit.php deleted file mode 100644 index 3de906c..0000000 --- a/JSON_SQL_Bridge/formDeleteCacheOldSubmit.php +++ /dev/null @@ -1,40 +0,0 @@ - 0) { - echo "
Cache older than " . date('d F Y H:i:s', $cutoff_time) . " has been succesfully deleted from '" . CACHEDIR . "'.
"; - } - else { - $cutoff_hours = abs($cutoff_time/3600); - echo "
Cache older than $cutoff_hours hours from now has been succesfully deleted from '" . CACHEDIR . "'.
"; - } -} -?> - - - - - - - diff --git a/JSON_SQL_Bridge/formDeleteCacheSubmit.php b/JSON_SQL_Bridge/formDeleteCacheSubmit.php deleted file mode 100644 index 9ecf555..0000000 --- a/JSON_SQL_Bridge/formDeleteCacheSubmit.php +++ /dev/null @@ -1,26 +0,0 @@ -All application's cache has been succesfully deleted from '" . CACHEDIR . "'."; -} -?> - - - - - - - diff --git a/JSON_SQL_Bridge/formRegisterTableSubmit.php b/JSON_SQL_Bridge/formRegisterTableSubmit.php index 24b4287..146ca5d 100644 --- a/JSON_SQL_Bridge/formRegisterTableSubmit.php +++ b/JSON_SQL_Bridge/formRegisterTableSubmit.php @@ -1,11 +1,205 @@ - $l22,"db" => $O21,"dbtype" => $O24,"datefields" => $l25,"geofields" => $O25,"linkfields" => $l26,"enablecache" => $O26); $O27=l28($l27); if ($O27 !== FALSE) { $O28=$O27["id"]; $l29=$O27["rc"]; if ($l29 === FALSE) { O29( __FILE__ ,Oc,l2a()); } else { switch ($l29) { case (lf): O29("",lb,O2a($l22,$O21,$O28,$O26)); break; case (Of): O29("",lb,l2b($l22,$O21,$O28,$O26)); break; case (le): O29("",lc,O2b(DATADIR."/".$O21)); break; case (Oe): O29("",lc,l2c($l22,DATADIR."/".$O21)); break; default : O29( __FILE__ ,Oc,O2c($l29)); break; } } if ($l25 !== "" or $O25 !== "" or $l26 !== "") { echo "

The following fields were registered as fields of special type:

"; $l2d=O2d($O28); if ($l2d == NULL || count($l2d) == 0) { echo "No fields were registered as fields of special type."; } else { foreach ($l2d as $l2e => $O2e) { if ($O2e === "date" || $O2e === "geo_point" || $O2e === "url") { echo "$O2e: $l2e
"; } } } } } echo "
"; \ No newline at end of file + + *
  • db name of the database where the table is located with no indication of the path (e.g. income.sqlite) + *
  • table name of the table for which the index should be created (e.g. census) + * + * + */ +namespace kibella; + +require_once 'config.php'; + + +/** Returns a string with an internal error message about the TABLESDIR directory. + * + * @author: Daniel Mastropietro + * @since: 29-Jul-2016 + */ +function msgErrorInternalTablesDir() { + return "An internal error occurred.\nCheck existence and permissions of '" . TABLESDIR . "' directory in the web server.\n"; +} + +/** Returns a string with a note message about table registered successfully. + * + * @param string $table table name. + * @param string $db database where the table is stored. + * @param string $id table ID used for registration. + * @param string $enablecache flag 0/1 indicating whether the cache is enabled for this table. + * @return string note message. + * + * @author: Daniel Mastropietro + * @since: 29-Jul-2016 + */ +function msgNoteTableRegistrationAdded($table, $db, $id, $enablecache) { + $cachemode = $enablecache == 1 ? "ENABLED" : "DISABLED"; + return "Table '$table' in database '$db' successfully registered with ID '$id'.\nCache is $cachemode.\n"; +} + +/** Returns a string with a note message about table registration updated. + * + * @param string $table table name. + * @param string $db database where the table is stored. + * @param string $id table ID used for registration. + * @param string $enablecache flag 0/1 indicating whether the cache is enabled for this table. + * @return string note message. + * + * @author: Daniel Mastropietro + * @since: 29-Jul-2016 + */ +function msgNoteTableRegistrationUpdated($table, $db, $id, $enablecache) { + $cachemode = $enablecache == 1 ? "ENABLED" : "DISABLED"; + return "The registration information for table '$table' in database '$db' with ID '$id' has been successfully updated.\nCache is $cachemode.\n"; +} + +/*------------------------------------- ERROR MESSAGES --------------------------------------*/ +// These messages are divided into EXTERNAL errors (triggered by the user, i.e. they could happen depending on the user input --e.g. user leaves the name of the table to register empty) +// and INTERNAL errors (triggered by the application, i.e. they should NOT happen if everything is all right with the application setup --e.g. permissions to write in internal database) +// - All EXTERNAL errors start with "msgErrorExternal" in the function name +// - All INTERNAL errors start with "msgErrorInternal" in the function name +/** Returns a string with an error message about database not found. + * + * @param string $db database name. + * + * @author: Daniel Mastropietro + * @since: 18-Jul-2016 + */ +function msgErrorExternalDatabaseNotFound($db) { + return "Database '$db' does not exist.\nTry again going back to the previous page.\n"; +} + +/** Returns a string with an error message about table not found in database. + * + * @param string $table table name searched for. + * @param string $db database where the table was searched for. + * + * @author: Daniel Mastropietro + * @since: 13-Jun-2016 + */ +function msgErrorExternalTableNotFound($table, $db) { + if ($table == "") { + return "Please specify a table name.\nTry again going back to the previous page.\n"; + } + else if ($db == "") { + return "Please specify the database where the table '$table' resides.\nTry again going back to the previous page.\n"; + } + else + return "Table '$table' was not found in database '$db'.\nTry again going back to the previous page.\n"; +} +/** Returns a string with an internal error message about return codes. + * + * @return rc invalid return code to show in the error message. + * + * @author: Daniel Mastropietro + * @since: 29-Jul-2016 + */ +function msgErrorInternalReturnCode($rc) { + return "Unknown return code ($rc).\n"; +} + +/*-------------------------- GET DATA FROM THE FORM ---------------------------*/ +$table = $_POST['table']; +$db = $_POST['db']; +$dbengine_name = "sqlite"; // In the future this attribute would be read from the form +//$dbengine_name = $_POST['dbtype']; +$datefields = $_POST['datefields']; // This is expected to be a list of date fields separated by commas +$geofields = $_POST['geofields']; // This is expected to be a list of geo-coordinate fields separated by commas +$linkfields = $_POST['linkfields']; // This is expected to be a list of link fields separated by commas +$enablecache = 1; // $_POST['enablecache']; // Flag 0/1 indicating whether to enable the cache for the table + +// Assertions on the above values +//dbAssertValidDBEngine($dbengine_name); +//$dbengine_code = convertDBEngineNameToDBEngineCode($dbengine_name); + +// Store the above values in an array +$aTableInfoFromUser = array( 'table' => $table, + 'db' => $db, + 'dbengine' => $dbengine_name, + 'datefields' => $datefields, + 'geofields' => $geofields, + 'linkfields' => $linkfields, + 'enablecache' => $enablecache + ); +/*-------------------------- GET DATA FROM THE FORM ---------------------------*/ + + +/*---------------------------- REGISTER THE TABLE -----------------------------*/ +// Save the table information in Kibella's database +$aResult = dbRegisterTable($aTableInfoFromUser); +if ($aResult !== FALSE) { + $id = $aResult['id']; // Table ID + $rc = $aResult['rc']; // Return code + + // Check the return code and show a message accordingly + if ($rc === FALSE) { + showMessage(__FILE__, TAG_ERROR_INTERNAL, msgErrorInternalTablesDir()); + } + else { + switch ($rc) { + case (RC_NOTE_TABLE_ADDED): + showMessage("", TAG_NOTE, msgNoteTableRegistrationAdded($table, $db, $id, $enablecache)); + break; + case (RC_NOTE_TABLE_UPDATED): + showMessage("", TAG_NOTE, msgNoteTableRegistrationUpdated($table, $db, $id, $enablecache)); + break; + case (RC_ERROR_NOTFOUND_DB): + $dbWithFullPath = $db; +// if (isEmbeddedDatabase($dbengine_code)) { + $dbWithFullPath = DATADIR . "/$db"; +// } + showMessage("", TAG_ERROR, msgErrorExternalDatabaseNotFound($dbWithFullPath)); + break; + case (RC_ERROR_NOTFOUND_TABLE): + $dbWithFullPath = $db; +// if (isEmbeddedDatabase($dbengine_code)) { + $dbWithFullPath = DATADIR . "/$db"; +// } + showMessage("", TAG_ERROR, msgErrorExternalTableNotFound($table, $dbWithFullPath)); + break; + default: + showMessage(__FILE__, TAG_ERROR_INTERNAL, msgErrorInternalReturnCode($rc)); + break; + } + } + + // List the fields of special type (e.g. date, geo, link) specified by the user that were found in the user table + if ($datefields !== "" or $geofields !== "" or $linkfields !== "") { + // Show a message with the fields registered as special-type fields + echo "

    The following fields were registered as fields of special type:

    "; + $aFields = dbGetFieldTypes($id); + if ($aFields == null || count($aFields) == 0) { + echo "No fields were registered as fields of special type."; + } + else { + foreach ($aFields as $field => $type) { + if ($type === "date" || $type === "geo_point" || $type === "url") { + echo "$type: $field
    "; + } + } + } + /* // (2016/07/29) This was commented out because the information of the fields not found in the user data is no longer returned by dbGetFieldTypes(). + // Check if any date fields were not found in the user table and show a message + if (count($aIndex['notfound']) > 0) { + showMessage("", TAG_WARNING, "The following date fields were not found in table '$table':\n"); + foreach ($aIndex['notfound'] as $field) { + echo "$field
    "; + } + } + */ + } +} +/*---------------------------- REGISTER THE TABLE -----------------------------*/ + +//echo "
    "; diff --git a/JSON_SQL_Bridge/functionsaux.php b/JSON_SQL_Bridge/functionsaux.php index 2677c1a..dcd4331 100644 --- a/JSON_SQL_Bridge/functionsaux.php +++ b/JSON_SQL_Bridge/functionsaux.php @@ -1,4 +1,4 @@ -0) { $l2j=-1; foreach ($O2h as $l2l => $O2l) { $l2j ++; $O2k[0]=$O2l; $O2k[1]=$l2l; $O2k[2]=$l2j; if (is_array($O2l)) { call_user_func_array($l2i,$O2k); $O2j ++; $O2g=l2h($O2l,$l2i,$O2i,$l2j,$O2j); } else { $O2g=call_user_func_array($l2i,$O2k); } } $O2j --; } else { $O2g=call_user_func_array($l2i,$O2k); $O2j --; } return $O2g; } function l2m($O2h) { $O2m=array(); $l2n=array_keys($O2h); sort($l2n); foreach ($l2n as $l2l) { $O2m[$l2l]=$O2h[$l2l]; } return $O2m; } function O2n($O2h,$l2o=FALSE) { return l2h($O2h,"updateDimension",array("max_number_elements" => $l2o)); } function O2o($O2l,$l2l,$l2j,$O2j,$l2k,$l2p) { static $O2p; static $l2q; static $O2q; static $l2r; if ($l2j == 0 && $O2j == 0) { $O2p=1; $l2q=array(array("count" => 0)); $O2q=0; $l2r=FALSE; if (array_key_exists("max_number_elements",$l2p)) $l2r=$l2p["max_number_elements"]; } if ($l2k>0) { $l2q[$O2j]["count"]++; } if (is_array($O2l)) { $l2q[]=array("count" => 0); } else { if ($l2q[$O2j]["count"] == $l2k) { if ($O2j+1>=$O2p) { $O2q=max($O2q,$l2q[$O2j]["count"]); } $O2p=max($O2p,$O2j+1); array_pop($l2q); } } if ($l2r === FALSE) { return max($O2p,$O2j+1); } else { return array(max($O2p,$O2j+1),$O2q); } } function checkdirexistsorcreate($O2r,$l2s=0744,$O2s=TRUE,$l2t=FALSE,$O2t="") { $l29=TRUE; if (!is_dir($O2r)) { if ($l2t) O29("",Ob,$O2t); $l29=mkdir($O2r,$l2s,$O2s); } return $l29; } function l2u($O2u) { if (strlen($O2u)>0) { $O2u=preg_replace("/\\s*,\\s*/",",",$O2u); $l2d=explode(",",strtolower($O2u)); for ($l2v=0; $l2vERROR: $O2r must be a directory\nThe deletion process failed.\n"; return FALSE; } if (substr($O2r,strlen($O2r)-1,1) != "/") { $O2r.="/"; } $O2w=glob($O2r."*",GLOB_MARK); foreach ($O2w as $l2x) { if (is_dir($l2x)) { deletedir($l2x); } else { if ($l2w == 0 || $l2w<0 && (time()-filemtime($l2x))>abs($l2w) || $l2w>0 && filemtime($l2x)<$l2w) { unlink($l2x); } } } if (!$O2v) rmdir($O2r); return TRUE; } function O2x($l2g,$l2y=FALSE) { if ($l2y) { $O2y="["; $l2z="]"; } else { $O2y=""; $l2z=""; } return "\"".$O2y.str_replace("\"","\\\"",$l2g).$l2z."\""; } function O2z($l30) { $l30=str_replace("'","''",$l30); return $l30; } function O30($l31,$O2h) { if (!is_array($O2h)) { user_error( "Input parameter $O2h is not an array\n" ,E_USER_ERROR); return; } foreach ($O2h as $O31) { $l32=explode($l31,$O31); $O32=count($l32); if ($O32 == 1) $l33[$l32[0]]=NULL; else if ($O32>1) $l33[$l32[0]]=$l32[1]; } return $l33; } function O33($O2r,$l34) { $O34=""; $l35=strrpos($O2r,$l34); if ($l35>0) { $O35=substr($O2r,0,$l35-1); $l36=substr($O2r,$l35-1,1); $O34=substr($O35,strrpos($O35,$l36)+1); } return $O34; } function O36($l2g) { return preg_replace("/^_{1}|_{1}\$/","",$l2g); } \ No newline at end of file +function l35($O35) { $l36=FALSE; $O35=trim($O35); if (strlen($O35)>0) { $O35=preg_replace("/^(\\-|\\+)\\s*/","\$1",$O35); if (!preg_match("/[^0123456789\\.\\-\\+]/",$O35)) { if (preg_match("/^.+(\\-|\\+)+/",$O35)) $l36=FALSE; else if (preg_match("/^(\\-\\.)|(\\+\\.)/",$O35) && preg_match("/\\.|\\-|\\+/",substr($O35,2))) $l36=FALSE; else if (preg_match_all("/\\./",$O35)>1) $l36=FALSE; else $l36=TRUE; } } return $l36; } function O36($O35,$l37=NULL) { if ($l37 === NULL) { echo $O35; } else { assert($l37 !== FALSE,"The file handle is not false"); fputs($l37,$O35); } } function O37($l38,$O38,$l39=array(),$O39=0,&$l3a=0) { if (!is_array($l38)) { user_error( __FUNCTION__.": The first argument should be an array",E_USER_ERROR); return; } if (!is_callable($O38)) { if (is_array($O38)) { $O38=$O38[0]."::".$O38[1]; } user_error( __FUNCTION__.": The second argument is not a valid callback ".$O38,E_USER_ERROR); return; } if (!is_null($l39) && !is_array($l39)) { user_error( __FUNCTION__.": The third argument should be an array",E_USER_ERROR); return; } $O3a=count($l38); if (is_null($l39)) { $l39=array(); } $l3b=array(); $l3b[]=NULL; $l3b[]=NULL; $l3b[]=$O39; $l3b[]=&$l3a; $l3b[]=$O3a; $l3b[]=$l39; $l37=NULL; if ($O3a>0) { $O39=-1; foreach ($l38 as $O3b => $l3c) { $O39 ++; $l3b[0]=$l3c; $l3b[1]=$O3b; $l3b[2]=$O39; if (is_array($l3c)) { call_user_func_array($O38,$l3b); $l3a ++; $l37=O37($l3c,$O38,$l39,$O39,$l3a); } else { $l37=call_user_func_array($O38,$l3b); } } $l3a --; } else { $l37=call_user_func_array($O38,$l3b); $l3a --; } return $l37; } function O3c($l38) { $l3d=array(); $O3d=array_keys($l38); sort($O3d); foreach ($O3d as $O3b) { $l3d[$O3b]=$l38[$O3b]; } return $l3d; } function l3e($l38,$O3e=FALSE) { return O37($l38,"updateDimension",array("max_number_elements" => $O3e)); } function l3f($O3f,$l3g,$O3g="string",$l3h=TRUE,$O3h=.1E-5) { if (is_null($O3f) && is_null($l3g) || $O3f === FALSE && $l3g === FALSE) { return TRUE; } if (strtolower($O3g) === "string") { if (strtolower($O3f) !== strtolower($l3g)) { return FALSE; } if ($l3h === TRUE && $O3f !== $l3g) { return FALSE; } else return TRUE; } else { if (!l35($O3f) || !l35($l3g)) { echo "WARNING: Not all the compared values are numbers.\n"; return FALSE; } if (( float) $O3f === .00 && ( float) $l3g === .00) { return TRUE; } if (abs($O3f-$l3g)/max(abs($O3f),abs($l3g))<( float) $O3h) { return TRUE; } else { return FALSE; } } } function l3i($O3i,$l3j,$O3j=TRUE,$l3k=TRUE,$O3k=array("value"),$O3h=.1E-5,$l3l="bool") { if (count($O3i) != count($l3j)) { return FALSE; } if (is_array($O3i) && !is_array($l3j) || !is_array($O3i) && is_array($l3j)) { return FALSE; } if (!is_array($O3i) && !is_array($l3j)) { return $O3i === $l3j; } if ($O3j === FALSE) { $l3j=array_change_key_case($l3j,CASE_LOWER); if (count($l3j) $O3f) { if ($O3j === FALSE) { $O3l=strtolower($O3l); } if (array_key_exists($O3l,$l3j)) { $l3g=$l3j[$O3l]; if (is_array($O3f)) { $l3m=l3i($O3f,$l3g,$O3j=$O3j,$l3k=$l3k,$O3k=$O3k,$O3h=$O3h,$l3l=$l3l); if ($l3m !== TRUE) { if (strtolower($l3l) === "bool") { return FALSE; } else { return $O3l." -> ".$l3m; } } } else { if (in_array($O3l,$O3k)) { $O3m="number"; } else { $O3m="string"; } if (l3f($O3f,$l3g,$O3g=$O3m,$l3k=$l3k,$O3h=$O3h) === FALSE) { if (strtolower($l3l) === "bool") { return FALSE; } else { return $O3l; } } } } else { if (strtolower($l3l) === "bool") { return FALSE; } else { return $O3l; } } } return TRUE; } function l3n($l3c,$O3b,$O39,$l3a,$O3a,$O3n) { static $l3o; static $O3o; static $l3p; static $O3p; if ($O39 == 0 && $l3a == 0) { $l3o=1; $O3o=array(array("count" => 0)); $l3p=0; $O3p=FALSE; if (array_key_exists("max_number_elements",$O3n)) $O3p=$O3n["max_number_elements"]; } if ($O3a>0) { $O3o[$l3a]["count"]++; } if (is_array($l3c)) { $O3o[]=array("count" => 0); } else { if ($O3o[$l3a]["count"] == $O3a) { if ($l3a+1>=$l3o) { $l3p=max($l3p,$O3o[$l3a]["count"]); } $l3o=max($l3o,$l3a+1); array_pop($O3o); } } if ($O3p === FALSE) { return max($l3o,$l3a+1); } else { return array(max($l3o,$l3a+1),$l3p); } } function checkdirexistsorcreate($l3q,$O3q=0744,$l3r=TRUE,$O3r=FALSE,$l3s="") { $O3s=TRUE; if (!is_dir($l3q)) { if ($O3r) showmessage("",l16,$l3s); $O3s=mkdir($l3q,$O3q,$l3r); } return $O3s; } function l3t($O3t) { if (strlen($O3t)>0) { $O3t=preg_replace("/\\s*,\\s*/",",",$O3t); $l3u=explode(",",strtolower($O3t)); for ($O3u=0; $O3uERROR: $l3q must be a directory\nThe deletion process failed.\n"; return FALSE; } if (substr($l3q,strlen($l3q)-1,1) != "/") { $l3q.="/"; } $l3w=glob($l3q."*",GLOB_MARK); foreach ($l3w as $O3w) { if (is_dir($O3w)) { deletedir($O3w); } else { if ($O3v == 0 || $O3v<0 && (time()-filemtime($O3w))>abs($O3v) || $O3v>0 && filemtime($O3w)<$O3v) { unlink($O3w); } } } if (!$l3v) rmdir($l3q); return TRUE; } function l3x($O35,$O3x=FALSE) { if ($O3x) { $l3y="["; $O3y="]"; } else { $l3y=""; $O3y=""; } return "\"".$l3y.str_replace("\"","\\\"",$O35).$O3y."\""; } function l3z($O3z) { $O3z=str_replace("'","''",$O3z); return $O3z; } function l40($O3z) { $O3z=str_replace("\"","'",$O3z); return $O3z; } function O40($Ob,$l38) { if (!is_array($l38)) { user_error( "Input parameter $l38 is not an array\n" ,E_USER_ERROR); return; } foreach ($l38 as $l41) { $O41=explode($Ob,$l41); $l42=count($O41); if ($l42 == 1) $O42[$O41[0]]=NULL; else if ($l42>1) $O42[$O41[0]]=$O41[1]; } return $O42; } function l43($l3q,$O43) { $l44=""; $O44=strrpos($l3q,$O43); if ($O44>0) { $l45=substr($l3q,0,$O44-1); $O45=substr($l3q,$O44-1,1); $l44=substr($l45,strrpos($l45,$O45)+1); } return $l44; } function l46($O35) { return preg_replace("/^_{1}|_{1}\$/","",$O35); } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionsauxkibella.php b/JSON_SQL_Bridge/functionsauxkibella.php index 65ccf48..a7f912b 100644 --- a/JSON_SQL_Bridge/functionsauxkibella.php +++ b/JSON_SQL_Bridge/functionsauxkibella.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; require_once "functionsaux.php"; function l37($O2h,$O37) { if (!is_array($O2h) || count($O2h) == 0) { user_error( "The input parameter is not an array or is empty ($O2h)\n" ,E_USER_ERROR); return NULL; } else if ($O37<0 || $O37>=count($O2h)) { error( "The index to extract from the array is out of range ($O37 while size of array is count($O2h))\n" ,E_USER_ERROR); return NULL; } return $O2h[$O37]; } function l38($O38) { $l39=strtotime($O38)-strtotime("00:00"); $O39=time()-strtotime("00:00"); if ($l39<=$O39) { $l3a=strtotime($O38); } else { $l3a=strtotime($O38)-0250600; } return $l3a; } function O3a($l3b) { $date=date_create(strftime("%Y-%m-%d %H:%M:%S",$l3b)); $O3b=(array) $date; $l3c=timezone_offset_get(new \datetimezone($date->timezone),$date); return $l3b-$l3c; } function O3c($l3d,$timezone="UTC") { $O3d=array("s" => "second","m" => "minute","h" => "hour","d" => "day","w" => "week","M" => "month","y" => "year"); $l3e="/^((now)|([\\d\\/-:\\s]+)\\|\\|)([-+])(\\d+)([smhdwMy]{1})\\w*\\/*([smhdwMy])*/"; preg_match($l3e,$l3d,$O3e); if (count($O3e)>0) { assert(count($O3e)>=7,"The preg_match() array has at least 7 elements"); $date=date_create($O3e[2].$O3e[3]); if ($timezone !== NULL && $O3e[2] !== "now") { $date=date_create(strftime("%Y-%m-%d %H:%M:%S",date_timestamp_get($date)),new \datetimezone($timezone)); } $l3f=$O3e[4].$O3e[5]; $O3f=$O3e[6]; date_modify($date,"$l3f ".$O3d[$O3f]); $O3b=(array) $date; if (count($O3e)>=8) { $l3g=$O3e[7]; O3g($date,$l3g); } } else { if ($timezone !== NULL) { $date=date_create($l3d); $date=date_create(strftime("%Y-%m-%d %H:%M:%S",date_timestamp_get($date)),new \datetimezone($timezone)); } else { $date=date_create($l3d); } } return date_timestamp_get($date); } function O3g(&$l3h,$l3g) { switch ($l3g) { case ("s"): date_modify($l3h,strftime("%Y-%m-%d %H:%M:%S",strtotime($l3h->date))); break; case ("m"): date_modify($l3h,strftime("%Y-%m-%d %H:%M",strtotime($l3h->date)).":00"); break; case ("h"): date_modify($l3h,strftime("%Y-%m-%d %H",strtotime($l3h->date)).":00:00"); break; case ("d"): date_modify($l3h,strftime("%Y-%m-%d",strtotime($l3h->date))." 00:00:00"); break; case ("w"): date_modify($l3h,"last monday"); $O3b=(array) $l3h; date_modify($l3h,strftime("%Y-%m-%d",strtotime($l3h->date))." 00:00:00"); break; case ("M"): date_modify($l3h,"first day of this month"); $O3b=(array) $l3h; date_modify($l3h,strftime("%Y-%m-%d",strtotime($l3h->date))." 00:00:00"); break; case ("y"): date_modify($l3h,strftime("%Y",strtotime($l3h->date))."-01-01 00:00:00"); break; default : break; } $O3b=(array) $l3h; } function O3h($l3i) { $O3i=preg_grep("/^\\-/",array($l3i)); $l3j=count($O3i)>0; if ($l3j) $l3i=substr($l3i,1); $O3j=explode("-",$l3i,2); $l3k=$O3j[0]; if ($l3j) $l3k="-".$l3k; $O3k=""; if (count($O3j)>1) { $O3k=$O3j[1]; } return array($l3k,$O3k); } function l3l($O3l) { $l3m=FALSE; $O3m=filemtime($O3l); if (strtolower(CACHEMODE) === CACHEMODE_DAY) { $O38=CACHEDAYCHANGE; $l3a=l38($O38); if ($O3m<$l3a) { $l3m=TRUE; } } else if (time()-$O3m>CACHEHOURS*07020) { $l3m=TRUE; } return $l3m; } function l3n($l2g) { $l3m=FALSE; $l2g=trim($l2g); if (strlen($l2g)>0) { $l2g=preg_replace("/^(\\-|\\+)\\s*/","\$1",$l2g); if (!preg_match("/[^0123456789\\.\\-\\+]/",$l2g)) { if (preg_match("/^.+(\\-|\\+)+/",$l2g)) $l3m=FALSE; else if (preg_match("/^(\\-\\.)|(\\+\\.)/",$l2g) && preg_match("/\\.|\\-|\\+/",substr($l2g,2))) $l3m=FALSE; else if (preg_match_all("/\\./",$l2g)>1) $l3m=FALSE; else $l3m=TRUE; } } return $l3m; } function O3n($l3o,$O3o) { switch (( string) $l3o) { case (l19): $l3o=O19; break; case (O1c): if ($O3o == O1b) $l3o=O1j; break; case (O1m): if ($O3o == l1a) $l3o=O1a; else $l3o=l1g; break; default : break; } return $l3o; } function l3p($O3p,$l3q) { if ($O3p == $l3q) $O3q=""; else $O3q=","; return $O3q; } function l3r($O2l) { if ($O2l<=0) $O3r=""; else $O3r="LIMIT ".$O2l; return $O3r; } \ No newline at end of file +namespace kibella; require_once "functionsaux.php"; function O46($l38,$l47) { if (!is_array($l38) || count($l38) == 0) { user_error( "The input parameter is not an array or is empty ($l38)\n" ,E_USER_ERROR); return NULL; } else if ($l47<0 || $l47>=count($l38)) { error( "The index to extract from the array is out of range ($l47 while size of array is count($l38))\n" ,E_USER_ERROR); return NULL; } return $l38[$l47]; } function O47($l48) { $O48=strtotime($l48)-strtotime("00:00"); $l49=time()-strtotime("00:00"); if ($O48<=$l49) { $O49=strtotime($l48); } else { $O49=strtotime($l48)-0250600; } return $O49; } function l4a($O4a) { global $l4b; $O4b=array_search($O4a,$l4b); assert($O4b !== FALSE,"The database engine name is valid: $O4b\n"); return $O4b; } function l4c($O4b) { if ($O4b == NULL) { return NULL; } O4c($O4b); global $l4b; return $l4b[$O4b]; } function l4d($O4d) { $date=date_create(strftime("%Y-%m-%d %H:%M:%S",$O4d)); $l4e=(array) $date; $O4e=timezone_offset_get(new \datetimezone($date->timezone),$date); return $O4d-$O4e; } function l4f($O4f,$timezone="UTC") { $l4g=array("s" => "second","m" => "minute","h" => "hour","d" => "day","w" => "week","M" => "month","y" => "year"); $O4g="/^((now)|([\\d\\/-:\\s]+)\\|\\|)([-+])(\\d+)([smhdwMy]{1})\\w*\\/*([smhdwMy])*/"; preg_match($O4g,$O4f,$l4h); if (count($l4h)>0) { assert(count($l4h)>=7,"The preg_match() array has at least 7 elements"); $date=date_create($l4h[2].$l4h[3]); if ($timezone !== NULL && $l4h[2] !== "now") { $date=date_create(strftime("%Y-%m-%d %H:%M:%S",date_timestamp_get($date)),new \datetimezone($timezone)); } $O4h=$l4h[4].$l4h[5]; $l4i=$l4h[6]; date_modify($date,"$O4h ".$l4g[$l4i]); $l4e=(array) $date; if (count($l4h)>=8) { $O4i=$l4h[7]; l4j($date,$O4i); } } else { if ($timezone !== NULL) { $date=date_create($O4f); $date=date_create(strftime("%Y-%m-%d %H:%M:%S",date_timestamp_get($date)),new \datetimezone($timezone)); } else { $date=date_create($O4f); } } return date_timestamp_get($date); } function l4j(&$O4j,$O4i) { switch ($O4i) { case ("s"): date_modify($O4j,strftime("%Y-%m-%d %H:%M:%S",strtotime($O4j->date))); break; case ("m"): date_modify($O4j,strftime("%Y-%m-%d %H:%M",strtotime($O4j->date)).":00"); break; case ("h"): date_modify($O4j,strftime("%Y-%m-%d %H",strtotime($O4j->date)).":00:00"); break; case ("d"): date_modify($O4j,strftime("%Y-%m-%d",strtotime($O4j->date))." 00:00:00"); break; case ("w"): date_modify($O4j,"last monday"); $l4e=(array) $O4j; date_modify($O4j,strftime("%Y-%m-%d",strtotime($O4j->date))." 00:00:00"); break; case ("M"): date_modify($O4j,"first day of this month"); $l4e=(array) $O4j; date_modify($O4j,strftime("%Y-%m-%d",strtotime($O4j->date))." 00:00:00"); break; case ("y"): date_modify($O4j,strftime("%Y",strtotime($O4j->date))."-01-01 00:00:00"); break; default : break; } $l4e=(array) $O4j; } function l4k($O4k) { $l4l=preg_grep("/^\\-/",array($O4k)); $O4l=count($l4l)>0; if ($O4l) $O4k=substr($O4k,1); $l4m=explode("-",$O4k,2); $O4m=$l4m[0]; if ($O4l) $O4m="-".$O4m; $l4n=""; if (count($l4m)>1) { $l4n=$l4m[1]; } return array($O4m,$l4n); } function O4n($Oe) { $l36=FALSE; $l4o=filemtime($Oe); if (strtolower(CACHEMODE) === CACHEMODE_DAY) { $l48=CACHEDAYCHANGE; $O49=O47($l48); if ($l4o<$O49) { $l36=TRUE; } } else if (time()-$l4o>CACHEHOURS*07020) { $l36=TRUE; } return $l36; } function O4o($lp,$l4p,$O30) { global $O4p; return $O4p[$l4p][$lp].$O4p[$l4p][O1a]."'$O30'".$O4p[$l4p][l1b]; } function l4q($lp) { global $O4q; return $O4q[$lp] === O17; } function l4r($O4r,$l4s) { switch (( string) $O4r) { case (l23): $O4r=O23; break; case (O26): if ($l4s == O25) $O4r=O2d; break; case (O2g): if ($l4s == l24) $O4r=O24; else $O4r=l2a; break; default : break; } return $O4r; } function O4s($l4t,$O4t) { if ($l4t == $O4t) $l4u=""; else $l4u=","; return $l4u; } function O4u($l3c,$lp,$l4v) { $O4v=""; if ($l3c>0) { switch ($lp) { case (O18): if ($l4v === 1) $O4v= "LIMIT $l3c"; break; case (l19): if ($l4v === 0) $O4v= "TOP $l3c"; break; default : break; } } return $O4v; } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionscfg.php b/JSON_SQL_Bridge/functionscfg.php index e884294..f01095c 100644 --- a/JSON_SQL_Bridge/functionscfg.php +++ b/JSON_SQL_Bridge/functionscfg.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; define(__NAMESPACE__."\\DEFAULT_DATADIR",__DIR__."/../../data"); const l3s=0764; const O3s=1; const l3t="day"; const O3t="04:00"; const l3u=030; const O3u=017; const l3v=024; function O3v($O3l,$l31="/\t+/") { $l3w=array(); if (($O3w=fopen($O3l,"r")) === FALSE) throw new exception( __FUNCTION__."Cannot open configuration file ($O3l)."); while (($l3x=fgets($O3w,02000)) !== FALSE) { $l3x=preg_replace("/(^\\s+)|(\\s+\$)/","",$l3x); if (preg_match("/^#/",$l3x) == 0) { $O3x=preg_split($l31,$l3x); if (count($O3x)>1) { $l3w[$O3x[0]]=trim($O3x[1]); } } } return $l3w; } function l7($O3l,$l31="/\t+/") { $l3w=O3v($O3l,$l31); foreach ($l3w as $l3y => $O2l) { $l3y=trim(strtoupper( "$l3y")); if ($l3y === "CACHEMODE" || $l3y === "CACHEDAYCHANGE" || $l3y === "CACHEHOURS" || $l3y === "DATADIR" || $l3y === "DISCOVERSIZE" || $l3y === "ADDTABLEPREFIX" || $l3y === "ACCELERATETOP" || $l3y === "ACCELERATEMAX") { if ($l3y === "DATADIR" && stripos(trim($O2l),"..") == 0) { $O2l= __DIR__."/../".trim($O2l); } define(__NAMESPACE__."\\".$l3y,$O2l); } } if (!defined(__NAMESPACE__."\\DATADIR"))define(__NAMESPACE__."\\DATADIR",DEFAULT_DATADIR); if (!defined(__NAMESPACE__."\\DISCOVERSIZE")) { define(__NAMESPACE__."\\DISCOVERSIZE",l3s); } if (!defined(__NAMESPACE__."\\ADDTABLEPREFIX"))define(__NAMESPACE__."\\ADDTABLEPREFIX",O3s); if (!defined(__NAMESPACE__."\\CACHEMODE"))define(__NAMESPACE__."\\CACHEMODE",l3t); if (!defined(__NAMESPACE__."\\CACHEDAYCHANGE"))define(__NAMESPACE__."\\CACHEDAYCHANGE",O3t); if (!defined(__NAMESPACE__."\\CACHEHOURS"))define(__NAMESPACE__."\\CACHEHOURS",l3u); if (!defined(__NAMESPACE__."\\ACCELERATETOP"))define(__NAMESPACE__."\\ACCELERATETOP",l3v); if (!defined(__NAMESPACE__."\\ACCELERATEMAX"))define(__NAMESPACE__."\\ACCELERATEMAX",O3u); } \ No newline at end of file +namespace kibella; require_once "constantscfg.php"; function lc($Oe,$Ob="/\t+/") { $lf=array(); if (($Of=fopen($Oe,"r")) === FALSE) throw new exception( __FUNCTION__."Cannot open configuration file ($Oe)."); while (($lg=fgets($Of,02000)) !== FALSE) { $lg=preg_replace("/(^\\s+)|(\\s+\$)/","",$lg); if (preg_match("/^#/",$lg) == 0) { $Og=preg_split($Ob,$lg); if (count($Og)>1) { $lf[$Og[0]]=trim($Og[1]); } } } return $lf; } function l12($Oe=APPCONFIG,$Ob="/\t+/") { $lf=lc($Oe,$Ob); foreach ($lf as $l4w => $l3c) { $l4w=trim(strtoupper( "$l4w")); if ($l4w === "CACHEMODE" || $l4w === "CACHEDAYCHANGE" || $l4w === "CACHEHOURS" || $l4w === "DATADIR" || $l4w === "DISCOVERSIZE" || $l4w === "ADDTABLEPREFIX" || $l4w === "LISTONLYTABLEOBJECTS" || $l4w === "ACCELERATETOP" || $l4w === "ACCELERATEMAX" || $l4w === "DBCONNECTIONSFILE" || $l4w === "MULTITHREADING") { if ($l4w === "DATADIR" && stripos(trim($l3c),"..") == 0) { $l3c= __DIR__."/../".trim($l3c); } define(__NAMESPACE__."\\".$l4w,$l3c); } } if (!defined(__NAMESPACE__."\\DATADIR"))define(__NAMESPACE__."\\DATADIR",DEFAULT_DATADIR); if (!defined(__NAMESPACE__."\\DISCOVERSIZE")) { define(__NAMESPACE__."\\DISCOVERSIZE",O2v); } if (!defined(__NAMESPACE__."\\ADDTABLEPREFIX"))define(__NAMESPACE__."\\ADDTABLEPREFIX",l2w); if (!defined(__NAMESPACE__."\\LISTONLYTABLEOBJECTS"))define(__NAMESPACE__."\\LISTONLYTABLEOBJECTS",O2w); if (!defined(__NAMESPACE__."\\CACHEMODE"))define(__NAMESPACE__."\\CACHEMODE",l2x); if (!defined(__NAMESPACE__."\\CACHEDAYCHANGE"))define(__NAMESPACE__."\\CACHEDAYCHANGE",O2x); if (!defined(__NAMESPACE__."\\CACHEHOURS"))define(__NAMESPACE__."\\CACHEHOURS",l2y); if (!defined(__NAMESPACE__."\\ACCELERATETOP"))define(__NAMESPACE__."\\ACCELERATETOP",l2z); if (!defined(__NAMESPACE__."\\ACCELERATEMAX"))define(__NAMESPACE__."\\ACCELERATEMAX",O2y); if (!defined(__NAMESPACE__."\\DBCONNECTIONSFILE"))define(__NAMESPACE__."\\DBCONNECTIONSFILE",DEFAULT_DBCONNECTIONSFILE); if (!defined(__NAMESPACE__."\\MULTITHREADING"))define(__NAMESPACE__."\\MULTITHREADING",O2z); } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionsdashaccelerate.php b/JSON_SQL_Bridge/functionsdashaccelerate.php index 009ae9e..27fc0aa 100644 --- a/JSON_SQL_Bridge/functionsdashaccelerate.php +++ b/JSON_SQL_Bridge/functionsdashaccelerate.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; function O3y($O2l,&$l3z) { if (array_search($O2l,$l3z["values"]) === FALSE) { $l3z["values"][]=$O2l; } } function O3z($l40,$l2d,$O40,$O2j,&$l41,&$O41) { $l42=array_keys($l2d); $O42=count($l2d); if ($O2j+1<$O42) $l43=TRUE; else $l43=FALSE; if ($l43) $O43=$l42[$O2j+1]; $O2e=$l2d[$l40]["type"]; $l44=$l2d[$l40]["ifield"]; $O44=$l2d[$l40]["interval"]; if (array_key_exists($l44,$l41) === FALSE) { $l41[$l44]=array("type" => $O2e,"values" => array(),"interval" => $O44); } switch ($O2e) { case ("h"): case ("hd"): case ("t"): foreach ($O40 as $l45) { $O2l=$l45["key"]; if ($O2e == "hd") { $O2l=$O2l/01750; } if ($l43) { $O41[$O2l]=array(); if (array_key_exists($O43,$l45)) { $O45=$l45[$O43][l1c]; O3z($O43,$l2d,$O45,$O2j+1,$l41,$O41[$O2l]); } } else { $O41[]=$O2l; } O3y($O2l,$l41[$l44]); } break; case ("r"): case ("rd"): foreach ($O40 as $O2l => $l45) { if ($l43) { $O41[$O2l]=array(); if (array_key_exists($O43,$l45)) { $O45=$l45[$O43][l1c]; O3z($O43,$l2d,$O45,$O2j+1,$l41,$O41[$O2l]); } } else { $O41[]=$O2l; } O3y($O2l,$l41[$l44]); } break; default : break; } } function l46($O46,$l47) { $O47=array(); $l41=array(); $O41=array(); $l48=json_decode($O46,TRUE); assert(array_key_exists("xaggs",$l47),"The parsed query array contains the attribute 'xaggs'"); $O48=$l47["xaggs"]; $l42=array(); foreach ($O48 as $l49) { assert(array_key_exists("ofield",$l49),"The array with the aggregation info contains the attribute 'ofield'"); assert(array_key_exists("type",$l49),"The array with the aggregation info contains the attribute 'type'"); $l42[]=$l49["ofield"]; if ($l49["type"] == "h" || $l49["type"] == "hd") { assert(array_key_exists("interval",$l49),"The array with the aggregation info contains the attribute 'interval'"); $O44=$l49["interval"]; } else { $O44=NULL; } assert(array_key_exists("ifieldname",$l49),"The array with the aggregation info contains the attribute 'ifieldname'"); $O47[$l49["ofield"]]=array("type" => $l49["type"],"ifield" => $l49["ifieldname"],"interval" => $O44); } if (array_key_exists(l19,$l48)) { $O49=$l48[l19]; $O2j=-1; $l40=$l42[0]; $O40=$O49[$l40][l1c]; O3z($l40,$O47,$O40,$O2j+1,$l41,$O41); } $l4a=count($O41); if (0<$l4a && $l4a<=ACCELERATEMAX) { if (DEBUG) { O29( __FUNCTION__ ,"note","Multi-level filter values\n"); O4a($O41); } return array("Fields and Values" => $l41,"Multilevel Values" => $O41); } else { return FALSE; } } function l4b(&$O4b,$l2e,$O2e,$O44,$O2l,$l4c="") { global $O4c; switch ($O2e) { case ("t"): $O4b.=$l4c."{"."\"query\":{"."\"match\":{".$l2e.":{"."\"query\":\"".$O2l."\","."\"type\":\"phrase\""."}"."}"."}"."}"; break; case ("h"): case ("hd"): if ($O2e == "hd") { $l4d=$O2l*01750; } else { $l4d=$O2l; } $O4b.=$l4c."{"."\"range\":{".$l2e.":{"."\"gte\":".$l4d.","; if ($O2e == "h") { assert(is_numeric($O44),"The histogram interval (bin size) is a number or numeric string"); $O4d=$l4d+$O44; $O4b.="\"lt\":".$O4d; } else { $l3f=max(1,round(substr($O44,0,strlen($O44)-1)))*1; $O3f=substr($O44,strlen($O44)-1); $l4e=date_create(gmstrftime("%Y-%m-%d %H:%M:%S",$l4d/01750),new \datetimezone("UTC")); $O4e=(array) $l4e; date_modify($l4e,"$l3f ".$O4c[$O3f]); $O4e=(array) $l4e; $O4d=date_timestamp_get($l4e); $O4b.="\"lte\":".($O4d*01750-1); } $O4b.="}"."}"."}"; break; case ("r"): case ("rd"): $l4f=O3h($O2l); $l4d=$l4f[0]; $O4d=$l4f[1]; $O4b.=$l4c."{"."\"range\":{".$l2e.":{"."\"gte\":".$l4d.","."\"lt\":".$O4d."}"."}"."}"; break; default : break; } } function O4f($l4g,$O4b) { $O4g=FALSE; if ($O4b != NULL && trim($O4b) !== "") { $O4g=TRUE; $l4h=json_decode($O4b,TRUE); } foreach ($l4g["objects"] as $O4h) { $l4i=$O4h["id"]; $O22=$O4h["tableid"]; $O4i=$O4h["query"]; if ($O4i != NULL) { if ($O4g === TRUE) { $l4j=json_decode($O4i,TRUE); if (array_key_exists("query",$l4j)) { $l4j["query"]=$l4h; } $O4i=json_encode($l4j); } $O4j=l4k($O22,$O4i); $O4k=l4($O4j); } if (DEBUG) O29( __FUNCTION__ ,"note","\t\t*********** FILTER QUERY for object $l4i **************\n\t\t$O4i\n"); } } function l4l($l4g,$O4l) { if (DEBUG) { O29( __FUNCTION__ ,"note","Objects in dashboard to be accelerated:\n"); O4a($l4g); O29( __FUNCTION__ ,"note","Filters to apply:\n"); O4a($O4l); } O4f($l4g,""); $l4m="{"."\"filtered\":{"."\"query\":{"."\"query_string\":{"."\"query\":\"*\","."\"analyze_wildcard\":true"."}"."},"."\"filter\":{"."\"bool\":{"."\"must\":["; $O4m=",{"."\"query\":{"."\"query_string\":{"."\"analyze_wildcard\":true,"."\"query\":\"*\""."}"."}"."}"."],"."\"must_not\":[]"."}"."}"."}"."}"; foreach ($O4l as $l4n => $O4n) { $l4o=array(); foreach ($O4n["Fields and Values"] as $l2e => $O4o) { $O2e=$O4o["type"]; $O44=$O4o["interval"]; $l4o[]=array("field" => $l2e,"type" => $O2e,"interval" => $O44); foreach ($O4o["values"] as $O2l) { $O4b=$l4m; l4b($O4b,$l2e,$O2e,$O44,$O2l); $O4b.=$O4m; O4f($l4g,$O4b); } } $l4p=count($l4o); if ($l4p>1) { l2h($O4n["Multilevel Values"],"kibella\\dashAddMultiLevelFilterAndAccelerateObjects",array($l4g,$l4o,$l4m,$O4m)); } } } function dashaddmultilevelfilterandaccelerateobjects($O2l,$l2l,$l2j,$O2j,$l2k,$O2i) { static $O4p; static $l4q; static $O4q; static $l4r; static $O4r; assert(count($O2i) == 4,"The parameters array has exactly 4 elements"); if ($l2j == 0 && $O2j == 0) { $O4p=$O2i[0]; $l4q=$O2i[1]; $l4r=$O2i[2]; $O4q=array($l4r); $O4r=$O2i[3]; } assert(count($l4q)>$O2j,"The number of elements in the aFieldsInfo array is larger than the current level (numel=".count($l4q)."), level=$O2j)"); $l2e=$l4q[$O2j]["field"]; $O2e=$l4q[$O2j]["type"]; $O44=$l4q[$O2j]["interval"]; if (is_array($O2l)) { $l4s=$l2l; $O4q[]=$O4q[$O2j]; if ($O2j == 0) { $l4c=""; } else { $l4c=","; } l4b($O4q[$O2j+1],$l2e,$O2e,$O44,$l4s,$l4c=$l4c); } else { $l4s=$O2l; $O4b=$O4q[$O2j]; l4b($O4b,$l2e,$O2e,$O44,$l4s,$l4c=","); $O4b.=$O4r; O4f($O4p,$O4b); if ($l2j == $l2k-1) { array_pop($O4q); } } } function O4s($O22,$l4t) { $O4t=l4u($O22)["cache"]; if ($O4t) { if (LOG) { O29( __FUNCTION__ ,"note","$O22 - Accelerating dashboard...\n"); } $O4u=array(); if (array_key_exists("panelsJSON",$l4t)) { $l4v=json_decode($l4t["panelsJSON"],TRUE); foreach ($l4v as $O4v) { if (array_key_exists("id",$O4v)) { $l4w=O4w("select * from ".Ov." where ".Ow." <> '".Og."' and ".lq." = '".$O4v["id"]."'",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if (count($l4w)>0) { assert(count($l4w) == 1,"There is only one object that matches the searched ID"); $O4i=$l4w[0][Ox]; $O4x["objects"][]=array("id" => $O4v["id"],"tableid" => $O22,"query" => $O4i); if ($O4i != NULL) { $O4j=l4k($O22,$O4i); $l4y=l4($O4j); $l3=$l4y["responseFile"]; $l47=$l4y["parsedQuery"]; if ($l3 !== FALSE) { $O46=file_get_contents($l3); } $O4l=l46($O46,$l47); if ($O4l !== FALSE) { $O4u[$O4v["id"]]=$O4l; } } } } } if (count($O4u)>0) { l4l($O4x,$O4u); } } } } function dashacceleratealldashboards($O22,$O2=FALSE) { $O4t=l4u($O22)["cache"]; if ($O4t) { $O4y=l4z($O22); if ($O4y !== FALSE) { foreach ($O4y as $O4z) { if ($O2) echo "
    Accelerating dashboard ".$O4z[lq]."...
    "; ob_flush(); $l4t=json_decode($O4z[lx],TRUE); O4s($O22,$l4t); } } } } function dashacceleratetopqueries($O22,$l24=l3v,$O2=FALSE) { $O4t=l4u($O22)["cache"]; if ($O4t && $l24>0) { $l50=O50($O22); if ($l50 !== FALSE) { $l51=0; foreach ($l50 as $O51) { $l51 += $O51["n"]; $l52=$O51["counter"]; } $O52=0; $l53=$l50[0]["counter"]; foreach ($l50 as $O51) { $O52 += $O51["n"]; if ($O52/$l51>$l24/0144) { $l52=$l53; break; } $l53=$O51["counter"]; } if ($O2) echo "
    => Queries to accelerate should have been run at least $l52 times.
    "; $O53=l54($O22,$l52); if ($O53 !== FALSE) { $l2v=0; foreach ($O53 as $l4j) { $l2v ++; $O54=$l4j[lz]; $l55=$l4j[l11]; if ($O2) echo "
    Running query $l2v with MD5 $O54 (run $l55 times)
    "; $O4i=$l4j[O10]; $O4j=l4k($O22,$O4i); l4($O4j); } } } } } \ No newline at end of file +namespace kibella; function O4w($l3c,&$l4x) { if (array_search($l3c,$l4x["values"]) === FALSE) { $l4x["values"][]=$l3c; } } function O4x($l4y,$l3u,$O4y,$l3a,&$l4z,&$O4z) { $l50=array_keys($l3u); $O50=count($l3u); if ($l3a+1<$O50) $l51=TRUE; else $l51=FALSE; if ($l51) $O51=$l50[$l3a+1]; $l52=$l3u[$l4y]["type"]; $O52=$l3u[$l4y]["ifield"]; $l53=$l3u[$l4y]["interval"]; if (array_key_exists($O52,$l4z) === FALSE) { $l4z[$O52]=array("type" => $l52,"values" => array(),"interval" => $l53); } switch ($l52) { case ("h"): case ("hd"): case ("t"): foreach ($O4y as $O53) { $l3c=$O53["key"]; if ($l52 == "hd") { $l3c=$l3c/01750; } if ($l51) { $O4z[$l3c]=array(); if (array_key_exists($O51,$O53)) { $l54=$O53[$O51][l26]; O4x($O51,$l3u,$l54,$l3a+1,$l4z,$O4z[$l3c]); } } else { $O4z[]=$l3c; } O4w($l3c,$l4z[$O52]); } break; case ("r"): case ("rd"): foreach ($O4y as $l3c => $O53) { if ($l51) { $O4z[$l3c]=array(); if (array_key_exists($O51,$O53)) { $l54=$O53[$O51][l26]; O4x($O51,$l3u,$l54,$l3a+1,$l4z,$O4z[$l3c]); } } else { $O4z[]=$l3c; } O4w($l3c,$l4z[$O52]); } break; default : break; } } function O54($l55,$O55) { $l56=array(); $l4z=array(); $O4z=array(); $O56=json_decode($l55,TRUE); assert(array_key_exists("xaggs",$O55),"The parsed query array contains the attribute 'xaggs'"); $l57=$O55["xaggs"]; $l50=array(); foreach ($l57 as $O57) { assert(array_key_exists("ofield",$O57),"The array with the aggregation info contains the attribute 'ofield'"); assert(array_key_exists("type",$O57),"The array with the aggregation info contains the attribute 'type'"); $l50[]=$O57["ofield"]; if ($O57["type"] == "h" || $O57["type"] == "hd") { assert(array_key_exists("interval",$O57),"The array with the aggregation info contains the attribute 'interval'"); $l53=$O57["interval"]; } else { $l53=NULL; } assert(array_key_exists("ifieldname",$O57),"The array with the aggregation info contains the attribute 'ifieldname'"); $l56[$O57["ofield"]]=array("type" => $O57["type"],"ifield" => $O57["ifieldname"],"interval" => $l53); } if (array_key_exists(l23,$O56)) { $l58=$O56[l23]; $l3a=-1; $l4y=$l50[0]; $O4y=$l58[$l4y][l26]; O4x($l4y,$l56,$O4y,$l3a+1,$l4z,$O4z); } $O58=count($O4z); if (0<$O58 && $O58<=ACCELERATEMAX) { if (DEBUG) { showmessage( __FUNCTION__ ,"note","Multi-level filter values\n"); l59($O4z); } return array("Fields and Values" => $l4z,"Multilevel Values" => $O4z); } else { return FALSE; } } function O59(&$l5a,$O5a,$l52,$l53,$l3c,$l5b="") { global $O5b; switch ($l52) { case ("t"): $l5a.=$l5b."{"."\"query\":{"."\"match\":{".$O5a.":{"."\"query\":\"".$l3c."\","."\"type\":\"phrase\""."}"."}"."}"."}"; break; case ("h"): case ("hd"): if ($l52 == "hd") { $l5c=$l3c*01750; } else { $l5c=$l3c; } $l5a.=$l5b."{"."\"range\":{".$O5a.":{"."\"gte\":".$l5c.","; if ($l52 == "h") { assert(is_numeric($l53),"The histogram interval (bin size) is a number or numeric string"); $O5c=$l5c+$l53; $l5a.="\"lt\":".$O5c; } else { $O4h=max(1,round(substr($l53,0,strlen($l53)-1)))*1; $l4i=substr($l53,strlen($l53)-1); $l5d=date_create(gmstrftime("%Y-%m-%d %H:%M:%S",$l5c/01750),new \datetimezone("UTC")); $O5d=(array) $l5d; date_modify($l5d,"$O4h ".$O5b[$l4i]); $O5d=(array) $l5d; $O5c=date_timestamp_get($l5d); $l5a.="\"lte\":".($O5c*01750-1); } $l5a.="}"."}"."}"; break; case ("r"): case ("rd"): $l5e=l4k($l3c); $l5c=$l5e[0]; $O5c=$l5e[1]; $l5a.=$l5b."{"."\"range\":{".$O5a.":{"."\"gte\":".$l5c.","."\"lt\":".$O5c."}"."}"."}"; break; default : break; } } function O5e($l5f,$l5a) { $O5f=FALSE; if ($l5a != NULL && trim($l5a) !== "") { $O5f=TRUE; $l5g=json_decode($l5a,TRUE); } foreach ($l5f["objects"] as $O5g) { $l5h=$O5g["id"]; $l31=$O5g["tableid"]; $O5h=$O5g["query"]; if ($O5h != NULL) { if ($O5f === TRUE) { $l5i=json_decode($O5h,TRUE); if (array_key_exists("query",$l5i)) { $l5i["query"]=$l5g; } $O5h=json_encode($l5i); } $O5i=l5j($l31,$O5h); $O5j=lz($O5i); } if (DEBUG) showmessage( __FUNCTION__ ,"note","\t\t*********** FILTER QUERY for object $l5h **************\n\t\t$O5h\n"); } } function l5k($l5f,$O5k) { if (DEBUG) { showmessage( __FUNCTION__ ,"note","Objects in dashboard to be accelerated:\n"); l59($l5f); showmessage( __FUNCTION__ ,"note","Filters to apply:\n"); l59($O5k); } O5e($l5f,""); $l5l="{"."\"filtered\":{"."\"query\":{"."\"query_string\":{"."\"query\":\"*\","."\"analyze_wildcard\":true"."}"."},"."\"filter\":{"."\"bool\":{"."\"must\":["; $O5l=",{"."\"query\":{"."\"query_string\":{"."\"analyze_wildcard\":true,"."\"query\":\"*\""."}"."}"."}"."],"."\"must_not\":[]"."}"."}"."}"."}"; foreach ($O5k as $l5m => $O5m) { $l5n=array(); foreach ($O5m["Fields and Values"] as $O5a => $O5n) { $l52=$O5n["type"]; $l53=$O5n["interval"]; $l5n[]=array("field" => $O5a,"type" => $l52,"interval" => $l53); foreach ($O5n["values"] as $l3c) { $l5a=$l5l; O59($l5a,$O5a,$l52,$l53,$l3c); $l5a.=$O5l; O5e($l5f,$l5a); } } $l5o=count($l5n); if ($l5o>1) { O37($O5m["Multilevel Values"],"kibella\\dashAddMultiLevelFilterAndAccelerateObjects",array($l5f,$l5n,$l5l,$O5l)); } } } function dashaddmultilevelfilterandaccelerateobjects($l3c,$O3b,$O39,$l3a,$O3a,$l39) { static $O5o; static $l5p; static $O5p; static $l5q; static $O5q; assert(count($l39) == 4,"The parameters array has exactly 4 elements"); if ($O39 == 0 && $l3a == 0) { $O5o=$l39[0]; $l5p=$l39[1]; $l5q=$l39[2]; $O5p=array($l5q); $O5q=$l39[3]; } assert(count($l5p)>$l3a,"The number of elements in the aFieldsInfo array is larger than the current level (numel=".count($l5p)."), level=$l3a)"); $O5a=$l5p[$l3a]["field"]; $l52=$l5p[$l3a]["type"]; $l53=$l5p[$l3a]["interval"]; if (is_array($l3c)) { $l5r=$O3b; $O5p[]=$O5p[$l3a]; if ($l3a == 0) { $l5b=""; } else { $l5b=","; } O59($O5p[$l3a+1],$O5a,$l52,$l53,$l5r,$l5b=$l5b); } else { $l5r=$l3c; $l5a=$O5p[$l3a]; O59($l5a,$O5a,$l52,$l53,$l5r,$l5b=","); $l5a.=$O5q; O5e($O5o,$l5a); if ($O39 == $O3a-1) { array_pop($O5p); } } } function O5r($l31,$l5s) { $O5s=l5t($l31)["cache"]; if ($O5s) { if (LOG) { showmessage( __FUNCTION__ ,"note","$l31 - Accelerating dashboard...\n"); } $O5t=array(); if (array_key_exists("panelsJSON",$l5s)) { $l5u=json_decode($l5s["panelsJSON"],TRUE); foreach ($l5u as $O5u) { if (array_key_exists("id",$O5u)) { $l5v=dbcreatedbh(KIBELLADB); $O5v=dbdbhexecutesqlquery($l5v->getdbhandle(),"select * from ".l3." where ".l4." <> '".O4."' and ".O3." = '".$O5u["id"]."'"); $l5v->close(); if (count($O5v)>0) { assert(count($O5v) == 1,"There is only one object that matches the searched ID"); $O5h=$O5v[0][O1r]; $l5w["objects"][]=array("id" => $O5u["id"],"tableid" => $l31,"query" => $O5h); if ($O5h != NULL) { $O5i=l5j($l31,$O5h); $O5w=lz($O5i); $ly=$O5w["responseFile"]; $O55=$O5w["parsedQuery"]; if ($ly !== FALSE) { $l55=file_get_contents($ly); } $O5k=O54($l55,$O55); if ($O5k !== FALSE) { $O5t[$O5u["id"]]=$O5k; } } } } } if (count($O5t)>0) { l5k($l5w,$O5t); } } } } function dashacceleratealldashboards($l31,$lx=FALSE) { $O5s=l5t($l31)["cache"]; if ($O5s) { $l5x=O5x($l31); if ($l5x !== FALSE) { foreach ($l5x as $l5y) { if ($lx) echo "
    Accelerating dashboard ".$l5y[O3]."...
    "; ob_flush(); $l5s=json_decode($l5y[l1r],TRUE); O5r($l31,$l5s); } } } } function dashacceleratetopqueries($l31,$O32=l2z,$lx=FALSE) { $O5s=l5t($l31)["cache"]; if ($O5s && $O32>0) { $O5y=l5z($l31); if ($O5y !== FALSE) { $O5z=0; foreach ($O5y as $l60) { $O5z += $l60["n"]; $O60=$l60["counter"]; } $l61=0; $O61=$O5y[0]["counter"]; foreach ($O5y as $l60) { $l61 += $l60["n"]; if ($l61/$O5z>$O32/0144) { $O60=$O61; break; } $O61=$l60["counter"]; } if ($lx) echo "
    => Queries to accelerate should have been run at least $O60 times.
    "; $l62=O62($l31,$O60); if ($l62 !== FALSE) { $O3u=0; foreach ($l62 as $l5i) { $O3u ++; $l63=$l5i[O1s]; $O63=$l5i[O1u]; if ($lx) echo "
    Running query $O3u with MD5 $l63 (run $O63 times)
    "; $O5h=$l5i[l1u]; $O5i=l5j($l31,$O5h); lz($O5i); } } } } } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionsdb.php b/JSON_SQL_Bridge/functionsdb.php index 8dc3695..ed07629 100644 --- a/JSON_SQL_Bridge/functionsdb.php +++ b/JSON_SQL_Bridge/functionsdb.php @@ -1,11 +1,11 @@ close(); unset ($l5b); } return $l29; } function l5c($l2e,$l22,$O21,$O2r,$O24="sqlite") { $O27=O5c($l22,$O21,$O2r,$O24=$O24); if ($O27 === FALSE) { return FALSE; } foreach ($O27 as $O51) { if (O2x(strtolower($O51["name"])) === strtolower($l2e)) { return TRUE; } } return FALSE; } function l5a($l22,$O21,$O2r) { if (!file_exists( "$O2r/$O21")) { return le; } $O27=O4w( "select * from sqlite_master where type = 'table' and lower(name) = lower('$l22')" ,$O21,$O2r); if ($O27 === FALSE) { return FALSE; } if (count($O27) == 0) { return Oe; } return TRUE; } function l5d($l5b,$l22) { $O27=dbdbhexecutesqlquery($l5b,"select * from sqlite_master where type = 'table' and name = '$l22'"); if ($O27 === FALSE) { return FALSE; } if (count($O27) == 0) { return Oe; } return TRUE; } function O5d(&$l5b,$l4x="pdo",$l5e=FALSE,$O5e="",$l5f=NULL) { if ($l5f == NULL) { O5f($l5b,$l4x=$l4x); } else { assert(count($l5f)>=2 && array_key_exists("dbh",$l5f) && array_key_exists("attachname",$l5f),"Input array \$dbAttachInfo contains the neccessary keys"); $l5g="DETACH DATABASE ".$l5f["attachname"]; dbdbhexecutesqlquery($l5b,$l5g,$l4x="exec"); O5f($l5f["dbh"],$l4x=$l4x); } if ($l5e === TRUE && $O5e != "" && $O5e != ":memory:") { unlink($O5e); } } function O5f(&$l5b,$l4x="pdo") { switch ($l4x) { case ("pdo"): $l5b=NULL; break; case ("sqlite"): $l5b->close(); break; default : $l5b=NULL; break; } unset ($l5b); } function dbdbhcreate($O21,$O2r="",$l4x="pdo",$O5g=array("dbtype" => "sqlite","attributes" => array( \pdo::ATTR_PERSISTENT => true,\pdo::ATTR_STRINGIFY_FETCHES => false)),$l5h=array("flags" => SQLITE3_OPEN_READWRITE)) { $l5b=FALSE; if ($O2r === "") $O0=$O21; else $O0= "$O2r/$O21"; if (strtolower($l4x) === "sqlite") { assert($l5h !== NULL && count($l5h)>=1 && array_key_exists("flags",$l5h),"Input array \$optionsSQLite contains the minimum required attributes"); $O5h=$l5h["flags"]; try { $l5b=new l0($O0,$O5h=$O5h); } catch ( \exception $l1) { O29( __FUNCTION__ ,Oc,$l1->getmessage()." '$O0'.\n"); } } else { assert($O5g !== NULL && count($O5g)>=1 && array_key_exists("dbtype",$O5g),"Input array \$optionsPDO contains the minimum required attributes"); $O24=$O5g["dbtype"]; if (array_key_exists("attributes",$O5g)) { $l5i=$O5g["attributes"]; } else { $l5i=NULL; } try { $l5b=new \pdo( "$O24:$O0"); if ($l5i != NULL) { foreach ($l5i as $O5i => $O2l) { $l5b->setattribute($O5i,$O2l); } } $l5b->setattribute( \pdo::ATTR_ERRMODE,\pdo::ERRMODE_SILENT); } catch ( \l5j $l1) { O29( __FUNCTION__ ,Oc,$l1->getmessage()." '$O0' of type '$O24'.\n"); } } return $l5b; } function O5j($l5b,$l22) { $l29=l5d($l5b,$l22); if ($l29 === TRUE) { dbdbhexecutesqlquery($l5b,"drop table $l22" ,$l4x="exec"); } return $l29; } function dbdbhexecutesqlquery($l5b,$l5k,$l4x="query",$O2i=NULL) { $O5k=FALSE; if ($l4x == "exec") { try { if ($O2i != NULL) { $l5l=@$l5b->prepare($l5k); foreach ($O2i as $O5l => $O2l) { $l5l->bindvalue($O5l,$O2l); } $O5k=@$l5l->execute(); unset ($l5l); } else { $O5k=@$l5b->exec($l5k); } } catch ( \l5j $l1) { } } else { $l5l=@$l5b->query($l5k); if ($l5l) { if (get_class($l5l) == "PDOStatement") { $O5k=$l5l->fetchall( \pdo::FETCH_ASSOC); } else if (get_class($l5l) == "SQLite3Result") { $O5k=array(); while ($l5m=$l5l->fetcharray(SQLITE3_ASSOC)) { $O5k[]=$l5m; } } } unset ($l5l); } return $O5k; } function O5m($O28,$O21,$l22,$l25,$O25,$O2r,$O24="sqlite") { if (strtolower($O24) != "sqlite") { return Od; } $l29=l5a($l22,$O21,$O2r); if ($l29 === FALSE || $l29<0) { return FALSE; } $l5n=O5c($l22,$O21,$O2r,$O24=$O24); if ($l5n === FALSE) { return FALSE; } if (count($l5n) == 0) { return Oe; } $O5n=""; $l5o=l2u($l25); $O5o=l2u($O25); $l4c=""; $l5p=0; $O5p=$O5o; for ($l2v=0; $l2v0) $l4c=","; $O5n.=$l4c.dbgeneratefieldmetadatashort($l5q,$l5s); $l5p ++; } } if ($O5o != NULL) { O5s($O5n,$O5o,$l5n,"kibella\\dbGenerateFieldMetadataShort"); } $l5t="{\"docs\":[{\"".lj."\":\"".O7."\",\"".Oj."\":\"index-pattern\",\"".lk."\":\"".$O28."\",\"".Ok."\":1,\"".lo."\":true,\"".lm."\":{\"title\":\"".$O28."\","."\"fields\":".O2x($O5n,TRUE)."}"."}]"."}"; return $l5t; } function O5t($O28,$O21,$l22,$l25,$O25,$O2r,$O24="sqlite") { if (strtolower($O24) != "sqlite") { return Od; } $l29=l5a($l22,$O21,$O2r); if ($l29 === FALSE || $l29<0) { return FALSE; } $l5n=O5c($l22,$O21,$O2r,$O24=$O24); if ($l5n === FALSE) { return FALSE; } if (count($l5n) == 0) { return Oe; } $l5u="{\"".$O28."\":{"."\"mappings\":{"."\"row\":{"."\"_ttl\":{"."\"full_name\":\"_ttl\","."\"mapping\":{"."\"_ttl\":{"."\"enabled\":false,"."\"default\":-1"."}"."}"."}"; $l5o=l2u($l25); $O5o=l2u($O25); $l4c=","; $O5p=$O5o; for ($l2v=0; $l2v0) { $l5w="true"; $O5w=$O27[0][Oq]*1; O4w( "delete from $l5v $O5v" ,KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); } else { $l5w="false"; $O5w=1; } if ($O2e == lh) { l58(Ov,$l2t=FALSE); O4w("delete from ".Ov." where ".lw." = '$O28'" ,KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); } l5x($O2e,$O28,$O5w,lo,$l5w); } function O5x($l22,$O21,$O2r) { $l29=l5a($l22,$O21,$O2r); if ($l29 === TRUE) { O4w( "drop table $l22" ,$O21,$O2r,$l4x="exec"); } return $l29; } function O4w($l5k,$O21,$O2r,$l4x="query",$O24="sqlite",$O2i=NULL) { $O5k=FALSE; $O0= "$O2r/$O21"; try { $l5y=new \pdo( "$O24:$O0"); if ($l4x == "exec") { try { if ($O2i != NULL) { $O5y=@$l5y->prepare($l5k); foreach ($O2i as $O5l => $O2l) { $O5y->bindvalue($O5l,$O2l); } $O5k=$O5y->execute(); unset ($O5y); } else { $O5k=@$l5y->exec($l5k); } } catch ( \l5j $l1) { } } else { $O5y=@$l5y->query($l5k); if ($O5y) { $O5k=$O5y->fetchall( \pdo::FETCH_ASSOC); } unset ($O5y); } unset ($l5y); } catch ( \l5j $l1) { O29( __FUNCTION__ ,Oc,$l1->getmessage()." ".$O0."\n"); } return $O5k; } function O5r($l5q,$l5s,&$l5o,&$O5o,$O5p,$O24="sqlite") { $l5z=FALSE; if ($O5p !== NULL && count($O5p)>0) { $O5z="/_geohash[".Oo."-".lp."]\$/i"; if (preg_match($O5z,$l5q) === 1 && array_search(preg_replace($O5z,"",strtolower($l5q)),$O5p) !== FALSE) { $l60=""; $O60=""; $l5z=TRUE; } } if (!$l5z) { $l61=array_search(strtolower($l5q),$l5o); if ($l61 !== FALSE) { $l60="date"; $O60="date"; unset ($l5o[$l61]); } else { $O61=array_search(strtolower($l5q),$O5o); if ($O61 !== FALSE) { $l60="geo_point"; $O60="geo_point"; unset ($O5o[$O61]); } else { switch (( string) strtoupper($l5s)) { case ("DOUBLE"): case ("FLOAT"): case ("REAL"): $l60="number"; $O60="double"; break; case ("INT"): $l60="number"; $O60="long"; break; case ("TEXT"): $l60="string"; $O60="string"; break; default : l62($l5s,$O24); $l60="string"; $O60="string"; break; } } } } return array("FieldTypeIndex" => $l60,"FieldTypeMappings" => $O60); } function dbgeneratefieldmetadatalong($l5q,$l5s) { $l2g="\"".$l5q."\":{"."\"full_name\":\"".$l5q."\","."\"mapping\":{\"".$l5q."\":{"."\"type\":\"".$l5s."\","; if ($l5s === "date") { $l2g.="\"analyzer\":\"_date/16\","."\"search_analyzer\":\"_date/max\","."\"format\":\"yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_second\","."\"numeric_resolution\":\"seconds\","; } $l2g.="\"index\":\"not_analyzed\""."}"."}"."}"; return $l2g; } function dbgeneratefieldmetadatashort($l5q,$l5s) { return "{"."\"name\":\"".$l5q."\","."\"type\":\"".$l5s."\","."\"count\":0,"."\"scripted\":false,"."\"indexed\":true,"."\"analyzed\":false,"."\"doc_values\":true"."}"; } function O5s(&$l2g,&$O5o,$O62,$l63) { assert($O5o != NULL,"the input geofields array is not null"); foreach ($O5o as $O63) { $O63=strtolower($O63); $l64=FALSE; $O64=FALSE; $l65=FALSE; foreach ($O62 as $O51) { $l5q=$O51["name"]; $O65=strtolower($l5q); if ($O65 === $O63."_lat") $l64=TRUE; if ($O65 === $O63."_lon") $O64=TRUE; $l66=$O63."_geohash"; $O66=substr($O65,0,strlen($l66)); $l67=substr($O65,strlen($l66)); if ($O66 === $l66 && Oo<=$l67 && $l67<=lp) $l65=TRUE; if ($l64 && $O64 && $l65) break; } if ($l64 && $O64 && $l65) { if ($l2g == "") $l4c=""; else $l4c=","; $O67=substr($l5q,0,strlen($O63)); $l2g.=$l4c.call_user_func($l63,$O67,"geo_point"); } unset ($O5o[$O63]); } return $l2g; } function l23($l22,$O21) { return strtoupper(strstr($O21,".",TRUE))."(".strtolower($l22).")"; } function l68() { if (PHP_SAPI !== "cli") { $O68=str_replace([":","."],"_",$_SERVER["REMOTE_ADDR"]); $l69=$O68."_"; } else { $l69=""; } return "_$l69".floor(microtime(1))."_".rand(0,023420); } function O2d($O28) { $l5r=FALSE; $l5t=O69($O28); $l6a=json_decode($l5t,TRUE); if ($l6a != NULL && array_key_exists("docs",$l6a) && count($l6a["docs"])>0) { $O6a=$l6a["docs"][0][lm]["fields"]; $l6b=json_decode($O6a,TRUE); $l5r=array(); foreach ($l6b as $O6b) { $l5r["\"".$O6b["name"]."\""]=$O6b["type"]; } } return $l5r; } function l4z($O22) { l58(Ov,$l2t=FALSE); $O4y=O4w("select ".lw.", ".lq.", ".lx." from ".Ov." where ".Ow." = '".Og."' and ".lw." = '".$O22."'",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($O4y == FALSE or count($O4y) == 0) { return FALSE; } return $O4y; } function l54($O22,$l52=0) { l58(Oy,$l2t=FALSE); $O53=O4w("select ".lz.", ".l10.", ".O10.", ".l11." from ".Oy." where ".l10." = '".$O22."' and ".l11." >= $l52"." order by ".l11." desc",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($O53 == FALSE or count($O53) == 0) { return FALSE; } return $O53; } function O50($O22) { l58(Oy,$l2t=FALSE); $l6c=O4w("select ".l11.", count(*) as n "." from ".Oy." where ".l10." = '".$O22."'"." group by ".l11." order by ".l11." desc",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($l6c === FALSE or count($l6c) == 0) { return FALSE; } return $l6c; } function l4u($O22) { l58(lr,$l2t=FALSE); $O6c=O4w("select ".Os.", ".ls.", ".lv." from ".lr." where ".lq." = '$O22'" ,KIBELLADB,TABLESDIR); if ($O6c == FALSE or count($O6c) == 0) { return FALSE; } $O21=$O6c[0][Os]; $l22=$O6c[0][ls]; $l6d=strtolower(CACHEMODE) !== "none" && ($O6c[0][lv] == 1); $l27=array("table" => $l22,"db" => $O21,"cache" => $l6d); return $l27; } function O69($O22) { l58(lr,$l2t=FALSE); $O27=O4w("select ".ls.", ".Os.", ".lt.", ".Ot.", ".lu.", ".Ou." from ".lr." where lower(".lq.") = '".strtolower($O22)."'",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($O27 !== FALSE && count($O27)>0) { $l22=$O27[0][ls]; $O21=$O27[0][Os]; $O24=$O27[0][lt]; $l25=$O27[0][Ot]; $O25=$O27[0][lu]; $l26=$O27[0][Ou]; $l5t=O5m($O22,$O21,$l22,$l25,$O25,DATADIR,$O24=$O24); } else { $l5t=FALSE; } return $l5t; } function O6d($O28) { l58(lr,$l2t=FALSE); $O27=O4w("select ".ls.", ".Os.", ".lt.", ".Ot.", ".lu.", ".Ou." from ".lr." where lower(".lq.") = '".strtolower($O28)."'",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($O27 !== FALSE && count($O27)>0) { $l22=$O27[0][ls]; $O21=$O27[0][Os]; $O24=$O27[0][lt]; $l25=$O27[0][Ot]; $O25=$O27[0][lu]; $l26=$O27[0][Ou]; $l5u=O5t($O28,$O21,$l22,$l25,$O25,DATADIR,$O24=$O24); } else { $l5u=FALSE; } return $l5u; } function O5c($l22,$O21,$O2r,$O24="sqlite") { if ($O24 == "sqlite") { return O4w( "PRAGMA table_info('$l22')" ,$O21,$O2r,$l4x="query",$O24=$O24); } else { O29( __FUNCTION__ ,Oc,l6e($O24)); } } function O6e($l6f) { $O6f=json_decode($l6f["kibanaSavedObjectMeta"]["searchSourceJSON"],TRUE); return $O6f["index"]; } function l6g($O2e,$O28,$O6g=TRUE) { l58(Ov,$l2t=FALSE); $l6h=O4w("select * from ".Ov." where ".Ow." = '".$O2e."' and ".lq." = '".$O28."'",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($l6h === FALSE) { echo Oc." when reading from Objects table '".Ov."'. ".ld.".\n"; } else { if (count($l6h) == 0) { $O6h="{\"".lj."\":\"".O7."\",\"".Oj."\":\"".$O2e."\",\"".lk."\":\"".$O28."\",\"".lo."\":false"."}"; if ($O6g) { $O6h="{\"docs\":[".$O6h."]}"; } } else { $O6h="{\"".lj."\":\"".O7."\",\"".Oj."\":\"".$l6h[0][Ow]."\",\"".lk."\":\"".$l6h[0][lq]."\",\"".Ok."\":".$l6h[0][Oq]*1 .",\"".lo."\":true,\"".lm."\":".$l6h[0][lx]; $l6i=$l6h[0][Om]; if ($l6i) $O6h.=",\"".Om."\":".$l6i; $O6h.="}"; if ($O6g) { $O6h="{\"docs\":[".$O6h."]}"; } } O2f($O6h); } } function O6i($O22,$l6j,$O6j) { $l27=l4u($O22); $l22=$l27["table"]; $O21=$l27["db"]; $O4t=$l27["cache"]; $l6k=O6k($O22,$l6j); $l6l=O6l($l6k,$O4t); if ($l6l === FALSE) { $l6m["xaggs"]=array(); $l6m["yaggs"]=array(); $l6m["filter"]= "where rowid = $O6j"; $l6m["discover"]=array("tab" => TRUE,"limit" => l3r(1)); O6m($l22,$O21,$l6m,$l6k["responseFileTmp"]); l6n($l6k,$O4t); } O6n($l6k["responseFileFinal"]); } function l6o($O28) { $l5t=O69($O28); if ($l5t !== FALSE) { $O46=$l5t; } else { $l22=l14; $O21=l13; $O28=l23($l22,$O21); $O46="{\"docs\":[{\"".lj."\":\"".O7."\",\"".Oj."\":\"index-pattern\",\"".lk."\":\"".$O28."\",\"".Ok."\":1,\"".lo."\":true,\"".lm."\":{\"title\":\"".$O28."\","."\"fields\":\"[{}]\""."}"."}]"."}"; } O2f($O46); } function O6o($O28) { $l5u=O6d($O28); if ($l5u !== FALSE) { $O46=$l5u; } else { $l22=l14; $O21=l13; $O28=l23($l22,$O21); $l5q="_dummy"; $l5s="string"; $O46="{\"".$O28."\":{"."\"mappings\":{"."\"row\":{"."\"_ttl\":{"."\"full_name\":\"_ttl\","."\"mapping\":{"."\"_ttl\":{"."\"enabled\":false,"."\"default\":-1"."}"."}"."},\"".$l5q."\":{"."\"full_name\":\"".$l5q."\","."\"mapping\":{\"".$l5q."\":{"."\"type\":\"".$l5s."\","."\"index\":\"not_analyzed\""."}"."}"."}"."}"."}"."}"."}"; } O2f($O46); } function l6p($l5b,$l5k) { $l5l=FALSE; if ($l5b !== FALSE) { $l5l=@$l5b->query($l5k); } return $l5l; } function O6p($l5l,$l6q=0) { $O5k=FALSE; if ($l5l) { if (get_class($l5l) == "PDOStatement") { $O5k=$l5l->fetch( \pdo::FETCH_ASSOC); } else if (get_class($l5l) == "SQLite3Result") { $O5k=$l5l->fetcharray(SQLITE3_ASSOC); } } return $O5k; } function O6q($O22,$O4i,$O54) { $l29=l58(Oy,$l2t=FALSE); $O27=O4w("select ".lz.", ".l11." from ".Oy." where ".lz." = '".$O54."'"." and ".l10." = '$O22'" ,KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); $l2w=@strftime("%Y/%m/%d %H:%M:%S",time()); if (count($O27) == 0) { $l6r="true"; $l55=1; $O5k=O4w("insert into ".Oy." values(\t'$O54',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O22',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O4i',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$l55,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l2w'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)" ,KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); } else { $l55=$O27[0][l11]+1; $O5k=O4w("update ".Oy." set ".lz." = '$O54', ".l10." = '$O22', ".O10." = '$O4i', ".l11." = $l55, ".Oz." = '$l2w'"." where ".lz." = '$O54'" ,KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); } } function l28($l27) { $O6r=new user(); if (PHP_SAPI !== "cli" && !$O6r->isloggedin()) return FALSE; $l22=$l27["table"]; $O21=$l27["db"]; $O24=$l27["dbtype"]; $l25=$l27["datefields"]; $O25=$l27["geofields"]; $l26=$l27["linkfields"]; $O26=$l27["enablecache"]; if ($O21 == "") { O29("","note",l6s("Database")); } if ($l22 == "") { O29("","note",l6s("Table")); } if ($O21 == "" || $l22 == "") { return FALSE; } assert($O24 != "","The database type is not empty."); $l29=l5a($l22,$O21,DATADIR); if ($l29 === FALSE || $l29<0) { $O28=""; } else { $l29=FALSE; $O21=basename(realpath(DATADIR."/$O21")); $O28=l23($l22,$O21); $l29=l58(lr,$l2t=TRUE); if ($l29 === FALSE) { return array("id" => $O28,"rc" => FALSE); } $l29=FALSE; $O27=O4w("select ".Oq." from ".lr." where lower(".lq.") = '".strtolower($O28)."'",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($O27 === FALSE) { $l29=FALSE; } else if (count($O27) == 0) { $O5w=1; $O5k=O4w("insert into ".lr." (".lq.",".ls.",".Os.",".lt.",".Oq.",".Ot.",".lu.",".Ou.",".lv.")"." values(\t'$O28',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l22',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O21',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O24',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t $O5w,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l25',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O25',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l26',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O26'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)" ,KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); if ($O5k !== FALSE) $l29=lf; } else { $O5w=$O27[0][Oq]+1; $O5k=O4w("update ".lr." set ".ls." = '$l22', ".Os." = '$O21', ".lt." = '$O24', ".Oq." = $O5w, ".Ot." = '$l25', ".lu." = '$O25', ".Ou." = '$l26', ".lv." = $O26"." where lower(".lq.") = '".strtolower($O28)."'",KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); if ($O5k !== FALSE) $l29=Of; } } return array("id" => $O28,"rc" => $l29); } function O5a($l2t=FALSE) { $l29=TRUE; $l5b=dbdbhcreate(KIBELLADB,$O2r=TABLESDIR,$l4x="sqlite"); if ($l5b === FALSE) { return FALSE; } $O6s=array(lr,Ov,Oy); $l29=TRUE; foreach ($O6s as $l22) { $l29=$l29 && O5b($l5b,$l22,$l2t=$l2t); } $l5b->close(); unset ($l5b); return $l29; } function O5b($l5b,$l22,$l2t=FALSE) { assert($l5b !== NULL && $l5b != FALSE,"The database handle is not null nor false"); $l29=O5j($l5b,$l22); if ($l29 === FALSE) { O29( __FUNCTION__ ,Ob,l6t($l22)); } else { switch ($l22) { case (lr): $O6t=lq." TEXT, ".ls." TEXT, ".Os." TEXT, ".lt." TEXT, ".Oq." INT, ".Ot." TEXT, ".lu." TEXT, ".Ou." TEXT, ".lv." NUMBER".",imageFields TEXT".",linkTemplate TEXT".",linkTemplateLabel TEXT".",imageTemplate TEXT".",imageTemplateLabel TEXT".", PRIMARY KEY(".lq.")"; $l6u="Registered tables"; break; case (Ov): $O6t=lw." TEXT, ".Ow." TEXT, ".lq." TEXT, ".Oq." INT, ".lx." TEXT, ".Ox." TEXT, ".ly." INT"; $l6u="Saved objects (visualizations, dashboards, searches)"; break; case (Oy): $O6t=lz." TEXT, ".l10." TEXT, ".O10." TEXT, ".l11." INT, ".Oz." TEXT"; $l6u="Run queries"; break; default : $O6t=""; $l6u=""; break; } $l29=dbdbhexecutesqlquery($l5b,"create table ".$l22." ($O6t)" ,$l4x="exec"); if ($l29 === FALSE) { O29( __FUNCTION__ ,lc,O6u($l22)); } else if ($l2t) { echo l6v($l6u); } } return $l29; } function O6v($O2e,$l6w) { $O6r=new user(); if (PHP_SAPI !== "cli" && !$O6r->isloggedin()) return FALSE; $O6w=json_decode($l6w,TRUE); switch ($O2e) { case (Oh): case (Oi): $O22=O6e($O6w); $O4i=l6x(O12); break; case (Og): $O22=l6x(l12); $O4i=""; break; default : $O22=""; $O4i=""; break; } $l29=l58(Ov,$l2t=FALSE); if (ADDTABLEPREFIX == 1) { $O6x= "$O22: "; $l6y=strpos($l6w,$O6x); if ($l6y === strlen("{\"title\":\"")) { $l6w=substr_replace($l6w,"",$l6y,strlen($O6x)); } } else { $O6x=""; } $O6y="\"title\":\"([^\"]+)\""; $l6w=preg_replace( "/$O6y/" ,"\"title\":\"".$O6x."\$1\"",$l6w); preg_match( "/$O6y/" ,$l6w,$O3e); if (count($O3e)>1) { $l6z=$O3e[1]; $O6z=l70($l6z); } else { $O6z=""; } $O27=O4w("select ".lq.", ".Oq." from ".Ov." where ".Ow." = '$O2e' and ".lq." = '".$O6z."'",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if (count($O27) == 0) { $l6r="true"; $O5w=1; $O5k=O4w("insert into ".Ov." values(\t'$O22',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O2e',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O6z',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$O5w,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l6w',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O4i', ".O11.")",KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); } else { $l6r="false"; $O5w=$O27[0][Oq]+1; $O5k=O4w("update ".Ov." set ".lw." = '$O22', ".Ow." = '$O2e', ".lq." = '$O6z', ".Oq." = $O5w, ".lx." = '$l6w', ".Ox." = '$O4i'"." where ".lq." = '$O6z'" ,KIBELLADB,TABLESDIR,$l4x="exec",$O24="sqlite"); } l5x($O2e,$O6z,$O5w,On,$l6r); } function O70($l5v,$O2e,$O4n) { l58($l5v,$l2t=FALSE); switch ($O2e) { case (Og): case (Oh): case (Oi): $l71=Ow; $O71=lq; $l72=lx; $O5v= "where $l71 = '$O2e'"; $l22=l6x(l12); if ($l22 !== "") { $O5v.=" and ".lw." = '$l22'"; } if ($O4n != "*") { $O4n=str_replace(" ","-",$O4n); $O5v.= " and lower($O71) GLOB lower('*".$O4n."')"; } $l4g=O4w( "select $l71, $O71, $l72\n\t\t\t\t\t\t\t\t\t\t\tfrom $l5v\n\t\t\t\t\t\t\t\t\t\t\t$O5v\n\t\t\t\t\t\t\t\t\t\t\torder by $O71" ,KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); break; case (lh): $O71=lq; $l72=Oq; $l4g=O4w( "select $O71, $l72\n\t\t\t\t\t\t\t\t\t\t\tfrom $l5v\n\t\t\t\t\t\t\t\t\t\t\torder by $O71" ,KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); break; default : O29( __FUNCTION__ ,Oc,"Invalid object type ($O2e). ".ld.".\n"); break; } if ($l4g === FALSE) { O29( __FUNCTION__ ,Oc,"when reading from table '$l5v'. ".ld.".\n"); } else { if ($O2e == Og || $O2e == Oh || $O2e == Oi) { for ($l2v=0; $l2v=0,"Invalid database engine '$lp'. Valid values are: '".implode("' , '",$O65)."'"); } function l66($O66,$O30,$O5a) { $l67=O67($O66,$O30); if ($l67 === FALSE) { return FALSE; } foreach ($l67 as $l60) { if (l3x(strtolower($l60["name"])) === strtolower($O5a)) { return TRUE; } } return FALSE; } function l68($O30,$O3r=FALSE) { if ($O3r) { switch ($O30) { case (O1m): $O68="registered tables"; break; case (l3): $O68="saved objects"; break; case (l1s): $O68="run queries"; break; default : break; } } $O3s=checkdirexistsorcreate(TABLESDIR,$O3r=$O3r,$l3s="The temporary directory with the application's information '".TABLESDIR."' was not found and is being recreated.\n"); if ($O3s === FALSE) { showmessage( __FUNCTION__ ,TAG_ERROR,l69().O69()); return FALSE; } $O66=dbcreatedbh(KIBELLADB); if ($O66->lu() === RC_ERROR_NOTFOUND_DB) { if ($O3r) showmessage("",l16,"Internal database storing the application's information was not found and is being recreated.\n"); $O3s=l6a($O3r=FALSE); return $O3s; } $O3s=O6a($O66,$O30); if ($O3s === RC_ERROR_NOTFOUND_TABLE) { if ($O3r) showmessage("",l16,"The internal table storing the $O68 was not found and is being recreated.\n"); $O3s=l6b($O66->getdbhandle(),$O30,FALSE); } $O66->close(); return $O3s; } function O6a($O66,$O30) { $O5h=O6b($O66,$O30,O19); $l67=dbdbhexecutesqlquery($O66->getdbhandle(),$O5h); if ($l67 === FALSE) { return FALSE; } if (count($l67) == 0) { return RC_ERROR_NOTFOUND_TABLE; } return TRUE; } function O6b($O66,$O30,$l4p) { $l6c=O6c($O66,$O30); return O4o($O66->lp ,$l4p,$l6c); } function O6c($O66,$O30) { $l6c=$O30; return $l6c; } function dbcreatedbh($lo,$Oo=O17,$l6d=array("dir" => TABLESDIR)) { switch ($Oo) { case (O17): return O6d($lo,$l3q=$l6d["dir"]); break; default : global $l6e; showmessage( __FUNCTION__ ,TAG_ERROR,"Invalid DBMS type '$Oo'. Valid values are: '".implode(" , ",$l6e)."'"); return FALSE; break; } } function O6d($l9,$l3q=TABLESDIR,$O6e=array("dbenginePDO" => O18,"attributesPDO" => array( \pdo::ATTR_PERSISTENT => true,\pdo::ATTR_STRINGIFY_FETCHES => false,\pdo::ATTR_ERRMODE => \pdo::ERRMODE_SILENT))) { assert($O6e !== NULL && count($O6e)>=1 && array_key_exists("dbenginePDO",$O6e),"Input array \$optionsPDO contains the minimum required attributes"); if ($l3q !== "") $l9= "$l3q/$l9"; $O4a=$O6e["dbenginePDO"]; $O4b=l4a($O4a); if (array_key_exists("attributesPDO",$O6e) === FALSE) { $O6e["attributesPDO"]=NULL; } $O66=new On($l9,"$O4b:$l9" ,O17,$O4a,$O6e["attributesPDO"]); return $O66; } function l6f($Op,$O30) { $O5h=O4o(O18,O19,$O30); $l67=dbdbhexecutesqlquery($Op,$O5h); if ($l67 === FALSE) { return FALSE; } if (count($l67) == 0) { return RC_ERROR_NOTFOUND_TABLE; } return TRUE; } function O6f($O66,$l6g=FALSE,$O6g="",$l6h=NULL) { if ($l6h == NULL) { $O66->close(); } else { assert(count($l6h)>=2 && array_key_exists("dbhandle",$l6h) && array_key_exists("attachname",$l6h),"Input array \$dbAttachInfo contains the neccessary keys"); $O6h="DETACH DATABASE ".$l6h["attachname"]; dbdbhexecutesqlquery($O66->getdbhandle(),$O6h,$O5="exec"); $l6h["dbhandle"]->close(); } if ($l6g === TRUE && $O6g != "" && $O6g != ":memory:") { unlink($O6g); } } function Ot(&$Op,$l6i=lt) { switch ($l6i) { case (lt): $Op=NULL; break; case (l17): $Op->close(); break; default : $Op=NULL; break; } unset ($Op); } function l6b($Op,$O30,$O3r=FALSE) { assert($Op !== NULL && $Op != FALSE,"The database handle is not null nor false"); $O3s=O6i($Op,$O30); if ($O3s === FALSE) { showmessage( __FUNCTION__ ,l16,l6j($O30)); } else { switch ($O30) { case (O1m): $O6j=O3." TEXT, ".l1n." TEXT, ".O1n." TEXT, ".l1o." TEXT, ".O1l." INT, ".O1o." TEXT, ".l1p." TEXT, ".O1p." TEXT, ".l1q." NUMBER".",imageFields TEXT".",linkTemplate TEXT".",linkTemplateLabel TEXT".",imageTemplate TEXT".",imageTemplateLabel TEXT".",".l1m." TEXT".", PRIMARY KEY(".O3.")"; $l6k="Registered tables"; break; case (l3): $O6j=O1q." TEXT, ".l4." TEXT, ".O3." TEXT, ".O1l." INT, ".l1r." TEXT, ".O1r." TEXT, ".O2." INT, ".l1m." TEXT"; $l6k="Saved objects (visualizations, dashboards, searches)"; break; case (l1s): $O6j=O1s." TEXT, ".O1t." TEXT, ".l1u." TEXT, ".O1u." INT, ".l1t." TEXT"; $l6k="Run queries"; break; default : $O6j=""; $l6k=""; break; } $O3s=dbdbhexecutesqlquery($Op,"create table ".$O30." ($O6j)" ,$O5="exec"); if ($O3s === FALSE) { showmessage( __FUNCTION__ ,TAG_ERROR,O6k($O30)); } else if ($O3r) { echo l6l($l6k); } } return $O3s; } function O6l($Op,$Os) { if ($Os != NULL) { foreach ($Os as $l6m => $l3c) { $Op->setattribute($l6m,$l3c); } } } function O6i($Op,$O30) { $O3s=l6f($Op,$O30); if ($O3s === TRUE) { dbdbhexecutesqlquery($Op,"drop table $O30" ,$O5="exec"); } return $O3s; } function dbdbhexecutesqlquery($Op,$O5h,$O5="query",$l39=NULL) { $l5=FALSE; if ($O5 == "exec") { try { if ($l39 != NULL) { $O6m=@$Op->prepare($O5h); foreach ($l39 as $l6n => $l3c) { $O6m->bindvalue($l6n,$l3c); } $l5=@$O6m->execute(); unset ($O6m); } else { $l5=@$Op->exec($O5h); } } catch ( \pdoexception $O9) { } } else { $O6m=O6n($Op,$O5h); if ($O6m) { if (get_class($O6m) == "PDOStatement") { $l5=$O6m->fetchall( \pdo::FETCH_ASSOC); } else if (get_class($O6m) == "SQLite3Result") { $l5=array(); while ($l6o=$O6m->fetcharray(SQLITE3_ASSOC)) { $l5[]=$l6o; } } } unset ($O6m); } return $l5; } function O6o($O1,$lo,$O30,$lp,$l6p,$O6p,$l6d=array("dir" => DATADIR)) { $l6q=O6q($lo,$O30,$lp,$l6d=$l6d); if ($l6q === FALSE) { return FALSE; } $l6r=""; $O6r=l3t($l6p); $l6s=l3t($O6p); $l5b=""; $O6s=0; $l6t=$l6s; for ($O3u=0; $O3u0) $l5b=","; $l6r.=$l5b.dbgeneratefieldmetadatashort($O6t,$O6v); $O6s ++; } } if ($l6s != NULL) { l6w($l6r,$l6s,$l6q,"kibella\\dbGenerateFieldMetadataShort"); } $O6w="{\"docs\":[{\"".l1f."\":\"".O12."\",\"".O1f."\":\"index-pattern\",\"".l1g."\":\"".$O1."\",\"".O1g."\":1,\"".O1j."\":true,\"".O1h."\":{\"title\":\"".$O1."\","."\"fields\":".l3x($l6r,TRUE)."}"."}]"."}"; return $O6w; } function l6x($O1,$lo,$O30,$lp,$l6p,$O6p,$l6d=array("dir" => DATADIR)) { $l6q=O6q($lo,$O30,$lp,$l6d=$l6d); if ($l6q === FALSE) { return FALSE; } $O6x="{\"".$O1."\":{"."\"mappings\":{"."\"row\":{"."\"_ttl\":{"."\"full_name\":\"_ttl\","."\"mapping\":{"."\"_ttl\":{"."\"enabled\":false,"."\"default\":-1"."}"."}"."}"; $O6r=l3t($l6p); $l6s=l3t($O6p); $l5b=","; $l6t=$l6s; for ($O3u=0; $O3u DATADIR)) { global $O4q; $O66=dbcreatedbh($lo,$Oo=$O4q[$lp],$l6d=$l6d); if ($O66->lu()<0) { return FALSE; } $O3s=O6a($O66,$O30); if ($O3s === FALSE || $O3s<0) { return FALSE; } $l6q=O67($O66,$O30); if ($l6q === FALSE) { return FALSE; } assert(count($l6q)>0,"The number of fields in the table is > 0"); $O66->close(); return $l6q; } function l6y($O6y,$l52,$O1) { l68($O6y,$O3r=FALSE); switch ($l52) { case (O1d): $l6z="where lower(".O3.") = '".strtolower($O1)."'"; break; default : $l6z="where ".l4." = '$l52' and ".O3." = '".$O1."'"; break; } $l5v=dbcreatedbh(KIBELLADB); $l67=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".O1l." from $O6y $l6z"); if ($l67 !== FALSE && count($l67)>0) { $O6z="true"; $l70=$l67[0][O1l]*1; dbdbhexecutesqlquery($l5v->getdbhandle(),"delete from $O6y $l6z" ,$O5="exec"); } else { $O6z="false"; $l70=1; } if ($l52 == O1d) { l68(l3,$O3r=FALSE); dbdbhexecutesqlquery($l5v->getdbhandle(),"delete from ".l3." where ".O1q." = '$O1'" ,$O5="exec"); } $l5v->close(); O70($l52,$O1,$l70,O1j,$O6z); } function l6v($O6t,$O6v,&$O6r,&$l6s,$l6t) { $l71=FALSE; if ($l6t !== NULL && count($l6t)>0) { $O71="/_geohash[".O1k."-".l1l."]\$/i"; if (preg_match($O71,$O6t) === 1 && array_search(preg_replace($O71,"",strtolower($O6t)),$l6t) !== FALSE) { $l72=""; $O72=""; $l71=TRUE; } } if (!$l71) { $l73=array_search(strtolower($O6t),$O6r); if ($l73 !== FALSE) { $l72="date"; $O72="date"; unset ($O6r[$l73]); } else { $O73=array_search(strtolower($O6t),$l6s); if ($O73 !== FALSE) { $l72="geo_point"; $O72="geo_point"; unset ($l6s[$O73]); } else { switch (( string) strtoupper($O6v)) { case ("DOUBLE"): case ("FLOAT"): case ("REAL"): $l72="number"; $O72="double"; break; case ("BIGINT"): case ("INT"): $l72="number"; $O72="long"; break; case ("TEXT"): case ("VARCHAR"): $l72="string"; $O72="string"; break; default : l74($O6v); $l72="string"; $O72="string"; break; } } } } return array("FieldTypeIndex" => $l72,"FieldTypeMappings" => $O72); } function dbgeneratefieldmetadatalong($O6t,$O6v) { $O35="\"".$O6t."\":{"."\"full_name\":\"".$O6t."\","."\"mapping\":{\"".$O6t."\":{"."\"type\":\"".$O6v."\","; if ($O6v === "date") { $O35.="\"analyzer\":\"_date/16\","."\"search_analyzer\":\"_date/max\","."\"format\":\"yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_second\","."\"numeric_resolution\":\"seconds\","; } $O35.="\"index\":\"not_analyzed\""."}"."}"."}"; return $O35; } function dbgeneratefieldmetadatashort($O6t,$O6v) { return "{"."\"name\":\"".$O6t."\","."\"type\":\"".$O6v."\","."\"count\":0,"."\"scripted\":false,"."\"indexed\":true,"."\"analyzed\":false,"."\"doc_values\":true"."}"; } function l6w(&$O35,&$l6s,$O74,$l75) { assert($l6s != NULL,"the input geofields array is not null"); foreach ($l6s as $O75) { $O75=strtolower($O75); $l76=FALSE; $O76=FALSE; $l77=FALSE; foreach ($O74 as $l60) { $O6t=$l60["name"]; $O77=strtolower($O6t); if ($O77 === $O75."_lat") $l76=TRUE; if ($O77 === $O75."_lon") $O76=TRUE; $l78=$O75."_geohash"; $O78=substr($O77,0,strlen($l78)); $l79=substr($O77,strlen($l78)); if ($O78 === $l78 && O1k<=$l79 && $l79<=l1l) $l77=TRUE; if ($l76 && $O76 && $l77) break; } if ($l76 && $O76 && $l77) { if ($O35 == "") $l5b=""; else $l5b=","; $O79=substr($O6t,0,strlen($O75)); $O35.=$l5b.call_user_func($l75,$O79,"geo_point"); } unset ($l6s[$O75]); } return $O35; } function O31($O30,$l30) { $l7a=strstr($l30,".",TRUE); if (empty($l7a)) { $l7a=$l30; } return strtoupper($l7a)."(".strtolower($O30).")"; } function O7a() { if (PHP_SAPI !== "cli") { $l7b=str_replace([":","."],"_",$_SERVER["REMOTE_ADDR"]); $O7b=$l7b."_"; } else { $O7b=""; } return "_$O7b".floor(microtime(1))."_".rand(0,023420); } function l7c($O1) { $O6u=FALSE; $O6w=O7c($O1); $l7d=json_decode($O6w,TRUE); if ($l7d != NULL && array_key_exists("docs",$l7d) && count($l7d["docs"])>0) { $O7d=$l7d["docs"][0][O1h]["fields"]; $l7e=json_decode($O7d,TRUE); $O6u=array(); foreach ($l7e as $O7e) { $O6u["\"".$O7e["name"]."\""]=$O7e["type"]; } } return $O6u; } function O5x($l31) { l68(l3,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l5x=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".O1q.", ".O3.", ".l1r." from ".l3." where ".l4." = '".O4."' and ".O1q." = '".$l31."'"); $l5v->close(); if ($l5x == FALSE or count($l5x) == 0) { return FALSE; } return $l5x; } function O62($l31,$O60=0) { l68(l1s,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l62=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".O1s.", ".O1t.", ".l1u.", ".O1u." from ".l1s." where ".O1t." = '".$l31."' and ".O1u." >= $O60"." order by ".O1u." desc"); $l5v->close(); if ($l62 == FALSE or count($l62) == 0) { return FALSE; } return $l62; } function l5z($l31) { l68(l1s,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l7f=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".O1u.", count(*) as n "." from ".l1s." where ".O1t." = '".$l31."'"." group by ".O1u." order by ".O1u." desc"); $l5v->close(); if ($l7f === FALSE or count($l7f) == 0) { return FALSE; } return $l7f; } function O7f($lo,$lp) { if ($lp === O18) { return basename(realpath(DATADIR."/$lo")); } else { return $lo; } } function l5t($l31) { l68(O1m,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l7g=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".l1n.", ".O1n.", ".l1o.", ".l1q." from ".O1m." where ".O3." = '$l31'"); $l5v->close(); if ($l7g == FALSE or count($l7g) == 0) { return FALSE; } $O30=$l7g[0][l1n]; $l30=$l7g[0][O1n]; $lp=l4c($l7g[0][l1o]); $O7g=strtolower(CACHEMODE) !== "none" && ($l7g[0][l1q] == 1); $l7h=array("table" => $O30,"db" => $l30,"dbengine" => $lp,"cache" => $O7g); return $l7h; } function O7c($l31) { l68(O1m,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l67=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".l1n.", ".O1n.", ".l1o.", ".O1o.", ".l1p.", ".O1p." from ".O1m." where lower(".O3.") = '".strtolower($l31)."'"); $l5v->close(); if ($l67 !== FALSE && count($l67)>0) { $O30=$l67[0][l1n]; $l30=$l67[0][O1n]; $lp=l4c($l67[0][l1o]); $l6p=$l67[0][O1o]; $O6p=$l67[0][l1p]; $O7h=$l67[0][O1p]; $O6w=O6o($l31,$l30,$O30,$lp,$l6p,$O6p); } else { $O6w=FALSE; } return $O6w; } function l7i($O1) { l68(O1m,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l67=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".l1n.", ".O1n.", ".l1o.", ".O1o.", ".l1p.", ".O1p." from ".O1m." where lower(".O3.") = '".strtolower($O1)."'"); $l5v->close(); if ($l67 !== FALSE && count($l67)>0) { $O30=$l67[0][l1n]; $l30=$l67[0][O1n]; $lp=l4c($l67[0][l1o]); $l6p=$l67[0][O1o]; $O6p=$l67[0][l1p]; $O7h=$l67[0][O1p]; $O6x=l6x($O1,$l30,$O30,$lp,$l6p,$O6p); } else { $O6x=FALSE; } return $O6x; } function O67($O66,$O30) { $O5h=O6b($O66,$O30,l1a); $l67=dbdbhexecutesqlquery($O66->getdbhandle(),$O5h); return $l67; } function O7i($l7j) { $O7j=json_decode($l7j["kibanaSavedObjectMeta"]["searchSourceJSON"],TRUE); return $O7j["index"]; } function l7k($l52,$O1,$O7k=TRUE) { l68(l3,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l7l=dbdbhexecutesqlquery($l5v->getdbhandle(),"select * from ".l3." where ".l4." = '".$l52."' and ".O3." = '".$O1."'"); $l5v->close(); if ($l7l === FALSE) { echo TAG_ERROR_INTERNAL." when reading from Objects table '".l3."'. ".O16.".\n"; } else { if (count($l7l) == 0) { $O7l="{\"".l1f."\":\"".O12."\",\"".O1f."\":\"".$l52."\",\"".l1g."\":\"".$O1."\",\"".O1j."\":false"."}"; if ($O7k) { $O7l="{\"docs\":[".$O7l."]}"; } } else { $O7l="{\"".l1f."\":\"".O12."\",\"".O1f."\":\"".$l7l[0][l4]."\",\"".l1g."\":\"".$l7l[0][O3]."\",\"".O1g."\":".$l7l[0][O1l]*1 .",\"".O1j."\":true,\"".O1h."\":".$l7l[0][l1r]; $l7m=$l7l[0][l1i]; if ($l7m) $O7l.=",\"".l1i."\":".$l7m; $O7l.="}"; if ($O7k) { $O7l="{\"docs\":[".$O7l."]}"; } } O36($O7l); } } function O7m($l31,$l7n,$O7n) { $l7h=l5t($l31); $O30=$l7h["table"]; $l30=$l7h["db"]; $lp=$l7h["dbengine"]; $O5s=$l7h["cache"]; $l7o=O7o($l31,$l7n); $l7p=O7p($l7o,$O5s); if ($l7p === FALSE) { $l7q["xaggs"]=array(); $l7q["yaggs"]=array(); $l7q["filter"]="where ".l1v." = $O7n"; $l7q["onerec"]=$l7q["filter"]; $l7q["discover"]=array("tab" => TRUE,"limit" => 1); global $O4q; O7q($O30,$l30,$O4q[$lp],$l7q,$l7o["responseFileTmp"]); l7r($l7o,$O5s); } O7r($l7o["responseFileFinal"]); } function l7s($O1) { $O6w=O7c($O1); if ($O6w !== FALSE) { $l55=$O6w; } else { $O30=l1y; $l30=l1x; $O1=O31($O30,$l30); $l55="{\"docs\":[{\"".l1f."\":\"".O12."\",\"".O1f."\":\"index-pattern\",\"".l1g."\":\"".$O1."\",\"".O1g."\":1,\"".O1j."\":true,\"".O1h."\":{\"title\":\"".$O1."\","."\"fields\":\"[{}]\""."}"."}]"."}"; } O36($l55); } function O7s($O1) { $O6x=l7i($O1); if ($O6x !== FALSE) { $l55=$O6x; } else { $O30=l1y; $l30=l1x; $O1=O31($O30,$l30); $O6t="_dummy"; $O6v="string"; $l55="{\"".$O1."\":{"."\"mappings\":{"."\"row\":{"."\"_ttl\":{"."\"full_name\":\"_ttl\","."\"mapping\":{"."\"_ttl\":{"."\"enabled\":false,"."\"default\":-1"."}"."}"."},\"".$O6t."\":{"."\"full_name\":\"".$O6t."\","."\"mapping\":{\"".$O6t."\":{"."\"type\":\"".$O6v."\","."\"index\":\"not_analyzed\""."}"."}"."}"."}"."}"."}"."}"; } O36($l55); } function O6n($Op,$O5h) { $O6m=FALSE; if ($Op !== FALSE) { $O6m=@$Op->query($O5h); } return $O6m; } function l7t($O6m) { $l5=FALSE; if ($O6m) { if (get_class($O6m) == "PDOStatement") { $l5=$O6m->fetch( \pdo::FETCH_ASSOC); } else if (get_class($O6m) == "SQLite3Result") { $l5=$O6m->fetcharray(SQLITE3_ASSOC); } } return $l5; } function O7t($l31,$O5h,$l63) { $O3s=l68(l1s,$O3r=FALSE); $l5v=dbcreatedbh(KIBELLADB); $l67=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".O1s.", ".O1u." from ".l1s." where ".O1s." = '".$l63."'"." and ".O1t." = '$l31'"); $l7u=strftime("%Y/%m/%d %H:%M:%S",time()); if (count($l67) == 0) { $O7u="true"; $O63=1; $l5=dbdbhexecutesqlquery($l5v->getdbhandle(),"insert into ".l1s." values(\t'$l63',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l31',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O5h',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$O63,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l7u'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)" ,$O5="exec"); } else { $O63=$l67[0][O1u]+1; $l5=dbdbhexecutesqlquery($l5v->getdbhandle(),"update ".l1s." set ".O1s." = '$l63', ".O1t." = '$l31', ".l1u." = '$O5h', ".O1u." = $O63, ".l1t." = '$l7u'"." where ".O1s." = '$l63'" ,$O5="exec"); } $l5v->close(); } function dbregistertable($l7v) { $l7=new user(); if (PHP_SAPI !== "cli" && !$l7->isloggedin()) return FALSE; $O30=$l7v["table"]; $l30=$l7v["db"]; $O4b=$l7v["dbengine"]; $l6p=$l7v["datefields"]; $O6p=$l7v["geofields"]; $O7h=$l7v["linkfields"]; $O7v=$l7v["enablecache"]; if ($l30 == "") { showmessage("","note",l7w("Database")); } if ($O30 == "") { showmessage("","note",l7w("Table")); } if ($l30 == "" || $O30 == "") { return FALSE; } $O4a=l4c($O4b); global $O4q; $O66=dbcreatedbh($l30,$Oo=$O4q[$O4a],$l6d=array("dir" => DATADIR)); if ($O66->lu()<0) { $O1=""; $O3s=$O66->lu(); } else { $O3s=O6a($O66,$O30); if ($O3s === FALSE || $O3s<0) { $O1=""; } else { $O3s=FALSE; $l30=O7f($l30,$O4a); $O1=O31($O30,$l30); $O3s=l68(O1m,$O3r=TRUE); if ($O3s === FALSE) { return array("id" => $O1,"rc" => FALSE); } $O3s=FALSE; $l7u=strftime("%Y/%m/%d %H:%M:%S",time()); $l5v=dbcreatedbh(KIBELLADB); $l67=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".O1l." from ".O1m." where lower(".O3.") = '".strtolower($O1)."'"); if ($l67 === FALSE) { $O3s=FALSE; } else if (count($l67) == 0) { $l70=1; $l5=dbdbhexecutesqlquery($l5v->getdbhandle(),"insert into ".O1m." (".O3.",".l1n.",".O1n.",".l1o.",".O1l.",".O1o.",".l1p.",".O1p.",".l1q.",".l1m.")"." values(\t'$O1',\n\t\t\t\t\t\t\t\t\t\t'$O30',\n\t\t\t\t\t\t\t\t\t\t'$l30',\n\t\t\t\t\t\t\t\t\t\t'$O4b',\n\t\t\t\t\t\t\t\t\t\t$l70,\n\t\t\t\t\t\t\t\t\t\t'$l6p',\n\t\t\t\t\t\t\t\t\t\t'$O6p',\n\t\t\t\t\t\t\t\t\t\t'$O7h',\n\t\t\t\t\t\t\t\t\t\t'$O7v',\n\t\t\t\t\t\t\t\t\t\t'$l7u'\n\t\t\t\t\t\t\t\t\t)" ,$O5="exec"); if ($l5 !== FALSE) $O3s=RC_NOTE_TABLE_ADDED; } else { $l70=$l67[0][O1l]+1; $l5=dbdbhexecutesqlquery($l5v->getdbhandle(),"update ".O1m." set ".l1n." = '$O30', ".O1n." = '$l30', ".l1o." = '$O4b', ".O1l." = $l70, ".O1o." = '$l6p', ".l1p." = '$O6p', ".O1p." = '$O7h', ".l1q." = $O7v, ".l1m." = '$l7u'"." where lower(".O3.") = '".strtolower($O1)."'",$O5="exec"); if ($l5 !== FALSE) $O3s=RC_NOTE_TABLE_UPDATED; } $l5v->close(); } } return array("id" => $O1,"rc" => $O3s); } function l6a($O3r=FALSE) { $O3s=TRUE; $l5v=dbcreatedbh(KIBELLADB); if ($l5v === FALSE) { return FALSE; } $O7w=array(O1m,l3,l1s); $O3s=TRUE; foreach ($O7w as $O30) { $O3s=$O3s && l6b($l5v->getdbhandle(),$O30,$O3r=$O3r); } $l5v->close(); return $O3s; } function l7x($l52,$O7x) { $l7=new user(); if (PHP_SAPI !== "cli" && !$l7->isloggedin()) return FALSE; $l7y=json_decode($O7x,TRUE); switch ($l52) { case (l1e): case (O1e): $l31=O7i($l7y); $O5h=O7y(O1w); break; case (O4): $l31=O7y(l1w); $O5h=""; break; default : $l31=""; $O5h=""; break; } $O3s=l68(l3,$O3r=FALSE); if (ADDTABLEPREFIX == 1) { $l7z= "$l31: "; $O7z=strpos($O7x,$l7z); if ($O7z === strlen("{\"title\":\"")) { $O7x=substr_replace($O7x,"",$O7z,strlen($l7z)); } } else { $l7z=""; } $l80="\"title\":\"([^\"]+)\""; $O7x=preg_replace( "/$l80/" ,"\"title\":\"".$l7z."\$1\"",$O7x); preg_match( "/$l80/" ,$O7x,$l4h); if (count($l4h)>1) { $O80=$l4h[1]; $l81=O81($O80); } else { $l81=""; } $l5v=dbcreatedbh(KIBELLADB); $l67=dbdbhexecutesqlquery($l5v->getdbhandle(),"select ".O3.", ".O1l." from ".l3." where ".l4." = '$l52' and ".O3." = '".$l81."'"); $l7u=strftime("%Y/%m/%d %H:%M:%S",time()); if (count($l67) == 0) { $O7u="true"; $l70=1; $l5=dbdbhexecutesqlquery($l5v->getdbhandle(),"insert into ".l3." values(\t'$l31',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l52',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$l81',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$l70,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O7x',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'$O5h', ".O1v.", "."'$l7u'".")",$O5="exec"); } else { $O7u="false"; $l70=$l67[0][O1l]+1; $l5=dbdbhexecutesqlquery($l5v->getdbhandle(),"update ".l3." set ".O1q." = '$l31', ".l4." = '$l52', ".O3." = '$l81', ".O1l." = $l70, ".l1r." = '$O7x', ".O1r." = '$O5h', ".l1m." = '$l7u'"." where ".O3." = '$l81'" ,$O5="exec"); } $l5v->close(); O70($l52,$l81,$l70,l1j,$O7u); } function l82($O6y,$l52,$O5m) { l68($O6y,$O3r=FALSE); switch ($l52) { case (O4): case (l1e): case (O1e): $O82=l4; $l83=O3; $O83=l1r; $l6z= "where $O82 = '$l52'"; if (LISTONLYTABLEOBJECTS === 1) { $O30=O7y(l1w); if ($O30 !== "") { $l6z.=" and ".O1q." = '$O30'"; } } if ($O5m != "*") { $O5m=str_replace(" ","-",$O5m); $l6z.= " and lower($l83) GLOB lower('*".$O5m."')"; } $l5v=dbcreatedbh(KIBELLADB); $l5f=dbdbhexecutesqlquery($l5v->getdbhandle(),"select $O82, $l83, $O83\n\t\t\t\t\t\t\t\t\t\t\t\tfrom $O6y\n\t\t\t\t\t\t\t\t\t\t\t\t$l6z\n\t\t\t\t\t\t\t\t\t\t\t\torder by $l83"); $l5v->close(); break; case (O1d): $l83=O3; $O83=O1l; $l5v=dbcreatedbh(KIBELLADB); $l5f=dbdbhexecutesqlquery($l5v->getdbhandle(),"select $l83, $O83\n\t\t\t\t\t\t\t\t\t\t\t\tfrom $O6y\n\t\t\t\t\t\t\t\t\t\t\t\torder by $l83"); $l5v->close(); break; default : showmessage( __FUNCTION__ ,TAG_ERROR_INTERNAL,"Invalid object type ($l52). ".O16.".\n"); break; } if ($l5f === FALSE) { showmessage( __FUNCTION__ ,TAG_ERROR_INTERNAL,"when reading from table '$O6y'. ".O16.".\n"); } else { if ($l52 == O4 || $l52 == l1e || $l52 == O1e) { for ($O3u=0; $O3u$O77 successfully deleted.

    "; } function O2a($l22,$O21,$O28,$O26) { $l78=$O26 == 1 ? "ENABLED": "DISABLED"; return "Table '$l22' in database '$O21' successfully registered with ID '$O28'.\nCache is $l78.\n"; } function l2b($l22,$O21,$O28,$O26) { $l78=$O26 == 1 ? "ENABLED": "DISABLED"; return "The registration information for table '$l22' in database '$O21' with ID '$O28' has been successfully updated.\nCache is $l78.\n"; } function O29($O78,$O2e,$l79) { global $O79; if ($O78 !== "") $O78= "($O78) "; if ($O79) { fwrite($O79,strftime("%Y/%m/%d:%H:%M:%S",time())." ".strtoupper($O2e).": $O78 $l79"); } else { echo "
    ".strtoupper($O2e).": $O78 $l79
    "; } } function O4a($O2h) { global $O79; if ($O79) { $O2g=print_r($O2h,TRUE); fwrite($O79,$O2g); } else { print_r($O2h); } } \ No newline at end of file +namespace kibella; function O84($O4r,$l85,$O85,$l3a,$l86=0) { if (DEBUG && O86($l85,$O85) && array_search($O4r,$O85[$l85]) == FALSE) { if ($l86 == 0) { echo "WARNING: (".strtoupper($l3a)."): Invalid keyword '$O4r' for context '$l85'!\n"; } if ($l86 == 1) { echo "WARNING: (".strtoupper($l3a)."): Invalid keyword '$O4r' for context '$l85'! Previous context is maintained.\n"; } else if ($l86 == 2) { echo "WARNING: (".strtoupper($l3a)."): Invalid keyword '$O4r' for context '$l85'! The process may generate unexpected results.\n"; } } } function l87($l85,$l3a) { if (DEBUG) { echo "WARNING: (".strtoupper($l3a)."): Invalid context '$l85'!\n"; } } function l74($l52) { if (DEBUG) { echo "WARNING: Invalid metadata type ('$l52') for the currently used database!\n"; echo " Field type set to STRING.\n"; } } function O87($l52) { if (DEBUG) { echo "WARNING: Invalid aggregation type ('$l52'). No action will be taken on the aggregation type.\n"; } } function l88($l3q) { return "Could not create directory '$l3q'.\n"; } function l7w($O88) { return "Please specify a value for the '$O88' field.\n"; } function l89($lp) { global $O65; return "Invalid database engine ('$lp').\nValid ones are: ".implode("' , '",$O65)."'\n"; } function l69() { return "An error occurred when attempting to create the temporary directory '".TABLESDIR."' with the application's information.\n"; } function O6k($O30) { return "Could not create table '$O30' in the application's database.\n"; } function l6j($O30) { return "Could not drop table '$O30' from the application's database.\n"; } function O69() { return "Check user permissions and try again.\n"; } function l6l($O89) { return "

    $O89 successfully deleted.

    "; } function showmessage($l8a,$l52,$O8a) { global $l8b; if ($l8a !== "") $l8a= "($l8a) "; if ($l8b) { fwrite($l8b,strftime("%Y/%m/%d:%H:%M:%S",time())." ".strtoupper($l52).": $l8a $O8a"); } else { echo "
    ".strtoupper($l52).": $l8a $O8a
    "; } } function l59($l38) { global $l8b; if ($l8b) { $l37=print_r($l38,TRUE); fwrite($l8b,$l37); } else { print_r($l38); } } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionsparse.php b/JSON_SQL_Bridge/functionsparse.php index 443758b..103538f 100644 --- a/JSON_SQL_Bridge/functionsparse.php +++ b/JSON_SQL_Bridge/functionsparse.php @@ -4,8 +4,8 @@ Copyright 2016 Frank Vanden berghen All Right reserved. -JSON_SQL_Bridge is not a free software. The JSON_SQL_Bridge software is NOT licensed under the "Apache License". -If you are interested in distributing, reselling, modifying, contibuting or in general creating +JSON_SQL_Bridge is not a free software. The JSON_SQL_Bridge software is NOT licensed under the "Apache License". +If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; function l7a($l6j,$l22,$O21) { $O2h=json_decode($l6j,TRUE); $O22=l23($l22,$O21); $l5r=O2d($O22); $O27=l2h($O2h,"kibella\\parseEsJsonQueryElement",array("fieldtypes" => $l5r)); return $O27; } function parseesjsonqueryelement($O2l,$l3o,$l2j,$O2j,$l2k,$O2i) { static $O7a; static $l7b; static $O7b; static $l7c; static $O7c; static $l7d; static $O7d; static $l7e; static $O7e; static $l7f; static $O7f; static $l7g; static $O7g; static $l7h; static $O7h; static $l7i; static $O7i; static $l7j; static $O7j; static $l7k; static $O7k; static $l7l; static $O7l; static $l7m; static $O7m; static $l7n; static $O7n; static $l7o; static $O7o; static $l7p; static $O7p; static $l7q; static $O7q; static $l7r; static $O7r; static $l7s; static $O7s; static $l7t; static $O7t; static $l7u; static $O7u; static $l7v; global $O7v; global $l7w; if ($l2j == 0 && $O2j == 0) { $O7a=array(); $l7b=array(); $O7b=array(); $l7c=array("level" => 0,"context" => array(O1n),"idx" => array(-1),"size" => array($l2k)); $l7d=array(); $O7d=FALSE; $l7e=FALSE; $O7e=FALSE; $l7f=-1; $O7f=NULL; $l7g=NULL; $O7g=NULL; $l7h=NULL; $O7h=NULL; $l7i=NULL; $O7i=DISCOVERSIZE; $l7j=NULL; $O7j=NULL; $l7k=NULL; $l7l=NULL; $O7k=NULL; $O7l=NULL; $l7m=NULL; $O7m=NULL; $l7n=""; $O7n=l15; $l7o=""; $O7o=NULL; $l7p=NULL; $O7p=NULL; $l7q=""; $O7q=""; $l7r=NULL; $O7r=""; $l7s=NULL; $O7s=NULL; $l7t=NULL; $O7t=NULL; $l7u=NULL; $O7u=NULL; $l7v=""; if (array_key_exists("fieldtypes",$O2i)) $O7a=$O2i["fieldtypes"]; } if ($O2j>$l7c["level"]) { return $O7c; } $l7c["idx"][$l7c["level"]]++; if (is_array($O2l) && count($O2l)>0) { $l7c["level"]++; $O3o=$l7c["context"][$l7c["level"]-1]; $l3o=O3n($l3o,$O3o); if (array_search(NULL,$O7v[$O3o]) !== FALSE || array_search(( string) $l3o,$O7v[$O3o]) !== FALSE || $O3o == l1a && array_search(( string) $l3o,$O7v[l1a][0]) !== FALSE) { if ($l3o === O19) { $l7f ++; } else if ($l3o === l1i) { $O7d=TRUE; } switch ($O3o) { case (O19): $l7m=$l3o; $l7c["context"][]=l1a; $O7s="(CASE"; break; case (l1a): if ($l2l=array_search($l3o,$O7v[l1a][0]) !== FALSE) { $l7u=$l7w[$l3o]; $l7c["context"][]=l1p; } else if ($l2l=array_search($l3o,array_slice($O7v[l1a],1)) !== FALSE) { $l7c["context"][]=$l3o; } else l73($l3o,$O3o,$O7v,"COMPOUND",2); break; case (O1b): if ($l3o === O1j) $l7o=""; else if ($l3o === l1k) $l7o=" not "; $l7c["context"][]=$l3o; break; case (l1f): if (strpos($l3o,"(CASE WHEN ") === 0) { $O7k=$l3o; } else { $O7k=O2x($l3o); } $l7c["context"][]=O1f; break; case (l1g): $l7l=O2x($l3o); $l7c["context"][]=O1g; break; case (l1d): $O7w=O2x($l3o); $l7x=O36($l3o); $O7j=O2x($l7x."_".l1u); $l7k=O2x($l7x."_".O1t); $l7c["context"][]=l1e; break; case (l1e): switch (( string) $l3o) { case (O1d): case (O1e): $l7c["context"][]=$l3o; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; default : if (gettype($l3o) == "integer") { $O7x=end($l7c["size"]); reset($l7c["size"]); if ($O7x>1) { $l2j=$l3o; if ($l2j == $O7x-1) { $O7q=")"; } if ($l2j == 0) { $l7q="("; } else { $O7n=" and "; $l7q=""; if ($l2j<$O7x-1) $O7q=""; } } $l7c["context"][]=$O3o; } else $l7c["context"][]=$l3o; break; } } else { l73($l3o,$O3o,$O7v,"COMPOUND",1); $l7c["context"][]=$O3o; } if (DEBUG) { echo "CONTEXT history\n"; print_r($l7c["context"]); } $l7c["idx"][]=-1; $l7c["size"][]=count($O2l); $O3o=$l7c["context"][$l7c["level"]]; if (DEBUG) echo "Keyword: $l3o => Entering context ".$O3o."... (field aggregation level is $l7f)\n"; } else { $O2j=$l7c["level"]; $O37=$l7c["idx"][$O2j]; $O7x=$l7c["size"][$O2j]; $O3o=$l7c["context"][$O2j]; $l3o=O3n($l3o,$O3o); switch ($O3o) { case (O1i): case (l1j): $l7b[$l7f]["ofield"]=$l7m; if ($O3o == O1i) $l7b[$l7f]["type"]="h"; else $l7b[$l7f]["type"]="hd"; $l7b[$l7f]["order"]=O2x($l7m); $l7b[$l7f]["limit"]=""; switch (( string) $l3o) { case (O1r): $O7l=O2x($O2l); $l7b[$l7f]["ifieldname"]=$O7l; $l7b[$l7f]["ifield"]=$O7l; break; case (O1v): $l7b[$l7f]["interval"]=$O2l; break; case (O1x): break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1h): $l7b[$l7f]["ofield"]=$l7m; $l7b[$l7f]["type"]="g"; $l7b[$l7f]["order"]=O2x($l7m); $l7b[$l7f]["limit"]=""; switch (( string) $l3o) { case (O1r): $O7l=$O2l; $l7b[$l7f]["ifieldname"]=O2x(O36($O7l)); break; case (O1y): $l7b[$l7f]["ifield"]=O2x(O36($O7l)."_geohash".$O2l); break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1d): switch (( string) $l3o) { case (O1t): $l7h=$O2l; break; case (l1u): $O7f=$O2l; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1e): switch (( string) $l3o) { case (O1t): $O7g=$O2l; break; case (l1u): $l7g=$O2l; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1f): switch (( string) $l3o) { case (l1y): $O7n=$O2l; break; case (l1z): $O7u=$O2l; break; case (l21): if ($O2l === "phrase") $O7r="'"; else $O7r=""; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (l1l): if ($l3o === l1q) { $O7p=$l7w[l17]."(*)"." ".$O2l; } else { $O7p=O2x($l3o)." ".$O2l; } $l7b[$l7f]["order"]=$O7p; break; case (l1m): switch (( string) $l3o) { case (O1p): break; case (l1z): if ($O2l === "*") $l7r=1; else $l7r=$O2l; $l7d[]=trim($l7r); break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1a): case (l1b): $l7b[$l7f]["ofield"]=$l7m; if ($O3o == O1a) { $l7b[$l7f]["type"]="r"; } else { $l7b[$l7f]["type"]="rd"; } $l7b[$l7f]["order"]=O2x($l7m); $l7b[$l7f]["limit"]=""; switch (( string) $l3o) { case (O1r): $O7l=O2x($O2l); $l7b[$l7f]["ifieldname"]=$O7l; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1g): switch (( string) $l3o) { case (O1s): $O7m=$O2l; break; case (O1u): case (l1v): $l7i=$O2l; if ($l3o === O1w) $O7o=">"; else $O7o=">="; break; case (O1w): case (l1x): $O7h=$O2l; if ($l3o === O1w) $l7p="<"; else $l7p="<="; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (l1n): switch (( string) $l3o) { case (l1t): if ($l7b[$l7f]["type"] == "rd") { $O2l=O3c($O2l); } $l7s=$O2l; $l7t=$O2l."-"; break; case (O20): if ($l7b[$l7f]["type"] == "rd") { $O2l=O3c($O2l); } $O7t=$O2l; $l7t.=$O2l; $O7s.="\n\tWHEN ".$l7s." <= ".$O7l." AND ".$O7l." < ".$O7t." THEN "."'".$l7t."'"; $l7b[$l7f]["ranges"][]=$l7t; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1n): if ($l3o === l20) { $O7i=$O2l; $l7n=l3r($O7i); } else l73($l3o,$O3o,$O7v,"LEAF"); break; case (l1p): switch (( string) $l3o) { case (O1r): $l7j=O2x($O2l); break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; case (O1o): $l7b[$l7f]["ofield"]=$l7m; $l7b[$l7f]["type"]="t"; switch (( string) $l3o) { case (O1r): $O7l=O2x($O2l); $l7b[$l7f]["ifieldname"]=$O7l; $l7b[$l7f]["ifield"]=$O7l; break; case (l20): $l7n=l3r($O2l); $l7b[$l7f]["limit"]=$l7n; break; default : l73($l3o,$O3o,$O7v,"LEAF"); break; } break; default : O75($O3o,"LEAF"); break; } while ($O37 == $O7x-1 && $O2j>=0) { if (DEBUG) echo "\tRemoving data from level: ".$O2j."\n"; $O2j --; $l7c["level"]=$O2j; foreach (array_slice($l7c,1) as $l7y => $O7y) { array_pop($l7c[$l7y]); } assert($O2j>=-1,"\$level >= -1"); if ($O2j>=0) { switch ($O3o) { case (l1a): $l7j=NULL; $l7m=NULL; $l7u=NULL; break; case (O1a): case (l1b): assert(!is_null($O7s) && !is_null($l7m),"C_AGGS_RANGE: Range grouping ($O7s), FieldOut ($l7m) are not null"); $O7s.="\nEND)"; $l7b[$l7f]["ifield"]=$O7s; break; case (O1d): case (O1e): case (O1f): case (O1g): case (l1m): if ($O3o == O1d && !is_null($O7j) && !is_null($l7k) && !is_null($O7f) && !is_null($l7h)) { if (!$O7e) { $l7z="("; $O7z=""; } else { $l7z=""; $O7z=")"; } $l7r=$l7z.$l7h." <= ".$l7k." and ".$O7j." <= ".$O7f.$O7z; $l7e=TRUE; } else if ($O3o == O1e && !is_null($O7j) && !is_null($l7k) && !is_null($l7g) && !is_null($O7g)) { if (!$l7e) { $l7z="("; $O7z=""; } else { $l7z=""; $O7z=")"; } $l7r=$l7z.$l7g." <= ".$O7j." and ".$l7k." <= ".$O7g.$O7z; $O7e=TRUE; } else if ($O3o == O1f && !is_null($O7k) && !is_null($O7u)) { $l7r=$O7k." = ".$O7r.O2z($O7u).$O7r; } else if ($O3o == O1g && !is_null($l7i) && !is_null($O7h)) { if (array_key_exists($l7l,$O7a) && $O7a[$l7l] === "date") { $l7l=$l7l."*1000"; } $l7r= "$l7l $O7o $l7i and $l7l $l7p $O7h"; } $l80=$l7q.$l7o; if ($l7v == "") $l7v="WHERE"; else { if (($l7e+$O7e)<2) $l80=$O7n.$l7q.$l7o; else $l80=$O7n.$l7q; } if (!is_null($l7r)) { $l7v.="\n".$l80."(".$l7r.")".$O7q; } $l7d[]=trim($l7o.$l7r); $l7q=""; $O7q=""; $O7n=l15; $O7o=NULL; $l7p=NULL; if ($l7e && $O7e) { $O7j=NULL; $l7k=NULL; $l7e=FALSE; $O7e=FALSE; } $O7f=NULL; $l7g=NULL; $O7g=NULL; $l7h=NULL; $O7h=NULL; $l7i=NULL; $O7k=NULL; $l7l=NULL; $O7u=NULL; $l7r=NULL; break; case (l1l): assert(!is_null($O7p),"C_ORDER: Order statistic ($O7p) is not null"); break; case (l1p): assert(!is_null($l7j) && !is_null($l7m) && !is_null($l7u),"C_STATISTIC: Field ($l7j), FieldOut ($l7m), Statistic ($l7u) are not null"); $O7z=str_repeat(")",substr_count($l7u,"(")); $O7b[$l7m]=$l7u."(".$l7j.")".$O7z; $l7j=NULL; break; case (O1o): assert(!is_null($O7l) && !is_null($l7m),"C_TERMS: Grouping field ($O7l), FieldOut ($l7m) are not null"); break; default : break; } $O37=$l7c["idx"][$O2j]; $O7x=$l7c["size"][$O2j]; if ($O3o == O19) { $l7f --; } $O3o=$l7c["context"][$O2j]; } else { if (DEBUG) echo "REACHED LAST KEY-VALUE PAIR\n"; if ($O7d === TRUE) { $l7n=l3r(DISCOVERSIZE); } $O7c=array("xaggs" => $l7b,"yaggs" => $O7b,"filterArray" => $l7d,"filter" => $l7v,"discover" => array("tab" => $O7d,"limit" => $l7n)); return $O7c; } } } } function O80($l81) { $O81=array(); foreach ($l81["xaggs"] as $l49) { $O81[]=l2m($l49); } $O81[]=l2m($l81["yaggs"]); $O81[]=$l81["filterArray"]; sort($O81[count($O81)-1]); $O81[]=l2m($l81["discover"]); return $O81; } function O6m($l22,$O21,$l82,$l3) { $O48=$l82["xaggs"]; $O82=$l82["yaggs"]; $l83=$l82["filter"]; $O83=$l82["discover"]; $l84=fopen($l3,"wt"); if (!$l84) { O29( __FUNCTION__ ,lc,"Error opening or creating file $l3\n. An empty response will be returned.\n"); return ""; } $O84="sqlite"; $l85=dbdbhcreate($O21,$O2r=DATADIR,$l4x=$O84,$O5g=array("dbtype" => "sqlite","attributes" => array( \pdo::ATTR_PERSISTENT => TRUE,\pdo::ATTR_STRINGIFY_FETCHES => FALSE)),$l5h=array("flags" => SQLITE3_OPEN_READONLY)); $O85= "SELECT count(*) from $l22"."\n".$l83; $l86=dbdbhexecutesqlquery($l85,$O85); if ($l86 === FALSE) { $O86=0; } else { $O86=$l86[0]["count(*)"]; } if (DEBUG) { echo "\nTotal Hits:\n"; print_r($l86); } l87($l84,$O86); if ($O83["tab"] === TRUE && count($O48) == 0 && count($O82) == 0) { O2f("[",$O2g=$l84); $O22=l23($l22,$O21); $l5r=O2d($O22); $O87="SELECT rowid as _id"; $l5o=array(); foreach ($l5r as $l2e => $O2e) { if ($O2e === "date") { $O87.=", ".$l2e." as ".$l2e; $l5o[]=str_replace("\"","",$l2e); } else if ($O2e === "geo_point") { if (l5c($l2e,$l22,$O21,$O2r,$O24="sqlite") === TRUE) $O87.=", ".$l2e; } else { $O87.=", ".$l2e; } } $l5k=$O87."\nFROM ".$l22."\n".$l83."\nORDER BY _id"."\n".$O83["limit"]; $l5l=l6p($l85,$l5k); if ($l5l !== FALSE) { $l88=""; while ($O51=O6p($l5l)) { $O28=$O51["_id"]; foreach ($l5o as $O88) { $l89=date_create(strftime("%Y-%m-%d %H:%M:%S",$O51[$O88])); $O3b=(array) $l89; $l3c=timezone_offset_get(new \datetimezone($l89->timezone),$l89); $O51[$O88]=($O51[$O88]-$l3c)*01750; } $O89=($O86-$O28)/$O86; $l8a=$l88."{"."\"".lj."\":\"".$O22."\","."\"".Oj."\":\"row\","."\"".lk."\":\"".$O28."\","."\"".ll."\":".$O89.","."\"".lm."\":".json_encode($O51)."}"; O2f($l8a,$O2g=$l84); $l88=","; } unset ($O51); } unset ($l5l); O2f("]}",$O2g=$l84); } else { O2f("[]}",$O2g=$l84); if (count($O48)>0 || count($O82)>0) { O2f(",\"aggregations\":{",$O2g=$l84); if (count($O48) == 0) { $l88=""; $O8a=""; foreach ($O82 as $l8b => $O8b) { $O8a.= "\n\t$l88".$O8b." as ".O2x($l8b); $l88=","; } $l5k="SELECT".$O8a."\nFROM ".$l22."\n".$l83; $l8c=dbdbhexecutesqlquery($l85,$l5k,$l4x="query"); if ($l8c !== FALSE) { O8c($l84,$l8c[0],0); } } else { $l8d=":memory:"; $O8d=dbdbhcreate($l8d,$O2r="",$l4x=$O84); $l8e="attach database '".$l8d."' as ".Op; dbdbhexecutesqlquery($l85,$l8e,$l4x="exec"); $O2e=$O48[0]["type"]; $O8e="T".l68(); $l8f=$O8e."_T0"; $O8f=l8g($O48[0],$O82,Op.".$l8f" ,$l22,$l83,$l85); if (DEBUG) { echo "Output filename: $l3\n"; echo "\nCreating temporary table $l8f in the temporary database located at ".$l8d."...\n"; echo $O8f; } $l5k=$O8f; $O8g=dbdbhexecutesqlquery($l85,$l5k,$l4x="exec"); if ($O8g !== FALSE) { if (count($O48)>1) { if (DEBUG) echo "\nRecurring to the lower grouping level...\n"; l8h($l84,$l22,$l85,$l83,$l8f,1,$O48,array(),$O82,$O8e,""); } else { $l5k="select * from ".Op.".$l8f"; if (DEBUG) echo "\nSQLQUERY: $l5k\n"; $O8h=array("sqlquery" => $l5k,"db" => $l85,"dbtype" => "sqlite","dir" => TABLESDIR); $l8i=O8i($l84,$O2e,0,$O48,$O8h); if ($l8i>0) l8j($l84,$O2e); } } $O8j=array("dbh" => $O8d,"attachname" => Op); O5d($l85,$l4x=$O84,$l5e=TRUE,$O5e=$l8d,$l5f=$O8j); } O2f("}",$O2g=$l84); } } O2f("}",$O2g=$l84); O5d($l85,$l4x=$O84,$l5e=FALSE); fclose($l84); } function l8h($O3w,$l8k,$l85,$l83,$O8k,$O2j,$O48,$l8l,$O82,$O8l,$l8m) { assert($O2j>0,"Grouping level is larger than 0"); assert(count($O48)>$O2j,"The xaggs array has more than \$level elements (count(\$xaggs)=".count($O48).", level=$O2j)"); assert(count($l8l) == $O2j-1,"The aGroupValuesAndTypes array has \$level-1 elements (count(\$aGroupValuesAndTypes)=".count($l8l).", level-1=$O2j-1)"); $O8m=$O48[$O2j-1]["ofield"]; $l8n=$O48[$O2j-1]["type"]; $l5k="select * from ".Op.".$O8k"; $l5l=l6p($l85,$l5k); $O8n=TEMPDIR."/$O8k"; $l8o=fopen($O8n,"wt"); if (!$l8o) { O29( __FUNCTION__ ,lc,"Cannot open temporary file $O8n for writing. Check directory permissions.\n"); } while ($O51=O6p($l5l)) { $O8o=array_keys($O51); $l8p=implode("|",$O51); fwrite($l8o,$l8p."\n"); } fclose($l8o); unset ($O51); unset ($l5l); $l8o=fopen($O8n,"r"); if (!$l8o) { user_error( "Cannot open temporary file $O8n for reading" ,E_USER_ERROR); } $O8p=-1; $l88=""; while (($l8p=fgets($l8o)) !== FALSE) { $O8p ++; if (DEBUG) echo "Reading row $O8p...\n"; $l8p=preg_replace("/[\n\r]\$/","",$l8p); $l8q=explode("|",$l8p); $O51=array_combine($O8o,$l8q); $O8q=$O51[$O8m]; if ($O8p == 0) { l8r($O3w,$l8n,$O2j-1,$O8m); $l8m.= "_$O8p"; $l8l[]=array("value" => $O8q,"type" => $l8n); } else { $l8m=substr_replace($l8m,$O8p,strrpos($l8m,"_")+1); $l8l[$O2j-1]=array("value" => $O8q,"type" => $l8n); } O8r($O3w,$l8n,$O51,$l88); $l8s=""; for ($O8s=0; $O8s<$O2j; $O8s ++) { $l8t=$O48[$O8s]["ifield_parsed"]; $O8t=$l8l[$O8s]["value"]; $l8u=$l8l[$O8s]["type"]; if ($l8u == "t" || $l8u == "r" || $l8u == "rd") $O8u="'".O2z($O8t)."'"; else $O8u=$O8t; $l8s.=" and ".$l8t." = ".$O8u; } if (strstr($l83,"WHERE") === FALSE) { $l8s=preg_replace("/[ ]+and[ ]+/","WHERE ",$l8s,1); } $l8v=$l83.$l8s; $l8f=$O8l."_S$l8m"; if (DEBUG) echo "Output table name: $l8f\n"; $O8f=l8g($O48[$O2j],$O82,Op.".$l8f" ,$l8k,$l8v,$l85); if (DEBUG) { echo "\n".str_repeat("\t",$O2j)."SQLQUERY Level $O2j:\n"; echo "\nCreating temporary table $l8f in temporary database...\n"; echo $O8f; } $l5k=$O8f; dbdbhexecutesqlquery($l85,$l5k,$l4x="exec"); if ($O2j $l5k,"db" => $l85,"dbtype" => "sqlite","dir" => TABLESDIR); $l8i=O8i($O3w,$O2e,$O2j,$O48,$O8h); if ($l8i>0) { if (DEBUG) echo "Closing Lowest level $O2j...\n"; l8j($O3w,$O2e); } } if (DEBUG) echo "Closing Group value $O8p at level (".$O2j-1 .")...\n"; O2f("}",$O2g=$O3w); $l88=","; } fclose($l8o); if (!unlink($O8n)) { user_error( "Could not delete temporary file $O8n" ,E_USER_WARNING); } if ($O8p>=0) l8j($O3w,$l8n); } function O8v($l8w,$O8w="_count") { return str_ireplace("count(*)",$O8w,$l8w); } function l8g(&$O48,$O82,$l8f,$O8k,$l83,$l5b) { global $O4c; $l40=$O48["ofield"]; $l8x=O2x($l40); $O2e=$O48["type"]; $l44=$O48["ifield"]; $l8w=$O48["order"]; $O8x=$O48["limit"]; switch ($O2e) { case ("r"): case ("rd"): assert(count($O48["ranges"])>0,"There is at least one RANGE value"); $l8y=Op."._ranges"; $l5k= "CREATE TABLE $l8y (_range TEXT, _range_from NUMBER);"; foreach ($O48["ranges"] as $O8y) { $l8z=O3h($O8y); $O8z=$l8z[0]; if ($O8z === "") $O8z="NULL"; $l5k.= "\nINSERT INTO $l8y values ('$O8y', $O8z);"; } if (DEBUG) { echo "SQL for _RANGES:\n"; echo $l5k."\n"; } O5j($l5b,$l8y); dbdbhexecutesqlquery($l5b,$l5k,$l4x="exec"); if (DEBUG) { echo "RESULT _ranges:\n"; $O5k=dbdbhexecutesqlquery($l5b,"select * from $l8y"); print_r($O5k); } $l8w="_range_from"; $l90=$l44; $O48["ifield_parsed"]=$l90; break; case ("h"): case ("hd"): $O44=$O48["interval"]; $l5k= "SELECT min($l44) as _min, max($l44) as _max FROM $O8k $l83"; $O90=dbdbhexecutesqlquery($l5b,$l5k,$l4x="query"); if ($O90 === FALSE || count($O90) == 0) { $l90=""; } else { if ($O90[0]["_min"] === "" || $O90[0]["_max"] === "") { $l90="(CASE WHEN 1 THEN null END)"; } else { if ($O2e == "h") { assert($O44>0,"The histogram interval value (bin size) is positive"); $l91=floor($O90[0]["_min"]/$O44)*$O44; $O91=$O90[0]["_max"]; $l92=floor(($O91-$l91)/$O44)+1; if ($l92 == 0) $O92=1; $l93="(CASE"; $O93=$l91; for ($l2v=0; $l2v<$l92; $l2v ++) { $l94=$O93+$O44; $l93.= "\n\tWHEN $O93 <= $l44 AND $l44 < $l94 THEN $O93"; $O93=$l94; } } else { $l4e=date_create(gmstrftime("%Y-%m-%d %H:%M:%S",$O90[0]["_min"]),new \datetimezone("UTC")); $O4e=(array) $l4e; $l3f=max(1,round(substr($O44,0,strlen($O44)-1)))*1; $O3f=substr($O44,strlen($O44)-1); assert($l3f>0,"The step is positive (value given: $l3f)\n"); assert(array_key_exists($O3f,$O4c) !== FALSE,"The period definition is one of the 7 valid one (value given: $O3f)\n"); $O94=$O90[0]["_max"]-$O90[0]["_min"]; if ($O3f === "s" && $O94>01274) { $l3f=1; $O3f="m"; } if ($O3f === "m" && $O94/074>01274) { $l3f=1; $O3f="h"; } $O48["interval"]=$l3f.$O3f; O3g($l4e,$O3f); $l91=date_timestamp_get($l4e); $O91=$O90[0]["_max"]; $l93="(CASE"; $O93=$l91; while ($O93<=$O91) { date_modify($l4e,"$l3f ".$O4c[$O3f]); $O4e=(array) $l4e; $l94=date_timestamp_get($l4e); $l95=$O93; $l93.= "\n\tWHEN $O93 <= $l44 AND $l44 < $l94 THEN $l95"; $O93=$l94; } } $l90=$l93."\nEND)"; } $O48["ifield_parsed"]=$l90; } break; default : $l90=$l44; $O48["ifield_parsed"]=$l90; break; } $O95=$l90." as ".$l8x; $O8a=""; $l96=""; foreach ($O82 as $l8b => $O8b) { $O8a.="\n\t,".$O8b." as ".O2x($l8b); $l96.="\n\t,".O2x($l8b); } $O87="SELECT"."\n\t".$O95."\n\t,count(*) as _count".$O8a."\nFROM ".$O8k."\n".$l83."\nGROUP BY ".$l90; $l5k= "CREATE TABLE $l8f as"; if ($O2e == "r" or $O2e == "rd") { $l5k.="\nSELECT"."\n\ta._range as ".$l8x."\n\t,IFNULL(b._count,0) as _count".$l96."\nFROM $l8y a"."\nLEFT JOIN ("."\n\t".$O87."\n\t\t) b"."\nON a._range = b.".$l8x; } else { $l5k.="\n".$O87; } assert($l8w != NULL && $l8w != "","Order variable is not null nor empty"); $l8w=O8v($l8w); $l5k.="\nORDER BY ".$l8w."\n".$O8x; return $l5k; } function l87($O3w,$O86) { assert($O86 !== NULL,"The number of total hits is not null"); $O96="{"; $l97="\"took\":0,"."\"timed_out\":false,"."\"_shards\":{"."\"total\":5,"."\"successful\":5,"."\"failed\":0"."},"; $O97="\"hits\":{"."\"total\":".$O86.","."\"max_score\":0,"."\"hits\":"; O2f($O96.$l97.$O97,$O2g=$O3w); } function l8r($O3w,$O2e,$O2j,$l40) { $l98=""; $l88=","; if ($O2j == 0) $l88=""; $l2g=$l88.O2x($l40).":{"; switch ($O2e) { case ("t"): $l2g.="\"doc_count_error_upper_bound\":0,"; $l2g.="\"sum_other_doc_count\":0,"; $l98="["; break; case ("g"): case ("h"): case ("hd"): $l98="["; break; case ("r"): case ("rd"): $l98="{"; break; default : break; } $l2g.="\"".l1c."\":".$l98; O2f($l2g,$O2g=$O3w); } function O8r($O3w,$O2e,$O98,$l88) { l99($O3w,$O2e,$O98,$l88); O8c($O3w,$O98); } function O8i($O3w,$O2e,$O2j,$O48,$O8h) { $O21=$O8h["db"]; $l5k=$O8h["sqlquery"]; $l5l=l6p($O21,$l5k); $O51=O6p($l5l); $l88=""; $l8i=0; if ($O51) { l8r($O3w,$O2e,$O2j,$O48[$O2j]["ofield"]); do { $l8i ++; l99($O3w,$O2e,$O51,$l88); O8c($O3w,$O51); O2f("}",$O2g=$O3w); $O51=O6p($l5l); $l88=","; } while ($O51); } unset ($O51); unset ($l5l); return $l8i; } function l99($O3w,$O2e,$O98,$l88="") { $l2n=array_keys($O98); $O2l=$O98[$l2n[0]]; $l2g=$l88; switch ($O2e) { case ("t"): case ("g"): case ("h"): case ("hd"): $l2g.="{"; if (l3n($O2l) === FALSE) $O99=O2x($O2l); else { if ($O2e == "hd") { if (PHP_SAPI !== "cli") { $O2l=O3a($O2l); } $O99=$O2l*01750; } else $O99=$O2l; } $l2g.="\"key\":".$O99.","; break; case ("r"): case ("rd"): $l2g.=O2x($O2l).":{"; $l4f=O3h($O2l); $l3k=$l4f[0]; $O3k=$l4f[1]; if ($O2e == "rd") { if (PHP_SAPI !== "cli") { $l3k=O3a($l3k); $O3k=O3a($O3k); } $l3k=$l3k*01750; $O3k=$O3k*01750; } $l2g.="\"from\":".$l3k.","; $l2g.="\"from_as_string\":".O2x($l3k).","; $l2g.="\"to\":".$O3k.","; $l2g.="\"to_as_string\":".O2x($O3k).","; break; default : break; } $l2g.="\"doc_count\":".$O98["_count"]; O2f($l2g,$O2g=$O3w); } function O8c($O3w,$O98,$l9a=2) { $l2n=array_keys($O98); $O9a=count($O98); if ($l9a == 0) { $l88=""; } else { $l88=","; } $l2g=""; for ($l2v=$l9a; $l2v<$O9a; $l2v ++) { $l2e=$l2n[$l2v]; $O2l=$O98[$l2n[$l2v]]; $l2g.=$l88.O2x($l2e).":{"; if ($O2l === NULL || $O2l === "") $l2g.="\"value\":null"; else $l2g.="\"value\":".$O2l; $l2g.="}"; $l88=","; } O2f($l2g,$O2g=$O3w); } function l8j($O3w,$O2e) { $l9b=""; switch ($O2e) { case ("t"): case ("g"): case ("h"): case ("hd"): $l9b="]"; break; case ("r"): case ("rd"): $l9b="}"; break; default : break; } $l2g=$l9b."}"; O2f($l2g,$O2g=$O3w); } \ No newline at end of file +namespace kibella; use l33\O33\O8b\l8c; function O8c($l7n,$O30,$l30) { $l38=json_decode($l7n,TRUE); $l31=O31($O30,$l30); $O6u=l7c($l31); $l67=O37($l38,"kibella\\parseEsJsonQueryElement",array("fieldtypes" => $O6u)); return $l67; } function parseesjsonqueryelement($l3c,$O4r,$O39,$l3a,$O3a,$l39) { static $l8d; static $O8d; static $l8e; static $O8e; static $l8f; static $O8f; static $l8g; static $O8g; static $l8h; static $O8h; static $l8i; static $O8i; static $l8j; static $O8j; static $l8k; static $O8k; static $l8l; static $O8l; static $l8m; static $O8m; static $l8n; static $O8n; static $l8o; static $O8o; static $l8p; static $O8p; static $l8q; static $O8q; static $l8r; static $O8r; static $l8s; static $O8s; static $l8t; static $O8t; static $l8u; static $O8u; static $l8v; static $O8v; static $l8w; static $O8w; static $l8x; global $O8x; global $l8y; if ($O39 == 0 && $l3a == 0) { $l8d=array(); $O8d=array(); $l8e=array(); $O8e=array("level" => 0,"context" => array(O2h),"idx" => array(-1),"size" => array($O3a)); $O8f=array(); $l8g=FALSE; $O8g=FALSE; $l8h=FALSE; $O8h=-1; $l8i=NULL; $O8i=NULL; $l8j=NULL; $O8j=NULL; $l8k=NULL; $O8k=NULL; $l8l=DISCOVERSIZE; $O8l=NULL; $l8m=NULL; $O8m=NULL; $O8n=NULL; $l8n=NULL; $l8o=NULL; $O8o=NULL; $l8p=NULL; $O8p=l1z; $l8q=""; $O8q=NULL; $l8r=NULL; $O8r=NULL; $l8s=""; $O8s=""; $l8t=NULL; $O8t=""; $l8u=NULL; $O8u=NULL; $l8v=NULL; $O8v=NULL; $l8w=NULL; $O8w=NULL; $l8x=""; if (array_key_exists("fieldtypes",$l39)) $l8d=$l39["fieldtypes"]; } if ($l3a>$O8e["level"]) { return $l8f; } $O8e["idx"][$O8e["level"]]++; if (is_array($l3c) && count($l3c)>0) { $O8e["level"]++; $l4s=$O8e["context"][$O8e["level"]-1]; $O4r=l4r($O4r,$l4s); if (array_search(NULL,$O8x[$l4s]) !== FALSE || array_search(( string) $O4r,$O8x[$l4s]) !== FALSE || $l4s == l24 && array_search(( string) $O4r,$O8x[l24][0]) !== FALSE) { if ($O4r === O23) { $O8h ++; } else if ($O4r === l2c) { $l8g=TRUE; } switch ($l4s) { case (O23): $O8o=$O4r; $O8e["context"][]=l24; $O8u="(CASE"; break; case (l24): if ($O3b=array_search($O4r,$O8x[l24][0]) !== FALSE) { $l8w=$l8y[$O4r]; $O8e["context"][]=l2j; } else if ($O3b=array_search($O4r,array_slice($O8x[l24],1)) !== FALSE) { $O8e["context"][]=$O4r; } else O84($O4r,$l4s,$O8x,"COMPOUND",2); break; case (O25): if ($O4r === O2d) $l8q=""; else if ($O4r === l2e) $l8q=" not "; $O8e["context"][]=$O4r; break; case (l29): if (strpos($O4r,"(CASE WHEN ") === 0) { $l8n=$O4r; } else { $l8n=l3x($O4r); } $O8e["context"][]=O29; break; case (l2a): $O8n=l3x($O4r); $O8e["context"][]=O2a; break; case (l27): $O8y=l3x($O4r); $l8z=l46($O4r); $l8m=l3x($l8z."_".l2o); $O8m=l3x($l8z."_".O2n); $O8e["context"][]=l28; break; case (l28): switch (( string) $O4r) { case (O27): case (O28): $O8e["context"][]=$O4r; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; default : if (gettype($O4r) == "integer") { $O8z=end($O8e["size"]); reset($O8e["size"]); if ($O8z>1) { $O39=$O4r; if ($O39 == $O8z-1) { $O8s=")"; } if ($O39 == 0) { $l8s="("; } else { $O8p=" and "; $l8s=""; if ($O39<$O8z-1) $O8s=""; } } $O8e["context"][]=$l4s; } else $O8e["context"][]=$O4r; break; } } else { O84($O4r,$l4s,$O8x,"COMPOUND",1); $O8e["context"][]=$l4s; } if (DEBUG) { echo "CONTEXT history\n"; print_r($O8e["context"]); } $O8e["idx"][]=-1; $O8e["size"][]=count($l3c); $l4s=$O8e["context"][$O8e["level"]]; if (DEBUG) echo "Keyword: $O4r => Entering context ".$l4s."... (field aggregation level is $O8h)\n"; } else { $l3a=$O8e["level"]; $l47=$O8e["idx"][$l3a]; $O8z=$O8e["size"][$l3a]; $l4s=$O8e["context"][$l3a]; $O4r=l4r($O4r,$l4s); switch ($l4s) { case (O2c): case (l2d): $O8d[$O8h]["ofield"]=$O8o; if ($l4s == O2c) $O8d[$O8h]["type"]="h"; else $O8d[$O8h]["type"]="hd"; $O8d[$O8h]["order"]=l3x($O8o); $O8d[$O8h]["limit"]=0; switch (( string) $O4r) { case (O2l): $l8o=l3x($l3c); $O8d[$O8h]["ifieldname"]=$l8o; $O8d[$O8h]["ifield"]=$l8o; break; case (O2p): $O8d[$O8h]["interval"]=$l3c; break; case (O2r): break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O2b): $O8d[$O8h]["ofield"]=$O8o; $O8d[$O8h]["type"]="g"; $O8d[$O8h]["order"]=l3x($O8o); $O8d[$O8h]["limit"]=0; switch (( string) $O4r) { case (O2l): $l8o=$l3c; $O8d[$O8h]["ifieldname"]=l3x(l46($l8o)); break; case (O2s): $O8d[$O8h]["ifield"]=l3x(l46($l8o)."_geohash".$l3c); break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O27): switch (( string) $O4r) { case (O2n): $O8j=$l3c; break; case (l2o): $l8i=$l3c; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O28): switch (( string) $O4r) { case (O2n): $l8j=$l3c; break; case (l2o): $O8i=$l3c; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O29): switch (( string) $O4r) { case (l2s): $O8p=$l3c; break; case (l2t): $O8w=l40($l3c); break; case (l2v): if ($l3c === "phrase") $O8t="'"; else $O8t=""; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (l2f): if ($O4r === l2k) { $O8r=$l8y[l21]."(*)"." ".$l3c; } else { $O8r=l3x($O4r)." ".$l3c; } assert(!is_null($O8d[$O8h]["ifield"]),"The aggregation field name is NOT null"); $O8d[$O8h]["order"]=$O8r.", ".$O8d[$O8h]["ifield"]; break; case (l2g): switch (( string) $O4r) { case (O2j): break; case (l2t): if ($l3c === "*") $l8t="1 = 1"; else $l8t=$l3c; $O8f[]=trim($l8t); break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O24): case (l25): $O8d[$O8h]["ofield"]=$O8o; if ($l4s == O24) { $O8d[$O8h]["type"]="r"; } else { $O8d[$O8h]["type"]="rd"; } $O8d[$O8h]["order"]=l3x($O8o); $O8d[$O8h]["limit"]=0; switch (( string) $O4r) { case (O2l): $l8o=l3x($l3c); $O8d[$O8h]["ifieldname"]=$l8o; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O2a): switch (( string) $O4r) { case (O2m): $l8p=$l3c; break; case (O2o): case (l2p): $O8k=$l3c; if ($O4r === O2q) $O8q=">"; else $O8q=">="; break; case (O2q): case (l2r): $l8k=$l3c; if ($O4r === O2q) $l8r="<"; else $l8r="<="; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (l2h): switch (( string) $O4r) { case (l2n): if ($O8d[$O8h]["type"] == "rd") { $l3c=l4f($l3c); } $l8u=$l3c; $l8v=$l3c."-"; break; case (O2u): if ($O8d[$O8h]["type"] == "rd") { $l3c=l4f($l3c); } $O8v=$l3c; $l8v.=$l3c; $O8u.=O1c."WHEN ".$l8u." <= ".$l8o." AND ".$l8o." < ".$O8v." THEN "."'".$l8v."'"; $O8d[$O8h]["ranges"][]=$l8v; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O2h): if ($O4r === l2u) { $l8l=$l3c; } else O84($O4r,$l4s,$O8x,"LEAF"); break; case (l2j): switch (( string) $O4r) { case (O2l): $O8l=l3x($l3c); break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; case (O2i): $O8d[$O8h]["ofield"]=$O8o; $O8d[$O8h]["type"]="t"; switch (( string) $O4r) { case (O2l): $l8o=l3x($l3c); $O8d[$O8h]["ifieldname"]=$l8o; $O8d[$O8h]["ifield"]=$l8o; break; case (l2u): $l8l=$l3c; $O8d[$O8h]["limit"]=$l8l; break; default : O84($O4r,$l4s,$O8x,"LEAF"); break; } break; default : l87($l4s,"LEAF"); break; } while ($l47 == $O8z-1 && $l3a>=0) { if (DEBUG) echo "\tRemoving data from level: ".$l3a."\n"; $l3a --; $O8e["level"]=$l3a; foreach (array_slice($O8e,1) as $l90 => $O90) { array_pop($O8e[$l90]); } assert($l3a>=-1,"\$level >= -1"); if ($l3a>=0) { switch ($l4s) { case (l24): $O8l=NULL; $O8o=NULL; $l8w=NULL; break; case (O24): case (l25): assert(!is_null($O8u) && !is_null($O8o),"C_AGGS_RANGE: Range grouping ($O8u), FieldOut ($O8o) are not null"); $O8u.="\nEND)"; $O8d[$O8h]["ifield"]=$O8u; break; case (O27): case (O28): case (O29): case (O2a): case (l2g): if ($l4s == O27 && !is_null($l8m) && !is_null($O8m) && !is_null($l8i) && !is_null($O8j)) { if (!$l8h) { $l91="("; $O91=""; } else { $l91=""; $O91=")"; } $l8t=$l91.$O8j." <= ".$O8m." and ".$l8m." <= ".$l8i.$O91; $O8g=TRUE; } else if ($l4s == O28 && !is_null($l8m) && !is_null($O8m) && !is_null($O8i) && !is_null($l8j)) { if (!$O8g) { $l91="("; $O91=""; } else { $l91=""; $O91=")"; } $l8t=$l91.$O8i." <= ".$l8m." and ".$O8m." <= ".$l8j.$O91; $l8h=TRUE; } else if ($l4s == O29 && !is_null($l8n) && !is_null($O8w)) { $l8t=$l8n." = ".$O8t.l3z($O8w).$O8t; } else if ($l4s == O2a && !is_null($O8k) && !is_null($l8k)) { if (array_key_exists($O8n,$l8d) && $l8d[$O8n] === "date") { $O8n=$O8n."*1000"; } $l8t= "$O8n $O8q $O8k and $O8n $l8r $l8k"; } $l92=$l8s.$l8q; if ($l8x == "") $l8x="WHERE"; else { if (($O8g+$l8h)<2) $l92=$O8p.$l8s.$l8q; else $l92=$O8p.$l8s; } if (!is_null($l8t)) { $l8x.="\n".$l92."(".$l8t.")".$O8s; } $O8f[]=trim($l8q.$l8t); $l8s=""; $O8s=""; $O8p=l1z; $O8q=NULL; $l8r=NULL; if ($O8g && $l8h) { $l8m=NULL; $O8m=NULL; $O8g=FALSE; $l8h=FALSE; } $l8i=NULL; $O8i=NULL; $l8j=NULL; $O8j=NULL; $l8k=NULL; $O8k=NULL; $l8n=NULL; $O8n=NULL; $O8w=NULL; $l8t=NULL; break; case (l2f): assert(!is_null($O8r),"C_ORDER: Order statistic ($O8r) is not null"); break; case (l2j): assert(!is_null($O8l) && !is_null($O8o) && !is_null($l8w),"C_STATISTIC: Field ($O8l), FieldOut ($O8o), Statistic ($l8w) are not null"); $O91=str_repeat(")",substr_count($l8w,"(")); $l8e[$O8o]=$l8w."(".$O8l.")".$O91; $O8l=NULL; break; case (O2i): assert(!is_null($l8o) && !is_null($O8o),"C_TERMS: Grouping field ($l8o), FieldOut ($O8o) are not null"); break; default : break; } $l47=$O8e["idx"][$l3a]; $O8z=$O8e["size"][$l3a]; if ($l4s == O23) { $O8h --; } $l4s=$O8e["context"][$l3a]; } else { if (DEBUG) echo "REACHED LAST KEY-VALUE PAIR\n"; if ($l8g === TRUE) { $l8l=DISCOVERSIZE; } $l8f=array("xaggs" => $O8d,"yaggs" => $l8e,"filterArray" => $O8f,"filter" => $l8x,"discover" => array("tab" => $l8g,"limit" => $l8l)); return $l8f; } } } } function O92($l93) { $O93=array(); foreach ($l93["xaggs"] as $O57) { $O93[]=O3c($O57); } $O93[]=O3c($l93["yaggs"]); $O93[]=$l93["filterArray"]; sort($O93[count($O93)-1]); $O93[]=O3c($l93["discover"]); return $O93; } function O7q($O30,$l30,$Oo,$l94,$ly) { $l31=O31($O30,$l30); $l57=$l94["xaggs"]; $O94=$l94["yaggs"]; $l95=$l94["filter"]; $O95=array_key_exists("onerec",$l94); $l96=$l94["discover"]; $O96=$l94["discover"]["limit"]; $l97=fopen($ly,"wt"); if (!$l97) { showmessage( __FUNCTION__ ,TAG_ERROR,"Error opening or creating file $ly\n. An empty response will be returned.\n"); return ""; } $O97=dbcreatedbh($l30,$Oo=$Oo,$l6d=array("dir" => DATADIR)); $l98=O98($O97,$O30,$l95,$O95); if (l99($l94,$l57,$O94)) { O99($O97,$O30,$l31,$l95,$l98,$O96,$l37=$l97); } else if (count($l57)+count($O94)>0) { l9a($O97,$O30,$l95,$l57,$O94,$l98,$l37=$l97); } else { $O9a=l9b($O97->getdbhandle(),$O30,$l95); O9b($O9a,$l37=$l97); O36("[]}",$l37=$l97); } O36("}",$l37=$l97); O6f($O97,$l6g=FALSE); fclose($l97); } function l9b($Op,$O30,$l95) { $l9c= "SELECT count(*) as _count from $O30"."\n".$l95; $O9c=dbdbhexecutesqlquery($Op,$l9c); if ($O9c === FALSE) { $O9a=0; } else { $O9a=$O9c[0]["_count"]; } if (DEBUG) { echo "\nTotal Hits:\n"; print_r($O9c); } return $O9a; } function l99($l9d,$l57,$O94) { assert(array_key_exists("discover",$l9d) && array_key_exists("limit",$l9d["discover"]) && array_key_exists("filter",$l9d),"The required keys exist in the input array \$aParseResult"); return $l9d["discover"]["tab"] === TRUE && count($l57) == 0 && count($O94) == 0; } function O99($O66,$O30,$l31,$l95,$O9d,$O96,$l37=NULL) { global $l9e; $l6c=O6c($O66,$O30); $O9e="SELECT ".O4u($O96,$O66->lp ,$l4v=0)." * FROM ("."SELECT ".$l9e[O1b][$O66->lp ]." as ".l1v; $O6u=l7c($l31); $O6r=array(); foreach ($O6u as $O5a => $l52) { if ($l52 === "date") { $O9e.=",".$O5a." as ".$O5a; $O6r[]=str_replace("\"","",$O5a); } else if ($l52 === "geo_point") { if (l66($O66,$l6c,$O5a) === TRUE) $O9e.=",".$O5a; } else { $O9e.=",".$O5a; } } $l9f=$O9d."(".$O9e."\nFROM ".$l6c.") innerQueryWithRowNumber"."\n".$l95."\n".O4u($O96,$O66->lp ,$l4v=1).") mainQuery"; $O6m=O6n($O66->getdbhandle(),$l9f); if ($O6m === FALSE) { O9b(0,$l37=$l37); O36("[",$l37=$l37); } else { $O9f=""; $l9g=0; while ($l60=l7t($O6m)) { $l9g ++; if ($l9g == 1) { $O9a=$l60["_count"]; O9b($O9a,$l37=$l37); O36("[",$l37=$l37); } foreach ($O6r as $O9g) { $l9h=date_create(strftime("%Y-%m-%d %H:%M:%S",$l60[$O9g])); $l4e=(array) $l9h; $O4e=timezone_offset_get(new \datetimezone($l9h->timezone),$l9h); $l60[$O9g]=($l60[$O9g]-$O4e)*01750; } $O9h=(PHP_INT_MAX-$l9g)/PHP_INT_MAX; $l9i=$O9f."{"."\"".l1f."\":\"".$l31."\","."\"".O1f."\":\"row\","."\"".l1g."\":\"".$l9g."\","."\"".l1h."\":".$O9h.","."\"".O1h."\":".json_encode($l60)."}"; O36($l9i,$l37=$l37); $O9f=","; } unset ($l60); } unset ($O6m); O36("]}",$l37=$l37); } function l9a($O66,$O30,$l95,$l57,$O94,$O9d,$l37=NULL) { if (count($l57) == 0) { O9i($O66,$O30,$l95,$O94,$O9d,$l37=$l37); } else { $O9a=l9b($O66->getdbhandle(),$O30,$l95); O9b($O9a,$l37=$l37); O36("[]}",$l37=$l37); O36(",\"aggregations\":{",$l37=$l37); l9j($O66,$O30,$l95,$l57,$O94,$l37=$l37); } O36("}",$l37=$l37); } function O98($O66,$O30,$l95,$O95) { if ($O95) { $O9j="WITH cnt as (SELECT ".O4u(1,$O66->lp ,$l4v=0)." 1 as _count FROM $O30 ".O4u(1,$O66->lp ,$l4v=1).")"."\nSELECT * FROM cnt"."\nCROSS JOIN "; } else { $O9j="WITH cnt as (SELECT count(*) as _count FROM ".$O30." ".$l95.")"."\nSELECT * FROM cnt"."\nCROSS JOIN "; } return $O9j; } function O9i($O66,$O30,$l95,$O94,$O9d,$l37=NULL) { $l9k=O9k($O94); $O9e=l9l($O30,$l95,"","",$l9k); $l9f=$O9d."(SELECT ".$O9e.") mainQuery"; $O9l=dbdbhexecutesqlquery($O66->getdbhandle(),$l9f,$O5="query"); if ($O9l === FALSE) { O9b(0,$l37=$l37); O36("[]",$l37=$l37); } else { assert(count($O9l) == 1,"There is exactly one row returned by the only-Y-axis-aggregations query"); $O9a=$O9l[0]["_count"]; O9b($O9a,$l37=$l37); O36("[]}",$l37=$l37); O36(",\"aggregations\":{",$l37=$l37); l9m($O9l[0],$O9m=1,$O9f="",$l37=$l37); } } function l9j($O66,$O30,$l95,$l57,$O94,$l37=NULL) { $l9k=O9k($O94); l9n($O66,$O30,$l95,$l57,0,$O94,$l9k,$l37=$l37); } function l9n($O66,$O30,$l95,$l57,$l3a,$O94,$l9k,$l37=NULL) { assert($l3a>=0,"Grouping level is non-negative"); assert(count($l57)>$l3a,"The xaggs array has more than \$level elements (count(\$xaggs)=".count($l57).", level=$l3a)"); $l9f=O9n($O66,$O30,$l95,$l57,$l3a,$O94); $O6m=O6n($O66->getdbhandle(),$l9f); $l60=l7t($O6m); $O9f=""; $l9o=0; if ($l60) { O9o($l57[$l3a]["type"],$l3a,$l57[$l3a]["ofield"],$l37=$l37); do { l9p($l57[$l3a]["type"],$l60,$O9f,$l37=$l37); $O9p=($l3a == count($l57)-1); if (!$O9p) { $l9q=$l60[$l57[$l3a]["ofield"]]; $O9q=l9r($l95,$l57,$l3a,$l9q); $O9r=dbcreatedbh($O66->lo ,$Oo=$O66->Oo ,$l6d=array("dir" => "")); l9n($O9r,$O30,$O9q,$l57,$l3a+1,$O94,$l9k,$l37=$l37); unset ($O9r); } O36("}",$l37=$l37); $l60=l7t($O6m); $O9f=","; } while ($l60); l9s($l57[$l3a]["type"],$l37=$l37); } unset ($l60); unset ($O6m); } function l9r($l95,$l57,$l3a,$l9q) { $O9s=$l57[$l3a]["ifield_parsed"]; $l9t=$l57[$l3a]["type"]; if ($l9t == "t" || $l9t == "r" || $l9t == "rd") $O9t="'".l3z($l9q)."'"; else $O9t=$l9q; if (preg_match("/^\\s*WHERE/",$l95)>0) { $O4r=" AND "; } else { $O4r="WHERE "; } return $l95.$O4r.$O9s." = ".$O9t; } function O9n($O66,$O30,$l95,&$l57,$l3a,$O94) { $l57[$l3a]=l9u($O66,$O30,$l95,$l57[$l3a],$O94); $O9u=l3x($l57[$l3a]["ofield"]); $l9v=O9v($O66,$O30,$l95,$l57,$l3a,$O94); $l9k=O9k($O94); $O9e=l9l($O30,$l95,$l9v["field"],$l9v["statement"],$l9k); $l9f=""; if ($l57[$l3a]["type"] == "r" or $l57[$l3a]["type"] == "rd") { $l9f.="\nSELECT".$l57[$l3a]["ranges_clause"]." r"."\nLEFT JOIN (".O1c."SELECT ".$O9e.O1c."\t) d"."\nON r._range = d.".$O9u; } else { $l9f.="\nSELECT ".O4u($l57[$l3a]["limit"],$O66->lp ,$l4v=0).$O9e; } assert($l57[$l3a]["order"] != NULL && $l57[$l3a]["order"] != "","Order variable is not null nor empty"); $l9w=O9w($l57[$l3a]["order"]); $l9f.="\nORDER BY ".$l9w."\n".O4u($l57[$l3a]["limit"],$O66->lp ,$l4v=1); return $l9f; } function l9u($O66,$O30,$l95,$l9x,$O94) { switch ($l9x["type"]) { case ("r"): case ("rd"): $O9x=l9y($O66,$l9x["ofield"],$l9x["ranges"],$O94); $l9x["order"]=$O9x["order"]; $l9x["ifield_parsed"]=$l9x["ifield"]; $l9x["ranges_clause"]=$O9x["sqlclause"]; break; case ("h"): case ("hd"): $O9x=O9y($O66,$O30,$l95,$l9x["ifield"],$l9x["type"],$l9x["interval"]); $l9x["ifield_parsed"]=$O9x["sqlclause"]; $l9x["interval"]=$O9x["interval"]; break; default : $l9x["ifield_parsed"]=$l9x["ifield"]; break; } return $l9x; } function l9y($O66,$l4y,$l9z,$O94) { assert(count($l9z)>0,"There is at least one RANGE value"); global $l9e; $O9u=l3x($l4y); $l9k=O9k($O94,$O9z=TRUE); $la0=O1c."_range as ".$O9u.O1c.",".$l9e[l1c][$O66->lp ]."(_count,0) as _count".$l9k."\nFROM ("; $Oa0=""; foreach ($l9z as $O4k) { $la1=l4k($O4k); $Oa1=$la1[0]; if ($Oa1 === "") $Oa1="NULL"; $la0.=$Oa0."\nSELECT '$O4k' as _range, $Oa1 as _range_from"; $Oa0="\nUNION "; } $la0.="\n)"; if (DEBUG) { echo "SQL for _RANGES:\n"; echo $la0."\n"; } return array("sqlclause" => $la0,"order" => "_range_from"); } function O9y($O66,$O30,$l95,$O5a,$la2,$l53) { global $O5b; assert($la2 === "h" || $la2 === "hd","The histogram aggregation type is either 'h' or 'hd'"); $Oa2= function (&$la3,&$l5d,$Oa3,$la4) { $Oa4=$la4-$Oa3; if ($l5d === "s" && $Oa4>l1k) { $la3=1; $l5d="m"; } if ($l5d === "m" && $Oa4/074>l1k) { $la3=1; $l5d="h"; } $l53=$la3.$l5d; return $l53; }; $l9f= "SELECT min($O5a) as _min, max($O5a) as _max FROM $O30 $l95"; $la5=dbdbhexecutesqlquery($O66->getdbhandle(),$l9f,$O5="query"); if ($la5 === FALSE || count($la5) == 0) { $la0=""; } else { $Oa5=$la5[0]["_min"]; $la6=$la5[0]["_max"]; if ($Oa5 === "" || $la6 === "") { $la0="(CASE WHEN 1 THEN null END)"; } else { if ($la2 == "h") { assert($l53>0,"The histogram interval value (bin size) is positive"); $Oa6=floor($Oa5/$l53)*$l53; $la7=$la6; $Oa7=floor(($la7-$Oa6)/$l53)+1; if ($Oa7 == 0) $la8=1; $Oa8="(CASE"; $la9=$Oa6; for ($O3u=0; $O3u<$Oa7; $O3u ++) { $Oa9=$la9+$l53; $Oa8.=O1c."WHEN $la9 <= $O5a AND $O5a < $Oa9 THEN $la9"; $la9=$Oa9; } } else { $l5d=date_create(gmstrftime("%Y-%m-%d %H:%M:%S",$Oa5),new \datetimezone("UTC")); $O5d=(array) $l5d; $la3=max(1,round(substr($l53,0,strlen($l53)-1)))*1; $l4i=substr($l53,strlen($l53)-1); assert($la3>0,"The date step is positive (value given: $la3)\n"); assert(array_key_exists($l4i,$O5b) !== FALSE,"The period definition is one of the 7 valid one (value given: $l4i)\n"); $l53=$Oa2($la3,$l4i,$Oa5,$la6); l4j($l5d,$l4i); $Oa6=date_timestamp_get($l5d); $la7=$la6; $Oa8="(CASE"; $la9=$Oa6; while ($la9<=$la7) { date_modify($l5d,"$la3 ".$O5b[$l4i]); $O5d=(array) $l5d; $Oa9=date_timestamp_get($l5d); $laa=$la9; $Oa8.=O1c."WHEN $la9 <= $O5a AND $O5a < $Oa9 THEN $laa"; $la9=$Oa9; } } $la0=$Oa8."\nEND)"; } } return array("sqlclause" => $la0,"interval" => $l53); } function O9v($O66,$O30,$l95,&$l57,$l3a,$O94) { $l57[$l3a]=l9u($O66,$O30,$l95,$l57[$l3a],$O94); $O9u=l3x($l57[$l3a]["ofield"]); $Oaa=$l57[$l3a]["ifield_parsed"]." as ".$O9u; $lab="GROUP BY ".$l57[$l3a]["ifield_parsed"]; return array("field" => $Oaa,"statement" => $lab); } function O9k($O94,$O9z=FALSE) { $l9k=""; if ($O9z === TRUE) { foreach (array_keys($O94) as $Oab) { $l9k.=O1c.",".l3x($Oab); } } else { foreach ($O94 as $Oab => $lac) { $l9k.=O1c.",".$lac." as ".l3x($Oab); } } return $l9k; } function l9l($O30,$l95,$Oac,$lab,$lad) { $Oad=""; if (strlen($Oac)>0) { $Oad=","; } $O9e=O1c.$Oac.O1c.$Oad."count(*) as _count".$lad."\nFROM ".$O30."\n".$l95."\n".$lab; return $O9e; } function O9w($l9w,$lae="_count") { return str_ireplace("count(*)",$lae,$l9w); } function O9b($O9a,$l37=NULL) { assert($O9a !== NULL,"The number of total hits is not null"); $Oae="{"; $laf="\"took\":0,"."\"timed_out\":false,"."\"_shards\":{"."\"total\":5,"."\"successful\":5,"."\"failed\":0"."},"; $Oaf="\"hits\":{"."\"total\":".$O9a.","."\"max_score\":0,"."\"hits\":"; O36($Oae.$laf.$Oaf,$l37=$l37); } function O9o($l52,$l3a,$l4y,$l37=NULL) { $lag=""; $O9f=","; if ($l3a == 0) $O9f=""; $O35=$O9f.l3x($l4y).":{"; switch ($l52) { case ("t"): $O35.="\"doc_count_error_upper_bound\":0,"; $O35.="\"sum_other_doc_count\":0,"; $lag="["; break; case ("g"): case ("h"): case ("hd"): $lag="["; break; case ("r"): case ("rd"): $lag="{"; break; default : break; } $O35.="\"".l26."\":".$lag; O36($O35,$l37=$l37); } function l9p($l52,$Oag,$O9f,$l37=NULL) { lah($l52,$Oag,$O9f,$l37=$l37); l9m($Oag,$O9m=2,$Oah=",",$l37=$l37); } function lah($l52,$Oag,$O9f="",$l37=NULL) { $O3d=array_keys($Oag); $l3c=$Oag[$O3d[0]]; $O35=$O9f; switch ($l52) { case ("t"): case ("g"): case ("h"): case ("hd"): $O35.="{"; if (l35($l3c) === FALSE) $lai=l3x($l3c); else { if ($l52 == "hd") { if (PHP_SAPI !== "cli") { $l3c=l4d($l3c); } $lai=$l3c*01750; } else $lai=$l3c; } $O35.="\"key\":".$lai.","; break; case ("r"): case ("rd"): $O35.=l3x($l3c).":{"; $l5e=l4k($l3c); $O4m=$l5e[0]; $l4n=$l5e[1]; if ($l52 == "rd") { if (PHP_SAPI !== "cli") { $O4m=l4d($O4m); $l4n=l4d($l4n); } $O4m=$O4m*01750; $l4n=$l4n*01750; } $O35.="\"from\":".$O4m.","; $O35.="\"from_as_string\":".l3x($O4m).","; $O35.="\"to\":".$l4n.","; $O35.="\"to_as_string\":".l3x($l4n).","; break; default : break; } $O35.="\"doc_count\":".$Oag["_count"]; O36($O35,$l37=$l37); } function l9m($Oag,$O9m=2,$O9f=",",$l37=NULL) { $O3d=array_keys($Oag); $Oai=count($Oag); $O35=""; for ($O3u=$O9m; $O3u<$Oai; $O3u ++) { $O5a=$O3d[$O3u]; $l3c=$Oag[$O3d[$O3u]]; $O35.=$O9f.l3x($O5a).":{"; if ($l3c === NULL || $l3c === "") $O35.="\"value\":null"; else $O35.="\"value\":".$l3c; $O35.="}"; $O9f=","; } O36($O35,$l37=$l37); } function l9s($l52,$l37=NULL) { $laj=""; switch ($l52) { case ("t"): case ("g"): case ("h"): case ("hd"): $laj="]"; break; case ("r"): case ("rd"): $laj="}"; break; default : break; } $O35=$laj."}"; O36($O35,$l37=$l37); } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionsquery.php b/JSON_SQL_Bridge/functionsquery.php index 8d42661..9d15987 100644 --- a/JSON_SQL_Bridge/functionsquery.php +++ b/JSON_SQL_Bridge/functionsquery.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; function O9b($l9c) { return array_sum(array_map( function ($O9c) { return $O9c->isrunning(); } ,$l9c)); } function l9d($O9d) { $l6f=explode("\n",$O9d); if (count($l6f)<2) { O29( __FILE__ ,"error","The request body of the POST data is not valid. It should have at least 2 elements but ".count($l6f)." were found.\nProgram aborts.\n"); } else { $l9e=floor(count($l6f)/2); echo "{\"responses\":["; $O9e=array(); $l9f=array(); $O9f=array(); $l9g=NULL; $O9g=array(); $l9h=array(); $O9h=-1; $l9i=-1; for ($O9i=0; $O9i<$l9e; $O9i ++) { $l27=json_decode($l6f[2*$O9i],TRUE); $O22=$l27["index"]; $l6j=$l6f[2*$O9i+1]; $O9e[]=l4k($O22,$l6j); O6q($O22,$l6j,l9j($O9e[$O9i]["responseFiles"]["responseFileFinal"])); if ($O9e[$O9i]["cacheFileExists"] === FALSE) { $O9h ++; $l9h[]=array("type" => "run","index" => $O9h); $l9f[]=$O9e[$O9i]; if ($O9h == 0) { $l9g=$O9e[$O9i]; } else { $O9g[]=new O1($O9e[$O9i]); } } else { $l9i ++; $l9h[]=array("type" => "cache","index" => $l9i); $O9f[]=$O9e[$O9i]; } } if ($O9h>=1) { assert($l9g != NULL,"The first request to run is not null"); foreach ($O9g as $O9c) { $O9c->start(PTHREADS_INHERIT_ALL|PTHREADS_ALLOW_GLOBALS); } $O9j=l4($l9g); foreach ($O9g as $O9c) { $O9c->join(); } for ($O9i=0; $O9i<$l9e; $O9i ++) { if ($O9i>0) echo ","; $l9k=$l9h[$O9i]["index"]; if ($l9h[$O9i]["type"] == "run") { if ($l9k == 0) { $O9k=O6n($O9j["responseFile"]); if ($O9k === FALSE) O29( __FUNCTION__ ,"warning","PARALLEL RUN (FIRST JOB): The response file could not be read.\nCheck permissions on the file '".$l3."'.\n"); } else { assert($l9k-1l6()); if ($O9k === FALSE) O29( __FUNCTION__ ,"warning","PARALLEL RUN: The response file could not be read.\nCheck permissions on the file '".$O9c->l6()."'.\n"); } } else { assert($l9k0) echo ","; $O3=l4($O9e[$O9i]); $O9k=O6n($O3["responseFile"]); if ($O9k === FALSE) O29( __FUNCTION__ ,"warning","SEQUENTIAL RUN: The response file could not be read.\nCheck permissions on the file '".$l3."'.\n"); } } echo "]}"; } } function l4k($O22,$l6j,$O2=FALSE) { $l27=l4u($O22); if ($l27 === FALSE) { if ($O2) O29("",lc,"Table with table ID '$O22' was not found in the registered tables information."); l87(NULL,0); O2f("[]}}"); return FALSE; } $l22=$l27["table"]; $O21=$l27["db"]; $O4t=$l27["cache"]; $l9l=l7a($l6j,$l22,$O21); $O9l=O80($l9l); $l6k=O6k($O22,$O9l); if (!l6x(la) && (time()-l6x(O9))>Oa && file_exists(l6x(l9)) === TRUE) { @unlink(l6x(l9)); } $l9m=O6l($l6k,$O4t); return array("table" => $l22,"db" => $O21,"responseFiles" => $l6k,"parsedQuery" => $l9l,"cacheEnabled" => $O4t,"cacheFileExists" => $l9m); } function l4($O4j,$O2=FALSE) { $l22=$O4j["table"]; $O21=$O4j["db"]; $l6k=$O4j["responseFiles"]; $l47=$O4j["parsedQuery"]; $O4t=$O4j["cacheEnabled"]; $l9m=$O4j["cacheFileExists"]; if ($l9m === FALSE) { if (file_exists($l6k["responseFileTmp"])) { O9m($l6k["responseFileFinal"]); } else { O6m($l22,$O21,$l47,$l6k["responseFileTmp"]); l6n($l6k,$O4t); if ($O2) { echo "--------------------\n"; echo "Result from parseEsJsonRequest():\n"; print_r($l47); echo "--------------------\n"; echo "Result from generateEsJsonResponse():\n"; O6n($l6k["responseFileFinal"]); } } } return array("responseFile" => $l6k["responseFileFinal"],"parsedQuery" => $l47); } \ No newline at end of file +namespace kibella; function Oaj($lak) { return array_sum(array_map( function ($Oak) { return $Oak->isrunning(); } ,$lak)); } function lal($Oal) { $l7j=explode("\n",$Oal); if (count($l7j)<2) { showmessage( __FILE__ ,"error","The request body of the POST data is not valid. It should have at least 2 elements but ".count($l7j)." were found.\nProgram aborts.\n"); } else { $lam=floor(count($l7j)/2); echo "{\"responses\":["; $Oam=array(); $lan=array(); $Oan=array(); $lao=array(); $Oao=array(); $lap=-1; $Oap=-1; for ($laq=0; $laq<$lam; $laq ++) { $l7h=json_decode($l7j[2*$laq],TRUE); $l31=$l7h["index"]; $l7n=$l7j[2*$laq+1]; $Oam[]=l5j($l31,$l7n); O7t($l31,$l7n,Oaq($Oam[$laq]["responseFiles"]["responseFileFinal"])); if ($Oam[$laq]["cacheFileExists"] === FALSE) { $lap ++; $Oao[]=array("type" => "run","index" => $lap); $lan[]=$Oam[$laq]; $lar=new lv($Oam[$laq],$lx=FALSE); $lao[]=$lar; } else { $Oap ++; $Oao[]=array("type" => "cache","index" => $Oap); $Oan[]=$Oam[$laq]; } } if ($lap>=1 && MULTITHREADING == 1) { foreach ($lao as $Oak) { $Oar=$Oak->start(PTHREADS_INHERIT_ALL|PTHREADS_ALLOW_GLOBALS); } foreach ($lao as $Oak) { $Oak->join(); } for ($laq=0; $laq<$lam; $laq ++) { if ($laq>0) echo ","; $las=$Oao[$laq]["index"]; if ($Oao[$laq]["type"] == "run") { assert($lasO10()); if ($Oar === FALSE) showmessage( __FUNCTION__ ,"warning","PARALLEL RUN: The response file could not be read.\nCheck permissions on the file '".$Oak->O10()."'.\n"); } else { assert($las0) echo ","; $Oy=lz($Oam[$laq]); $Oar=O7r($Oy["responseFile"]); if ($Oar === FALSE) showmessage( __FUNCTION__ ,"warning","SEQUENTIAL RUN: The response file could not be read.\nCheck permissions on the file '".$ly."'.\n"); } } echo "]}"; } } function l5j($l31,$l7n,$lx=FALSE) { $l7h=l5t($l31); if ($l7h === FALSE) { if ($lx) showmessage("",TAG_ERROR,"Table with table ID '$l31' was not found in the registered tables information."); O9b(NULL,0); O36("[]}}"); return FALSE; } $O30=$l7h["table"]; $l30=$l7h["db"]; $lp=$l7h["dbengine"]; $O5s=$l7h["cache"]; $Oas=O8c($l7n,$O30,$l30); $lat=O92($Oas); $l7o=O7o($l31,$lat); if (!O7y(l15) && (time()-O7y(O14))>O15 && file_exists(O7y(l14)) === TRUE) { @unlink(O7y(l14)); } $Oat=O7p($l7o,$O5s); return array("table" => $O30,"db" => $l30,"dbengine" => $lp,"responseFiles" => $l7o,"parsedQuery" => $Oas,"cacheEnabled" => $O5s,"cacheFileExists" => $Oat); } function lz($O5i,$lx=FALSE) { $O30=$O5i["table"]; $l30=$O5i["db"]; $lp=$O5i["dbengine"]; $l7o=$O5i["responseFiles"]; $O55=$O5i["parsedQuery"]; $O5s=$O5i["cacheEnabled"]; $Oat=$O5i["cacheFileExists"]; if ($Oat === FALSE) { if (file_exists($l7o["responseFileTmp"])) { lau($l7o["responseFileFinal"]); } else { global $O4q; O7q($O30,$l30,$O4q[$lp],$O55,$l7o["responseFileTmp"]); l7r($l7o,$O5s); if ($lx) { echo "--------------------\n"; echo "Result from parseEsJsonRequest():\n"; print_r($O55); echo "--------------------\n"; echo "Result from generateEsJsonResponse():\n"; O7r($l7o["responseFileFinal"]); } } } return array("responseFile" => $l7o["responseFileFinal"],"parsedQuery" => $O55); } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionsserver.php b/JSON_SQL_Bridge/functionsserver.php index b1fb806..5b138f1 100644 --- a/JSON_SQL_Bridge/functionsserver.php +++ b/JSON_SQL_Bridge/functionsserver.php @@ -1,11 +1,11 @@ $l9n,"responseFileTmp" => $O9n); return $l6k; } function l9j($O3l) { $l9q=substr($O3l,strrpos($O3l,O14)+1); $O9q=strrpos($l9q,"."); if ($O9q>0) { $O54=substr($l9q,0,$O9q); } else { $O54=$l9q; } return $O54; } function l6x($l9r) { if ( isset ($_COOKIE[$l9r])) { return $_COOKIE[$l9r]; } else { return ""; } } function O6n($O3l,$O9r=5) { $O9k=FALSE; if ($O3l !== NULL && $O3l !== FALSE && $O3l !== "") { $l9s=time(); $O9s=strlen(ob_get_contents()); while ($O9k === FALSE && (time()-$l9s)<=$O9r) { @readfile($O3l); if (PHP_SAPI === "cli" || strlen(ob_get_contents())>$O9s && @filesize($O3l)>0) $O9k=TRUE; } } return $O9k; } function O9o($l6k,$O9r=5) { $O9k=FALSE; $l9s=time(); while ($O9k === FALSE && (time()-$l9s)<=$O9r) { $O9k=@rename($l6k["responseFileTmp"],$l6k["responseFileFinal"]); } return $O9k; } function l9t($O9t,$O2e="application/json") { header($_SERVER["SERVER_PROTOCOL"]." ".$O9t); header("Access-Control-Allow-Origin: *"); header( "Content-Type: $O2e; charset=UTF-8"); } function l9u($O6g=TRUE) { $O9u=l6x(l12); if ($O9u == "") { l58(lr,$l2t=FALSE); $l9v=O4w("select ".lq." from ".lr." LIMIT 1",KIBELLADB,TABLESDIR,$l4x="query",$O24="sqlite"); if ($l9v !== FALSE && count($l9v)>0) { $l22=$l9v[0][lq]; } else { $l22=""; } } else { $l22=$O9u; } $O9v="{\"".lj."\":\"".O7."\",\"".Oj."\":\"config\",\"".lk."\":\"".l8."\",\"".Ok."\":1,\"".lo."\":true,\"".lm."\":{"."\"buildNum\":1000,"."\"defaultIndex\":\"".$l22."\""."}"."}"; if ($O6g) { $O9v="{\"docs\":[".$O9v."]}"; } O2f($O9v); } function O72($l9w) { $O9w="{\"took\":2,\"timed_out\":false,\"".ln."\":{\"total\":1,\"successful\":1,\"failed\":0},"."\"hits\":{"."\"total\":".count($l9w).","."\"max_score\":1,"."\"hits\":".json_encode($l9w)."}"."}"; O2f($O9w); } function l5x($O2e,$O28,$O5w,$l9x,$O9x) { $O9w="{\"".lj."\":\"".O7."\",\"".Oj."\":\"".$O2e."\",\"".lk."\":\"".$O28."\",\"".Ok."\":".$O5w.",\"".ln."\":{\"total\":2,\"successful\":1,\"failed\":0},\"".$l9x."\":".$O9x."}"; O2f($O9w); } function l9y($l9r,$O2l,$O9y="",$l9z=NULL,$O9z=NULL) { if ($l9z === NULL) $l9z=@strtotime("+365 days"); if ($O9z === NULL) $O9z="/".APPDIRNAME."/"; if ($O9y === "raw") { setrawcookie($l9r,$O2l,$l9z,$O9z); } else { setcookie($l9r,$O2l,$l9z,$O9z); } } function la0($Oa0,$la1,$Oa1) { $la2=""; $Oa2=""; if (strtolower($Oa1) == "begin") { if ($la1 == "" || $la1 == NULL) { $la3=$Oa0; $la1=""; } else $la3=str_replace($la1."/","",$Oa0); $l3c=0; $Oa3=""; if ($la3[0] == "/") { $l3c=1; $Oa3="/"; } if ($la1 == "") $la4=""; else $la4=$Oa3.$la1; $Oa1=strpos($la3,"/",$l3c); if ($Oa1 !== FALSE) { $la2=$la4.substr($la3,$Oa1); $Oa2=substr($la3,$l3c,$Oa1-$l3c); } else { $Oa4=la5($Oa0); $Oa5=$Oa4["URI"]; $Oa2=substr($Oa5,$l3c); } } else { $Oa4=la5($Oa0); $Oa5=$Oa4["URI"]; $la6=strlen($Oa5); if ($Oa5[$la6-1] == "/") $Oa5=substr($Oa5,0,$la6-1); $Oa1=strrpos($Oa5,"/"); if ($Oa1 !== FALSE) { if ($Oa1 $la2,"object" => $Oa2); } function la5($Oa0) { $Oa1=strpos($Oa0,"?"); if ($Oa1 === FALSE) { $Oa6=$Oa0; $O2i=NULL; } else { $Oa6=substr($Oa0,0,$Oa1); if ($Oa1 == strlen($Oa0)-1) { $O2i=NULL; } else { $la7=substr($Oa0,$Oa1+1); $Oa7=explode("&",$la7); $O2i=O30("=",$Oa7); } } return array("URI" => $Oa6,"params" => $O2i); } function l70($l2g) { $l2g=preg_replace("/\\s+/","-",$l2g); return $l2g; } function la8($l2g) { $l2g=urldecode($l2g); return $l2g; } function O9m($l2x,$Oa8=O8) { $l9s=time(); while (!file_exists($l2x) && (time()-$l9s)<=$Oa8) { sleep(1); } } \ No newline at end of file +namespace kibella; function O7p($l7o,$O5s) { $Oat=FALSE; if ($O5s) { $Oau=$l7o["responseFileFinal"]; $lav=$l7o["responseFileTmp"]; $O3s=checkdirexistsorcreate(CACHEDIR); if ($O3s === FALSE) { showmessage( __FUNCTION__ ,TAG_ERROR,l88(CACHEDIR).Oav()); return FALSE; } if (file_exists($Oau) && !O4n($Oau)) { $Oat=TRUE; } else if (file_exists($lav)) { lau($Oau); if (file_exists($Oau)) { $Oat=TRUE; } } } return $Oat; } function l7r($l7o,$O5s) { if (file_exists($l7o["responseFileTmp"]) === TRUE) { $Oar=law($l7o); if ($Oar !== FALSE && PHP_SAPI !== "cli") { if ($l7o["responseFileFinal"] !== O7y(l14)) { setrawcookie(l14,$l7o["responseFileFinal"],strtotime("+365 days"),"/".APPDIRNAME."/"); setrawcookie(O14,time(),strtotime("+365 days"),"/".APPDIRNAME."/"); setrawcookie(l15,$O5s*1,strtotime("+365 days"),"/".APPDIRNAME."/"); } } } } function O7o($l31,$l7n) { if (is_string($l7n)) { $Oaw=$l7n; } else { $Oaw=serialize($l7n); } $Oau=CACHEDIR."/query_".$l31.O1y.md5($l31."\n".$Oaw).".json"; $lax="_tmp"; $lav= "$Oau$lax"; $l7o=array("responseFileFinal" => $Oau,"responseFileTmp" => $lav); return $l7o; } function Oaq($Oe) { $Oax=substr($Oe,strrpos($Oe,O1y)+1); $lay=strrpos($Oax,"."); if ($lay>0) { $l63=substr($Oax,0,$lay); } else { $l63=$Oax; } return $l63; } function O7y($Oay) { if ( isset ($_COOKIE[$Oay])) { return $_COOKIE[$Oay]; } else { return ""; } } function O7r($Oe,$laz=5) { $Oar=FALSE; if ($Oe !== NULL && $Oe !== FALSE && $Oe !== "") { $Oaz=time(); $lb0=strlen(ob_get_contents()); while ($Oar === FALSE && (time()-$Oaz)<=$laz) { @readfile($Oe); if (PHP_SAPI === "cli" || strlen(ob_get_contents())>$lb0 && @filesize($Oe)>0) $Oar=TRUE; } } return $Oar; } function law($l7o,$laz=5) { $Oar=FALSE; $Oaz=time(); while ($Oar === FALSE && (time()-$Oaz)<=$laz) { $Oar=@rename($l7o["responseFileTmp"],$l7o["responseFileFinal"]); } return $Oar; } function Ob0($lb1,$l52="application/json") { header($_SERVER["SERVER_PROTOCOL"]." ".$lb1); header("Access-Control-Allow-Origin: *"); header( "Content-Type: $l52; charset=UTF-8"); } function Ob1($O7k=TRUE) { $lb2=O7y(l1w); if ($lb2 == "") { l68(O1m,$O3r=FALSE); $O66=dbcreatedbh(KIBELLADB); $Ob2=dbdbhexecutesqlquery($O66->getdbhandle(),"select ".O3." from ".O1m." LIMIT 1"); $O66->close(); if ($Ob2 !== FALSE && count($Ob2)>0) { $O30=$Ob2[0][O3]; } else { $O30="INCOME(income)"; } } else { $O30=$lb2; } $lb3="{\"".l1f."\":\"".O12."\",\"".O1f."\":\"config\",\"".l1g."\":\"".l13."\",\"".O1g."\":1,\"".O1j."\":true,\"".O1h."\":{"."\"buildNum\":1000,"."\"defaultIndex\":\"".$O30."\""."}"."}"; if ($O7k) { $lb3="{\"docs\":[".$lb3."]}"; } O36($lb3); } function l84($Ob3) { $lb4="{\"took\":2,\"timed_out\":false,\"".O1i."\":{\"total\":1,\"successful\":1,\"failed\":0},"."\"hits\":{"."\"total\":".count($Ob3).","."\"max_score\":1,"."\"hits\":".json_encode($Ob3)."}"."}"; O36($lb4); } function O70($l52,$O1,$l70,$Ob4,$lb5) { $lb4="{\"".l1f."\":\"".O12."\",\"".O1f."\":\"".$l52."\",\"".l1g."\":\"".$O1."\",\"".O1g."\":".$l70.",\"".O1i."\":{\"total\":2,\"successful\":1,\"failed\":0},\"".$Ob4."\":".$lb5."}"; O36($lb4); } function Ob5($Oay,$l3c,$lb6="",$Ob6=NULL,$lb7=NULL) { if ($Ob6 === NULL) $Ob6=strtotime("+365 days"); if ($lb7 === NULL) $lb7="/".APPDIRNAME."/"; if ($lb6 === "raw") { setrawcookie($Oay,$l3c,$Ob6,$lb7); } else { setcookie($Oay,$l3c,$Ob6,$lb7); } } function Ob7($lb8,$Ob8,$l4v) { $lb9=""; $Ob9=""; if (strtolower($l4v) == "begin") { if ($Ob8 == "" || $Ob8 == NULL) { $lba=$lb8; $Ob8=""; } else $lba=str_replace($Ob8."/","",$lb8); $O4e=0; $Oba=""; if ($lba[0] == "/") { $O4e=1; $Oba="/"; } if ($Ob8 == "") $lbb=""; else $lbb=$Oba.$Ob8; $l4v=strpos($lba,"/",$O4e); if ($l4v !== FALSE) { $lb9=$lbb.substr($lba,$l4v); $Ob9=substr($lba,$O4e,$l4v-$O4e); } else { $Obb=lbc($lb8); $Obc=$Obb["URI"]; $Ob9=substr($Obc,$O4e); } } else { $Obb=lbc($lb8); $Obc=$Obb["URI"]; $lbd=strlen($Obc); if ($Obc[$lbd-1] == "/") $Obc=substr($Obc,0,$lbd-1); $l4v=strrpos($Obc,"/"); if ($l4v !== FALSE) { if ($l4v $lb9,"object" => $Ob9); } function lbc($lb8) { $l4v=strpos($lb8,"?"); if ($l4v === FALSE) { $Obd=$lb8; $l39=NULL; } else { $Obd=substr($lb8,0,$l4v); if ($l4v == strlen($lb8)-1) { $l39=NULL; } else { $lbe=substr($lb8,$l4v+1); $Obe=explode("&",$lbe); $l39=O40("=",$Obe); } } return array("URI" => $Obd,"params" => $l39); } function O81($O35) { $O35=preg_replace("/\\s+/","-",$O35); return $O35; } function lbf($O35) { $O35=urldecode($O35); return $O35; } function lau($O3w,$Obf=O13) { $Oaz=time(); while (!file_exists($O3w) && (time()-$Oaz)<=$Obf) { sleep(1); } } \ No newline at end of file diff --git a/JSON_SQL_Bridge/functionsstatic.php b/JSON_SQL_Bridge/functionsstatic.php index 0ff1f80..9bc55c3 100644 --- a/JSON_SQL_Bridge/functionsstatic.php +++ b/JSON_SQL_Bridge/functionsstatic.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; function __kibana_4___kibanaqueryvalidator__validate_query() { $O46="{\"valid\":true,\"_shards\":{\"total\":1,\"successful\":1,\"failed\":0},\"explanations\":[{\"index\":\".kibana-4\",\"valid\":true,\"explanation\":\"ConstantScore(ConstantScore(+_type:__kibanaQueryValidator))\"}]}"; O2f($O46); } function __kibana_4__mapping___field__source() { $O46="{\".kibana-4\":{\"mappings\":{\"index-pattern\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"search\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"visualization\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"config\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"dashboard\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}}}}}"; O2f($O46); } function __kibana_4__refresh() { $O46="{\"_shards\":{\"total\":2,\"successful\":1,\"failed\":0}}"; O2f($O46); } function __kibana_4__settings() { $O46="{\"acknowledge\":true}"; O2f($O46); } function __kibana_4_config_4_1_2_es_2_0() { $O46="{\"_index\":\".kibana-4\",\"_type\":\"config\",\"_id\":\"4.1.2\",\"_version\":1,\"_shards\":{\"total\":2,\"successful\":1,\"failed\":0}}"; O2f($O46); } function __kibana_4_config() { $O46="{\"_index\":\".kibana-4\",\"_type\":\"config\",\"_id\":\"4.1.2\",\"_version\":1,\"_shards\":{\"total\":2,\"successful\":1,\"failed\":0}}"; O2f($O46); } function __kibana_4() { $O46="{\n\t \".kibana-4\" : {\n\t \"aliases\" : { },\n\t \"mappings\" : {\n\t \"config\" : {\n\t \"properties\" : {\n\t \"buildNum\" : {\n\t \"type\" : \"long\"\n\t }\n\t }\n\t }\n\t },\n\t \"settings\" : {\n\t \"index\" : {\n\t \"creation_date\" : \"1456837727490\",\n\t \"uuid\" : \"KyQTolBsQKKDHGaS1FPSLQ\",\n\t \"number_of_replicas\" : \"1\",\n\t \"number_of_shards\" : \"1\",\n\t \"version\" : {\n\t \"created\" : \"2020099\"\n\t }\n\t }\n\t },\n\t \"warmers\" : { }\n\t }\n\t}"; O2f($O46); } function __cluster_health__kibana_4() { $O46="{\"cluster_name\":\"elasticsearch\",\"status\":\"yellow\",\"timed_out\":false,\"number_of_nodes\":1,\"number_of_data_nodes\":1,\"active_primary_shards\":1,\"active_shards\":1,\"relocating_shards\":0,\"initializing_shards\":0,\"unassigned_shards\":1,\"delayed_unassigned_shards\":0,\"number_of_pending_tasks\":0,\"number_of_in_flight_fetch\":0,\"task_max_waiting_in_queue_millis\":0,\"active_shards_percent_as_number\":50.0}"; O2f($O46); } function __nodes() { $O46="{\n\t \"cluster_name\" : \"elasticsearch\",\n\t \"nodes\" : {\n\t \"9X39ibGRSziEvcgaY0h21w\" : {\n\t \"name\" : \"Awesome Android\",\n\t \"transport_address\" : \"10.0.2.15:9300\",\n\t \"host\" : \"10.0.2.15\",\n\t \"ip\" : \"10.0.2.15\",\n\t \"version\" : \"2.2.0\",\n\t \"build\" : \"8ff36d1\",\n\t \"http_address\" : \"10.0.2.15:9200\",\n\t \"settings\" : {\n\t \"client\" : {\n\t \"type\" : \"node\"\n\t },\n\t \"http\" : {\n\t \"cors\" : {\n\t \"enabled\" : \"true\",\n\t \"allow-origin\" : \"*\"\n\t }\n\t },\n\t \"name\" : \"Awesome Android\",\n\t \"pidfile\" : \"/var/run/elasticsearch/elasticsearch.pid\",\n\t \"path\" : {\n\t \"data\" : \"/var/lib/elasticsearch\",\n\t \"home\" : \"/usr/share/elasticsearch\",\n\t \"conf\" : \"/etc/elasticsearch\",\n\t \"logs\" : \"/var/log/elasticsearch\"\n\t },\n\t \"config\" : {\n\t \"ignore_system_properties\" : \"true\"\n\t },\n\t \"cluster\" : {\n\t \"name\" : \"elasticsearch\"\n\t },\n\t \"network\" : {\n\t \"host\" : \"0.0.0.0\"\n\t },\n\t \"foreground\" : \"false\"\n\t },\n\t \"os\" : {\n\t \"refresh_interval_in_millis\" : 1000,\n\t \"name\" : \"Linux\",\n\t \"arch\" : \"amd64\",\n\t \"version\" : \"3.2.0-23-generic\",\n\t \"available_processors\" : 2,\n\t \"allocated_processors\" : 2\n\t },\n\t \"process\" : {\n\t \"refresh_interval_in_millis\" : 1000,\n\t \"id\" : 2056,\n\t \"mlockall\" : false\n\t },\n\t \"jvm\" : {\n\t \"pid\" : 2056,\n\t \"version\" : \"1.7.0_95\",\n\t \"vm_name\" : \"OpenJDK 64-Bit Server VM\",\n\t \"vm_version\" : \"24.95-b01\",\n\t \"vm_vendor\" : \"Oracle Corporation\",\n\t \"start_time_in_millis\" : 1456758145723,\n\t \"mem\" : {\n\t \"heap_init_in_bytes\" : 268435456,\n\t \"heap_max_in_bytes\" : 1056309248,\n\t \"non_heap_init_in_bytes\" : 24313856,\n\t \"non_heap_max_in_bytes\" : 224395264,\n\t \"direct_max_in_bytes\" : 1056309248\n\t },\n\t \"gc_collectors\" : [ \"ParNew\", \"ConcurrentMarkSweep\" ],\n\t \"memory_pools\" : [ \"Code Cache\", \"Par Eden Space\", \"Par Survivor Space\", \"CMS Old Gen\", \"CMS Perm Gen\" ],\n\t \"using_compressed_ordinary_object_pointers\" : \"true\"\n\t },\n\t \"thread_pool\" : {\n\t \"generic\" : {\n\t \"type\" : \"cached\",\n\t \"keep_alive\" : \"30s\",\n\t \"queue_size\" : -1\n\t },\n\t \"index\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 200\n\t },\n\t \"fetch_shard_store\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 4,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"get\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 1000\n\t },\n\t \"snapshot\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"force_merge\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"queue_size\" : -1\n\t },\n\t \"suggest\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 1000\n\t },\n\t \"bulk\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 50\n\t },\n\t \"warmer\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"flush\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"search\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 4,\n\t \"max\" : 4,\n\t \"queue_size\" : 1000\n\t },\n\t \"fetch_shard_started\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 4,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"listener\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"queue_size\" : -1\n\t },\n\t \"percolate\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 1000\n\t },\n\t \"refresh\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"management\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 5,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t }\n\t },\n\t \"transport\" : {\n\t \"bound_address\" : [ \"[::]:9300\" ],\n\t \"publish_address\" : \"10.0.2.15:9300\",\n\t \"profiles\" : { }\n\t },\n\t \"http\" : {\n\t \"bound_address\" : [ \"[::]:9200\" ],\n\t \"publish_address\" : \"10.0.2.15:9200\",\n\t \"max_content_length_in_bytes\" : 104857600\n\t },\n\t \"plugins\" : [ ],\n\t \"modules\" : [ {\n\t \"name\" : \"lang-expression\",\n\t \"version\" : \"2.2.0\",\n\t \"description\" : \"Lucene expressions integration for Elasticsearch\",\n\t \"jvm\" : true,\n\t \"classname\" : \"org.elasticsearch.script.expression.ExpressionPlugin\",\n\t \"isolated\" : true,\n\t \"site\" : false\n\t }, {\n\t \"name\" : \"lang-groovy\",\n\t \"version\" : \"2.2.0\",\n\t \"description\" : \"Groovy scripting integration for Elasticsearch\",\n\t \"jvm\" : true,\n\t \"classname\" : \"org.elasticsearch.script.groovy.GroovyPlugin\",\n\t \"isolated\" : true,\n\t \"site\" : false\n\t } ]\n\t }\n\t }\n\t}"; O2f($O46); } function _() { $O46="{\n\t \"name\" : \"Awesome Android\",\n\t \"cluster_name\" : \"elasticsearch\",\n\t \"version\" : {\n\t \"number\" : \"2.2.0\",\n\t \"build_hash\" : \"8ff36d139e16f8720f2947ef62c8167a888992fe\",\n\t \"build_timestamp\" : \"2016-01-27T13:32:39Z\",\n\t \"build_snapshot\" : false,\n\t \"lucene_version\" : \"5.4.1\"\n\t },\n\t \"tagline\" : \"You Know, for Search\"\n\t}"; O2f($O46); } \ No newline at end of file +namespace kibella; function __kibana_4___kibanaqueryvalidator__validate_query() { $l55="{\"valid\":true,\"_shards\":{\"total\":1,\"successful\":1,\"failed\":0},\"explanations\":[{\"index\":\".kibana-4\",\"valid\":true,\"explanation\":\"ConstantScore(ConstantScore(+_type:__kibanaQueryValidator))\"}]}"; O36($l55); } function __kibana_4__mapping___field__source() { $l55="{\".kibana-4\":{\"mappings\":{\"index-pattern\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"search\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"visualization\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"config\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}},\"dashboard\":{\"_source\":{\"full_name\":\"_source\",\"mapping\":{}}}}}}"; O36($l55); } function __kibana_4__refresh() { $l55="{\"_shards\":{\"total\":2,\"successful\":1,\"failed\":0}}"; O36($l55); } function __kibana_4__settings() { $l55="{\"acknowledge\":true}"; O36($l55); } function __kibana_4_config_4_1_2_es_2_0() { $l55="{\"_index\":\".kibana-4\",\"_type\":\"config\",\"_id\":\"4.1.2\",\"_version\":1,\"_shards\":{\"total\":2,\"successful\":1,\"failed\":0}}"; O36($l55); } function __kibana_4_config() { $l55="{\"_index\":\".kibana-4\",\"_type\":\"config\",\"_id\":\"4.1.2\",\"_version\":1,\"_shards\":{\"total\":2,\"successful\":1,\"failed\":0}}"; O36($l55); } function __kibana_4() { $l55="{\n\t \".kibana-4\" : {\n\t \"aliases\" : { },\n\t \"mappings\" : {\n\t \"config\" : {\n\t \"properties\" : {\n\t \"buildNum\" : {\n\t \"type\" : \"long\"\n\t }\n\t }\n\t }\n\t },\n\t \"settings\" : {\n\t \"index\" : {\n\t \"creation_date\" : \"1456837727490\",\n\t \"uuid\" : \"KyQTolBsQKKDHGaS1FPSLQ\",\n\t \"number_of_replicas\" : \"1\",\n\t \"number_of_shards\" : \"1\",\n\t \"version\" : {\n\t \"created\" : \"2020099\"\n\t }\n\t }\n\t },\n\t \"warmers\" : { }\n\t }\n\t}"; O36($l55); } function __cluster_health__kibana_4() { $l55="{\"cluster_name\":\"elasticsearch\",\"status\":\"yellow\",\"timed_out\":false,\"number_of_nodes\":1,\"number_of_data_nodes\":1,\"active_primary_shards\":1,\"active_shards\":1,\"relocating_shards\":0,\"initializing_shards\":0,\"unassigned_shards\":1,\"delayed_unassigned_shards\":0,\"number_of_pending_tasks\":0,\"number_of_in_flight_fetch\":0,\"task_max_waiting_in_queue_millis\":0,\"active_shards_percent_as_number\":50.0}"; O36($l55); } function __nodes() { $l55="{\n\t \"cluster_name\" : \"elasticsearch\",\n\t \"nodes\" : {\n\t \"9X39ibGRSziEvcgaY0h21w\" : {\n\t \"name\" : \"Awesome Android\",\n\t \"transport_address\" : \"10.0.2.15:9300\",\n\t \"host\" : \"10.0.2.15\",\n\t \"ip\" : \"10.0.2.15\",\n\t \"version\" : \"2.2.0\",\n\t \"build\" : \"8ff36d1\",\n\t \"http_address\" : \"10.0.2.15:9200\",\n\t \"settings\" : {\n\t \"client\" : {\n\t \"type\" : \"node\"\n\t },\n\t \"http\" : {\n\t \"cors\" : {\n\t \"enabled\" : \"true\",\n\t \"allow-origin\" : \"*\"\n\t }\n\t },\n\t \"name\" : \"Awesome Android\",\n\t \"pidfile\" : \"/var/run/elasticsearch/elasticsearch.pid\",\n\t \"path\" : {\n\t \"data\" : \"/var/lib/elasticsearch\",\n\t \"home\" : \"/usr/share/elasticsearch\",\n\t \"conf\" : \"/etc/elasticsearch\",\n\t \"logs\" : \"/var/log/elasticsearch\"\n\t },\n\t \"config\" : {\n\t \"ignore_system_properties\" : \"true\"\n\t },\n\t \"cluster\" : {\n\t \"name\" : \"elasticsearch\"\n\t },\n\t \"network\" : {\n\t \"host\" : \"0.0.0.0\"\n\t },\n\t \"foreground\" : \"false\"\n\t },\n\t \"os\" : {\n\t \"refresh_interval_in_millis\" : 1000,\n\t \"name\" : \"Linux\",\n\t \"arch\" : \"amd64\",\n\t \"version\" : \"3.2.0-23-generic\",\n\t \"available_processors\" : 2,\n\t \"allocated_processors\" : 2\n\t },\n\t \"process\" : {\n\t \"refresh_interval_in_millis\" : 1000,\n\t \"id\" : 2056,\n\t \"mlockall\" : false\n\t },\n\t \"jvm\" : {\n\t \"pid\" : 2056,\n\t \"version\" : \"1.7.0_95\",\n\t \"vm_name\" : \"OpenJDK 64-Bit Server VM\",\n\t \"vm_version\" : \"24.95-b01\",\n\t \"vm_vendor\" : \"Oracle Corporation\",\n\t \"start_time_in_millis\" : 1456758145723,\n\t \"mem\" : {\n\t \"heap_init_in_bytes\" : 268435456,\n\t \"heap_max_in_bytes\" : 1056309248,\n\t \"non_heap_init_in_bytes\" : 24313856,\n\t \"non_heap_max_in_bytes\" : 224395264,\n\t \"direct_max_in_bytes\" : 1056309248\n\t },\n\t \"gc_collectors\" : [ \"ParNew\", \"ConcurrentMarkSweep\" ],\n\t \"memory_pools\" : [ \"Code Cache\", \"Par Eden Space\", \"Par Survivor Space\", \"CMS Old Gen\", \"CMS Perm Gen\" ],\n\t \"using_compressed_ordinary_object_pointers\" : \"true\"\n\t },\n\t \"thread_pool\" : {\n\t \"generic\" : {\n\t \"type\" : \"cached\",\n\t \"keep_alive\" : \"30s\",\n\t \"queue_size\" : -1\n\t },\n\t \"index\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 200\n\t },\n\t \"fetch_shard_store\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 4,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"get\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 1000\n\t },\n\t \"snapshot\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"force_merge\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"queue_size\" : -1\n\t },\n\t \"suggest\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 1000\n\t },\n\t \"bulk\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 50\n\t },\n\t \"warmer\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"flush\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"search\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 4,\n\t \"max\" : 4,\n\t \"queue_size\" : 1000\n\t },\n\t \"fetch_shard_started\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 4,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"listener\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"queue_size\" : -1\n\t },\n\t \"percolate\" : {\n\t \"type\" : \"fixed\",\n\t \"min\" : 2,\n\t \"max\" : 2,\n\t \"queue_size\" : 1000\n\t },\n\t \"refresh\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 1,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t },\n\t \"management\" : {\n\t \"type\" : \"scaling\",\n\t \"min\" : 1,\n\t \"max\" : 5,\n\t \"keep_alive\" : \"5m\",\n\t \"queue_size\" : -1\n\t }\n\t },\n\t \"transport\" : {\n\t \"bound_address\" : [ \"[::]:9300\" ],\n\t \"publish_address\" : \"10.0.2.15:9300\",\n\t \"profiles\" : { }\n\t },\n\t \"http\" : {\n\t \"bound_address\" : [ \"[::]:9200\" ],\n\t \"publish_address\" : \"10.0.2.15:9200\",\n\t \"max_content_length_in_bytes\" : 104857600\n\t },\n\t \"plugins\" : [ ],\n\t \"modules\" : [ {\n\t \"name\" : \"lang-expression\",\n\t \"version\" : \"2.2.0\",\n\t \"description\" : \"Lucene expressions integration for Elasticsearch\",\n\t \"jvm\" : true,\n\t \"classname\" : \"org.elasticsearch.script.expression.ExpressionPlugin\",\n\t \"isolated\" : true,\n\t \"site\" : false\n\t }, {\n\t \"name\" : \"lang-groovy\",\n\t \"version\" : \"2.2.0\",\n\t \"description\" : \"Groovy scripting integration for Elasticsearch\",\n\t \"jvm\" : true,\n\t \"classname\" : \"org.elasticsearch.script.groovy.GroovyPlugin\",\n\t \"isolated\" : true,\n\t \"site\" : false\n\t } ]\n\t }\n\t }\n\t}"; O36($l55); } function _() { $l55="{\n\t \"name\" : \"Awesome Android\",\n\t \"cluster_name\" : \"elasticsearch\",\n\t \"version\" : {\n\t \"number\" : \"2.2.0\",\n\t \"build_hash\" : \"8ff36d139e16f8720f2947ef62c8167a888992fe\",\n\t \"build_timestamp\" : \"2016-01-27T13:32:39Z\",\n\t \"build_snapshot\" : false,\n\t \"lucene_version\" : \"5.4.1\"\n\t },\n\t \"tagline\" : \"You Know, for Search\"\n\t}"; O36($l55); } \ No newline at end of file diff --git a/JSON_SQL_Bridge/geohash.php b/JSON_SQL_Bridge/geohash.php index bf8fab0..c62c6b0 100644 --- a/JSON_SQL_Bridge/geohash.php +++ b/JSON_SQL_Bridge/geohash.php @@ -1 +1 @@ -=$Oab) { if ($lag) { $Oah=($lad+$Oad)/2; if ($lab>$Oah) { $Oag |= self::$Oa9[$lah]; $lad=$Oah; } else { $Oad=$Oah; } } else { $Oah=($lae+$Oae)/2; if ($Oaa>$Oah) { $Oag |= self::$Oa9[$lah]; $lae=$Oah; } else { $Oae=$Oah; } } $lag=!$lag; if ($lah<4) { $lah ++; } else { $laf[]=self::$l22[$Oag]; $Oaf=max($Oad-$lad,$Oae-$lae); $lah=0; $Oag=0; } } return join("",$laf); } public static function lai($laf) { $lad=-0264; $Oad=0264; $lae=-0132; $Oae=0132; $Oai=0132; $laj=0264; for ($l2v=0,$Oaj=strlen($laf); $l2v<$Oaj; $l2v ++) { $O7y=strpos(self::$l22,$laf[$l2v]); if (1&$l2v) { if (020&$O7y) { $lae=($lae+$Oae)/2; } else { $Oae=($lae+$Oae)/2; } if (8&$O7y) { $lad=($lad+$Oad)/2; } else { $Oad=($lad+$Oad)/2; } if (4&$O7y) { $lae=($lae+$Oae)/2; } else { $Oae=($lae+$Oae)/2; } if (2&$O7y) { $lad=($lad+$Oad)/2; } else { $Oad=($lad+$Oad)/2; } if (1&$O7y) { $lae=($lae+$Oae)/2; } else { $Oae=($lae+$Oae)/2; } $Oai /= 8; $laj /= 4; } else { if (020&$O7y) { $lad=($lad+$Oad)/2; } else { $Oad=($lad+$Oad)/2; } if (8&$O7y) { $lae=($lae+$Oae)/2; } else { $Oae=($lae+$Oae)/2; } if (4&$O7y) { $lad=($lad+$Oad)/2; } else { $Oad=($lad+$Oad)/2; } if (2&$O7y) { $lae=($lae+$Oae)/2; } else { $Oae=($lae+$Oae)/2; } if (1&$O7y) { $lad=($lad+$Oad)/2; } else { $Oad=($lad+$Oad)/2; } $Oai /= 4; $laj /= 8; } } $Oaa=round(($lae+$Oae)/2,max(1,-round(log10($Oai)))-1); $lab=round(($lad+$Oad)/2,max(1,-round(log10($laj)))-1); return array($Oaa,$lab); } } \ No newline at end of file +=$Obi) { if ($lbn) { $Obo=($lbk+$Obk)/2; if ($lbi>$Obo) { $Obn |= self::$Obg[$lbo]; $lbk=$Obo; } else { $Obk=$Obo; } } else { $Obo=($lbl+$Obl)/2; if ($Obh>$Obo) { $Obn |= self::$Obg[$lbo]; $lbl=$Obo; } else { $Obl=$Obo; } } $lbn=!$lbn; if ($lbo<4) { $lbo ++; } else { $lbm[]=self::$O30[$Obn]; $Obm=max($Obk-$lbk,$Obl-$lbl); $lbo=0; $Obn=0; } } return join("",$lbm); } public static function lbp($lbm) { $lbk=-0264; $Obk=0264; $lbl=-0132; $Obl=0132; $Obp=0132; $lbq=0264; for ($O3u=0,$Obq=strlen($lbm); $O3u<$Obq; $O3u ++) { $O90=strpos(self::$O30,$lbm[$O3u]); if (1&$O3u) { if (020&$O90) { $lbl=($lbl+$Obl)/2; } else { $Obl=($lbl+$Obl)/2; } if (8&$O90) { $lbk=($lbk+$Obk)/2; } else { $Obk=($lbk+$Obk)/2; } if (4&$O90) { $lbl=($lbl+$Obl)/2; } else { $Obl=($lbl+$Obl)/2; } if (2&$O90) { $lbk=($lbk+$Obk)/2; } else { $Obk=($lbk+$Obk)/2; } if (1&$O90) { $lbl=($lbl+$Obl)/2; } else { $Obl=($lbl+$Obl)/2; } $Obp /= 8; $lbq /= 4; } else { if (020&$O90) { $lbk=($lbk+$Obk)/2; } else { $Obk=($lbk+$Obk)/2; } if (8&$O90) { $lbl=($lbl+$Obl)/2; } else { $Obl=($lbl+$Obl)/2; } if (4&$O90) { $lbk=($lbk+$Obk)/2; } else { $Obk=($lbk+$Obk)/2; } if (2&$O90) { $lbl=($lbl+$Obl)/2; } else { $Obl=($lbl+$Obl)/2; } if (1&$O90) { $lbk=($lbk+$Obk)/2; } else { $Obk=($lbk+$Obk)/2; } $Obp /= 4; $lbq /= 8; } } $Obh=round(($lbl+$Obl)/2,max(1,-round(log10($Obp)))-1); $lbi=round(($lbk+$Obk)/2,max(1,-round(log10($lbq)))-1); return array($Obh,$lbi); } } \ No newline at end of file diff --git a/JSON_SQL_Bridge/globals.php b/JSON_SQL_Bridge/globals.php index 10aa36e..dc3839e 100644 --- a/JSON_SQL_Bridge/globals.php +++ b/JSON_SQL_Bridge/globals.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; if (LOG) { global $O79; $O79=@fopen(LOGFILE,"a+"); } global $O4c; global $O7v; global $l7w; global $lak; global $Oak; global $lal; $O4c=array("s" => "second","m" => "minute","h" => "hour","d" => "day","w" => "week","M" => "month","y" => "year"); $l7w=array(l16 => "avg",O16 => "count(distinct",MAX => "max",MIN => "min",O17 => "percentiles",l18 => "stddev",O18 => "sum",l17 => "count",); $lak=array(l16,O16,l17,MAX,MIN,O17,O18); $O7v=array(O19 => array(NULL),l1a => array(array_values($lak),O19,O1a,l1b,O1h,O1i,l1j,O1o),O1a => array(NULL,l1n,O1r,l1w),l1b => array(NULL,l1n,O1r,l1w),O1b => array(O1j,l1k),O1c => array(O1b,O1a,O1l),l1d => array(NULL),l1e => array(O1d,O1e),l1f => array(NULL),O1f => array(l1y,l1z,l21),l1g => array(NULL),O1g => array(O1s,O1u,l1v,O1w,l1x),l1h => array(O1c,O1l),O1h => array(O1r,O1y),l1i => array(O1z),O1i => array(O1r,O1v,O1x),l1j => array(O1r,O1v),O1j => array(NULL,l1d,O1l),l1k => array(NULL,l1d,O1l),l1l => array(NULL,l1q),O1l => array(l1h,l1f,l1m),l1m => array(O1p,O1q,l1r,l1s,l1z),l1n => array(l1t,O20),O1n => array(O19,l1i,O1l,l20),l1p => array(O1r),l1o => array(NULL),O1o => array(l1l,O1r,l20)); $Oak=array(lj,Oj,lk,Ok,ll,lm); \ No newline at end of file +namespace kibella; if (LOG) { global $l8b; $l8b=@fopen(LOGFILE,"a+"); } global $l4b; global $O65; global $O4q; global $O4p; global $l9e; global $O5b; global $O8x; global $l8y; global $lbr; global $Obr; global $lbs; $l4b=array("sqlite" => O18,"sqlserver" => l19); $O65=array_keys($l4b); $l6e=array(O17); $O4q=array(O18 => O17,l19 => l18); $O4p=array(O19 => array(O1a => "(",l1b => ")",O18 => "select * from sqlite_master where lower(type) = 'table' and lower(name) = lower",l19 => "select * from MASTER.INFORMATION_SCHEMA.TABLES where upper(TABLE_TYPE) = 'BASE TABLE' and\n\t\t\t\t\t\t\t\tlower(TABLE_CATALOG) + '.' + lower(TABLE_SCHEMA) + '.' + lower(TABLE_NAME) = lower",),l1a => array(O1a => "(",l1b => ")",O18 => "PRAGMA table_info",l19 => "select COLUMN_NAME as name, DATA_TYPE as type from INFORMATION_SCHEMA.COLUMNS\n \t\t\t\t\t\t\t\twhere lower(TABLE_CATALOG) + '.' + lower(TABLE_SCHEMA) + '.' + lower(TABLE_NAME) = lower"),); $l9e=array(O1b => array(O18 => "rowid",l19 => "row_number() over (order by (select null))",),l1c => array(O18 => "IFNULL",l19 => "ISNULL")); $O5b=array("s" => "second","m" => "minute","h" => "hour","d" => "day","w" => "week","M" => "month","y" => "year"); $l8y=array(l20 => "avg",O20 => "count(distinct",MAX => "max",MIN => "min",O21 => "percentiles",l22 => "stddev",O22 => "sum",l21 => "count",); $lbr=array(l20,O20,l21,MAX,MIN,O21,O22); $O8x=array(O23 => array(NULL),l24 => array(array_values($lbr),O23,O24,l25,O2b,O2c,l2d,O2i),O24 => array(NULL,l2h,O2l,l2q),l25 => array(NULL,l2h,O2l,l2q),O25 => array(O2d,l2e),O26 => array(O25,O24,O2f),l27 => array(NULL),l28 => array(O27,O28),l29 => array(NULL),O29 => array(l2s,l2t,l2v),l2a => array(NULL),O2a => array(O2m,O2o,l2p,O2q,l2r),l2b => array(O26,O2f),O2b => array(O2l,O2s),l2c => array(O2t),O2c => array(O2l,O2p,O2r),l2d => array(O2l,O2p),O2d => array(NULL,l27,O2f),l2e => array(NULL,l27,O2f),l2f => array(NULL,l2k),O2f => array(l2b,l29,l2g),l2g => array(O2j,O2k,l2l,l2m,l2t),l2h => array(l2n,O2u),O2h => array(O23,l2c,O2f,l2u),l2j => array(O2l),l2i => array(NULL),O2i => array(l2f,O2l,l2u)); $Obr=array(l1f,O1f,l1g,O1g,l1h,O1h); \ No newline at end of file diff --git a/JSON_SQL_Bridge/requests.php b/JSON_SQL_Bridge/requests.php index 937c69f..cd0eb5b 100644 --- a/JSON_SQL_Bridge/requests.php +++ b/JSON_SQL_Bridge/requests.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; require_once "config.php"; ob_start(); l9t("200 OK"); $Oa0=$_SERVER["REQUEST_URI"]; $Oal=$_SERVER["REQUEST_METHOD"]; $O9d=file_get_contents("php://input"); $l6f=json_decode($O9d,TRUE); $lam=O7; if (preg_match( "/$lam%2C/" ,$Oa0)) { if (array_key_exists("docs",$l6f)) { O2f("{\"docs\":["); for ($l2v=0; $l2v0) O2f(","); l5x("","",1,lo,"false"); } O2f("]}"); } } else if (preg_match("/_msearch/i",$Oa0)) { l9d($O9d); $l6f=explode("\n",$O9d); if (count($l6f)>1) { $O4i=$l6f[1]; l9y(O12,$O4i); } } else if (preg_match("/_mapping\\/field\\//i",$Oa0)) { $lan=la0($Oa0,ESDIRNAME,"begin"); $O28=$lan["object"]; O6o($O28); } else if (preg_match("/index-pattern\\/\$/i",$Oa0)) { $lan=la0($Oa0,ESDIRNAME,"begin"); $l22=$lan["object"]; l5x("index-pattern",$l22,1,lo,"true"); } else if (preg_match("/index-pattern\\/_search/i",$Oa0)) { O70(lr,lh,"*"); } else if (preg_match("/index-pattern/i",$Oa0)) { $lan=la0($Oa0,ESDIRNAME,"end"); $O28=$lan["object"]; if ($Oal == "POST") { l5x("index-pattern",$O28,1,lo,"true"); } else if ($Oal == "DELETE") { O5u(lr,lh,$O28); } } else if (preg_match("/_update\$/i",$Oa0)) { l9y(l12,$l6f["doc"]["defaultIndex"],$O9y="raw"); } else if (preg_match("/(dashboard|search|visualization)\\/_search/i",$Oa0,$O3e)) { assert(count($O3e)>=2,"Variable \$matches with the matched pattern has at least 1 element (found ".count($O3e).")"); $Oan=$O3e[1]; assert(array_key_exists("query",$l6f),"Attribute 'query' exists in the request array"); if (array_key_exists("simple_query_string",$l6f["query"]) && array_key_exists("query",$l6f["query"]["simple_query_string"])) { $O4n=$l6f["query"]["simple_query_string"]["query"]; } else { $O4n="*"; } O70(Ov,$Oan,$O4n); } else if (preg_match("/\\/dashboard|\\/search|\\/visualization/i",$Oa0,$O3e)) { assert(count($O3e)>=1,"Variable \$matches with the matched pattern has at least 1 element (found ".count($O3e).")"); $Oan=substr($O3e[0],1); $lan=la0($Oa0,ESDIRNAME,"end"); $O28=$lan["object"]; if ($Oal == "POST") { $l6w=$O9d; O6v($Oan,$l6w); } else if ($Oal == "GET") { $O28=la8($O28); l6g($Oan,$O28,$O6g=FALSE); } else if ($Oal == "DELETE") { $O28=la8($O28); O5u(Ov,$Oan,$O28); } } else if (preg_match("/\\/_search/i",$Oa0,$O3e)) { $lao=str_replace($O3e[0],"",$Oa0); $lan=la0($lao,ESDIRNAME,"end"); $O22=$lan["object"]; if (count($l6f["query"]["ids"]["values"])>0) { $O6j=$l6f["query"]["ids"]["values"][0]; O6i($O22,$O9d,$O6j); } } else if (preg_match("/_mget/i",$Oa0)) { assert(array_key_exists("docs",$l6f),"Attribute 'docs' exists in the request array"); assert(count($l6f["docs"] == 1),"There is only one request in the request array"); if (array_key_exists(lk,$l6f["docs"][0])) { $O28=$l6f["docs"][0][lk]; } else { $O28=""; } if (array_key_exists(Oj,$l6f["docs"][0])) { $O2e=$l6f["docs"][0][Oj]; switch ($O2e) { case (lg): l9u(); break; case (Og): case (Oh): case (Oi): l6g($O2e,$O28); break; case (lh): l6o($O28); break; default : break; } } } else { $Oa4=la5($Oa0); $Oa5=$Oa4["URI"]; $Oao=str_replace("/".ESDIRNAME,"",$Oa5); $Oao=str_replace(O7,"_kibana_4",$Oao); $Oao=preg_replace("/[\\/\\-\\.\\*]/","_",$Oao); if (function_exists( "kibella\\$Oao")) { call_user_func( "kibella\\$Oao"); } } ob_end_flush(); if (LOG) { fclose($O79); } exit; \ No newline at end of file +namespace kibella; require_once "config.php"; ob_start(); Ob0("200 OK"); $lb8=$_SERVER["REQUEST_URI"]; $Obs=$_SERVER["REQUEST_METHOD"]; $Oal=file_get_contents("php://input"); $l7j=json_decode($Oal,TRUE); $lbt=O12; if (preg_match( "/$lbt%2C/" ,$lb8)) { if (array_key_exists("docs",$l7j)) { O36("{\"docs\":["); for ($O3u=0; $O3u0) O36(","); O70("","",1,O1j,"false"); } O36("]}"); } } else if (preg_match("/_msearch/i",$lb8)) { lal($Oal); $l7j=explode("\n",$Oal); if (count($l7j)>1) { $O5h=$l7j[1]; Ob5(O1w,$O5h); } } else if (preg_match("/_mapping\\/field\\//i",$lb8)) { $lbu=Ob7($lb8,ESDIRNAME,"begin"); $O1=$lbu["object"]; O7s($O1); } else if (preg_match("/index-pattern\\/\$/i",$lb8)) { $lbu=Ob7($lb8,ESDIRNAME,"begin"); $O30=$lbu["object"]; O70("index-pattern",$O30,1,O1j,"true"); } else if (preg_match("/index-pattern\\/_search/i",$lb8)) { l82(O1m,O1d,"*"); } else if (preg_match("/index-pattern/i",$lb8)) { $lbu=Ob7($lb8,ESDIRNAME,"end"); $O1=$lbu["object"]; if ($Obs == "POST") { O70("index-pattern",$O1,1,O1j,"true"); } else if ($Obs == "DELETE") { l6y(O1m,O1d,$O1); } } else if (preg_match("/_update\$/i",$lb8)) { Ob5(l1w,$l7j["doc"]["defaultIndex"],$lb6="raw"); } else if (preg_match("/(dashboard|search|visualization)\\/_search/i",$lb8,$l4h)) { assert(count($l4h)>=2,"Variable \$matches with the matched pattern has at least 1 element (found ".count($l4h).")"); $Obu=$l4h[1]; assert(array_key_exists("query",$l7j),"Attribute 'query' exists in the request array"); if (array_key_exists("simple_query_string",$l7j["query"]) && array_key_exists("query",$l7j["query"]["simple_query_string"])) { $O5m=$l7j["query"]["simple_query_string"]["query"]; } else { $O5m="*"; } l82(l3,$Obu,$O5m); } else if (preg_match("/\\/dashboard|\\/search|\\/visualization/i",$lb8,$l4h)) { assert(count($l4h)>=1,"Variable \$matches with the matched pattern has at least 1 element (found ".count($l4h).")"); $Obu=substr($l4h[0],1); $lbu=Ob7($lb8,ESDIRNAME,"end"); $O1=$lbu["object"]; if ($Obs == "POST") { $O7x=$Oal; l7x($Obu,$O7x); } else if ($Obs == "GET") { $O1=lbf($O1); l7k($Obu,$O1,$O7k=FALSE); } else if ($Obs == "DELETE") { $O1=lbf($O1); l6y(l3,$Obu,$O1); } } else if (preg_match("/\\/_search/i",$lb8,$l4h)) { $lbv=str_replace($l4h[0],"",$lb8); $lbu=Ob7($lbv,ESDIRNAME,"end"); $l31=$lbu["object"]; if (count($l7j["query"]["ids"]["values"])>0) { $O7n=$l7j["query"]["ids"]["values"][0]; O7m($l31,$Oal,$O7n); } } else if (preg_match("/_mget/i",$lb8)) { assert(array_key_exists("docs",$l7j),"Attribute 'docs' exists in the request array"); assert(count($l7j["docs"] == 1),"There is only one request in the request array"); if (array_key_exists(l1g,$l7j["docs"][0])) { $O1=$l7j["docs"][0][l1g]; } else { $O1=""; } if (array_key_exists(O1f,$l7j["docs"][0])) { $l52=$l7j["docs"][0][O1f]; switch ($l52) { case (l1d): Ob1(); break; case (O4): case (l1e): case (O1e): l7k($l52,$O1); break; case (O1d): l7s($O1); break; default : break; } } } else { $Obb=lbc($lb8); $Obc=$Obb["URI"]; $Obv=str_replace("/".ESDIRNAME,"",$Obc); $Obv=str_replace(O12,"_kibana_4",$Obv); $Obv=preg_replace("/[\\/\\-\\.\\*]/","_",$Obv); if (function_exists( "kibella\\$Obv")) { call_user_func( "kibella\\$Obv"); } } ob_end_flush(); if (LOG) { fclose($l8b); } exit; \ No newline at end of file diff --git a/JSON_SQL_Bridge/reset.php b/JSON_SQL_Bridge/reset.php index cd4383c..7736ebb 100644 --- a/JSON_SQL_Bridge/reset.php +++ b/JSON_SQL_Bridge/reset.php @@ -8,4 +8,4 @@ If you are interested in distributing, reselling, modifying, contibuting or in general creating any derivative work from JSON_SQL_Bridge, please contact Frank Vanden Berghen at frank@timi.eu. */ -namespace kibella; require_once __DIR__."/config.php"; $O21=TABLESDIR."/".KIBELLADB; $Oaf=FALSE; $l29=checkdirexistsorcreate(TABLESDIR,$l2t=FALSE); if ($l29 === FALSE) { O29("",lc,l59().O59()); exit; } else { echo "

    Kibella reset process started

    "; if (file_exists($O21)) { $l29=unlink($O21); if (!$l29) { O29("\t\t",lc,"Could not delete database file '".$O21."'.\nThe process aborts.\n"); exit; } } } $l29=O5a($O77=NULL,$l2t=TRUE); $Oaf=!$l29; if ($Oaf === FALSE) { $l22="income"; $O21="income.sqlite"; $O24="sqlite"; $l25=""; $O25=""; $l26=""; $O26=1; $l27=array("table" => $l22,"db" => $O21,"dbtype" => $O24,"datefields" => $l25,"geofields" => $O25,"linkfields" => $l26,"enablecache" => $O26); $O27=l28($l27); $Oaf=!$l29 && !$O27["rc"]; } $l29=checkdirexistsorcreate(CACHEDIR,$l2t=FALSE); if ($l29 === FALSE) { $Oaf=TRUE; } else { $O9k=deletedir(CACHEDIR,$O2v=TRUE); if ($O9k) echo l6v("Cache files"); $Oaf=!$O9k; } if ($Oaf === FALSE) { echo "

    System successfully reset

    "; } else { echo "

    ERRORS FOUND! Check messages shown above.

    "; } \ No newline at end of file +namespace kibella; require_once __DIR__."/config.php"; $l30=TABLESDIR."/".KIBELLADB; $Obm=FALSE; $O3s=checkdirexistsorcreate(TABLESDIR,$O3r=FALSE); if ($O3s === FALSE) { showmessage("",TAG_ERROR,l69().O69()); exit; } else { echo "

    Kibella reset process started

    "; if (file_exists($l30)) { $O3s=unlink($l30); if (!$O3s) { showmessage("\t\t",TAG_ERROR,"Could not delete database file '".$l30."'.\nThe process aborts.\n"); exit; } } } $O3s=l6a($O89=NULL,$O3r=TRUE); $Obm=!$O3s; if ($Obm === FALSE) { $O30="income"; $l30="income.sqlite"; $lp=O18; $l6p=""; $O6p=""; $O7h=""; $O7v=1; $l7h=array("table" => $O30,"db" => $l30,"dbengine" => $lp,"datefields" => $l6p,"geofields" => $O6p,"linkfields" => $O7h,"enablecache" => $O7v); $l67=dbregistertable($l7h); $Obm=!$O3s && !$l67["rc"]; } $O3s=checkdirexistsorcreate(CACHEDIR,$O3r=FALSE); if ($O3s === FALSE) { $Obm=TRUE; } else { $Oar=deletedir(CACHEDIR,$l3v=TRUE); if ($Oar) echo l6l("Cache files"); $Obm=!$Oar; } if ($Obm === FALSE) { echo "

    System successfully reset

    "; } else { echo "

    ERRORS FOUND! Check messages shown above.

    "; } \ No newline at end of file diff --git a/JSON_SQL_Bridge/table/actions/insert.php b/JSON_SQL_Bridge/table/actions/insert.php deleted file mode 100644 index 5e423db..0000000 --- a/JSON_SQL_Bridge/table/actions/insert.php +++ /dev/null @@ -1,98 +0,0 @@ - - *
  • db name of the database where the table is located with no indication of the path (e.g. CensusIncome.sqlite) - *
  • table name of the table for which the index should be created (e.g. census) - * - * */ - -/*-------------------------- GET DATA FROM THE FORM ---------------------------*/ -$table = $_POST['table']; -$db = $_POST['db']; -$dbtype = "sqlite"; // In the future this attribute would be read from the form -$datefields = $_POST['datefields']; // This is expected to be a list of date fields separated by commas -$geofields = $_POST['geofields']; // This is expected to be a list of geo-coordinate fields separated by commas -$linkfields = $_POST['linkfields']; // This is expected to be a list of link fields separated by commas -$enablecache = $_POST['enablecache']; // Flag 0/1 indicating whether to enable the cache for the table -$aTableInfo = array( - 'table' => $table, - 'db' => $db, - 'dbtype' => $dbtype, - 'datefields' => $datefields, - 'geofields' => $geofields, - 'linkfields' => $linkfields, - 'enablecache' => $enablecache -); -/*-------------------------- GET DATA FROM THE FORM ---------------------------*/ - - -/*---------------------------- REGISTER THE TABLE -----------------------------*/ -// Save the table information in Kibella's database -$aResult = dbRegisterTable($aTableInfo); -$id = $aResult['id']; // Table ID -$rc = $aResult['rc']; // Return code - -// Check the return code and show a message accordingly -if ($rc === FALSE) { - showMessage(__FILE__, TAG_ERROR_INTERNAL, msgErrorInternalTablesDir()); -} else { - switch ($rc) { - case (RC_NOTE_TABLE_ADDED): - showMessage("", TAG_NOTE, msgNoteTableRegistrationAdded($table, $db, $id, $enablecache)); - break; - case (RC_NOTE_TABLE_UPDATED): - showMessage("", TAG_NOTE, msgNoteTableRegistrationUpdated($table, $db, $id, $enablecache)); - break; - case (RC_ERROR_NOTFOUND_DB): - showMessage("", TAG_ERROR, msgErrorDatabaseNotFound(DATADIR . "/" . $db)); - break; - case (RC_ERROR_NOTFOUND_TABLE): - showMessage("", TAG_ERROR, msgErrorTableNotFound($table, DATADIR . "/" . $db)); - break; - default: - showMessage(__FILE__, TAG_ERROR_INTERNAL, msgErrorInternalReturnCode($rc)); - break; - } -} - -// List the fields of special type (e.g. date, geo, link) specified by the user that were found in the user table -if ($datefields !== "" or $geofields !== "" or $linkfields !== "") { - // Show a message with the fields registered as special-type fields - echo "

    The following fields were registered as fields of special type:

    "; - $aFields = dbGetFieldTypes($id); - if ($aFields == null || count($aFields) == 0) { - echo "No fields were registered as fields of special type."; - } else { - foreach ($aFields as $field => $type) { - if ($type === "date" || $type === "geo_point" || $type === "url") { - echo "$type: $field
    "; - } - } - } - /* // (2016/07/29) This was commented out because the information of the date fields not found in the user data is no longer returned by dbGetFieldTypes() nor dbCreateTableIndex(). -// Check if any date fields were not found in the user table and show a message -if (count($aIndex['notfound']) > 0) { - showMessage("", TAG_WARNING, "The following date fields were not found in table '$table':\n"); - foreach ($aIndex['notfound'] as $field) { - echo "$field
    "; - } -} -*/ -} \ No newline at end of file diff --git a/JSON_SQL_Bridge/users/manager.php b/JSON_SQL_Bridge/users/manager.php index 8b720c8..32c0bd8 100644 --- a/JSON_SQL_Bridge/users/manager.php +++ b/JSON_SQL_Bridge/users/manager.php @@ -10,10 +10,7 @@ */ namespace kibella; -require_once(__DIR__ . '/../constants.php'); -require_once(__DIR__ . '/../functionsdb.php'); -require_once(__DIR__ . '/../classes.php'); - +require_once __DIR__ . '/../config.php'; class UserManager { private $db_connection = null; @@ -33,12 +30,11 @@ public function __construct() { public function getAll() { $this->checkIfAdmin(); - - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); + $this->db_connection = dbCreateDBH(KIBELLADB); $sql = 'SELECT * FROM Users'; - $result_rows = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="sqlite"); + $result_rows = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="query"); return $result_rows; } @@ -47,11 +43,11 @@ public function getUser($id) { if($id) { $id = addslashes(htmlentities($id, ENT_QUOTES)); - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); + $this->db_connection = dbCreateDBH(KIBELLADB); $sql = 'SELECT * FROM Users WHERE id = "' . $id . '"'; - $result = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="sqlite"); + $result = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="query"); if($result[0]) return $result[0]; @@ -62,37 +58,37 @@ public function getUser($id) { public function register(){ $this->checkIfAdmin(); - if ($this->checkRegistrationData($edit=false)) { - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); + $this->db_connection = dbCreateDBH(KIBELLADB); if ($this->db_connection) { - $this->createNewUser(); + if ($this->createNewUser()) + { + return true; + } } - } + } - return $this->error; + return false; } public function delete() { $this->checkIfAdmin(); - - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); + $this->db_connection = dbCreateDBH(KIBELLADB); if ($this->db_connection) { $email = addslashes(htmlentities($_POST["delete"], ENT_QUOTES)); $sql = 'DELETE FROM Users WHERE email = "' . $email . '"'; - $result = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="exec"); + $result = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="exec"); if($result) { $this->success = $email . ' account has been deleted.'; - } else { - $this->error = 'An error occured while deleting ' . $email . ' account.'; + return true; } + $this->error = 'An error occured while deleting ' . $email . ' account.'; } - - return $this->error; + return false; } public function edit() { @@ -100,23 +96,24 @@ public function edit() { $this->error = "You don't have the rights to do this."; return $this->error; } - if(isset($_POST['id'])) { if ($this->checkRegistrationData($edit=true)) { - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); + $this->db_connection = dbCreateDBH(KIBELLADB); if ($this->db_connection) { - $id = addslashes(htmlentities($_POST['id'], ENT_QUOTES)); + $id = addslashes(htmlentities($_GET['id'], ENT_QUOTES)); $email = addslashes(htmlentities($_POST['email'], ENT_QUOTES)); + $firstname = addslashes(htmlentities($_POST['firstname'], ENT_QUOTES)); $lastname = addslashes(htmlentities($_POST['lastname'], ENT_QUOTES)); $is_admin = addslashes(htmlentities($_POST['is_admin'], ENT_QUOTES)); $password = NULL; - if(isset($_POST['password'])) { $password = addslashes(htmlentities($_POST['password'], ENT_QUOTES)); } - $sql = 'UPDATE Users SET firstname = "' . $firstname . '",lastname = "' . $lastname . '",email = "' . $email . '",is_admin = "' . $is_admin . '"'; + $mytime = strftime("%Y/%m/%d %H:%M:%S", time()); + $sql = 'UPDATE Users SET firstname = "' . $firstname . '",lastname = "' . $lastname . '",email = "' . $email . + '",is_admin = "' . $is_admin . '", lastUpdate="'.$mytime.'"'; if(!empty($password)) { $password_hash = password_hash($password, PASSWORD_DEFAULT); @@ -125,7 +122,7 @@ public function edit() { $sql .= ' WHERE id = "' . $id . '"'; - $result = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="exec"); + $result = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="exec"); if($result) { $this->success = 'Account ' . $id . ' has been edited.'; @@ -143,7 +140,6 @@ public function edit() { public function createNewUser() { $this->checkIfAdmin(); - $user_email = addslashes(htmlentities($_POST['email'], ENT_QUOTES)); $user_password = addslashes(htmlentities($_POST['password'], ENT_QUOTES)); $user_firstname = addslashes(htmlentities($_POST['firstname'], ENT_QUOTES)); @@ -158,15 +154,16 @@ public function createNewUser() { // the constant PASSWORD_DEFAULT comes from PHP 5.5 $user_password_hash = password_hash($user_password, PASSWORD_DEFAULT); $sql = 'SELECT * FROM Users WHERE email = "' . $user_email . '"'; - - $result_row = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="sqlite"); + + $result_row = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="query"); if ($result_row) { $this->error = "Sorry, that email is already taken. Please choose another one."; } else { - $sql = 'INSERT INTO Users (email, password, firstname, lastname, is_admin) - VALUES("' . $user_email . '", "' . $user_password_hash . '", "' . $user_firstname . '", "' . $user_lastname . '", "' . $user_is_admin . '")'; - - $registration_success_state = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="exec"); + $mytime = strftime("%Y/%m/%d %H:%M:%S", time()); + $sql = 'INSERT INTO Users (email, password, firstname, lastname, is_admin, lastUpdate) + VALUES("' . $user_email . '", "' . $user_password_hash . '", "' . $user_firstname . '", "' . $user_lastname . '", "' . + $user_is_admin .'","'.$mytime.'")'; + $registration_success_state = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="exec"); if ($registration_success_state) { $this->success = "User created successfully."; return true; @@ -175,21 +172,20 @@ public function createNewUser() { } } - return $this->error; + return false; } - public function checkRegistrationData($edit=false) { // Validate inputs and fill error variable if (!empty($_POST['firstname']) - && strlen($_POST['firstname']) <= 64 - && preg_match('/^[A-Za-z-é]{2,64}$/i', $_POST['firstname']) + && strlen($_POST['firstname']) >= 4 + //&& preg_match('/^[A-Za-z-é]{2,64}$/i', $_POST['firstname']) && !empty($_POST['lastname']) - && strlen($_POST['lastname']) <= 64 - && preg_match('/^[A-Za-z-é]{2,64}$/i', $_POST['lastname']) + && strlen($_POST['lastname']) >= 4 + //&& preg_match('/^[A-Za-z-é]{2,64}$/i', $_POST['lastname']) && !empty($_POST['email']) - && strlen($_POST['email']) <= 64 - && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) + && strlen($_POST['email']) >= 4 + //&& filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) && (($edit == true && empty($_POST['password'])) || (($edit == false || $edit == true && !empty($_POST['password'])) && !empty($_POST['password']) && strlen($_POST['password']) >= 6 && !empty($_POST['password_repeat']) @@ -202,36 +198,33 @@ public function checkRegistrationData($edit=false) { } elseif ((empty($_POST['password']) || empty($_POST['password_repeat'])) && $edit == false) { $this->error = "Empty password."; } elseif ($_POST['password'] !== $_POST['password_repeat'] && ($edit == false || $edit == true && !empty($_POST['password']))) { - $this->error = "Password and password repeat are not the same."; + $this->error = "The 2 Passwords are not the same."; } elseif (strlen($_POST['password']) < 6 && ($edit == false || $edit == true && !empty($_POST['password']))) { $this->error = "Password has a minimum length of 6 characters."; - } elseif (strlen($_POST['firstname']) > 64 || strlen($_POST['firstname']) < 2) { - $this->error = "First name cannot be shorter than 2 or longer than 64 characters."; - } elseif (!preg_match('/^[A-Za-z-]{2,64}$/i', $_POST['firstname'])) { - $this->error = "First name does not fit the name scheme: only a-Z and dash are allowed, 2 to 64 characters."; - } elseif (strlen($_POST['lastname']) > 64 || strlen($_POST['lastname']) < 2) { - $this->error = "Last name cannot be shorter than 2 or longer than 64 characters."; - } elseif (!preg_match('/^[A-Za-z-]{2,64}$/i', $_POST['lastname'])) { - $this->error = "Last name does not fit the name scheme: only a-Z and dash are allowed, 2 to 64 characters."; + } elseif (strlen($_POST['firstname']) < 4) { + $this->error = "First name cannot be shorter than 4 characters."; +// } elseif (!preg_match('/^[A-Za-z-]{2,64}$/i', $_POST['firstname'])) { +// $this->error = "First name does not fit the name scheme: only a-Z and dash are allowed, 2 to 64 characters."; + } elseif (strlen($_POST['lastname']) < 4) { + $this->error = "Last name cannot be shorter than 4 characters."; +// } elseif (!preg_match('/^[A-Za-z-]{2,64}$/i', $_POST['lastname'])) { +// $this->error = "Last name does not fit the name scheme: only a-Z and dash are allowed, 2 to 64 characters."; } elseif (empty($_POST['email'])) { $this->error = "Email cannot be empty."; - } elseif (strlen($_POST['email']) > 64) { - $this->error = "Email cannot be longer than 64 characters."; - } elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { - $this->error = "Your email address is not in a valid email format."; + } elseif (strlen($_POST['email']) < 4) { + $this->error = "Email cannot be shorter than 4 characters."; +// } elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { +// $this->error = "Your email address is not in a valid email format."; } else { $this->error = "An unknown error occurred."; } - return false; + return $this->error; } - private function checkIfAdmin() { $user = new User(); - if($user->isAdmin() !== true) { exit('You are not an administrator. (what are you doing here?!)'); } } - } \ No newline at end of file diff --git a/JSON_SQL_Bridge/users/session.php b/JSON_SQL_Bridge/users/session.php index 0c5050d..5f95f9e 100644 --- a/JSON_SQL_Bridge/users/session.php +++ b/JSON_SQL_Bridge/users/session.php @@ -10,9 +10,7 @@ */ namespace kibella; -require_once(__DIR__ . '/../constants.php'); -require_once(__DIR__ . '/../functionsdb.php'); -require_once(__DIR__ . '/../classes.php'); +require_once __DIR__ . '/../config.php'; class Session { @@ -34,8 +32,8 @@ public function __construct() { private function login() { if ($this->checkLoginFormDataNotEmpty()) { - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); - if ($this->db_connection) { + $this->db_connection = dbCreateDBH(KIBELLADB); + if ($this->db_connection->getDBHandle()) { $this->checkPasswordCorrectnessAndLogin(); } } @@ -54,7 +52,7 @@ private function checkPasswordCorrectnessAndLogin() { WHERE email = "' . addslashes(htmlentities($_POST['email'], ENT_QUOTES)) . '" LIMIT 1'; - $result_row = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="sqlite"); + $result_row = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="query"); if ($result_row) { // using PHP 5.5's password_verify() function to check password if ((!strlen($result_row[0]['password']))||(password_verify($_POST['password'], $result_row[0]['password']))) { diff --git a/JSON_SQL_Bridge/users/user.php b/JSON_SQL_Bridge/users/user.php index 7aaccd1..7d8442f 100644 --- a/JSON_SQL_Bridge/users/user.php +++ b/JSON_SQL_Bridge/users/user.php @@ -10,9 +10,7 @@ */ namespace kibella; -require_once(__DIR__ . '/../constants.php'); -require_once(__DIR__ . '/../functionsdb.php'); -require_once(__DIR__ . '/../classes.php'); +require_once __DIR__ . '/../config.php'; class User { @@ -22,14 +20,14 @@ public function me() { if($this->isLoggedIn()) { $id = addslashes(htmlentities($_SESSION['id'], ENT_QUOTES)); - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); + $this->db_connection = dbCreateDBH(KIBELLADB); - $sql = 'SELECT * + $sql = 'SELECT firstname, lastname, email, is_admin FROM Users WHERE id = "' . $id . '" LIMIT 1'; - $result = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="sqlite"); + $result = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="query"); if(isset($result[0])) return $result[0]; @@ -53,14 +51,14 @@ public function isAdmin() { if($this->isLoggedIn()) { $id = addslashes(htmlentities($_SESSION['id'], ENT_QUOTES)); - $this->db_connection = dbDBHCreate(KIBELLADB, TABLESDIR, $mode="sqlite"); + $this->db_connection = dbCreateDBH(KIBELLADB); $sql = 'SELECT is_admin FROM Users WHERE id = "' . $id . '" LIMIT 1'; - $result = dbDBHExecuteSqlQuery($this->db_connection, $sql, $mode="sqlite"); + $result = dbDBHExecuteSqlQuery($this->db_connection->getDBHandle(), $sql, $mode="query"); if($result[0]['is_admin'] == "true" || $result[0]['is_admin'] == "TRUE") return true; diff --git a/README.md b/README.md index ce8f958..ccb7e57 100644 --- a/README.md +++ b/README.md @@ -61,15 +61,21 @@ For windows developers, the best way to work on Kibella is to use the "Ubuntu on Windows". More information on this subject here: https://docs.microsoft.com/en-us/windows/wsl/install-win10 +from https://linuxize.com/post/how-to-install-node-js-on-ubuntu-18.04/: +sudo curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - +sudo apt-get install nodejs +sudo apt-get install make +cd /mnt/f/soft/UwAmp2/www/kibella_src + 1. Install npm dependencies at root of project for Grunt & Webpack and in `/interface` for - front-end dependencies with `npm install` in `/` + front-end dependencies with `sudo npm install` in `/` This should download & unpack a whole bunch of required third party librairies. These librairies will be located in the 2 directories "node_modules" and "interface/node_modules". For your convenience, I packed all these librairies in one big zip file here: https://github.com/Kranf99/kibella/releases/tag/v0.1 2. If it's your first time using grunt, you must install it globally - with `npm install -g grunt-cli` + with `sudo npm install -g grunt-cli` # Config @@ -92,7 +98,7 @@ and keep the process alive for watching your modifications (webpack --watch)* ## Distribution ``` -(sudo) grunt dist +(sudo) grunt dist --force ``` *This will delete all in `/dist` if it exist, copy all the non-interface folders diff --git a/interface/components/agg_types/_agg_type.js b/interface/components/agg_types/_agg_type.js index c870cd3..559143a 100644 --- a/interface/components/agg_types/_agg_type.js +++ b/interface/components/agg_types/_agg_type.js @@ -24,7 +24,7 @@ define(function (require) { this.name = config.name; /** - * the name of the elasticsearch aggregation that this aggType represents. Usually just this.name + * the name of the aggregation that this aggType represents. Usually just this.name * * @property name * @type {string} diff --git a/interface/components/agg_types/buckets/terms.js b/interface/components/agg_types/buckets/terms.js index a47af48..9d9824c 100644 --- a/interface/components/agg_types/buckets/terms.js +++ b/interface/components/agg_types/buckets/terms.js @@ -143,9 +143,6 @@ define(function (require) { var orderAgg = agg.params.orderAgg || vis.aggs.getResponseAggById(agg.params.orderBy); - // TODO: This works around an Elasticsearch bug the always casts terms agg scripts to strings - // thus causing issues with filtering. This probably causes other issues since float might not - // be able to contain the number on the elasticsearch side if (output.params.script) { output.params.valueType = agg.field().type === 'number' ? 'float' : agg.field().type; } diff --git a/interface/components/agg_types/controls/field.html b/interface/components/agg_types/controls/field.html index 48cb9e2..3c030f7 100644 --- a/interface/components/agg_types/controls/field.html +++ b/interface/components/agg_types/controls/field.html @@ -9,9 +9,7 @@

    - Careful! The field selected contains analyzed strings. Analyzed strings are highly unique and can use a lot of memory to visualize. Values such as foo-bar will be broken into foo and bar. See Mapping Core Types for more information on setting this field as not_analyzed -

    - + Careful! The selected field contains analyzed strings. Analyzed strings are highly unique and can use a lot of memory to visualize.

    Tip: {{agg.params.field.name + '.raw'}} may be a not_analyzed version of this field.

    @@ -31,7 +29,7 @@

    - No Compatible Fields: The "{{ vis.indexPattern.id }}" index pattern does not contain any of the following field types: {{ agg.type.params.byName.field.filterFieldTypes | commaList:false }} + No Compatible Fields: The "{{ vis.indexPattern.id }}" Dataset does not contain any of the following field types: {{ agg.type.params.byName.field.filterFieldTypes | commaList:false }}

    diff --git a/interface/components/agg_types/controls/raw_json.html b/interface/components/agg_types/controls/raw_json.html index d27a1a4..a8d9460 100644 --- a/interface/components/agg_types/controls/raw_json.html +++ b/interface/components/agg_types/controls/raw_json.html @@ -5,7 +5,7 @@

    - Any JSON formatted properties you add here will be merged with the elasticsearch aggregation definition for this section. For example shard_size on a terms aggregation + Any JSON formatted properties you add here will be merged with the aggregation definition for this section. For example shard_size on a terms aggregation

    diff --git a/interface/components/config/defaults.js b/interface/components/config/defaults.js index dc7d5b5..9f8ac44 100644 --- a/interface/components/config/defaults.js +++ b/interface/components/config/defaults.js @@ -10,7 +10,7 @@ define(function () { }, 'sort:options': { value: '{ "unmapped_type": "boolean" }', - description: 'Options the Elasticsearch sort parameter', + description: 'Options the sort parameter', type: 'json' }, 'dateFormat': { @@ -35,8 +35,8 @@ define(function () { ' http://en.wikipedia.org/wiki/ISO_8601#Time_intervals' }, 'defaultIndex': { - value: null, - description: 'The index to access if no index is set', + value: "INCOME(income)", + description: 'The dataset to access if no dataset is set', }, 'metaFields': { value: ['_source', '_id', '_type', '_index'], @@ -90,7 +90,7 @@ define(function () { }, 'indexPattern:fieldMapping:lookBack': { value: 5, - description: 'For index patterns containing timestamps in their names, look for this many recent matching ' + + description: 'For datasets containing timestamps in their names, look for this many recent matching ' + 'patterns from which to query the field mapping.' }, 'format:defaultTypeMap': { diff --git a/interface/components/courier/data_source/_root_search_source.js b/interface/components/courier/data_source/_root_search_source.js index e14162f..30638f9 100644 --- a/interface/components/courier/data_source/_root_search_source.js +++ b/interface/components/courier/data_source/_root_search_source.js @@ -21,14 +21,14 @@ define(function (require) { * @return {Promise} */ function loadDefaultPattern() { - return notify.event('loading default index pattern', function () { + return notify.event('loading default Dataset', function () { var defId = config.get('defaultIndex'); return Promise.cast(defId && indexPatterns.get(defId)) .then(function (pattern) { pattern = pattern || undefined; globalSource.set('index', pattern); - notify.log('index pattern set to', defId); + notify.log('Current Dataset set to', defId); }); }); } diff --git a/interface/components/courier/fetch/_call_client.js b/interface/components/courier/fetch/_call_client.js index 2ac51a3..f0ef815 100644 --- a/interface/components/courier/fetch/_call_client.js +++ b/interface/components/courier/fetch/_call_client.js @@ -66,7 +66,7 @@ define(function (require) { }; // Now that all of THAT^^^ is out of the way, lets actually - // call out to elasticsearch + // call out to Back-end Promise.map(executable, function (req) { return Promise.try(req.getFetchParams, void 0, req) .then(function (fetchParams) { diff --git a/interface/components/courier/fetch/strategy/doc.js b/interface/components/courier/fetch/strategy/doc.js index 005de6d..8cc413c 100644 --- a/interface/components/courier/fetch/strategy/doc.js +++ b/interface/components/courier/fetch/strategy/doc.js @@ -15,8 +15,8 @@ define(function (require) { }, /** - * Fetch the multiple responses from the ES Response - * @param {object} resp - The response sent from Elasticsearch + * Fetch the multiple responses from the Back-end Response + * @param {object} resp - The response sent from Back-end * @return {array} - the list of responses */ getResponses: function (resp) { diff --git a/interface/components/courier/fetch/strategy/search.js b/interface/components/courier/fetch/strategy/search.js index 742fdc0..b593718 100644 --- a/interface/components/courier/fetch/strategy/search.js +++ b/interface/components/courier/fetch/strategy/search.js @@ -34,7 +34,7 @@ define(function (require) { /** * Fetch the multiple responses from the ES Response - * @param {object} resp - The response sent from Elasticsearch + * @param {object} resp - The response sent from Back-end * @return {array} - the list of responses */ getResponses: function (resp) { diff --git a/interface/components/courier/saved_object/saved_object.js b/interface/components/courier/saved_object/saved_object.js index cf1c62e..125675c 100644 --- a/interface/components/courier/saved_object/saved_object.js +++ b/interface/components/courier/saved_object/saved_object.js @@ -81,7 +81,7 @@ define(function (require) { return mappingSetup.setup(type, mapping); }) .then(function () { - // If there is not id, then there is no document to fetch from elasticsearch + // If there is not id, then there is no document to fetch from Back-end if (!self.id) { // just assign the defaults and be done _.assign(self, defaults); @@ -277,7 +277,7 @@ define(function (require) { }; /** - * Delete this object from Elasticsearch + * Delete this object from Back-end * @return {promise} */ self.delete = function () { diff --git a/interface/components/doc_table/lib/get_sort.js b/interface/components/doc_table/lib/get_sort.js index 18f5c47..2a85345 100644 --- a/interface/components/doc_table/lib/get_sort.js +++ b/interface/components/doc_table/lib/get_sort.js @@ -5,7 +5,7 @@ define(function (require) { * Take a sorting array and make it into an object * @param {array} 2 item array [fieldToSort, directionToSort] * @param {object} indexPattern used for determining default sort - * @returns {object} a sort object suitable for returning to elasticsearch + * @returns {object} a sort object suitable for returning to Back-end */ function getSort(sort, indexPattern) { var sortObj = {}; diff --git a/interface/components/errors.js b/interface/components/errors.js index 6cec8bf..d44a94b 100644 --- a/interface/components/errors.js +++ b/interface/components/errors.js @@ -56,7 +56,7 @@ define(function (require) { err = err || false; KbnError.call(this, - 'Request to Elasticsearch failed: ' + angular.toJson(resp || err.message), + 'Request to WebServer failed: ' + angular.toJson(resp || err.message), errors.RequestFailure); this.origError = err; @@ -133,7 +133,7 @@ define(function (require) { */ errors.CacheWriteFailure = function CacheWriteFailure() { KbnError.call(this, - 'A Elasticsearch cache write has failed.', + 'A cache write has failed.', errors.CacheWriteFailure); }; inherits(errors.CacheWriteFailure, KbnError); @@ -228,7 +228,7 @@ define(function (require) { inherits(errors.NotEnoughData, KbnError); /** - * error thrown when no results are returned from an elasticsearch query + * error thrown when no results are returned from a query */ errors.NoResults = function NoResults() { KbnError.call(this, @@ -238,7 +238,7 @@ define(function (require) { inherits(errors.NoResults, KbnError); /** - * error thrown when no results are returned from an elasticsearch query + * error thrown when no results are returned from a query */ errors.PieContainsAllZeros = function PieContainsAllZeros() { KbnError.call(this, @@ -248,7 +248,7 @@ define(function (require) { inherits(errors.PieContainsAllZeros, KbnError); /** - * error thrown when no results are returned from an elasticsearch query + * error thrown when no results are returned from a query */ errors.InvalidLogScaleValues = function InvalidLogScaleValues() { KbnError.call(this, diff --git a/interface/components/field_editor/scripting_warning.html b/interface/components/field_editor/scripting_warning.html index c525c9e..d800555 100644 --- a/interface/components/field_editor/scripting_warning.html +++ b/interface/components/field_editor/scripting_warning.html @@ -7,5 +7,5 @@

    - Scripted fields can be used to display and aggregate calculated values. As such, they can be very slow, and if done incorrectly, can cause Kibana to be unusable. There's no safety net here. If you make a typo, unexpected exceptions will be thrown all over the place! + Scripted fields can be used to display and aggregate calculated values. As such, they can be very slow, and if done incorrectly, can cause Kibella to become unusable. There's no safety net here. If you make a typo, unexpected exceptions will be thrown all over the place!

    diff --git a/interface/components/highlight/highlight_tags.js b/interface/components/highlight/highlight_tags.js index 2f6aea6..d5688b2 100644 --- a/interface/components/highlight/highlight_tags.js +++ b/interface/components/highlight/highlight_tags.js @@ -1,7 +1,7 @@ define(function (require) { var module = require('ui/modules').get('kibana'); - // By default, ElasticSearch surrounds matched values in . This is not ideal because it is possible that + // By default, Back-end surrounds matched values in . This is not ideal because it is possible that // the value could contain in the value. We define these custom tags that we would never expect to see // inside a field value. module.constant('highlightTags', { diff --git a/interface/components/index_patterns/_index_pattern.js b/interface/components/index_patterns/_index_pattern.js index 9817a3b..a71425b 100644 --- a/interface/components/index_patterns/_index_pattern.js +++ b/interface/components/index_patterns/_index_pattern.js @@ -75,7 +75,7 @@ define(function (require) { return mappingSetup.setup(type, mapping); }) .then(function () { - // If there is no id, then there is no document to fetch from elasticsearch + // If there is no id, then there is no document to fetch from Back-end if (!self.id) return; // fetch the object from ES diff --git a/interface/components/index_patterns/_map_field.js b/interface/components/index_patterns/_map_field.js index 1e6ce76..59040ae 100644 --- a/interface/components/index_patterns/_map_field.js +++ b/interface/components/index_patterns/_map_field.js @@ -5,7 +5,7 @@ define(function (require) { /** * Accepts a field object and its name, and tries to give it a mapping - * @param {Object} field - the field mapping returned by elasticsearch + * @param {Object} field - the field mapping returned by Back-end * @param {String} type - name of the field * @return {Object} - the resulting field after overrides and tweaking */ @@ -16,7 +16,7 @@ define(function (require) { var mapping = _.cloneDeep(field.mapping[keys.shift()]); mapping.type = castMappingType(mapping.type); - // Override the mapping, even if elasticsearch says otherwise + // Override the mapping, even if Back-end says otherwise var mappingOverrides = { _timestamp: { type: 'date', @@ -29,7 +29,7 @@ define(function (require) { }; if (!mapping.index || mapping.index === 'no') { - // elasticsearch responds with false sometimes and 'no' others + // Back-end responds with false sometimes and 'no' others mapping.indexed = false; } else { mapping.indexed = true; diff --git a/interface/components/index_patterns/_mapper.js b/interface/components/index_patterns/_mapper.js index d747b1e..2e5a478 100644 --- a/interface/components/index_patterns/_mapper.js +++ b/interface/components/index_patterns/_mapper.js @@ -100,7 +100,7 @@ define(function (require) { }; /** - * Clears mapping caches from elasticsearch and from local object + * Clears mapping caches from Back-end and from local object * @param {dataSource} dataSource * @returns {Promise} * @async diff --git a/interface/components/setup/steps/check_es_version.js b/interface/components/setup/steps/check_es_version.js index 5453404..a8bc667 100644 --- a/interface/components/setup/steps/check_es_version.js +++ b/interface/components/setup/steps/check_es_version.js @@ -32,10 +32,7 @@ define(function (require) { }); throw SetupError( - 'This version of Kibana requires Elasticsearch ' + - minimumElasticsearchVersion + ' or higher on all nodes. ' + - 'I found the following incompatible nodes in your cluster: \n\n' + - badNodeNames.join('\n') + 'This version of Kibeblla requires a specific Back-end' ); }); }); diff --git a/interface/components/setup/steps/check_for_es.js b/interface/components/setup/steps/check_for_es.js index 951f525..0e57be9 100644 --- a/interface/components/setup/steps/check_for_es.js +++ b/interface/components/setup/steps/check_for_es.js @@ -12,7 +12,7 @@ define(function (require) { if (err.body && err.body.message) { throw new SetupError(err.body.message, err); } else { - throw new SetupError('Unknown error while connecting to Elasticsearch', err); + throw new SetupError('Unknown error while connecting to Back-end server', err); } }) .then(complete, complete.failure); diff --git a/interface/components/setup/steps/check_for_kibana_index.js b/interface/components/setup/steps/check_for_kibana_index.js index ca962e3..bc8582a 100644 --- a/interface/components/setup/steps/check_for_kibana_index.js +++ b/interface/components/setup/steps/check_for_kibana_index.js @@ -9,7 +9,7 @@ define(function (require) { index: configFile.kibana_index }) .catch(function (err) { - throw new SetupError('Unable to check for Kibana index "<%= configFile.kibana_index %>"', err); + throw new SetupError('Unable to check for any Kibella back-end "<%= configFile.kibana_index %>"', err); }) .then(complete, complete.failure); }; diff --git a/interface/components/setup/steps/create_kibana_index.js b/interface/components/setup/steps/create_kibana_index.js index 840984c..71252be 100644 --- a/interface/components/setup/steps/create_kibana_index.js +++ b/interface/components/setup/steps/create_kibana_index.js @@ -14,7 +14,7 @@ define(function (require) { } }) .catch(function (err) { - throw new SetupError('Unable to create Kibana index "<%= configFile.kibana_index %>"', err); + throw new SetupError('Unable to create Kibella back-end "<%= configFile.kibana_index %>"', err); }) .then(function () { return es.cluster.health({ @@ -22,7 +22,7 @@ define(function (require) { index: configFile.kibana_index }) .catch(function (err) { - throw new SetupError('Waiting for Kibana index "<%= configFile.kibana_index %>" to come online failed', err); + throw new SetupError('Waiting for Kibella back-end "<%= configFile.kibana_index %>" to come online failed', err); }); }) .then(complete, complete.failure); diff --git a/interface/components/time_buckets/time_buckets.js b/interface/components/time_buckets/time_buckets.js index 1257634..084c253 100644 --- a/interface/components/time_buckets/time_buckets.js +++ b/interface/components/time_buckets/time_buckets.js @@ -178,8 +178,8 @@ define(function (require) { * - "10 days" * - "3 years" * - * interval.expr: the elasticsearch expression that creates this - * interval. If the interval does not properly form an elasticsearch + * interval.expr: the expression that creates this + * interval. If the interval does not properly form an * expression it will be forced into one. * * interval.scaled: the interval was adjusted to diff --git a/interface/components/vis/_agg_config_result.js b/interface/components/vis/_agg_config_result.js index d1b4c8b..d2bfb77 100644 --- a/interface/components/vis/_agg_config_result.js +++ b/interface/components/vis/_agg_config_result.js @@ -28,8 +28,8 @@ define(function () { }; /** - * Returns an Elasticsearch filter that represents the result. - * @returns {object} Elasticsearch filter + * Returns a filter that represents the result. + * @returns {object} filter */ AggConfigResult.prototype.createFilter = function () { return this.aggConfig.createFilter(this.key); diff --git a/interface/components/vislib/lib/data.js b/interface/components/vislib/lib/data.js index 084f48a..b3874d0 100644 --- a/interface/components/vislib/lib/data.js +++ b/interface/components/vislib/lib/data.js @@ -14,7 +14,7 @@ define(function (require) { * * @class Data * @constructor - * @param data {Object} Elasticsearch query results + * @param data {Object} query results * @param attr {Object|*} Visualization options */ function Data(data, attr) { diff --git a/interface/components/vislib/lib/layout/layout.js b/interface/components/vislib/lib/layout/layout.js index 52203e2..a8afb14 100644 --- a/interface/components/vislib/lib/layout/layout.js +++ b/interface/components/vislib/lib/layout/layout.js @@ -17,7 +17,7 @@ define(function (require) { * @class Layout * @constructor * @param el {HTMLElement} HTML element to which the chart will be appended - * @param data {Object} Elasticsearch query results for this specific chart + * @param data {Object} query results for this specific chart * @param chartType {Object} Reference to chart functions, i.e. Pie */ function Layout(el, data, chartType, opts) { diff --git a/interface/components/vislib/vis.js b/interface/components/vislib/vis.js index dc3aaea..3d902ad 100644 --- a/interface/components/vislib/vis.js +++ b/interface/components/vislib/vis.js @@ -37,7 +37,7 @@ define(function (require) { * Renders the visualization * * @method render - * @param data {Object} Elasticsearch query results + * @param data {Object} query results */ Vis.prototype.render = function (data) { var chartType = this._attr.type; diff --git a/interface/components/vislib/visualizations/_chart.js b/interface/components/vislib/visualizations/_chart.js index 025f6df..c3ad5ad 100644 --- a/interface/components/vislib/visualizations/_chart.js +++ b/interface/components/vislib/visualizations/_chart.js @@ -14,7 +14,7 @@ define(function (require) { * @constructor * @param handler {Object} Reference to the Handler Class Constructor * @param el {HTMLElement} HTML element to which the chart will be appended - * @param chartData {Object} Elasticsearch query results for this specific chart + * @param chartData {Object} query results for this specific chart */ function Chart(handler, el, chartData) { if (!(this instanceof Chart)) { diff --git a/interface/components/vislib/visualizations/_point_series_chart.js b/interface/components/vislib/visualizations/_point_series_chart.js index b086f15..dd40e15 100644 --- a/interface/components/vislib/visualizations/_point_series_chart.js +++ b/interface/components/vislib/visualizations/_point_series_chart.js @@ -43,7 +43,7 @@ define(function (require) { * Stacks chart data values * * @method stackData - * @param data {Object} Elasticsearch query result for this chart + * @param data {Object} query result for this chart * @returns {Array} Stacked data objects with x, y, and y0 values */ PointSeriesChart.prototype.stackData = function (data) { diff --git a/interface/components/vislib/visualizations/area_chart.js b/interface/components/vislib/visualizations/area_chart.js index 2f51b55..4fd430f 100644 --- a/interface/components/vislib/visualizations/area_chart.js +++ b/interface/components/vislib/visualizations/area_chart.js @@ -16,7 +16,7 @@ define(function (require) { * @extends Chart * @param handler {Object} Reference to the Handler Class Constructor * @param el {HTMLElement} HTML element to which the chart will be appended - * @param chartData {Object} Elasticsearch query results for this specific + * @param chartData {Object} query results for this specific * chart */ _(AreaChart).inherits(PointSeriesChart); diff --git a/interface/components/vislib/visualizations/column_chart.js b/interface/components/vislib/visualizations/column_chart.js index 9f0fe14..dcc8f21 100644 --- a/interface/components/vislib/visualizations/column_chart.js +++ b/interface/components/vislib/visualizations/column_chart.js @@ -19,7 +19,7 @@ define(function (require) { * @extends Chart * @param handler {Object} Reference to the Handler Class Constructor * @param el {HTMLElement} HTML element to which the chart will be appended - * @param chartData {Object} Elasticsearch query results for this specific chart + * @param chartData {Object} query results for this specific chart */ _(ColumnChart).inherits(PointSeriesChart); function ColumnChart(handler, chartEl, chartData) { diff --git a/interface/components/vislib/visualizations/line_chart.js b/interface/components/vislib/visualizations/line_chart.js index 3689477..2c5c6db 100644 --- a/interface/components/vislib/visualizations/line_chart.js +++ b/interface/components/vislib/visualizations/line_chart.js @@ -16,7 +16,7 @@ define(function (require) { * @extends Chart * @param handler {Object} Reference to the Handler Class Constructor * @param el {HTMLElement} HTML element to which the chart will be appended - * @param chartData {Object} Elasticsearch query results for this specific chart + * @param chartData {Object} query results for this specific chart */ _(LineChart).inherits(PointSeriesChart); function LineChart(handler, chartEl, chartData) { diff --git a/interface/components/vislib/visualizations/pie_chart.js b/interface/components/vislib/visualizations/pie_chart.js index 5689765..6587ab0 100644 --- a/interface/components/vislib/visualizations/pie_chart.js +++ b/interface/components/vislib/visualizations/pie_chart.js @@ -15,7 +15,7 @@ define(function (require) { * @extends Chart * @param handler {Object} Reference to the Handler Class Constructor * @param el {HTMLElement} HTML element to which the chart will be appended - * @param chartData {Object} Elasticsearch query results for this specific chart + * @param chartData {Object} query results for this specific chart */ _(PieChart).inherits(Chart); function PieChart(handler, chartEl, chartData) { diff --git a/interface/components/vislib/visualizations/tile_map.js b/interface/components/vislib/visualizations/tile_map.js index 75c3094..c55cc9b 100644 --- a/interface/components/vislib/visualizations/tile_map.js +++ b/interface/components/vislib/visualizations/tile_map.js @@ -25,7 +25,7 @@ define(function (require) { * @extends Chart * @param handler {Object} Reference to the Handler Class Constructor * @param chartEl {HTMLElement} HTML element to which the map will be appended - * @param chartData {Object} Elasticsearch query results for this map + * @param chartData {Object} query results for this map */ _(TileMap).inherits(Chart); function TileMap(handler, chartEl, chartData) { diff --git a/interface/components/visualize/spy/_req_resp_stats.html b/interface/components/visualize/spy/_req_resp_stats.html index 0668beb..62d571d 100644 --- a/interface/components/visualize/spy/_req_resp_stats.html +++ b/interface/components/visualize/spy/_req_resp_stats.html @@ -12,14 +12,14 @@
    {{req.fetchParams.body | json}}
    {{req.resp | json}}
    diff --git a/interface/config b/interface/config index 6b7f455..c654c55 100644 --- a/interface/config +++ b/interface/config @@ -16,5 +16,5 @@ "plugins/vis_types/index", "plugins/visualize/index" ], - "elasticsearch": "http://vps714395.ovh.net/kibella/db" + "elasticsearch": "../db" } diff --git a/interface/index.html b/interface/index.html index bf0aaec..5564ff5 100644 --- a/interface/index.html +++ b/interface/index.html @@ -3,7 +3,7 @@ @@ -85,7 +85,7 @@

    Insert / Update Table

    -
    +
    Enable the cache for the results run on this table?
    diff --git a/interface/plugins/discover/_hit_sort_fn.js b/interface/plugins/discover/_hit_sort_fn.js index 7738c39..19cdc4e 100644 --- a/interface/plugins/discover/_hit_sort_fn.js +++ b/interface/plugins/discover/_hit_sort_fn.js @@ -6,7 +6,7 @@ define(function () { * es used to sort them. * * background: - * When a hit is sorted by elasticsearch, es will write the values that it used + * When a hit is sorted by Back-end, Back-end will write the values that it used * to sort them into an array at the top level of the hit like so * * ``` diff --git a/interface/plugins/discover/components/field_chooser/lib/field_calculator.js b/interface/plugins/discover/components/field_chooser/lib/field_calculator.js index f5d231e..cf582f2 100644 --- a/interface/plugins/discover/components/field_chooser/lib/field_calculator.js +++ b/interface/plugins/discover/components/field_chooser/lib/field_calculator.js @@ -43,7 +43,7 @@ define(function (require) { if (params.hits.length - missing === 0) { return { - error: 'This field is present in your elasticsearch mapping' + + error: 'This field is present in your mapping' + ' but not in any documents in the search results.' + ' You may still be able to visualize or search on it.' }; diff --git a/interface/plugins/discover/index.html b/interface/plugins/discover/index.html index d7a1833..d6d1497 100644 --- a/interface/plugins/discover/index.html +++ b/interface/plugins/discover/index.html @@ -118,7 +118,7 @@

    Expand your time range

    Refine your query

    - The search bar at the top uses Elasticsearch's support for Lucene Query String syntax. Let's say we're searching web server logs that have been parsed into a few fields. + The search bar at the top uses Lucene Query String syntax. Let's say we're searching web server logs that have been parsed into a few fields.

    diff --git a/interface/plugins/doc/index.html b/interface/plugins/doc/index.html index ccc3f67..d794789 100644 --- a/interface/plugins/doc/index.html +++ b/interface/plugins/doc/index.html @@ -21,7 +21,7 @@

    Failed to locate document. This is bad.

    - Oh no. Something went very wrong. Its not just that I couldn't find your document, I couldn't even try. The index was missing, or the type. Go check out Elasticsearch, something isn't quite right here. + Oh no. Something went very wrong. Its not just that I couldn't find your document, I couldn't even try. The index was missing, or the type. Go check out Back-end Server, something isn't quite right here.

    diff --git a/interface/plugins/enhanced_tilemap/geoserver.md b/interface/plugins/enhanced_tilemap/geoserver.md index bdf6768..2be84b8 100644 --- a/interface/plugins/enhanced_tilemap/geoserver.md +++ b/interface/plugins/enhanced_tilemap/geoserver.md @@ -7,16 +7,16 @@ As the map is zoomed and panned, new tiles are requested and displayed. [Geoserver](http://geoserver.org/) is an open source server that implements OGC compliant standards such as WMS. Geoserver provides the tools needed to turn geospatial data into map tiles. -Out of the box, geoserver supports data stores such as PostGis and static files - but not Elasticsearch. -[ElasticGeo](https://github.com/ngageoint/elasticgeo) provides the plumbing needed to hook up geoserver to Elasticsearch. +Out of the box, geoserver supports data stores such as PostGis and static files - but not Kibella. +[ElasticGeo](https://github.com/ngageoint/elasticgeo) provides the plumbing needed to hook up geoserver to Kibella. A servlet is a Java program that implements the Java Servlet API - a standard for Java classes that respond to requests. Geoserver is a servlet. Servlets are deployed in web containers. A web container is an application that manages one to many servlets. [Apache Tomcat](http://tomcat.apache.org/) is an easy to use web container. -### Passing Elasticsearch queries over WMS -ElasticGeo exposes native Elasticsearch query functionality with the WMS parameter [viewparams](https://github.com/ngageoint/elasticgeo/blob/master/gs-web-elasticsearch/doc/index.rst#custom-q-and-f-parameters). +### Passing Kibella queries over WMS +ElasticGeo exposes native Kibella query functionality with the WMS parameter [viewparams](https://github.com/ngageoint/elasticgeo/blob/master/gs-web-elasticsearch/doc/index.rst#custom-q-and-f-parameters). The enhanced tilemap plugin uses this mechanism to pass the identical query Kibana used for aggregations to the WMS server. ## Installation @@ -40,7 +40,7 @@ The enhanced tilemap plugin uses this mechanism to pass the identical query Kiba View the page http://localhost:8080/geoserver/web/wicket/bookmarkable/org.geoserver.web.data.store.NewDataPage and ensure that Elasticsearch is an option under Vector Data Source. ## Setting up a WMS layer -Must have elasticsearch 2.2 instance running on the standard ports with an index containing a top level field with either a geo_point or geo_shape type. +Must have Kibella Back-end server running on the standard ports with an index containing a top level field with either a geo_point or geo_shape type. ### Login as admin username: admin diff --git a/interface/plugins/enhanced_tilemap/vislib/geoFilter.js b/interface/plugins/enhanced_tilemap/vislib/geoFilter.js index 18cc0e5..96db813 100644 --- a/interface/plugins/enhanced_tilemap/vislib/geoFilter.js +++ b/interface/plugins/enhanced_tilemap/vislib/geoFilter.js @@ -59,10 +59,10 @@ define(function (require) { } /** - * Convert elasticsearch geospatial filter to leaflet vectors + * Convert geospatial filter to leaflet vectors * * @method toVector - * @param filter {Object} elasticsearch geospatial filter + * @param filter {Object} geospatial filter * @param field {String} Index field name for geo_point or geo_shape field * @return {Array} Array of Leaftet Vector Layers constructed from filter geometries */ diff --git a/interface/plugins/extended_metric_vis/extended_metric_vis.js b/interface/plugins/extended_metric_vis/extended_metric_vis.js index 244a143..dcb6b89 100644 --- a/interface/plugins/extended_metric_vis/extended_metric_vis.js +++ b/interface/plugins/extended_metric_vis/extended_metric_vis.js @@ -17,7 +17,7 @@ define(function (require) { // Vis object of this type. return new TemplateVisType({ name: 'extended_metric', - title: 'Extended Metric', + title: 'Metric(Ext.)', description: 'Based on the core Metric-Plugin but gives you the ability' + 'to output custom aggregates on metric-results.', icon: 'fa-calculator', diff --git a/interface/plugins/kbn_dotplot/kbn_dotplot.js b/interface/plugins/kbn_dotplot/kbn_dotplot.js index b6a0b8f..05dc18c 100644 --- a/interface/plugins/kbn_dotplot/kbn_dotplot.js +++ b/interface/plugins/kbn_dotplot/kbn_dotplot.js @@ -34,9 +34,9 @@ function DotplotVisTypeProvider(Private) { // Vis object of this type. return new TemplateVisType({ name: 'dotplot', - title: 'Dot plot', + title: 'Scatter plot', icon: 'fa-ellipsis-v', - description: 'Display values in a dot plot', + description: 'Display values in a Scatter plot', // category: VisType.CATEGORY.DATA, template: DotplotVisTemplate, params: { diff --git a/interface/plugins/kibi_timeline_vis/lib/directives/kibi_select.html b/interface/plugins/kibi_timeline_vis/lib/directives/kibi_select.html index e85bb4d..29a9f57 100644 --- a/interface/plugins/kibi_timeline_vis/lib/directives/kibi_select.html +++ b/interface/plugins/kibi_timeline_vis/lib/directives/kibi_select.html @@ -22,7 +22,7 @@

    - Careful! The field selected contains analyzed strings. Values such as foo-bar will be broken into foo and bar. See Mapping Core Types for more information on setting this field as not_analyzed + Careful! The field selected contains analyzed strings.

    diff --git a/interface/plugins/metric_vis_colors/metric_vis_colors.js b/interface/plugins/metric_vis_colors/metric_vis_colors.js index d76c35c..ae64f99 100644 --- a/interface/plugins/metric_vis_colors/metric_vis_colors.js +++ b/interface/plugins/metric_vis_colors/metric_vis_colors.js @@ -16,7 +16,7 @@ define(function (require) { // Vis object of this type. return new TemplateVisType({ name: 'metric-vis-colors', - title: 'Simple Metric', + title: 'Metric(Simple)', description: 'One big number for all of your one big number needs. Perfect for showing ' + 'a count of hits, or the exact average a numeric field. Now with customizable colors.', icon: 'fa-calculator', diff --git a/interface/plugins/pie/c3_vis.js b/interface/plugins/pie/c3_vis.js index ba07e74..4bac88f 100644 --- a/interface/plugins/pie/c3_vis.js +++ b/interface/plugins/pie/c3_vis.js @@ -16,9 +16,9 @@ console.log("cc", colors.params) return new TemplateVisType({ name: 'pie_chart', - title: 'Plotly Pie', + title: 'Pie', icon: 'fa-pie-chart', - description: 'This is Kibella plugin which uses the JavaScript library Plotly for data representations.', + description: 'This is a Kibella plugin which uses the JavaScript library Plotly for data representations.', template: c3VisTemplate, params: { defaults: Object.assign({ diff --git a/interface/plugins/settings/sections/about/index.html b/interface/plugins/settings/sections/about/index.html index 1526955..ccf277f 100644 --- a/interface/plugins/settings/sections/about/index.html +++ b/interface/plugins/settings/sections/about/index.html @@ -135,12 +135,12 @@

    Kibella

    - + - + @@ -158,8 +158,8 @@

    Kibella

    Version2.03.0
    Kibella Version2017-03-142019-12-12

    - Kibella is a component of the TIMi Suite
    >©2016 - All Rights Reserved - Frank Vanden Berghen + Kibella is a component of the TIMi Suite
    + ©2016 - All Rights Reserved - Frank Vanden Berghen diff --git a/interface/plugins/settings/sections/indices/_create.html b/interface/plugins/settings/sections/indices/_create.html index c13a0f6..b351c00 100644 --- a/interface/plugins/settings/sections/indices/_create.html +++ b/interface/plugins/settings/sections/indices/_create.html @@ -2,14 +2,13 @@
    diff --git a/interface/plugins/settings/sections/indices/_create.js b/interface/plugins/settings/sections/indices/_create.js index db0d69a..b524347 100644 --- a/interface/plugins/settings/sections/indices/_create.js +++ b/interface/plugins/settings/sections/indices/_create.js @@ -70,7 +70,7 @@ define(function (require) { }) .catch(function (err) { if (err instanceof MissingIndices) { - notify.error('Could not locate any indices matching that pattern. Please add the index to Elasticsearch'); + notify.error('Could not locate any indices matching that pattern. Please add the index to Kibella'); } else notify.fatal(err); }); diff --git a/interface/plugins/settings/sections/indices/_edit.html b/interface/plugins/settings/sections/indices/_edit.html index 51b20cc..efd87ef 100644 --- a/interface/plugins/settings/sections/indices/_edit.html +++ b/interface/plugins/settings/sections/indices/_edit.html @@ -11,16 +11,12 @@

    This page lists every field in the {{indexPattern.id}} - index and the field's associated core type as recorded by Elasticsearch. - While this list allows you to view the core type of each field, changing - field types must be done using Elasticsearch's - - Mapping API - - + Dataset and the field's associated core type as recorded in Kibella + This list is read-only: you can only view the core type of each field, not changing + it.

    - This index uses a Time-based index pattern which repeats + This Dataset uses a Time-based Datasets which repeats
    Mapping conflict! {{conflictFields.length > 1 ? conflictFields.length : 'A'}} field{{conflictFields.length > 1 ? 's' : ''}} {{conflictFields.length > 1 ? 'are' : 'is'}} defined as several types (string, integer, etc) across the indices that match this pattern. You may still be able to use these conflict fields in parts of Kibana, but they will be unavailable for functions that require Kibana to know their type. Correcting this issue will require reindexing your data. diff --git a/interface/plugins/settings/sections/indices/_index_header.html b/interface/plugins/settings/sections/indices/_index_header.html index 7ae9f79..6e8a5a2 100644 --- a/interface/plugins/settings/sections/indices/_index_header.html +++ b/interface/plugins/settings/sections/indices/_index_header.html @@ -24,11 +24,11 @@

    diff --git a/interface/plugins/settings/sections/indices/index.html b/interface/plugins/settings/sections/indices/index.html index 259a0d6..7e725e0 100644 --- a/interface/plugins/settings/sections/indices/index.html +++ b/interface/plugins/settings/sections/indices/index.html @@ -2,7 +2,7 @@
  • Edit {{ title }} Object

    There is a problem with that saved object

    The saved search associated with this object no longer exists.

    -

    The index pattern associated with this object no longer exists.

    -

    A field associated with this object no longer exists in the index pattern.

    +

    The Dataset associated with this object no longer exists.

    +

    A field associated with this object no longer exists in the Dataset.

    If you know what this error means, go ahead and fix it - otherwise click the delete button above.

    diff --git a/interface/plugins/vis_types/_renderbot.js b/interface/plugins/vis_types/_renderbot.js index 27ba9d2..fc5a6d9 100644 --- a/interface/plugins/vis_types/_renderbot.js +++ b/interface/plugins/vis_types/_renderbot.js @@ -16,10 +16,10 @@ define(function (require) { /** * Each renderbot should implement a #render() method which - * should accept an elasticsearch response and update the underlying visualization + * should accept an response and update the underlying visualization * * @override - * @param {object} esResp - The raw elasticsearch response + * @param {object} esResp - The raw response * @return {undefined} */ Renderbot.prototype.render = function (esResp) { diff --git a/interface/plugins/vis_types/index.js b/interface/plugins/vis_types/index.js index d31d100..b430873 100644 --- a/interface/plugins/vis_types/index.js +++ b/interface/plugins/vis_types/index.js @@ -2,6 +2,6 @@ define(function (require) { var visTypes = require('ui/registry/vis_types'); visTypes.register(require('plugins/vis_types/vislib/histogram')); visTypes.register(require('plugins/vis_types/vislib/line')); - visTypes.register(require('plugins/vis_types/vislib/pie')); +// visTypes.register(require('plugins/vis_types/vislib/pie')); visTypes.register(require('plugins/vis_types/vislib/area')); }); diff --git a/interface/plugins/vis_types/vislib/pie.js b/interface/plugins/vis_types/vislib/pie.js deleted file mode 100644 index 0e73661..0000000 --- a/interface/plugins/vis_types/vislib/pie.js +++ /dev/null @@ -1,58 +0,0 @@ -define(function (require) { - return function HistogramVisType(Private) { - var VislibVisType = Private(require('plugins/vis_types/vislib/_vislib_vis_type')); - var Schemas = Private(require('plugins/vis_types/_schemas')); - - return new VislibVisType({ - name: 'pie', - title: 'Pie', - icon: 'fa-pie-chart', - description: 'Pie charts are ideal for displaying the parts of some whole. For example, sales percentages by department.' + - 'Pro Tip: Pie charts are best used sparingly, and with no more than 7 slices per pie.', - params: { - defaults: { - shareYAxis: true, - addTooltip: true, - addLegend: true, - isDonut: false, - displayOther: true - }, - editor: require('text!plugins/vis_types/vislib/editors/pie.html') - }, - responseConverter: false, - hierarchicalData: true, - schemas: new Schemas([ - { - group: 'metrics', - name: 'metric', - title: 'Slice Size', - min: 1, - max: 1, - aggFilter: ['sum', 'count', 'cardinality'], - defaults: [ - { schema: 'metric', type: 'count' } - ] - }, - { - group: 'buckets', - name: 'segment', - icon: 'fa fa-scissors', - title: 'Split Slices', - min: 0, - max: Infinity, - aggFilter: '!geohash_grid' - }, - { - group: 'buckets', - name: 'split', - icon: 'fa fa-th', - title: 'Split Chart', - mustBeFirst: true, - min: 0, - max: 1, - aggFilter: '!geohash_grid' - } - ]) - }); - }; -}); diff --git a/interface/plugins/vis_types/vislib/pie.zip b/interface/plugins/vis_types/vislib/pie.zip new file mode 100644 index 0000000000000000000000000000000000000000..a678de95b5d4c804167b935802c68e23225ad066 GIT binary patch literal 786 zcmWIWW@Zs#U|`^22<>b4m#Fd6YhYqvIK;-l07MK0nW=hN#cM--vu`^H>}CHXucm(U zis!80gG<}Z6t@IqC@c){G04u;;f;N}%3Aq&-pBg)FHTR3QQs0E|0ea`?Edd%D(X8_ z+83w3Oj3NGAo9W8lkxb6*I!r^7EC#Kknf*|jvcSsf3H6qGz&_^Gg6l-BLDDHO_>a(y=N$esw^uN3KXrKPN$zgpgye|}4+tz4p8TqE z-7^~sIc+AUJg|8Z7dc6iJ>S8% zYxcASR{GzBOs_t%X`Nd<_0>|%wLHxXYu0|e{o7PiVc`)^c@xi15B7>`^)=5obe%49 zup@tub}E;5awW&sZFPbE&Xae#Z?{!bQ;Cz@ttu3A`sU`{H!u9$^ht5@9k<7qCm&wK zxbs8b$6LEa*$x(1#JfrObQpK_?lnx}o3ho~dTscY*zXr}>^~j2Ve%s=x4USHgQ5Fw zt-Y>!8x*g+{ajnRy};kTu;clX=xS4*nO_r6EP1JWGwPAfBcpybfus9Mg5-TXPDpxh z>Xc*8{H;3k>tU_6qW7hxwEi!TjlA(qSg!y6%fM!_)IYLMcR2QBetp5S@$TWZ+sn@x z8ooYipPaN%Y2mg>{WpI6@|U)^tbM%7@cd56xl3OdAHHeBJH_R{ce?3wZY|Yn&--6L z{0*!9H0dexy`Tikh)2_p#Q)v>>fMhUcKNrT=_jtf|MjDJfHxzPJOi#&ssc=>AfNyy uVQH2N%4cMdU=a1$RwlRhD&s7Johx*a=m2k4P$Fkw1i}a)y#$!@85jU})K;?q literal 0 HcmV?d00001 diff --git a/interface/plugins/visualize/wizard/step_1.html b/interface/plugins/visualize/wizard/step_1.html index 69149b4..c48290e 100644 --- a/interface/plugins/visualize/wizard/step_1.html +++ b/interface/plugins/visualize/wizard/step_1.html @@ -24,7 +24,7 @@

    New Visualization

    -

    Select Index Pattern

    +

    Select a Registered Dataset

    - Kibella 2.5 - Sign in + Kibella 3.0 - Sign in @@ -20,7 +20,7 @@
    -

    You must sign in to access to the Kibella application.

    +

    You must sign in to access the Kibella application.

    error) { echo '

    ' . $session->error . '

    '; diff --git a/tempdata/T___1_1566657451_4670_T0 b/tempdata/T___1_1566657451_4670_T0 deleted file mode 100644 index 974814d..0000000 --- a/tempdata/T___1_1566657451_4670_T0 +++ /dev/null @@ -1,1240 +0,0 @@ -0|188219 -20|1 -70|1 -75|2 -100|11 -110|1 -125|1 -135|1 -143|1 -150|6 -170|1 -173|1 -190|1 -200|27 -205|1 -210|7 -212|2 -213|20 -215|3 -220|2 -225|4 -230|1 -232|1 -233|1 -234|1 -235|2 -245|1 -250|12 -252|1 -255|3 -260|1 -270|1 -275|1 -285|1 -289|1 -290|1 -294|1 -300|24 -303|2 -305|1 -310|2 -313|2 -325|4 -327|1 -333|1 -345|3 -350|10 -355|2 -365|1 -367|1 -375|1 -380|2 -385|3 -390|3 -400|125 -410|1 -415|1 -417|1 -420|1 -425|376 -427|1 -429|1 -430|6 -432|1 -435|98 -438|1 -440|13 -442|1 -443|1 -445|15 -446|1 -447|1 -448|2 -449|2 -450|222 -451|1 -455|14 -458|1 -460|17 -465|42 -466|2 -468|1 -470|8 -472|3 -473|1 -474|1 -475|105 -480|11 -483|1 -485|27 -486|3 -487|1 -489|1 -490|12 -491|1 -492|1 -493|1 -495|17 -496|1 -497|1 -499|1 -500|734 -504|1 -505|13 -509|2 -510|14 -511|1 -512|2 -515|16 -517|1 -518|2 -519|1 -520|7 -521|1 -522|1 -525|147 -528|3 -530|22 -532|2 -533|1 -534|1 -535|20 -536|1 -538|4 -540|21 -541|1 -544|1 -545|14 -546|2 -547|3 -548|1 -549|2 -550|280 -552|1 -555|7 -557|1 -558|2 -560|16 -561|2 -562|2 -564|1 -565|13 -566|2 -568|4 -569|2 -570|8 -571|1 -574|1 -575|73 -576|4 -577|1 -579|2 -580|23 -582|3 -583|1 -584|1 -585|17 -586|1 -587|2 -590|8 -592|1 -595|5 -599|2 -600|546 -602|2 -604|1 -605|6 -608|3 -609|2 -610|17 -611|2 -612|2 -613|1 -615|10 -619|3 -620|8 -621|1 -622|1 -623|1 -624|3 -625|91 -626|1 -627|5 -629|1 -630|10 -631|3 -633|1 -635|13 -636|2 -637|3 -638|2 -640|20 -642|2 -643|1 -645|11 -646|5 -647|5 -648|3 -649|5 -650|229 -652|3 -653|5 -654|1 -655|9 -657|2 -658|1 -659|2 -660|15 -662|1 -663|1 -665|11 -666|1 -667|1 -669|1 -670|9 -671|3 -672|2 -673|1 -674|3 -675|53 -676|1 -677|3 -678|4 -680|8 -683|4 -684|1 -685|14 -687|1 -688|4 -689|3 -690|10 -691|2 -692|6 -694|2 -695|6 -696|2 -697|5 -698|4 -699|3 -700|534 -701|1 -702|1 -703|2 -705|9 -706|2 -707|9 -708|5 -709|1 -710|16 -711|2 -712|4 -713|4 -714|2 -715|19 -716|5 -718|5 -719|2 -720|17 -721|6 -722|2 -724|1 -725|64 -726|2 -727|5 -728|1 -729|3 -730|24 -731|1 -732|5 -733|1 -735|16 -736|2 -738|1 -740|14 -742|1 -743|1 -744|2 -745|10 -747|4 -748|2 -749|2 -750|202 -751|1 -752|2 -753|1 -754|3 -755|13 -756|8 -757|4 -758|2 -760|17 -761|4 -762|1 -763|2 -764|1 -765|13 -766|2 -767|2 -769|6 -770|14 -771|1 -772|2 -773|1 -774|1 -775|21 -776|1 -777|3 -779|1 -780|11 -781|4 -782|3 -784|1 -785|9 -786|4 -787|3 -788|3 -789|3 -790|11 -791|2 -792|1 -793|1 -795|2 -796|1 -797|5 -798|3 -799|4 -800|507 -801|2 -802|1 -803|6 -804|2 -805|8 -807|1 -808|3 -809|2 -810|9 -811|3 -812|3 -813|1 -815|7 -816|1 -817|7 -819|4 -820|15 -822|1 -823|2 -825|51 -826|1 -827|1 -828|1 -829|3 -830|13 -831|3 -832|5 -833|1 -834|4 -835|11 -836|5 -837|3 -838|2 -839|1 -840|11 -843|3 -844|4 -845|5 -846|3 -847|3 -848|3 -850|167 -852|1 -853|1 -854|1 -855|10 -856|1 -857|1 -858|1 -859|3 -860|24 -862|2 -863|4 -864|2 -865|14 -866|3 -868|5 -869|3 -870|7 -871|1 -872|1 -874|2 -875|43 -876|3 -877|3 -878|3 -879|3 -880|4 -881|1 -882|2 -883|1 -885|9 -886|2 -887|1 -888|2 -889|2 -890|10 -891|4 -892|1 -893|1 -895|4 -896|2 -897|1 -899|1 -900|336 -901|3 -902|3 -903|1 -904|2 -905|11 -906|4 -907|1 -908|2 -910|12 -912|1 -913|2 -914|1 -915|6 -916|4 -917|1 -918|1 -919|1 -920|18 -921|2 -923|1 -924|2 -925|30 -926|1 -927|1 -928|2 -930|6 -932|4 -933|1 -935|6 -936|2 -937|3 -938|2 -939|2 -940|5 -941|2 -942|4 -943|2 -944|2 -945|17 -946|3 -947|2 -948|1 -949|1 -950|84 -951|4 -952|2 -953|4 -954|3 -955|5 -956|8 -957|2 -958|4 -959|1 -960|13 -961|5 -962|3 -963|8 -964|3 -965|9 -966|1 -967|2 -968|4 -969|2 -970|6 -972|2 -974|1 -975|19 -976|4 -978|1 -979|6 -980|5 -981|2 -982|1 -983|1 -984|2 -985|5 -986|3 -987|4 -988|3 -990|9 -991|1 -992|2 -993|1 -995|10 -996|1 -997|1 -998|4 -999|1 -1000|386 -1001|2 -1002|2 -1003|3 -1004|1 -1005|5 -1010|5 -1011|3 -1013|1 -1014|1 -1015|6 -1016|4 -1017|4 -1018|1 -1020|10 -1022|2 -1023|1 -1024|1 -1025|30 -1026|2 -1027|5 -1028|1 -1030|13 -1032|5 -1033|1 -1034|1 -1035|6 -1036|2 -1037|2 -1038|2 -1039|1 -1040|4 -1041|2 -1042|4 -1043|2 -1044|2 -1045|7 -1046|1 -1048|1 -1050|76 -1051|4 -1053|2 -1054|2 -1055|2 -1056|3 -1057|6 -1058|3 -1059|1 -1060|5 -1061|1 -1062|3 -1063|2 -1065|8 -1066|1 -1067|6 -1069|1 -1070|5 -1073|2 -1074|1 -1075|13 -1076|5 -1077|2 -1078|1 -1079|3 -1080|9 -1082|2 -1083|1 -1085|8 -1086|1 -1087|2 -1088|2 -1090|8 -1092|1 -1094|2 -1095|3 -1096|1 -1097|4 -1098|2 -1099|2 -1100|235 -1101|2 -1102|1 -1103|2 -1104|3 -1105|10 -1107|2 -1108|2 -1110|3 -1111|1 -1112|1 -1113|1 -1115|1 -1116|1 -1117|3 -1119|2 -1120|6 -1121|1 -1122|2 -1123|1 -1124|2 -1125|13 -1127|4 -1129|1 -1130|8 -1131|4 -1134|1 -1135|8 -1136|3 -1140|6 -1142|1 -1145|7 -1146|1 -1149|3 -1150|57 -1152|2 -1153|2 -1154|1 -1155|3 -1156|2 -1157|2 -1158|2 -1160|9 -1162|2 -1163|4 -1164|3 -1165|6 -1167|3 -1170|4 -1171|1 -1172|2 -1173|2 -1175|16 -1176|1 -1177|1 -1179|1 -1180|4 -1181|1 -1183|1 -1184|1 -1185|1 -1186|2 -1187|2 -1188|4 -1190|1 -1191|1 -1194|1 -1195|3 -1196|1 -1198|2 -1199|1 -1200|256 -1201|6 -1202|5 -1205|1 -1210|5 -1211|1 -1212|2 -1214|2 -1215|6 -1217|2 -1218|1 -1219|1 -1220|11 -1222|1 -1223|1 -1224|1 -1225|6 -1226|1 -1228|4 -1230|4 -1231|2 -1232|1 -1233|2 -1234|1 -1235|7 -1236|1 -1238|2 -1239|5 -1240|11 -1242|1 -1245|2 -1247|2 -1249|1 -1250|56 -1251|2 -1253|1 -1254|2 -1255|4 -1256|2 -1257|3 -1258|4 -1259|4 -1260|7 -1261|1 -1265|1 -1266|1 -1268|1 -1269|4 -1270|5 -1272|8 -1274|2 -1275|13 -1276|1 -1278|1 -1280|8 -1281|1 -1284|1 -1285|2 -1286|1 -1287|1 -1288|3 -1289|1 -1290|3 -1291|1 -1295|2 -1296|1 -1297|3 -1299|1 -1300|198 -1301|1 -1303|2 -1304|1 -1305|4 -1307|1 -1308|1 -1310|3 -1311|3 -1313|1 -1314|2 -1315|2 -1318|1 -1320|3 -1321|2 -1324|2 -1325|11 -1326|1 -1327|1 -1329|1 -1330|1 -1331|1 -1332|2 -1334|1 -1335|3 -1336|1 -1339|3 -1340|1 -1342|2 -1343|1 -1344|3 -1345|1 -1349|1 -1350|24 -1353|1 -1356|1 -1357|2 -1358|1 -1360|5 -1361|2 -1362|2 -1363|1 -1365|5 -1366|1 -1367|3 -1369|1 -1370|6 -1371|3 -1372|1 -1375|9 -1376|1 -1378|1 -1380|3 -1383|4 -1384|1 -1385|3 -1386|3 -1388|2 -1389|4 -1390|2 -1391|1 -1394|1 -1395|1 -1396|2 -1397|5 -1398|1 -1399|2 -1400|132 -1404|2 -1410|3 -1412|1 -1413|1 -1414|3 -1415|1 -1419|2 -1420|1 -1422|2 -1423|1 -1425|7 -1428|2 -1429|1 -1430|1 -1433|1 -1434|1 -1435|3 -1437|1 -1439|1 -1440|2 -1441|1 -1442|2 -1445|4 -1446|1 -1449|3 -1450|19 -1451|1 -1453|1 -1454|1 -1455|1 -1457|1 -1458|1 -1460|2 -1461|1 -1463|2 -1465|3 -1466|2 -1467|1 -1468|1 -1470|2 -1471|2 -1473|4 -1474|2 -1475|4 -1477|2 -1478|1 -1479|4 -1480|4 -1483|1 -1484|2 -1485|4 -1486|2 -1488|2 -1489|2 -1490|2 -1493|1 -1497|2 -1500|221 -1505|1 -1506|3 -1507|1 -1510|2 -1513|2 -1515|1 -1516|4 -1518|3 -1519|2 -1523|2 -1525|6 -1528|2 -1530|3 -1532|4 -1533|3 -1535|2 -1538|5 -1540|4 -1546|1 -1547|1 -1548|1 -1549|2 -1550|19 -1551|1 -1552|2 -1555|2 -1556|4 -1557|1 -1558|1 -1559|1 -1560|1 -1561|1 -1565|3 -1566|2 -1567|4 -1568|2 -1570|7 -1571|3 -1572|1 -1575|8 -1576|2 -1577|2 -1582|1 -1584|2 -1585|1 -1588|2 -1590|3 -1592|5 -1600|136 -1602|1 -1604|2 -1606|1 -1607|3 -1613|1 -1615|1 -1617|1 -1619|1 -1620|1 -1622|1 -1624|1 -1625|3 -1626|2 -1630|4 -1632|3 -1633|1 -1634|2 -1635|5 -1637|1 -1638|1 -1639|1 -1643|1 -1648|2 -1650|24 -1651|1 -1655|2 -1658|3 -1660|2 -1661|1 -1667|2 -1670|4 -1672|2 -1675|4 -1676|2 -1677|2 -1679|1 -1680|4 -1682|3 -1683|6 -1684|4 -1685|1 -1686|2 -1692|1 -1693|1 -1695|1 -1700|116 -1701|1 -1706|2 -1709|1 -1710|4 -1713|1 -1715|2 -1716|1 -1718|1 -1719|1 -1720|1 -1721|2 -1722|2 -1724|2 -1725|3 -1727|1 -1728|1 -1729|1 -1730|3 -1731|2 -1733|3 -1735|1 -1738|1 -1740|4 -1744|2 -1745|2 -1750|20 -1751|1 -1752|1 -1754|1 -1756|2 -1757|1 -1758|3 -1759|3 -1760|3 -1761|1 -1762|2 -1770|1 -1774|3 -1775|4 -1776|1 -1779|1 -1780|1 -1783|3 -1784|3 -1785|1 -1786|2 -1787|2 -1788|2 -1789|1 -1790|2 -1792|1 -1799|1 -1800|127 -1802|2 -1804|1 -1805|3 -1807|2 -1808|1 -1810|3 -1811|1 -1813|1 -1814|1 -1817|2 -1818|1 -1820|3 -1824|2 -1825|6 -1827|1 -1829|1 -1830|2 -1832|2 -1834|1 -1836|2 -1840|2 -1843|1 -1844|1 -1845|1 -1849|1 -1850|11 -1851|1 -1854|2 -1857|1 -1860|2 -1862|1 -1863|2 -1864|3 -1865|1 -1866|1 -1869|1 -1870|2 -1871|3 -1873|1 -1875|10 -1880|3 -1882|3 -1883|1 -1885|1 -1888|1 -1893|1 -1895|2 -1898|2 -1900|49 -1905|1 -1910|3 -1914|2 -1915|2 -1919|4 -1923|4 -1925|5 -1927|3 -1928|1 -1929|1 -1930|1 -1935|1 -1940|2 -1944|1 -1950|9 -1960|1 -1962|1 -1965|1 -1968|2 -1971|1 -1972|1 -1973|1 -1976|5 -1977|1 -1978|1 -1980|1 -1984|1 -1986|1 -1987|2 -1991|1 -1993|1 -1994|2 -1995|1 -1999|1 -2000|108 -2010|1 -2012|1 -2018|1 -2019|7 -2020|1 -2026|4 -2029|1 -2030|2 -2035|1 -2038|3 -2045|1 -2050|4 -2051|1 -2067|1 -2072|2 -2073|1 -2085|1 -2100|56 -2110|1 -2116|4 -2132|1 -2136|1 -2138|1 -2141|1 -2142|1 -2150|5 -2155|1 -2160|2 -2163|1 -2178|1 -2181|1 -2188|1 -2190|3 -2198|1 -2200|46 -2202|1 -2208|1 -2209|1 -2218|1 -2226|1 -2250|6 -2256|1 -2258|1 -2263|1 -2281|1 -2288|1 -2290|1 -2291|1 -2295|1 -2299|1 -2300|26 -2312|1 -2317|1 -2321|1 -2326|1 -2331|1 -2350|5 -2355|1 -2360|1 -2363|1 -2366|1 -2370|1 -2371|1 -2373|1 -2375|4 -2377|1 -2395|1 -2400|23 -2429|1 -2450|2 -2451|1 -2469|1 -2470|1 -2480|1 -2485|1 -2500|42 -2512|1 -2532|3 -2536|1 -2538|2 -2540|1 -2550|1 -2552|2 -2582|1 -2596|1 -2600|9 -2613|1 -2626|1 -2630|1 -2650|1 -2652|2 -2656|1 -2668|1 -2680|1 -2700|12 -2723|1 -2730|2 -2739|1 -2740|1 -2751|2 -2755|2 -2783|1 -2788|1 -2800|8 -2825|1 -2850|2 -2900|4 -2915|1 -2952|5 -2965|1 -2966|1 -2988|1 -3000|12 -3100|2 -3150|1 -3156|1 -3190|1 -3200|4 -3205|2 -3259|1 -3300|9 -3350|2 -3400|2 -3500|3 -3600|3 -3700|2 -3745|1 -3750|3 -3765|1 -3846|1 -3900|1 -4000|6 -4300|1 -4500|5 -4800|1 -4807|5 -4900|1 -5000|5 -5200|1 -5250|1 -5500|4 -5525|1 -6000|2 -6009|1 -6200|1 -6410|1 -6500|6 -6600|1 -6800|1 -6900|1 -7000|1 -7400|1 -7700|1 -7800|1 -8000|4 -8300|1 -8500|1 -8600|1 -8800|1 -9000|1 -9400|2 -9800|2 -9916|1 -9999|1 diff --git a/tempdata/T___1_1566657622_1592_T0 b/tempdata/T___1_1566657622_1592_T0 deleted file mode 100644 index 8fd3686..0000000 --- a/tempdata/T___1_1566657622_1592_T0 +++ /dev/null @@ -1,696 +0,0 @@ -0|188219 -18|1 -69|1 -75|2 -99|11 -108|1 -123|1 -135|1 -141|1 -150|6 -168|1 -171|1 -189|1 -198|27 -204|1 -210|9 -213|23 -219|2 -225|4 -228|1 -231|2 -234|3 -243|1 -249|12 -252|1 -255|3 -258|1 -270|1 -273|1 -285|1 -288|2 -294|1 -300|24 -303|3 -309|2 -312|2 -324|4 -327|1 -333|1 -345|3 -348|10 -354|2 -363|1 -366|1 -375|1 -378|2 -384|3 -390|3 -399|125 -408|1 -414|1 -417|1 -420|1 -423|376 -426|1 -429|7 -432|1 -435|98 -438|14 -441|2 -444|16 -447|5 -450|223 -453|14 -456|1 -459|17 -465|44 -468|9 -471|4 -474|106 -480|11 -483|28 -486|4 -489|14 -492|2 -495|19 -498|735 -504|14 -507|2 -510|17 -513|16 -516|3 -519|9 -522|1 -525|147 -528|25 -531|3 -534|22 -537|4 -540|22 -543|15 -546|6 -549|282 -552|1 -555|8 -558|18 -561|4 -564|16 -567|6 -570|9 -573|74 -576|5 -579|25 -582|5 -585|20 -588|8 -591|1 -594|5 -597|2 -600|548 -603|7 -606|3 -609|21 -612|3 -615|10 -618|11 -621|3 -624|95 -627|6 -630|13 -633|14 -636|7 -639|20 -642|3 -645|21 -648|237 -651|8 -654|10 -657|5 -660|16 -663|12 -666|2 -669|13 -672|6 -675|57 -678|12 -681|4 -684|15 -687|8 -690|18 -693|8 -696|11 -699|538 -702|3 -705|20 -708|22 -711|10 -714|26 -717|7 -720|25 -723|65 -726|8 -729|28 -732|6 -735|18 -738|15 -741|2 -744|12 -747|8 -750|205 -753|17 -756|14 -759|21 -762|4 -765|17 -768|20 -771|4 -774|23 -777|4 -780|18 -783|10 -786|10 -789|16 -792|2 -795|8 -798|514 -801|9 -804|10 -807|6 -810|15 -813|8 -816|8 -819|19 -822|3 -825|53 -828|17 -831|9 -834|20 -837|6 -840|11 -843|12 -846|9 -849|167 -852|3 -855|12 -858|28 -861|6 -864|19 -867|8 -870|9 -873|45 -876|9 -879|8 -882|3 -885|12 -888|14 -891|6 -894|6 -897|2 -900|342 -903|14 -906|7 -909|12 -912|4 -915|11 -918|20 -921|3 -924|33 -927|3 -930|10 -933|7 -936|7 -939|9 -942|8 -945|22 -948|86 -951|10 -954|16 -957|7 -960|21 -963|20 -966|7 -969|8 -972|3 -975|23 -978|12 -981|4 -984|10 -987|7 -990|12 -993|11 -996|6 -999|389 -1002|6 -1005|5 -1008|5 -1011|4 -1014|11 -1017|5 -1020|12 -1023|32 -1026|8 -1029|13 -1032|7 -1035|10 -1038|7 -1041|8 -1044|10 -1047|1 -1050|80 -1053|6 -1056|12 -1059|7 -1062|5 -1065|15 -1068|6 -1071|2 -1074|19 -1077|6 -1080|11 -1083|9 -1086|5 -1089|8 -1092|3 -1095|8 -1098|239 -1101|5 -1104|13 -1107|4 -1110|5 -1113|2 -1116|4 -1119|9 -1122|5 -1125|17 -1128|9 -1131|4 -1134|12 -1140|7 -1143|7 -1146|1 -1149|60 -1152|5 -1155|7 -1158|11 -1161|6 -1164|9 -1167|3 -1170|7 -1173|18 -1176|2 -1179|6 -1182|2 -1185|5 -1188|5 -1191|1 -1194|5 -1197|3 -1200|267 -1203|1 -1209|6 -1212|4 -1215|8 -1218|13 -1221|2 -1224|8 -1227|4 -1230|7 -1233|10 -1236|3 -1239|16 -1242|1 -1245|4 -1248|57 -1251|3 -1254|8 -1257|11 -1260|8 -1263|1 -1266|2 -1269|9 -1272|10 -1275|14 -1278|9 -1281|1 -1284|4 -1287|5 -1290|4 -1293|2 -1296|4 -1299|200 -1302|3 -1305|5 -1308|4 -1311|4 -1314|4 -1317|1 -1320|5 -1323|13 -1326|2 -1329|3 -1332|3 -1335|4 -1338|4 -1341|3 -1344|4 -1347|1 -1350|24 -1353|1 -1356|4 -1359|7 -1362|3 -1365|9 -1368|7 -1371|4 -1374|10 -1377|1 -1380|3 -1383|8 -1386|5 -1389|7 -1392|1 -1395|8 -1398|135 -1404|2 -1410|4 -1413|5 -1419|3 -1422|3 -1425|7 -1428|4 -1431|1 -1434|4 -1437|2 -1440|5 -1443|4 -1446|1 -1449|23 -1452|2 -1455|2 -1458|3 -1461|3 -1464|5 -1467|2 -1470|4 -1473|10 -1476|3 -1479|8 -1482|3 -1485|6 -1488|6 -1491|1 -1497|2 -1500|221 -1503|1 -1506|4 -1509|2 -1512|2 -1515|5 -1518|5 -1521|2 -1524|6 -1527|2 -1530|7 -1533|5 -1536|5 -1539|4 -1545|2 -1548|22 -1551|3 -1554|6 -1557|3 -1560|2 -1563|3 -1566|8 -1569|10 -1572|1 -1575|12 -1581|1 -1584|3 -1587|2 -1590|8 -1599|136 -1602|3 -1605|4 -1611|1 -1614|1 -1617|2 -1620|2 -1623|4 -1626|2 -1629|4 -1632|6 -1635|6 -1638|2 -1641|1 -1647|2 -1650|25 -1653|2 -1656|3 -1659|3 -1665|2 -1668|4 -1671|2 -1674|6 -1677|3 -1680|7 -1683|11 -1686|2 -1692|2 -1695|1 -1698|116 -1701|1 -1704|2 -1707|1 -1710|4 -1713|3 -1716|2 -1719|4 -1722|4 -1725|4 -1728|5 -1731|5 -1734|1 -1737|1 -1740|4 -1743|4 -1749|21 -1752|2 -1755|3 -1758|9 -1761|3 -1770|1 -1773|7 -1776|1 -1779|2 -1782|6 -1785|5 -1788|5 -1791|1 -1797|1 -1800|129 -1803|4 -1806|3 -1809|4 -1812|2 -1815|2 -1818|4 -1824|8 -1827|2 -1830|4 -1833|1 -1836|2 -1839|2 -1842|2 -1845|1 -1848|12 -1851|1 -1854|2 -1857|1 -1860|3 -1863|6 -1866|1 -1869|6 -1872|1 -1875|10 -1878|3 -1881|4 -1884|1 -1887|1 -1893|3 -1896|2 -1899|49 -1905|1 -1908|3 -1914|4 -1917|4 -1923|9 -1926|4 -1929|2 -1935|1 -1938|2 -1944|1 -1950|9 -1959|1 -1962|1 -1965|1 -1968|2 -1971|3 -1974|5 -1977|2 -1980|1 -1983|1 -1986|3 -1989|1 -1992|3 -1995|1 -1998|109 -2010|2 -2016|1 -2019|8 -2025|4 -2028|3 -2034|1 -2037|3 -2043|1 -2049|5 -2067|1 -2070|2 -2073|1 -2085|1 -2100|56 -2109|1 -2115|4 -2130|1 -2136|2 -2139|1 -2142|1 -2148|5 -2154|1 -2160|2 -2163|1 -2178|1 -2181|1 -2187|1 -2190|3 -2196|1 -2199|46 -2202|1 -2208|2 -2217|1 -2226|1 -2250|6 -2256|2 -2262|1 -2280|1 -2286|1 -2289|2 -2295|1 -2298|27 -2310|1 -2316|1 -2319|1 -2325|1 -2331|1 -2349|5 -2355|1 -2358|1 -2361|1 -2364|1 -2370|2 -2373|5 -2376|1 -2394|1 -2400|23 -2427|1 -2448|2 -2451|1 -2469|2 -2478|1 -2484|1 -2499|42 -2511|1 -2532|3 -2535|1 -2538|3 -2550|3 -2580|1 -2595|1 -2598|9 -2613|1 -2625|1 -2628|1 -2649|1 -2652|2 -2655|1 -2667|1 -2679|1 -2700|12 -2721|1 -2730|2 -2739|2 -2751|2 -2754|2 -2781|1 -2787|1 -2799|8 -2823|1 -2850|2 -2898|4 -2913|1 -2952|5 -2964|2 -2988|1 -3000|12 -3099|2 -3150|1 -3156|1 -3189|1 -3198|4 -3204|2 -3258|1 -3300|9 -3348|2 -3399|2 -3498|3 -3600|3 -3699|2 -3744|1 -3750|3 -3765|1 -3846|1 -3900|1 -3999|6 -4299|1 -4500|5 -4800|1 -4806|5 -4899|1 -4998|5 -5199|1 -5250|1 -5499|4 -5523|1 -6000|2 -6009|1 -6198|1 -6408|1 -6498|6 -6600|1 -6798|1 -6900|1 -6999|1 -7398|1 -7698|1 -7800|1 -7998|4 -8298|1 -8499|1 -8598|1 -8799|1 -9000|1 -9399|2 -9798|2 -9915|1 -9999|1 diff --git a/tempdata/T___1_1566657839_3942_T0 b/tempdata/T___1_1566657839_3942_T0 deleted file mode 100644 index fa5e93b..0000000 --- a/tempdata/T___1_1566657839_3942_T0 +++ /dev/null @@ -1,306 +0,0 @@ -0|188219 -20|1 -70|3 -100|11 -110|1 -120|1 -130|1 -140|1 -150|6 -170|2 -190|1 -200|28 -210|32 -220|6 -230|6 -240|1 -250|16 -260|1 -270|2 -280|2 -290|2 -300|27 -310|4 -320|5 -330|1 -340|3 -350|12 -360|2 -370|1 -380|5 -390|3 -400|125 -410|3 -420|379 -430|106 -440|36 -450|238 -460|62 -470|118 -480|44 -490|35 -500|750 -510|37 -520|159 -530|51 -540|45 -550|291 -560|42 -570|90 -580|48 -590|16 -600|560 -610|35 -620|112 -630|34 -640|52 -650|252 -660|31 -670|79 -680|35 -690|40 -700|564 -710|59 -720|101 -730|50 -740|36 -750|236 -760|48 -770|45 -780|41 -790|30 -800|532 -810|35 -820|75 -830|48 -840|32 -850|186 -860|57 -870|66 -880|24 -890|24 -900|363 -910|29 -920|57 -930|26 -940|39 -950|117 -960|50 -970|39 -980|26 -990|30 -1000|399 -1010|25 -1020|52 -1030|33 -1040|23 -1050|99 -1060|27 -1070|32 -1080|25 -1090|23 -1100|257 -1110|13 -1120|30 -1130|24 -1140|18 -1150|71 -1160|27 -1170|28 -1180|16 -1190|10 -1200|268 -1210|20 -1220|25 -1230|25 -1240|17 -1250|78 -1260|15 -1270|30 -1280|18 -1290|11 -1300|208 -1310|12 -1320|21 -1330|12 -1340|9 -1350|29 -1360|20 -1370|21 -1380|20 -1390|15 -1400|134 -1410|11 -1420|14 -1430|8 -1440|13 -1450|25 -1460|12 -1470|21 -1480|17 -1490|5 -1500|226 -1510|14 -1520|10 -1530|17 -1540|9 -1550|31 -1560|13 -1570|23 -1580|6 -1590|8 -1600|143 -1610|4 -1620|8 -1630|18 -1640|3 -1650|30 -1660|5 -1670|15 -1680|20 -1690|3 -1700|120 -1710|10 -1720|13 -1730|10 -1740|8 -1750|32 -1760|6 -1770|10 -1780|15 -1790|4 -1800|136 -1810|9 -1820|13 -1830|7 -1840|6 -1850|15 -1860|11 -1870|16 -1880|9 -1890|5 -1900|50 -1910|11 -1920|14 -1930|2 -1940|3 -1950|9 -1960|5 -1970|10 -1980|5 -1990|6 -2000|108 -2010|10 -2020|6 -2030|6 -2040|1 -2050|5 -2060|1 -2070|3 -2080|1 -2100|56 -2110|5 -2130|3 -2140|2 -2150|6 -2160|3 -2170|1 -2180|2 -2190|4 -2200|49 -2210|1 -2220|1 -2250|8 -2260|1 -2280|2 -2290|4 -2300|26 -2310|2 -2320|2 -2330|1 -2350|6 -2360|3 -2370|8 -2390|1 -2400|23 -2420|1 -2450|3 -2460|1 -2470|1 -2480|2 -2500|42 -2510|1 -2530|6 -2540|1 -2550|3 -2580|1 -2590|1 -2600|9 -2610|1 -2620|1 -2630|1 -2650|4 -2660|1 -2680|1 -2700|12 -2720|1 -2730|3 -2740|1 -2750|4 -2780|2 -2800|8 -2820|1 -2850|2 -2900|4 -2910|1 -2950|5 -2960|2 -2980|1 -3000|12 -3100|2 -3150|2 -3190|1 -3200|6 -3250|1 -3300|9 -3350|2 -3400|2 -3500|3 -3600|3 -3700|2 -3740|1 -3750|3 -3760|1 -3840|1 -3900|1 -4000|6 -4300|1 -4500|5 -4800|6 -4900|1 -5000|5 -5200|1 -5250|1 -5500|4 -5520|1 -6000|3 -6200|1 -6410|1 -6500|6 -6600|1 -6800|1 -6900|1 -7000|1 -7400|1 -7700|1 -7800|1 -8000|4 -8300|1 -8500|1 -8600|1 -8800|1 -9000|1 -9400|2 -9800|2 -9910|1 -9990|1 diff --git a/tempdata/T___1_1566775130_3232_T0 b/tempdata/T___1_1566775130_3232_T0 deleted file mode 100644 index 10af708..0000000 --- a/tempdata/T___1_1566775130_3232_T0 +++ /dev/null @@ -1,31 +0,0 @@ -0|9213 -3|9929 -6|9576 -9|9424 -12|9280 -15|8570 -18|7293 -21|7748 -24|8280 -27|8821 -30|9742 -33|10279 -36|9908 -39|9392 -42|8670 -45|8458 -48|6766 -51|6230 -54|5185 -57|4802 -60|4588 -63|4630 -66|4375 -69|4240 -72|3896 -75|3094 -78|2486 -81|1896 -84|1290 -87|737 -90|725 diff --git a/tempdata/T___1_1566775130_8449_T0 b/tempdata/T___1_1566775130_8449_T0 deleted file mode 100644 index 10af708..0000000 --- a/tempdata/T___1_1566775130_8449_T0 +++ /dev/null @@ -1,31 +0,0 @@ -0|9213 -3|9929 -6|9576 -9|9424 -12|9280 -15|8570 -18|7293 -21|7748 -24|8280 -27|8821 -30|9742 -33|10279 -36|9908 -39|9392 -42|8670 -45|8458 -48|6766 -51|6230 -54|5185 -57|4802 -60|4588 -63|4630 -66|4375 -69|4240 -72|3896 -75|3094 -78|2486 -81|1896 -84|1290 -87|737 -90|725 diff --git a/tempdata/kibella.sqlite b/tempdata/kibella.sqlite index b5f0bde5c71bc256289026c98c3f388cfbeadd28..a8bf4b9ad4cb2c35476c22825fbd4a16bca26e8e 100644 GIT binary patch literal 337920 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�W=7u%mN=l^je_zO~0*YUGx)g*>S2{DF1H=;*ACw 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