diff --git a/4dev/database/function/set_generic.sql b/4dev/database/function/set_generic.sql index 04cf1655..d9ee552e 100644 --- a/4dev/database/function/set_generic.sql +++ b/4dev/database/function/set_generic.sql @@ -3,7 +3,7 @@ CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS ' BEGIN IF TG_OP = ''INSERT'' THEN - NEW.cuid := random_string(random_length); + NEW.date_created := ''now''; ELSIF TG_OP = ''UPDATE'' THEN NEW.date_updated := ''now''; END IF; diff --git a/4dev/database/function/set_uid.sql b/4dev/database/function/set_uid.sql new file mode 100755 index 00000000..91102008 --- /dev/null +++ b/4dev/database/function/set_uid.sql @@ -0,0 +1,12 @@ +-- adds the created or updated date tags + +CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS ' + DECLARE + random_length INT = 12; -- that should be long enough + BEGIN + IF TG_OP = ''INSERT'' THEN + NEW.uid := random_string(random_length); + END IF; + RETURN NEW; + END; +' LANGUAGE 'plpgsql'; diff --git a/www/admin/class_test.php b/www/admin/class_test.php index 4a22c31f..ccbd6349 100644 --- a/www/admin/class_test.php +++ b/www/admin/class_test.php @@ -97,6 +97,9 @@ print "DIRECT MULTIPLE INSERT STATUS: $status | PRIMARY KEYS: ".print_r($basic-> // no returning, but not needed ; $status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');"); print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, 1)."
"; +// UPDATE WITH RETURNING +$status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test"); +print "UPDATE STATUS: $status | RETURNING EXT: ".print_r($basic->insert_id_ext, 1)."
"; # db write class test $table = 'foo'; diff --git a/www/admin/set_paths.inc b/www/admin/set_paths.inc index 1e12cb4f..a02f5846 100644 --- a/www/admin/set_paths.inc +++ b/www/admin/set_paths.inc @@ -32,7 +32,7 @@ if ($_SESSION['DEFAULT_CHARSET']) { if ($_SESSION['DEFAULT_LANG']) { $lang = $_SESSION['DEFAULT_LANG']; } elseif (!$lang) { - $lang = DEFAULT_LANG; + $lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;; } // create the char lang encoding $lang_short = substr($lang, 0, 2); @@ -108,8 +108,8 @@ if (!is_dir($cms->cache_pictures)) { // if the template_dir is != DEFAULT_TEMPLATE, then try to make a lang switch // if the default lang is not like the lang given, switch lang -if (false === strstr(LAYOUT.DEFAULT_TEMPLATE.LANG, $cms->lang_dir) || strcasecmp(DEFAULT_LANG, $lang)) { - $cms->debug('LANG', 'Orig: '.LAYOUT.DEFAULT_TEMPLATE.LANG.', New: '.$cms->lang_dir.' | Orig Lang: '.DEFAULT_LANG.', New Lang: '.$lang); +if (false === strstr(LAYOUT.DEFAULT_TEMPLATE.LANG, $cms->lang_dir) || strcasecmp(defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;, $lang)) { + $cms->debug('LANG', 'Orig: '.LAYOUT.DEFAULT_TEMPLATE.LANG.', New: '.$cms->lang_dir.' | Orig Lang: '.(defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;).', New Lang: '.$lang); $cms->l->l10nReloadMOfile($lang, $cms->lang_dir); // if we have login class if ($login) { diff --git a/www/layout/admin/default/javascript/edit.js b/www/layout/admin/default/javascript/edit.js index 1a17c16e..47207103 100644 --- a/www/layout/admin/default/javascript/edit.js +++ b/www/layout/admin/default/javascript/edit.js @@ -356,9 +356,12 @@ function phfo(tree) // push finished line content.push(line); // dive into sub tree to attach sub nodes - // NOTES: we cannot have content (text) AND sub nodes at the same level - // NODE takes preference over content + // NOTES: we can have content (text) AND sub nodes at the same level + // CONTENT (TEXT) takes preference over SUB NODE in order if (tree.sub.length > 0) { + if (tree.content) { + content.push(tree.content); + } tree.sub.each(function(t) { content.push(phfo(t)); }); @@ -416,7 +419,7 @@ function html_options(name, data, selected = '', options_only = false, return_st } else { // strip select part if (return_string) { - element.sub.each(function(t) { + element_select.sub.each(function(t) { content.push(phfo(t)); }); return content.join(''); diff --git a/www/lib/CoreLibs/Basic.inc b/www/lib/CoreLibs/Basic.inc index 2a20aeab..52ca8125 100644 --- a/www/lib/CoreLibs/Basic.inc +++ b/www/lib/CoreLibs/Basic.inc @@ -202,7 +202,14 @@ class Basic $this->page_name = $this->getPageName(); $this->host_name = $this->getHostName(); // init the log file id - $this->log_file_id = defined('LOG_FILE_ID') ? LOG_FILE_ID : ''; + // * GLOBALS + // * CONSTANT + // can be overridden with basicSetLogFileId + if (isset($GLOBALS['LOG_FILE_ID'])) { + $this->basicSetLogId($GLOBALS['LOG_FILE_ID']); + } elseif (defined('LOG_FILE_ID')) { + $this->basicSetLogId(LOG_FILE_ID); + } // set the paths matching to the valid file types $this->data_path = array ( @@ -388,6 +395,22 @@ class Basic // GENERAL METHODS // ************************************************************* + // METHOD: basicSetLogId + // PARAMS: string + // RETURN: current set string + // DESC : sets the log file prefix id + // must be alphanumeric only (\w) + public function basicSetLogId($string) + { + if (!isset($log_file_id)) { + $log_file_id = ''; + } + if (isset($string) && preg_match("/^\w+$/", $string)) { + $this->log_file_id = $string; + } + return $log_file_id; + } + // METHOD: db_io_info // PARAMS: show, default 1, if set to 0 won't write to error_msg var // RETURN: string with info diff --git a/www/lib/CoreLibs/DB/IO.inc b/www/lib/CoreLibs/DB/IO.inc index 682c0525..21d08f1c 100644 --- a/www/lib/CoreLibs/DB/IO.inc +++ b/www/lib/CoreLibs/DB/IO.inc @@ -461,15 +461,15 @@ class IO extends \CoreLibs\Basic // WAS : _check_query_for_select // PARAMS: query // RETURN: true if matching, false if not - // DESC : checks if query is a SELECT or SHOW, if not error, 0 return - // NOTE : Query needs to start with SELECT or SHOW. if starts with "with" it is ignored + // DESC : checks if query is a SELECT, SHOW or WITH, if not error, 0 return + // NOTE : Query needs to start with SELECT, SHOW or WITH. if starts with "with" it is ignored private function __checkQueryForSelect($query) { // perhaps allow spaces before select ?!? - if (!preg_match("/^(select|show|with) /i", $query)) { - return false; + if (preg_match("/^(select|show|with) /i", $query)) { + return true; } - return true; + return false; } // METHOD: __checkQueryForInsert @@ -481,16 +481,26 @@ class IO extends \CoreLibs\Basic // NOTE : Queries need to start with INSERT, UPDATE, DELETE. Anything else is ignored private function __checkQueryForInsert($query, $pure = false) { - if (!preg_match("/^insert /i", $query) && !preg_match("/^update /i", $query) && !preg_match("/^delete /i", $query)) { - return false; - } - if (!$pure) { + if ($pure && preg_match("/^insert /i", $query)) { return true; - } elseif (preg_match("/^insert /i", $query)) { - return true; - } else { - return false; } + if (!$pure && preg_match("/^(insert|update|delete) /i", $query)) { + return true; + } + return false; + } + + // METHOD: __checkQueryForUpdate + // PARAMS: query + // RETURN: true if UPDATE, else false + // DESC : returns true if the query starts with UPDATE + // NOTE : query NEEDS to start with UPDATE + private function __checkQueryForUpdate($query) + { + if (preg_match("/^update /i", $query)) { + return true; + } + return false; } // METHOD: __printArray @@ -683,15 +693,22 @@ class IO extends \CoreLibs\Basic $this->query = preg_replace("/(;\s*)$/", '', $this->query); $this->query .= " RETURNING ".$this->pk_name; $this->returning_id = true; - } elseif (preg_match("/ returning (.*)/i", $this->query, $matches) && $this->pk_name && $this->pk_name != 'NULL') { - // add the primary key if it is not in the returning set - if (!preg_match("/$this->pk_name/", $matches[1])) { - $this->query .= " , ".$this->pk_name; + } elseif (preg_match("/ returning (.*)/i", $this->query, $matches)) { + if ($this->pk_name && $this->pk_name != 'NULL') { + // add the primary key if it is not in the returning set + if (!preg_match("/$this->pk_name/", $matches[1])) { + $this->query .= " , ".$this->pk_name; + } } $this->returning_id = true; } } } + // if we have an UPDATE and RETURNING, flag for true, but do not add anything + if ($this->__checkQueryForUpdate($this->query) && preg_match("/ returning (.*)/i", $this->query, $matches)) { + $this->returning_id = true; + } + // $this->debug('DB IO', 'Q: '.$this->query.', RETURN: '.$this->returning_id); // for DEBUG, only on first time ;) if ($this->db_debug) { $this->__dbDebug('db', $this->query, '__dbPrepareExec', 'Q'); @@ -752,7 +769,9 @@ class IO extends \CoreLibs\Basic // if not select do here // count affected rows $this->num_rows = $this->db_functions->__dbAffectedRows($this->cursor); - if ($this->__checkQueryForInsert($this->query, true) && $this->pk_name != 'NULL') { + if (($this->__checkQueryForInsert($this->query, true) && $this->pk_name != 'NULL') || + ($this->__checkQueryForUpdate($this->query) && $this->returning_id) + ) { // set insert_id // if we do not have a returning, we try to get it via the primary key and another select if (!$this->returning_id) { @@ -770,14 +789,16 @@ class IO extends \CoreLibs\Basic // if we have only one, revert from array to single if (count($this->insert_id) == 1) { // echo "* SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->pk_name, $this->insert_id[0])."
"; - // echo "* PK DIRECT: ".$this->insert_id[0][$this->pk_name]."
"; + // echo "* PK DIRECT: ".(isset($this->insert_id[0][$this->pk_name]) ? $this->insert_id[0][$this->pk_name] : '[NO PK NAME SET]' )."
"; // if this has only the pk_name, then only return this, else array of all data (but without the position) // example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar'] // if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id if (count($this->insert_id[0]) > 1 || !array_key_exists($this->pk_name, $this->insert_id[0])) { $this->insert_id_ext = $this->insert_id[0]; - $this->insert_id = $this->insert_id[0][$this->pk_name]; - } elseif ($this->insert_id[0][$this->pk_name]) { + if (isset($this->insert_id[0][$this->pk_name])) { + $this->insert_id = $this->insert_id[0][$this->pk_name]; + } + } elseif (isset($this->insert_id[0][$this->pk_name])) { $this->insert_id = $this->insert_id[0][$this->pk_name]; } } elseif (count($this->insert_id) == 0) { diff --git a/www/lib/CoreLibs/DB/SQL/PgSQL.inc b/www/lib/CoreLibs/DB/SQL/PgSQL.inc index a85bfe6f..6ff2e3f8 100644 --- a/www/lib/CoreLibs/DB/SQL/PgSQL.inc +++ b/www/lib/CoreLibs/DB/SQL/PgSQL.inc @@ -350,7 +350,8 @@ class PgSQL // DESC : wrapper for pg_emta_data public function __dbMetaData($table) { - return pg_meta_data($this->dbh, $table); + // needs to prefixed with @ or it throws a warning on not existing table + return @pg_meta_data($this->dbh, $table); } // METHOD: __dbEscapeString