Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70a30c3182 | ||
|
|
9d54d6b0d1 | ||
|
|
a46888d101 | ||
|
|
be092fc449 | ||
|
|
6059b83637 | ||
|
|
b6c6d76b43 | ||
|
|
80993a06ac | ||
|
|
50073479d4 | ||
|
|
85f701ab2a | ||
|
|
519de8a23c | ||
|
|
d5fdb22e93 | ||
|
|
0ec0007569 | ||
|
|
7165a50b4d | ||
|
|
71ee80fa06 |
@@ -22,6 +22,7 @@ table/edit_page_access.sql
|
|||||||
table/edit_page_content.sql
|
table/edit_page_content.sql
|
||||||
table/edit_user.sql
|
table/edit_user.sql
|
||||||
table/edit_log.sql
|
table/edit_log.sql
|
||||||
|
table/edit_log_overflow.sql
|
||||||
table/edit_access.sql
|
table/edit_access.sql
|
||||||
table/edit_access_user.sql
|
table/edit_access_user.sql
|
||||||
table/edit_access_data.sql
|
table/edit_access_data.sql
|
||||||
@@ -32,6 +33,7 @@ trigger/trg_edit_access_data.sql
|
|||||||
trigger/trg_edit_access_user.sql
|
trigger/trg_edit_access_user.sql
|
||||||
trigger/trg_edit_group.sql
|
trigger/trg_edit_group.sql
|
||||||
trigger/trg_edit_language.sql
|
trigger/trg_edit_language.sql
|
||||||
|
trigger/trg_edit_log_overflow.sql
|
||||||
trigger/trg_edit_log.sql
|
trigger/trg_edit_log.sql
|
||||||
trigger/trg_edit_page_access.sql
|
trigger/trg_edit_page_access.sql
|
||||||
trigger/trg_edit_page_content.sql
|
trigger/trg_edit_page_content.sql
|
||||||
@@ -41,6 +43,5 @@ trigger/trg_edit_scheme.sql
|
|||||||
trigger/trg_edit_user.sql
|
trigger/trg_edit_user.sql
|
||||||
trigger/trg_edit_visible_group.sql
|
trigger/trg_edit_visible_group.sql
|
||||||
trigger/trg_edit_menu_group.sql
|
trigger/trg_edit_menu_group.sql
|
||||||
trigger/trg_set_edit_access_uid.sql
|
|
||||||
# insert data
|
# insert data
|
||||||
data/edit_tables.sql
|
data/edit_tables.sql
|
||||||
|
|||||||
28
4dev/database/function/edit_set_group_uid.sql
Executable file
28
4dev/database/function/edit_set_group_uid.sql
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
-- add uid add for edit_group table
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
myrec RECORD;
|
||||||
|
v_uid VARCHAR;
|
||||||
|
BEGIN
|
||||||
|
-- skip if NEW.name is not set
|
||||||
|
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||||
|
-- use NEW.name as base, remove all spaces
|
||||||
|
-- name data is already unique, so we do not need to worry about this here
|
||||||
|
v_uid := REPLACE(NEW.name, ' ', '');
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
-- always set
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
-- check if not set, then set
|
||||||
|
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
|
||||||
|
IF FOUND THEN
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
0
4dev/database/function/random_string.sql
Executable file → Normal file
0
4dev/database/function/random_string.sql
Executable file → Normal file
0
4dev/database/function/set_uid.sql
Executable file → Normal file
0
4dev/database/function/set_uid.sql
Executable file → Normal file
@@ -9,8 +9,8 @@
|
|||||||
CREATE TABLE edit_access_data (
|
CREATE TABLE edit_access_data (
|
||||||
edit_access_data_id SERIAL PRIMARY KEY,
|
edit_access_data_id SERIAL PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
value VARCHAR,
|
value VARCHAR
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -9,11 +9,11 @@
|
|||||||
CREATE TABLE edit_access_user (
|
CREATE TABLE edit_access_user (
|
||||||
edit_access_user_id SERIAL PRIMARY KEY,
|
edit_access_user_id SERIAL PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
edit_user_id INT NOT NULL,
|
|
||||||
edit_access_right_id INT NOT NULL,
|
|
||||||
edit_default SMALLINT DEFAULT 0,
|
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
edit_user_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
edit_access_right_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
edit_default SMALLINT DEFAULT 0,
|
||||||
|
enabled SMALLINT NOT NULL DEFAULT 0
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
CREATE TABLE edit_group (
|
CREATE TABLE edit_group (
|
||||||
edit_group_id SERIAL PRIMARY KEY,
|
edit_group_id SERIAL PRIMARY KEY,
|
||||||
edit_scheme_id INT,
|
edit_scheme_id INT,
|
||||||
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
deleted SMALLINT DEFAULT 0,
|
deleted SMALLINT DEFAULT 0,
|
||||||
uid VARCHAR,
|
uid VARCHAR,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
additional_acl JSONB,
|
additional_acl JSONB
|
||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
-- DROP TABLE edit_log;
|
-- DROP TABLE edit_log;
|
||||||
CREATE TABLE edit_log (
|
CREATE TABLE edit_log (
|
||||||
edit_log_id SERIAL PRIMARY KEY,
|
edit_log_id SERIAL PRIMARY KEY,
|
||||||
|
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
||||||
|
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
||||||
username VARCHAR,
|
username VARCHAR,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
@@ -26,7 +28,6 @@ CREATE TABLE edit_log (
|
|||||||
action_value VARCHAR,
|
action_value VARCHAR,
|
||||||
action_type VARCHAR,
|
action_type VARCHAR,
|
||||||
action_error VARCHAR,
|
action_error VARCHAR,
|
||||||
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
|
||||||
user_agent VARCHAR,
|
user_agent VARCHAR,
|
||||||
referer VARCHAR,
|
referer VARCHAR,
|
||||||
script_name VARCHAR,
|
script_name VARCHAR,
|
||||||
@@ -36,6 +37,5 @@ CREATE TABLE edit_log (
|
|||||||
http_accept VARCHAR,
|
http_accept VARCHAR,
|
||||||
http_accept_charset VARCHAR,
|
http_accept_charset VARCHAR,
|
||||||
http_accept_encoding VARCHAR,
|
http_accept_encoding VARCHAR,
|
||||||
session_id VARCHAR,
|
session_id VARCHAR
|
||||||
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL
|
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
0
4dev/database/table/edit_log_overflow.sql
Executable file → Normal file
0
4dev/database/table/edit_log_overflow.sql
Executable file → Normal file
@@ -9,6 +9,7 @@
|
|||||||
CREATE TABLE edit_page (
|
CREATE TABLE edit_page (
|
||||||
edit_page_id SERIAL PRIMARY KEY,
|
edit_page_id SERIAL PRIMARY KEY,
|
||||||
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
||||||
|
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||||
filename VARCHAR,
|
filename VARCHAR,
|
||||||
name VARCHAR UNIQUE,
|
name VARCHAR UNIQUE,
|
||||||
order_number INT NOT NULL,
|
order_number INT NOT NULL,
|
||||||
@@ -17,6 +18,5 @@ CREATE TABLE edit_page (
|
|||||||
popup SMALLINT NOT NULL DEFAULT 0,
|
popup SMALLINT NOT NULL DEFAULT 0,
|
||||||
popup_x SMALLINT,
|
popup_x SMALLINT,
|
||||||
popup_y SMALLINT,
|
popup_y SMALLINT,
|
||||||
hostname VARCHAR,
|
hostname VARCHAR
|
||||||
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE
|
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -9,12 +9,12 @@
|
|||||||
CREATE TABLE edit_page_access (
|
CREATE TABLE edit_page_access (
|
||||||
edit_page_access_id SERIAL PRIMARY KEY,
|
edit_page_access_id SERIAL PRIMARY KEY,
|
||||||
edit_group_id INT NOT NULL,
|
edit_group_id INT NOT NULL,
|
||||||
edit_page_id INT NOT NULL,
|
|
||||||
edit_access_right_id INT NOT NULL,
|
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
edit_access_right_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
enabled SMALLINT NOT NULL DEFAULT 0
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
6
4dev/database/table/edit_page_content.sql
Executable file → Normal file
6
4dev/database/table/edit_page_content.sql
Executable file → Normal file
@@ -10,11 +10,11 @@
|
|||||||
CREATE TABLE edit_page_content (
|
CREATE TABLE edit_page_content (
|
||||||
edit_page_content_id SERIAL PRIMARY KEY,
|
edit_page_content_id SERIAL PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
uid VARCHAR UNIQUE,
|
uid VARCHAR UNIQUE,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
order_number INT NOT NULL,
|
order_number INT NOT NULL,
|
||||||
online SMALLINT NOT NULL DEFAULT 0,
|
online SMALLINT NOT NULL DEFAULT 0
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
-- DROP TABLE edit_page_menu_group;
|
-- DROP TABLE edit_page_menu_group;
|
||||||
CREATE TABLE edit_page_menu_group (
|
CREATE TABLE edit_page_menu_group (
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
edit_menu_group_id INT NOT NULL,
|
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
edit_menu_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
-- DROP TABLE edit_page_visible_group;
|
-- DROP TABLE edit_page_visible_group;
|
||||||
CREATE TABLE edit_page_visible_group (
|
CREATE TABLE edit_page_visible_group (
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
edit_visible_group_id INT NOT NULL,
|
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
edit_visible_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
CREATE TABLE edit_query_string (
|
CREATE TABLE edit_query_string (
|
||||||
edit_query_string_id SERIAL PRIMARY KEY,
|
edit_query_string_id SERIAL PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
value VARCHAR,
|
value VARCHAR,
|
||||||
dynamic SMALLINT NOT NULL DEFAULT 0,
|
dynamic SMALLINT NOT NULL DEFAULT 0
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -9,10 +9,15 @@
|
|||||||
CREATE TABLE edit_user (
|
CREATE TABLE edit_user (
|
||||||
edit_user_id SERIAL PRIMARY KEY,
|
edit_user_id SERIAL PRIMARY KEY,
|
||||||
connect_edit_user_id INT, -- possible reference to other user
|
connect_edit_user_id INT, -- possible reference to other user
|
||||||
|
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_language_id INT NOT NULL,
|
edit_language_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_group_id INT NOT NULL,
|
edit_group_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_scheme_id INT,
|
edit_scheme_id INT,
|
||||||
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||||
username VARCHAR UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
@@ -26,17 +31,18 @@ CREATE TABLE edit_user (
|
|||||||
email VARCHAR,
|
email VARCHAR,
|
||||||
protected SMALLINT NOT NULL DEFAULT 0,
|
protected SMALLINT NOT NULL DEFAULT 0,
|
||||||
admin SMALLINT NOT NULL DEFAULT 0,
|
admin SMALLINT NOT NULL DEFAULT 0,
|
||||||
login_error_count INT,
|
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
login_error_count INT DEFAULT 0,
|
||||||
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
||||||
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
||||||
strict SMALLINT DEFAULT 0,
|
strict SMALLINT DEFAULT 0,
|
||||||
locked SMALLINT DEFAULT 0,
|
locked SMALLINT DEFAULT 0,
|
||||||
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
||||||
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
||||||
additional_acl JSONB, -- additional ACL as JSON string (can be set by other pages)
|
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
||||||
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
||||||
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
||||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
|
||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
||||||
|
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid';
|
||||||
|
|||||||
@@ -2,3 +2,8 @@ DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
|
|||||||
CREATE TRIGGER trg_edit_group
|
CREATE TRIGGER trg_edit_group
|
||||||
BEFORE INSERT OR UPDATE ON edit_group
|
BEFORE INSERT OR UPDATE ON edit_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
|
DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group;
|
||||||
|
CREATE TRIGGER trg_set_edit_group_uid
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_group
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid();
|
||||||
|
|||||||
0
4dev/database/trigger/trg_edit_log_overflow.sql
Executable file → Normal file
0
4dev/database/trigger/trg_edit_log_overflow.sql
Executable file → Normal file
0
4dev/database/trigger/trg_edit_page_content.sql
Executable file → Normal file
0
4dev/database/trigger/trg_edit_page_content.sql
Executable file → Normal file
@@ -1,4 +0,0 @@
|
|||||||
-- DROP TRIGGER trg_set_edit_access_uid ON edit_access;
|
|
||||||
CREATE TRIGGER trg_set_edit_access_uid
|
|
||||||
BEFORE INSERT OR UPDATE ON edit_access
|
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();
|
|
||||||
0
4dev/database/update/edit_tables_missing_columns.sql
Executable file → Normal file
0
4dev/database/update/edit_tables_missing_columns.sql
Executable file → Normal file
0
4dev/database/update/edit_update_missing_cuid.sql
Executable file → Normal file
0
4dev/database/update/edit_update_missing_cuid.sql
Executable file → Normal file
@@ -107,23 +107,62 @@ while ($res = $basic->dbReturn("SELECT * FROM max_test")) {
|
|||||||
print "[CACHED] TIME: ".$res['time']."<br>";
|
print "[CACHED] TIME: ".$res['time']."<br>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print "<pre>";
|
||||||
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
|
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
|
||||||
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
|
print "DIRECT INSERT STATUS: $status | "
|
||||||
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>";
|
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
|
||||||
|
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
|
||||||
|
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
|
||||||
|
|
||||||
|
// should throw deprecated error
|
||||||
|
// $basic->getReturningExt();
|
||||||
|
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
|
||||||
$basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
|
$basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
|
||||||
$status = $basic->dbExecute("ins_foo", array('BAR TEST '.time()));
|
$status = $basic->dbExecute("ins_foo", array('BAR TEST '.time()));
|
||||||
print "PREPARE INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
|
print "PREPARE INSERT STATUS: $status | "
|
||||||
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>";
|
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
|
||||||
|
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
|
||||||
|
."RETURNING RETURN: ".print_r($basic->dbGetReturningArray(), true)."<br>";
|
||||||
|
|
||||||
|
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
|
||||||
// returning test with multiple entries
|
// returning test with multiple entries
|
||||||
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
|
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
|
||||||
$status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
|
$status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
|
||||||
print "DIRECT MULTIPLE INSERT STATUS: $status | PRIMARY KEYS: ".print_r($basic->insert_id, true)." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>";
|
print "DIRECT MULTIPLE INSERT STATUS: $status | "
|
||||||
|
."PRIMARY KEYS: ".print_r($basic->dbGetInsertPK(), true)." | "
|
||||||
|
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
|
||||||
|
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
|
||||||
|
|
||||||
// no returning, but not needed ;
|
// no returning, but not needed ;
|
||||||
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');");
|
$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, true)."<br>";
|
print "DIRECT INSERT STATUS: $status | "
|
||||||
|
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
|
||||||
|
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
|
||||||
|
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
|
||||||
|
|
||||||
// UPDATE WITH RETURNING
|
// UPDATE WITH RETURNING
|
||||||
$status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test");
|
$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, true)."<br>";
|
print "UPDATE STATUS: $status | "
|
||||||
|
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
|
||||||
|
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
|
||||||
|
print "</pre>";
|
||||||
|
|
||||||
|
// REEAD PREPARE
|
||||||
|
if ($basic->dbPrepare('sel_foo', "SELECT foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time FROM foo ORDER BY foo_id DESC LIMIT 5") === false) {
|
||||||
|
print "Error in sel_foo prepare<br>";
|
||||||
|
} else {
|
||||||
|
$max_rows = 6;
|
||||||
|
// do not run this in dbFetchArray directly as
|
||||||
|
// dbFetchArray(dbExecute(...))
|
||||||
|
// this will end in an endless loop
|
||||||
|
$cursor = $basic->dbExecute('sel_foo', []);
|
||||||
|
$i = 1;
|
||||||
|
while (($res = $basic->dbFetchArray($cursor, true)) !== false) {
|
||||||
|
print "DB PREP EXEC FETCH ARR: ".$i.": <pre>".print_r($res, true)."</pre><br>";
|
||||||
|
$i ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# db write class test
|
# db write class test
|
||||||
$table = 'foo';
|
$table = 'foo';
|
||||||
@@ -347,6 +386,12 @@ foreach ($images as $image) {
|
|||||||
echo "<hr>";
|
echo "<hr>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// mime test
|
||||||
|
$mime = 'application/vnd.ms-excel';
|
||||||
|
print "App for mime: ".$basic->mimeGetAppName($mime)."<br>";
|
||||||
|
$basic->mimeSetAppName($mime, 'Microsoft Excel');
|
||||||
|
print "App for mime changed: ".$basic->mimeGetAppName($mime)."<br>";
|
||||||
|
|
||||||
// print error messages
|
// print error messages
|
||||||
// print $login->printErrorMsg();
|
// print $login->printErrorMsg();
|
||||||
print $basic->printErrorMsg();
|
print $basic->printErrorMsg();
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
// please be VERY carefull only to change the right side
|
// please be VERY carefull only to change the right side
|
||||||
$DB_CONFIG = array(
|
$DB_CONFIG = [
|
||||||
'test' => array(
|
'test' => [
|
||||||
'db_name' => 'gullevek',
|
'db_name' => 'gullevek',
|
||||||
'db_user' => 'gullevek',
|
'db_user' => 'gullevek',
|
||||||
'db_pass' => 'gullevek',
|
'db_pass' => 'gullevek',
|
||||||
@@ -19,7 +19,7 @@ $DB_CONFIG = array(
|
|||||||
'db_type' => 'pgsql',
|
'db_type' => 'pgsql',
|
||||||
'db_encoding' => '',
|
'db_encoding' => '',
|
||||||
'db_ssl' => 'disable' // allow, disable, require, prefer
|
'db_ssl' => 'disable' // allow, disable, require, prefer
|
||||||
)
|
]
|
||||||
);
|
];
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -12,18 +12,18 @@
|
|||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
// other master config to attach
|
// other master config to attach
|
||||||
// $__LOCAL_CONFIG = array(
|
// $__LOCAL_CONFIG = [
|
||||||
// 'db_host' => '',
|
// 'db_host' => '',
|
||||||
// 'location' => '',
|
// 'location' => '',
|
||||||
// 'debug_flag' => true,
|
// 'debug_flag' => true,
|
||||||
// 'site_lang' => 'en_utf8',
|
// 'site_lang' => 'en_utf8',
|
||||||
// 'login_enabled' => true
|
// 'login_enabled' => true
|
||||||
// );
|
// ];
|
||||||
|
|
||||||
// each host has a different db_host
|
// each host has a different db_host
|
||||||
$SITE_CONFIG = array(
|
$SITE_CONFIG = [
|
||||||
// development host
|
// development host
|
||||||
'soba.tokyo.tequila.jp' => array(
|
'soba.tokyo.tequila.jp' => [
|
||||||
// db config selection
|
// db config selection
|
||||||
'db_host' => 'test',
|
'db_host' => 'test',
|
||||||
// other db connections
|
// other db connections
|
||||||
@@ -37,8 +37,8 @@ $SITE_CONFIG = array(
|
|||||||
'site_lang' => 'en_utf8',
|
'site_lang' => 'en_utf8',
|
||||||
// enable/disable login override
|
// enable/disable login override
|
||||||
'login_enabled' => true
|
'login_enabled' => true
|
||||||
),
|
],
|
||||||
// 'other.host.com' => $__LOCAL_CONFIG
|
// 'other.host.com' => $__LOCAL_CONFIG
|
||||||
);
|
];
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ define('LIBS', 'lib'.DS);
|
|||||||
define('CONFIGS', 'configs'.DS);
|
define('CONFIGS', 'configs'.DS);
|
||||||
// includes (strings, arrays for static, etc)
|
// includes (strings, arrays for static, etc)
|
||||||
define('INCLUDES', 'includes'.DS);
|
define('INCLUDES', 'includes'.DS);
|
||||||
// data folder (mostly in includes)
|
// data folder (mostly in includes, or root for internal data)
|
||||||
define('DATA', 'data'.DS);
|
define('DATA', 'data'.DS);
|
||||||
// layout base path
|
// layout base path
|
||||||
define('LAYOUT', 'layout'.DS);
|
define('LAYOUT', 'layout'.DS);
|
||||||
@@ -36,20 +36,22 @@ define('PICTURES', 'images'.DS);
|
|||||||
define('IMAGES', 'images'.DS);
|
define('IMAGES', 'images'.DS);
|
||||||
// icons (below the images/ folder)
|
// icons (below the images/ folder)
|
||||||
define('ICONS', 'icons'.DS);
|
define('ICONS', 'icons'.DS);
|
||||||
// media
|
// media (accessable from outside)
|
||||||
define('MEDIA', 'media'.DS);
|
define('MEDIA', 'media'.DS);
|
||||||
// flash-root (below media)
|
// flash-root (below media or data)
|
||||||
define('FLASH', 'flash'.DS);
|
define('FLASH', 'flash'.DS);
|
||||||
// uploads (anything to keep)
|
// uploads (anything to keep or data)
|
||||||
define('UPLOADS', 'uploads'.DS);
|
define('UPLOADS', 'uploads'.DS);
|
||||||
// files (binaries) (below media)
|
// files (binaries) (below media or data)
|
||||||
define('BINARIES', 'binaries'.DS);
|
define('BINARIES', 'binaries'.DS);
|
||||||
// files (videos) (below media)
|
// files (videos) (below media or data)
|
||||||
define('VIDEOS', 'videos'.DS);
|
define('VIDEOS', 'videos'.DS);
|
||||||
// files (documents) (below media)
|
// files (documents) (below media or data)
|
||||||
define('DOCUMENTS', 'documents'.DS);
|
define('DOCUMENTS', 'documents'.DS);
|
||||||
// files (pdfs) (below media)
|
// files (pdfs) (below media or data)
|
||||||
define('PDFS', 'documents'.DS);
|
define('PDFS', 'documents'.DS);
|
||||||
|
// files (general) (below media or data)
|
||||||
|
define('FILES', 'files'.DS);
|
||||||
// CSV
|
// CSV
|
||||||
define('CSV', 'csv'.DS);
|
define('CSV', 'csv'.DS);
|
||||||
// css
|
// css
|
||||||
@@ -101,8 +103,23 @@ define('LOGOUT_TARGET', '');
|
|||||||
define('PASSWORD_CHANGE', false);
|
define('PASSWORD_CHANGE', false);
|
||||||
define('PASSWORD_FORGOT', false);
|
define('PASSWORD_FORGOT', false);
|
||||||
// min/max password length
|
// min/max password length
|
||||||
define('PASSWORD_MIN_LENGTH', 8);
|
define('PASSWORD_MIN_LENGTH', 9);
|
||||||
define('PASSWORD_MAX_LENGTH', 255);
|
define('PASSWORD_MAX_LENGTH', 255);
|
||||||
|
// defines allowed special characters
|
||||||
|
define('PASSWORD_SPECIAL_RANGE', '@$!%*?&');
|
||||||
|
// password must have upper case, lower case, number, special
|
||||||
|
// comment out for not mandatory
|
||||||
|
define('PASSWORD_LOWER', '(?=.*[a-z])');
|
||||||
|
define('PASSWORD_UPPER', '(?=.*[A-Z])');
|
||||||
|
define('PASSWORD_NUMBER', '(?=.*\d)');
|
||||||
|
define('PASSWORD_SPECIAL', "(?=.*[".PASSWORD_SPECIAL_RANGE."])");
|
||||||
|
// define full regex
|
||||||
|
define('PASSWORD_REGEX', "/^".
|
||||||
|
(defined('PASSWORD_LOWER') ? PASSWORD_LOWER : '').
|
||||||
|
(defined('PASSWORD_UPPER') ? PASSWORD_UPPER : '').
|
||||||
|
(defined('PASSWORD_NUMBER') ? PASSWORD_NUMBER : '').
|
||||||
|
(defined('PASSWORD_SPECIAL') ? PASSWORD_SPECIAL : '').
|
||||||
|
"[A-Za-z\d".PASSWORD_SPECIAL_RANGE."]{".PASSWORD_MIN_LENGTH.",".PASSWORD_MAX_LENGTH."}$/");
|
||||||
|
|
||||||
/************* AJAX / ACCESS *************/
|
/************* AJAX / ACCESS *************/
|
||||||
// ajax request type
|
// ajax request type
|
||||||
@@ -150,13 +167,6 @@ define('DEFAULT_ENCODING', 'UTF-8');
|
|||||||
// see Basic class constructor
|
// see Basic class constructor
|
||||||
define('LOG_FILE_ID', BASE_NAME);
|
define('LOG_FILE_ID', BASE_NAME);
|
||||||
|
|
||||||
/************* CLASS ERRORS *******************/
|
|
||||||
// 0 = default all OFF
|
|
||||||
// 1 = throw notice on unset class var
|
|
||||||
// 2 = no notice on unset class var, but do not set undefined class var
|
|
||||||
// 3 = throw error and do not set class var
|
|
||||||
define('CLASS_VARIABLE_ERROR_MODE', 3);
|
|
||||||
|
|
||||||
/************* QUEUE TABLE *************/
|
/************* QUEUE TABLE *************/
|
||||||
// if we have a dev/live system
|
// if we have a dev/live system
|
||||||
// set_live is a per page/per item
|
// set_live is a per page/per item
|
||||||
@@ -177,14 +187,14 @@ if (file_exists(BASE.CONFIGS.'config.host.php')) {
|
|||||||
require BASE.CONFIGS.'config.host.php';
|
require BASE.CONFIGS.'config.host.php';
|
||||||
}
|
}
|
||||||
if (!isset($SITE_CONFIG)) {
|
if (!isset($SITE_CONFIG)) {
|
||||||
$SITE_CONFIG = array();
|
$SITE_CONFIG = [];
|
||||||
}
|
}
|
||||||
/************* DB ACCESS *****************/
|
/************* DB ACCESS *****************/
|
||||||
if (file_exists(BASE.CONFIGS.'config.db.php')) {
|
if (file_exists(BASE.CONFIGS.'config.db.php')) {
|
||||||
require BASE.CONFIGS.'config.db.php';
|
require BASE.CONFIGS.'config.db.php';
|
||||||
}
|
}
|
||||||
if (!isset($DB_CONFIG)) {
|
if (!isset($DB_CONFIG)) {
|
||||||
$DB_CONFIG = array();
|
$DB_CONFIG = [];
|
||||||
}
|
}
|
||||||
/************* OTHER PATHS *****************/
|
/************* OTHER PATHS *****************/
|
||||||
if (file_exists(BASE.CONFIGS.'config.path.php')) {
|
if (file_exists(BASE.CONFIGS.'config.path.php')) {
|
||||||
@@ -230,7 +240,7 @@ if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVE
|
|||||||
}
|
}
|
||||||
// define the db config set name, the db config and the db schema
|
// define the db config set name, the db config and the db schema
|
||||||
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
|
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
|
||||||
define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : array());
|
define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : []);
|
||||||
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
|
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
|
||||||
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
|
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
|
||||||
// override for login and global schemas
|
// override for login and global schemas
|
||||||
|
|||||||
@@ -11,11 +11,11 @@
|
|||||||
|
|
||||||
/************* CONVERT *******************/
|
/************* CONVERT *******************/
|
||||||
// this only needed if the external thumbnail create is used
|
// this only needed if the external thumbnail create is used
|
||||||
$paths = array(
|
$paths = [
|
||||||
'/bin',
|
'/bin',
|
||||||
'/usr/bin',
|
'/usr/bin',
|
||||||
'/usr/local/bin'
|
'/usr/local/bin'
|
||||||
);
|
];
|
||||||
// find convert
|
// find convert
|
||||||
foreach ($paths as $path) {
|
foreach ($paths as $path) {
|
||||||
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
|
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
|
||||||
|
|||||||
@@ -10,12 +10,12 @@
|
|||||||
|
|
||||||
// File and Folder paths
|
// File and Folder paths
|
||||||
// ID is TARGET (first array element)
|
// ID is TARGET (first array element)
|
||||||
/*$PATHS = array(
|
/*$PATHS = [
|
||||||
'test' => array(
|
'test' => [
|
||||||
'csv_path' => '',
|
'csv_path' => '',
|
||||||
'perl_bin' => '',
|
'perl_bin' => '',
|
||||||
'other_url' => '',
|
'other_url' => '',
|
||||||
)
|
]
|
||||||
)*/
|
];*/
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ if (!defined('DS')) {
|
|||||||
exit('Base config unloadable');
|
exit('Base config unloadable');
|
||||||
}
|
}
|
||||||
// find trigger name "admin/" or "frontend/" in the getcwd() folder
|
// find trigger name "admin/" or "frontend/" in the getcwd() folder
|
||||||
foreach (array('admin', 'frontend') as $folder) {
|
foreach (['admin', 'frontend'] as $folder) {
|
||||||
if (strstr(getcwd(), DS.$folder)) {
|
if (strstr(getcwd(), DS.$folder)) {
|
||||||
define('CONTENT_PATH', $folder.DS);
|
define('CONTENT_PATH', $folder.DS);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
{if $STYLESHEET}
|
{if $STYLESHEET}
|
||||||
<link rel=stylesheet type="text/css" href="{$css}{$STYLESHEET}">
|
<link rel=stylesheet type="text/css" href="{$css}{$STYLESHEET}">
|
||||||
{/if}
|
{/if}
|
||||||
|
{if $CSS_CORE_INCLUDE}
|
||||||
|
<link rel=stylesheet type="text/css" href="{$CSS_CORE_INCLUDE}">
|
||||||
|
{/if}
|
||||||
{if $CSS_INCLUDE}
|
{if $CSS_INCLUDE}
|
||||||
<link rel=stylesheet type="text/css" href="{$CSS_INCLUDE}">
|
<link rel=stylesheet type="text/css" href="{$CSS_INCLUDE}">
|
||||||
{/if}
|
{/if}
|
||||||
@@ -23,9 +26,6 @@
|
|||||||
<link rel=stylesheet type="text/css" href="{$CSS_SPECIAL_INCLUDE}">
|
<link rel=stylesheet type="text/css" href="{$CSS_SPECIAL_INCLUDE}">
|
||||||
{/if}
|
{/if}
|
||||||
<script language="JavaScript" src="{$js}/firebug.js"></script>
|
<script language="JavaScript" src="{$js}/firebug.js"></script>
|
||||||
{if $JAVASCRIPT}
|
|
||||||
<script language="JavaScript" src="{$js}{$JAVASCRIPT}"></script>
|
|
||||||
{/if}
|
|
||||||
{if $USE_JQUERY}
|
{if $USE_JQUERY}
|
||||||
{* JQuery *}
|
{* JQuery *}
|
||||||
<script type="text/javascript" src="{$js}/jquery.min.js"></script>
|
<script type="text/javascript" src="{$js}/jquery.min.js"></script>
|
||||||
@@ -37,6 +37,12 @@
|
|||||||
<script src="{$js}/scriptaculous/scriptaculous.js" type="text/javascript"></script>
|
<script src="{$js}/scriptaculous/scriptaculous.js" type="text/javascript"></script>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
{if $JAVASCRIPT}
|
||||||
|
<script language="JavaScript" src="{$js}{$JAVASCRIPT}"></script>
|
||||||
|
{/if}
|
||||||
|
{if $JS_CORE_INCLUDE}
|
||||||
|
<script language="JavaScript" src="{$JS_CORE_INCLUDE}"></script>
|
||||||
|
{/if}
|
||||||
{if $JS_INCLUDE}
|
{if $JS_INCLUDE}
|
||||||
<script language="JavaScript" src="{$JS_INCLUDE}"></script>
|
<script language="JavaScript" src="{$JS_INCLUDE}"></script>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ if (!DEBUG) {
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
// open overlay boxes counter
|
// open overlay boxes counter
|
||||||
var GL_OB_S = 10;
|
var GL_OB_S = 30;
|
||||||
var GL_OB_BASE = 10;
|
var GL_OB_BASE = 30;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* opens a popup window with winName and given features (string)
|
* opens a popup window with winName and given features (string)
|
||||||
@@ -119,16 +119,18 @@ function setCenter(id, left, top)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* goes to an element id position
|
* goes to an element id position
|
||||||
* @param {String} element element id to move to
|
* @param {String} element element id to move to
|
||||||
* @param {Number} offset offset from top, default is 0 (px)
|
* @param {Number} [offset=0] offset from top, default is 0 (px)
|
||||||
|
* @param {Number} [duration=500] animation time, default 500ms
|
||||||
|
* @param {String} [base='body,html'] base element for offset scroll
|
||||||
*/
|
*/
|
||||||
function goToPos(element, offset = 0)
|
function goToPos(element, offset = 0, duration = 500, base = 'body,html')
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if ($('#' + element).length) {
|
if ($('#' + element).length) {
|
||||||
$('body,html').animate({
|
$(base).animate({
|
||||||
scrollTop: $('#' + element).offset().top - offset
|
scrollTop: $('#' + element).offset().top - offset
|
||||||
}, 500);
|
}, duration);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
errorCatch(err);
|
errorCatch(err);
|
||||||
@@ -154,8 +156,8 @@ function __(string)
|
|||||||
* simple sprintf formater for replace
|
* simple sprintf formater for replace
|
||||||
* usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
|
* usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
|
||||||
* First, checks if it isn't implemented yet.
|
* First, checks if it isn't implemented yet.
|
||||||
* @param {String} !String.prototype.format string with elements to be replaced
|
* @param {String} String.prototype.format string with elements to be replaced
|
||||||
* @return {String} Formated string
|
* @return {String} Formated string
|
||||||
*/
|
*/
|
||||||
if (!String.prototype.format) {
|
if (!String.prototype.format) {
|
||||||
String.prototype.format = function()
|
String.prototype.format = function()
|
||||||
@@ -171,6 +173,18 @@ if (!String.prototype.format) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* round to digits (float)
|
||||||
|
* @param {Float} Number.prototype.round Float type number to round
|
||||||
|
* @param {Number} prec Precision to round to
|
||||||
|
* @return {Float} Rounded number
|
||||||
|
*/
|
||||||
|
if (Number.prototype.round) {
|
||||||
|
Number.prototype.round = function (prec) {
|
||||||
|
return Math.round(this * Math.pow(10, prec)) / Math.pow(10, prec);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* formats flat number 123456 to 123,456
|
* formats flat number 123456 to 123,456
|
||||||
* @param {Number} x number to be formated
|
* @param {Number} x number to be formated
|
||||||
@@ -178,9 +192,9 @@ if (!String.prototype.format) {
|
|||||||
*/
|
*/
|
||||||
function numberWithCommas(x)
|
function numberWithCommas(x)
|
||||||
{
|
{
|
||||||
var parts = x.toString().split(".");
|
var parts = x.toString().split('.');
|
||||||
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
||||||
return parts.join(".");
|
return parts.join('.');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -282,12 +296,48 @@ function randomIdF()
|
|||||||
return Math.random().toString(36).substring(2);
|
return Math.random().toString(36).substring(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if name is a function
|
||||||
|
* @param {string} name Name of function to check if exists
|
||||||
|
* @return {Boolean} true/false
|
||||||
|
*/
|
||||||
|
function isFunction(name)
|
||||||
|
{
|
||||||
|
if (typeof window[name] !== 'undefined' &&
|
||||||
|
typeof window[name] === 'function') {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call a function by its string name
|
||||||
|
* https://stackoverflow.com/a/359910
|
||||||
|
* example: executeFunctionByName("My.Namespace.functionName", window, arguments);
|
||||||
|
* @param {string} functionName The function name or namespace + function
|
||||||
|
* @param {mixed} context context (window or first namespace)
|
||||||
|
* hidden next are all the arguments
|
||||||
|
* @return {mixed} Return values from functon
|
||||||
|
*/
|
||||||
|
function executeFunctionByName(functionName, context /*, args */)
|
||||||
|
{
|
||||||
|
var args = Array.prototype.slice.call(arguments, 2);
|
||||||
|
var namespaces = functionName.split('.');
|
||||||
|
var func = namespaces.pop();
|
||||||
|
for (var i = 0; i < namespaces.length; i++) {
|
||||||
|
context = context[namespaces[i]];
|
||||||
|
}
|
||||||
|
return context[func].apply(context, args);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* checks if a variable is an object
|
* checks if a variable is an object
|
||||||
* @param {Mixed} val possible object
|
* @param {Mixed} val possible object
|
||||||
* @return {Boolean} true/false if it is an object or not
|
* @return {Boolean} true/false if it is an object or not
|
||||||
*/
|
*/
|
||||||
function isObject(val) {
|
function isObject(val)
|
||||||
|
{
|
||||||
if (val === null) {
|
if (val === null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -299,7 +349,8 @@ function isObject(val) {
|
|||||||
* @param {Object} object object to check
|
* @param {Object} object object to check
|
||||||
* @return {Number} number of entry
|
* @return {Number} number of entry
|
||||||
*/
|
*/
|
||||||
function getObjectCount(object) {
|
function getObjectCount(object)
|
||||||
|
{
|
||||||
return Object.keys(object).length;
|
return Object.keys(object).length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,6 +444,49 @@ function formatBytes(bytes)
|
|||||||
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
|
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* like formatBytes, but returns bytes for <1KB and not 0.n KB
|
||||||
|
* @param {Number} bytes bytes in int
|
||||||
|
* @return {String} string in GB/MB/KB
|
||||||
|
*/
|
||||||
|
function formatBytesLong(bytes)
|
||||||
|
{
|
||||||
|
var i = Math.floor(Math.log(bytes) / Math.log(1024));
|
||||||
|
var sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
|
||||||
|
return (bytes / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + sizes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a string with B/K/M/etc into a byte number
|
||||||
|
* @param {String} bytes Any string with B/K/M/etc
|
||||||
|
* @return {Number} A byte number, or original string as is
|
||||||
|
*/
|
||||||
|
function stringByteFormat(bytes)
|
||||||
|
{
|
||||||
|
// early abort if this is a number already
|
||||||
|
if (!isNaN(bytes)) {
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
// for pow exponent list
|
||||||
|
let valid_units = 'bkmgtpezy';
|
||||||
|
// valid string that can be converted
|
||||||
|
let regex = /([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i;
|
||||||
|
let matches = bytes.match(regex);
|
||||||
|
// if nothing found, return original input
|
||||||
|
if (matches !== null) {
|
||||||
|
// remove all non valid entries outside numbers and .
|
||||||
|
// convert to float number
|
||||||
|
let m1 = parseFloat(matches[1].replace(/[^0-9.]/,''));
|
||||||
|
// only get the FIRST letter from the size, convert it to lower case
|
||||||
|
let m2 = matches[2].replace(/[^bkmgtpezy]/i, '').charAt(0).toLowerCase();
|
||||||
|
if (m2) {
|
||||||
|
// use the position in the valid unit list to do the math conversion
|
||||||
|
bytes = m1 * Math.pow(1024, valid_units.indexOf(m2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* prints out error messages based on data available from the browser
|
* prints out error messages based on data available from the browser
|
||||||
* @param {Object} err error from try/catch block
|
* @param {Object} err error from try/catch block
|
||||||
@@ -570,7 +664,9 @@ function showActionIndicator(loc)
|
|||||||
el.id = 'indicator';
|
el.id = 'indicator';
|
||||||
$('body').append(el);
|
$('body').append(el);
|
||||||
} else if (!$('#indicator').hasClass('progress')) {
|
} else if (!$('#indicator').hasClass('progress')) {
|
||||||
$('#indicator').addClass('progress');
|
// if I add a class it will not be hidden anymore
|
||||||
|
// hide it
|
||||||
|
$('#indicator').addClass('progress').hide();
|
||||||
}
|
}
|
||||||
// indicator not visible
|
// indicator not visible
|
||||||
if (!$('#indicator').is(':visible')) {
|
if (!$('#indicator').is(':visible')) {
|
||||||
@@ -591,7 +687,7 @@ function showActionIndicator(loc)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* hide action indicator, if it is visiable
|
* hide action indicator, if it is visiable
|
||||||
* If the global variable GL_OB_S is > 10 then
|
* If the global variable GL_OB_S is > GL_OB_BASE then
|
||||||
* the overlayBox is not hidden but the zIndex
|
* the overlayBox is not hidden but the zIndex
|
||||||
* is set to this value
|
* is set to this value
|
||||||
* @param {String} loc ID string, only used for console log
|
* @param {String} loc ID string, only used for console log
|
||||||
@@ -735,7 +831,8 @@ function ael(base, attach, id = '')
|
|||||||
if (id) {
|
if (id) {
|
||||||
// base id match already
|
// base id match already
|
||||||
if (base.id == id) {
|
if (base.id == id) {
|
||||||
base.sub.push(Object.assign({}, attach));
|
// base.sub.push(Object.assign({}, attach));
|
||||||
|
base.sub.push(deepCopyFunction(attach));
|
||||||
} else {
|
} else {
|
||||||
// sub check
|
// sub check
|
||||||
if (isObject(base.sub) && base.sub.length > 0) {
|
if (isObject(base.sub) && base.sub.length > 0) {
|
||||||
@@ -746,7 +843,8 @@ function ael(base, attach, id = '')
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
base.sub.push(Object.assign({}, attach));
|
// base.sub.push(Object.assign({}, attach));
|
||||||
|
base.sub.push(deepCopyFunction(attach));
|
||||||
}
|
}
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
@@ -761,7 +859,8 @@ function ael(base, attach, id = '')
|
|||||||
function aelx(base, ...attach)
|
function aelx(base, ...attach)
|
||||||
{
|
{
|
||||||
for (var i = 0; i < attach.length; i ++) {
|
for (var i = 0; i < attach.length; i ++) {
|
||||||
base.sub.push(Object.assign({}, attach[i]));
|
// base.sub.push(Object.assign({}, attach[i]));
|
||||||
|
base.sub.push(deepCopyFunction(attach[i]));
|
||||||
}
|
}
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
@@ -776,7 +875,8 @@ function aelx(base, ...attach)
|
|||||||
function aelxar(base, attach)
|
function aelxar(base, attach)
|
||||||
{
|
{
|
||||||
for (var i = 0; i < attach.length; i ++) {
|
for (var i = 0; i < attach.length; i ++) {
|
||||||
base.sub.push(Object.assign({}, attach[i]));
|
// base.sub.push(Object.assign({}, attach[i]));
|
||||||
|
base.sub.push(deepCopyFunction(attach[i]));
|
||||||
}
|
}
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
@@ -900,6 +1000,22 @@ function phfo(tree)
|
|||||||
// combine to string
|
// combine to string
|
||||||
return content.join('');
|
return content.join('');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create HTML elements from array list
|
||||||
|
* as a flat element without master object file
|
||||||
|
* Is like tree.sub call
|
||||||
|
* @param {Array} list Array of cel created objects
|
||||||
|
* @return {String} HTML String
|
||||||
|
*/
|
||||||
|
function phfa(list)
|
||||||
|
{
|
||||||
|
var content = [];
|
||||||
|
for (var i = 0; i < list.length; i ++) {
|
||||||
|
content.push(phfo(list[i]));
|
||||||
|
}
|
||||||
|
return content.join('');
|
||||||
|
}
|
||||||
// *** DOM MANAGEMENT FUNCTIONS
|
// *** DOM MANAGEMENT FUNCTIONS
|
||||||
|
|
||||||
// BLOCK: html wrappers for quickly creating html data blocks
|
// BLOCK: html wrappers for quickly creating html data blocks
|
||||||
@@ -940,9 +1056,10 @@ function html_options(name, data, selected = '', options_only = false, return_st
|
|||||||
* @param {Boolean} [return_string=false] return as string and not as element
|
* @param {Boolean} [return_string=false] return as string and not as element
|
||||||
* @param {String} [sort=''] if empty as is, else allowed 'keys',
|
* @param {String} [sort=''] if empty as is, else allowed 'keys',
|
||||||
* 'values' all others are ignored
|
* 'values' all others are ignored
|
||||||
|
* @param {String} [onchange=''] onchange trigger call, default unset
|
||||||
* @return {String} html with build options block
|
* @return {String} html with build options block
|
||||||
*/
|
*/
|
||||||
function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '')
|
function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '', onchange = '')
|
||||||
{
|
{
|
||||||
var content = [];
|
var content = [];
|
||||||
var element_select;
|
var element_select;
|
||||||
@@ -950,13 +1067,16 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
|
|||||||
var element_option;
|
var element_option;
|
||||||
var data_list = []; // for sorted output
|
var data_list = []; // for sorted output
|
||||||
var value;
|
var value;
|
||||||
var option;
|
// var option;
|
||||||
if (multiple > 0) {
|
if (multiple > 0) {
|
||||||
select_options.multiple = '';
|
select_options.multiple = '';
|
||||||
if (multiple > 1) {
|
if (multiple > 1) {
|
||||||
select_options.size = multiple;
|
select_options.size = multiple;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (onchange) {
|
||||||
|
select_options.OnChange = onchange;
|
||||||
|
}
|
||||||
// set outside select, gets stripped on return if options only is true
|
// set outside select, gets stripped on return if options only is true
|
||||||
element_select = cel('select', name, '', [], select_options);
|
element_select = cel('select', name, '', [], select_options);
|
||||||
// console.log('Call for %s, options: %s', name, options_only);
|
// console.log('Call for %s, options: %s', name, options_only);
|
||||||
@@ -1047,6 +1167,9 @@ function html_options_refill(name, data, sort = '')
|
|||||||
element_option.label = value;
|
element_option.label = value;
|
||||||
element_option.value = key;
|
element_option.value = key;
|
||||||
element_option.innerHTML = value;
|
element_option.innerHTML = value;
|
||||||
|
if (key == option_selected) {
|
||||||
|
element_option.selected = true;
|
||||||
|
}
|
||||||
document.getElementById(name).appendChild(element_option);
|
document.getElementById(name).appendChild(element_option);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
edit.pt.js
|
edit.jq.js
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
2
www/layout/admin/javascript/jquery-3.6.0.min.js
vendored
Normal file
2
www/layout/admin/javascript/jquery-3.6.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
www/layout/admin/javascript/jquery.js
vendored
2
www/layout/admin/javascript/jquery.js
vendored
@@ -1 +1 @@
|
|||||||
jquery-3.4.1.js
|
jquery-3.6.0.js
|
||||||
2
www/layout/admin/javascript/jquery.min.js
vendored
2
www/layout/admin/javascript/jquery.min.js
vendored
@@ -1 +1 @@
|
|||||||
jquery-3.4.1.min.js
|
jquery-3.6.0.min.js
|
||||||
@@ -114,16 +114,15 @@ class Login extends \CoreLibs\DB\IO
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* constructor, does ALL, opens db, works through connection checks, closes itself
|
* constructor, does ALL, opens db, works through connection checks, closes itself
|
||||||
* @param array $db_config db config array
|
* @param array $db_config db config array
|
||||||
* @param int $set_control_flag class variable check flags
|
|
||||||
*/
|
*/
|
||||||
public function __construct(array $db_config, int $set_control_flag = 0)
|
public function __construct(array $db_config)
|
||||||
{
|
{
|
||||||
// log login data for this class only
|
// log login data for this class only
|
||||||
$this->log_per_class = 1;
|
$this->log_per_class = 1;
|
||||||
|
|
||||||
// create db connection and init base class
|
// create db connection and init base class
|
||||||
parent::__construct($db_config, $set_control_flag);
|
parent::__construct($db_config);
|
||||||
if ($this->db_init_error === true) {
|
if ($this->db_init_error === true) {
|
||||||
echo 'Could not connect to DB<br>';
|
echo 'Could not connect to DB<br>';
|
||||||
// if I can't connect to the DB to auth exit hard. No access allowed
|
// if I can't connect to the DB to auth exit hard. No access allowed
|
||||||
|
|||||||
@@ -68,17 +68,16 @@ class Backend extends \CoreLibs\DB\IO
|
|||||||
// CONSTRUCTOR / DECONSTRUCTOR |====================================>
|
// CONSTRUCTOR / DECONSTRUCTOR |====================================>
|
||||||
/**
|
/**
|
||||||
* main class constructor
|
* main class constructor
|
||||||
* @param array $db_config db config array
|
* @param array $db_config db config array
|
||||||
* @param int|integer $set_control_flag class variable check flag
|
|
||||||
*/
|
*/
|
||||||
public function __construct(array $db_config, int $set_control_flag = 0)
|
public function __construct(array $db_config)
|
||||||
{
|
{
|
||||||
$this->setLangEncoding();
|
$this->setLangEncoding();
|
||||||
// get the language sub class & init it
|
// get the language sub class & init it
|
||||||
$this->l = new \CoreLibs\Language\L10n($this->lang);
|
$this->l = new \CoreLibs\Language\L10n($this->lang);
|
||||||
|
|
||||||
// init the database class
|
// init the database class
|
||||||
parent::__construct($db_config, $set_control_flag);
|
parent::__construct($db_config);
|
||||||
|
|
||||||
// set the action ids
|
// set the action ids
|
||||||
foreach ($this->action_list as $_action) {
|
foreach ($this->action_list as $_action) {
|
||||||
|
|||||||
@@ -97,18 +97,10 @@ namespace CoreLibs;
|
|||||||
/** Basic core class declaration */
|
/** Basic core class declaration */
|
||||||
class Basic
|
class Basic
|
||||||
{
|
{
|
||||||
// define check vars for the flags we can have
|
|
||||||
const CLASS_STRICT_MODE = 1;
|
|
||||||
const CLASS_OFF_COMPATIBLE_MODE = 2;
|
|
||||||
// define byteFormat
|
// define byteFormat
|
||||||
const BYTE_FORMAT_NOSPACE = 1;
|
const BYTE_FORMAT_NOSPACE = 1;
|
||||||
const BYTE_FORMAT_ADJUST = 2;
|
const BYTE_FORMAT_ADJUST = 2;
|
||||||
const BYTE_FORMAT_SI = 4;
|
const BYTE_FORMAT_SI = 4;
|
||||||
// control vars
|
|
||||||
/** @var bool compatible mode sets variable even if it is not defined */
|
|
||||||
private $set_compatible = true;
|
|
||||||
/** @var bool strict mode throws an error if the variable is not defined */
|
|
||||||
private $set_strict_mode = false;
|
|
||||||
// page and host name
|
// page and host name
|
||||||
public $page_name;
|
public $page_name;
|
||||||
public $host_name;
|
public $host_name;
|
||||||
@@ -188,19 +180,17 @@ class Basic
|
|||||||
// ajax flag
|
// ajax flag
|
||||||
protected $ajax_page_flag = false;
|
protected $ajax_page_flag = false;
|
||||||
|
|
||||||
// METHOD: __construct
|
// mime application list
|
||||||
// PARAMS: set_control_flag [current sets set/get var errors]
|
private $mime_apps = [];
|
||||||
// RETURN: none
|
|
||||||
// DESC : class constructor
|
// last json error
|
||||||
|
private $json_last_error;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* main Basic constructor to init and check base settings
|
* main Basic constructor to init and check base settings
|
||||||
* @param int $set_control_flag 0/1/2/3 to set internal class parameter check
|
|
||||||
*/
|
*/
|
||||||
public function __construct(int $set_control_flag = 0)
|
public function __construct()
|
||||||
{
|
{
|
||||||
// init flags
|
|
||||||
$this->__setControlFlag($set_control_flag);
|
|
||||||
|
|
||||||
// set per run UID for logging
|
// set per run UID for logging
|
||||||
$this->running_uid = hash($this->hash_algo, uniqid((string)rand(), true));
|
$this->running_uid = hash($this->hash_algo, uniqid((string)rand(), true));
|
||||||
// running time start for script
|
// running time start for script
|
||||||
@@ -410,6 +400,9 @@ class Basic
|
|||||||
|
|
||||||
// key generation init
|
// key generation init
|
||||||
$this->initRandomKeyData();
|
$this->initRandomKeyData();
|
||||||
|
|
||||||
|
// init mime apps
|
||||||
|
$this->mimeInitApps();
|
||||||
}
|
}
|
||||||
|
|
||||||
// METHOD: __destruct
|
// METHOD: __destruct
|
||||||
@@ -425,81 +418,6 @@ class Basic
|
|||||||
// $this->fdebugFP('c');
|
// $this->fdebugFP('c');
|
||||||
}
|
}
|
||||||
|
|
||||||
// *************************************************************
|
|
||||||
// INTERAL VARIABLE ERROR HANDLER
|
|
||||||
// *************************************************************
|
|
||||||
|
|
||||||
/**
|
|
||||||
* sets internal control flags for class variable check
|
|
||||||
* 0 -> turn of all, works like default php class
|
|
||||||
* CLASS_STRICT_MODE: 1 -> if set throws error on unset class variable
|
|
||||||
* CLASS_OFF_COMPATIBLE_MODE: 2 -> if set turns of auto set for unset variables
|
|
||||||
* 3 -> sets error on unset and does not set variable (strict)
|
|
||||||
* @param int $set_control_flag control flag as 0/1/2/3
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function __setControlFlag(int $set_control_flag): void
|
|
||||||
{
|
|
||||||
// is there either a constant or global set to override the control flag
|
|
||||||
if (defined('CLASS_VARIABLE_ERROR_MODE')) {
|
|
||||||
$set_control_flag = CLASS_VARIABLE_ERROR_MODE;
|
|
||||||
}
|
|
||||||
if (isset($GLOBALS['CLASS_VARIABLE_ERROR_MODE'])) {
|
|
||||||
$set_control_flag = $GLOBALS['CLASS_VARIABLE_ERROR_MODE'];
|
|
||||||
}
|
|
||||||
// bit wise check of int and set
|
|
||||||
if ($set_control_flag & self::CLASS_OFF_COMPATIBLE_MODE) {
|
|
||||||
$this->set_compatible = false;
|
|
||||||
} else {
|
|
||||||
$this->set_compatible = true;
|
|
||||||
}
|
|
||||||
if ($set_control_flag & self::CLASS_STRICT_MODE) {
|
|
||||||
$this->set_strict_mode = true;
|
|
||||||
} else {
|
|
||||||
$this->set_strict_mode = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* if strict mode is set, throws an error if the class variable is not set
|
|
||||||
* if compatible mode is set, also auto sets variable even if not declared
|
|
||||||
* default is strict mode false and compatible mode on
|
|
||||||
* @param mixed $name class variable name
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function __set($name, $value): void
|
|
||||||
{
|
|
||||||
if ($this->set_strict_mode === true && !property_exists($this, $name)) {
|
|
||||||
trigger_error('Undefined property via __set(): '.$name, E_USER_NOTICE);
|
|
||||||
}
|
|
||||||
// use this for fallback as to work like before to set unset
|
|
||||||
if ($this->set_compatible === true) {
|
|
||||||
$this->{$name} = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* if strict mode is set, throws an error if the class variable is not set
|
|
||||||
* default is strict mode false
|
|
||||||
* @param mixed $name class variable name
|
|
||||||
* @return mixed return set variable content
|
|
||||||
*/
|
|
||||||
public function &__get($name)
|
|
||||||
{
|
|
||||||
if ($this->set_strict_mode === true && !property_exists($this, $name)) {
|
|
||||||
trigger_error('Undefined property via __get(): '.$name, E_USER_NOTICE);
|
|
||||||
}
|
|
||||||
// on set return
|
|
||||||
if (property_exists($this, $name)) {
|
|
||||||
return $this->$name;
|
|
||||||
} elseif ($this->set_compatible === true && !property_exists($this, $name)) {
|
|
||||||
// if it is not set, and we are in compatible mode we need to init.
|
|
||||||
// This is so that $class->array['key'] = 'bar'; works
|
|
||||||
$this->{$name} = null;
|
|
||||||
return $this->$name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
// GENERAL METHODS
|
// GENERAL METHODS
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
@@ -1061,15 +979,11 @@ class Basic
|
|||||||
$use_key_length = $this->key_length;
|
$use_key_length = $this->key_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
return join(
|
$pieces = [];
|
||||||
'',
|
for ($i = 1; $i <= $use_key_length; $i ++) {
|
||||||
array_map(
|
$pieces[] = $this->key_range[random_int(0, $this->one_key_length - 1)];
|
||||||
function ($value) {
|
}
|
||||||
return $this->key_range[rand(0, $this->one_key_length - 1)];
|
return join('', $pieces);
|
||||||
},
|
|
||||||
range(1, $use_key_length)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ****** RANDOM KEY GEN ******
|
// ****** RANDOM KEY GEN ******
|
||||||
@@ -1787,8 +1701,12 @@ class Basic
|
|||||||
// label name, including leading space if flagged
|
// label name, including leading space if flagged
|
||||||
$pre = ($space ? ' ' : '').($labels[$exp] ?? '>E').($si ? 'i' : '').'B';
|
$pre = ($space ? ' ' : '').($labels[$exp] ?? '>E').($si ? 'i' : '').'B';
|
||||||
$bytes_calc = $abs_bytes / pow($unit, $exp);
|
$bytes_calc = $abs_bytes / pow($unit, $exp);
|
||||||
|
// if original is negative, reverse
|
||||||
|
if ($bytes < 0) {
|
||||||
|
$bytes_calc *= -1;
|
||||||
|
}
|
||||||
if ($adjust) {
|
if ($adjust) {
|
||||||
return sprintf("%.2f%sB", $bytes_calc, $pre);
|
return sprintf("%.2f%s", $bytes_calc, $pre);
|
||||||
} else {
|
} else {
|
||||||
return round($bytes_calc, 2).$pre;
|
return round($bytes_calc, 2).$pre;
|
||||||
}
|
}
|
||||||
@@ -1800,54 +1718,28 @@ class Basic
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
|
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
|
||||||
* if the number has a non standard thousand seperator ","" inside, the second
|
|
||||||
* flag needs to be set true (eg german style notaded numbers)
|
|
||||||
* @param string|int|float $number any string or number to convert
|
* @param string|int|float $number any string or number to convert
|
||||||
* @param bool $dot_thousand default is ".", set true for ","
|
|
||||||
* @return string|int|float converted value or original value
|
* @return string|int|float converted value or original value
|
||||||
*/
|
*/
|
||||||
public static function stringByteFormat($number, bool $dot_thousand = false)
|
public static function stringByteFormat($number)
|
||||||
{
|
{
|
||||||
$matches = [];
|
$matches = [];
|
||||||
|
// all valid units
|
||||||
|
$valid_units_ = 'bkmgtpezy';
|
||||||
// detects up to exo bytes
|
// detects up to exo bytes
|
||||||
preg_match("/([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/", strtolower($number), $matches);
|
preg_match("/([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i", strtolower($number), $matches);
|
||||||
if (isset($matches[1]) && isset($matches[2])) {
|
if (isset($matches[1]) && isset($matches[2])) {
|
||||||
// $last = strtolower($number[strlen($number) - 1]);
|
// remove all non valid characters from the number
|
||||||
if ($dot_thousand === false) {
|
$number = preg_replace('/[^0-9\.]/', '', $matches[1]);
|
||||||
$number = str_replace(',', '', $matches[1]);
|
// final clean up and convert to float
|
||||||
} else {
|
|
||||||
$number = str_replace('.', '', $matches[1]);
|
|
||||||
}
|
|
||||||
$number = (float)trim($number);
|
$number = (float)trim($number);
|
||||||
// match string in type to calculate
|
// convert any mb/gb/etc to single m/b
|
||||||
switch ($matches[2]) {
|
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[2]);
|
||||||
// exo bytes
|
if ($unit) {
|
||||||
case 'e':
|
$number = $number * pow(1024, stripos($valid_units_, $unit[0]));
|
||||||
case 'eb':
|
|
||||||
$number *= 1024;
|
|
||||||
// peta bytes
|
|
||||||
case 'p':
|
|
||||||
case 'pb':
|
|
||||||
$number *= 1024;
|
|
||||||
// tera bytes
|
|
||||||
case 't':
|
|
||||||
case 'tb':
|
|
||||||
$number *= 1024;
|
|
||||||
// giga bytes
|
|
||||||
case 'g':
|
|
||||||
case 'gb':
|
|
||||||
$number *= 1024;
|
|
||||||
// mega bytes
|
|
||||||
case 'm':
|
|
||||||
case 'mb':
|
|
||||||
$number *= 1024;
|
|
||||||
// kilo bytes
|
|
||||||
case 'k':
|
|
||||||
case 'kb':
|
|
||||||
$number *= 1024;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
$number = (int)round($number, 0);
|
// convert to INT to avoid +E output
|
||||||
|
$number = (int)round($number);
|
||||||
}
|
}
|
||||||
// if not matching return as is
|
// if not matching return as is
|
||||||
return $number;
|
return $number;
|
||||||
@@ -2291,8 +2183,8 @@ class Basic
|
|||||||
$thumbnail_write_path = null;
|
$thumbnail_write_path = null;
|
||||||
$thumbnail_web_path = null;
|
$thumbnail_web_path = null;
|
||||||
// path set first
|
// path set first
|
||||||
if ($img_type == IMG_JPG ||
|
if ($img_type == IMAGETYPE_JPEG ||
|
||||||
$img_type == IMG_PNG ||
|
$img_type == IMAGETYPE_PNG ||
|
||||||
$create_dummy === true
|
$create_dummy === true
|
||||||
) {
|
) {
|
||||||
// $this->debug('IMAGE PREPARE', "IMAGE TYPE OK: ".$inc_width.'x'.$inc_height);
|
// $this->debug('IMAGE PREPARE', "IMAGE TYPE OK: ".$inc_width.'x'.$inc_height);
|
||||||
@@ -2308,8 +2200,8 @@ class Basic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// do resize or fall back on dummy run
|
// do resize or fall back on dummy run
|
||||||
if ($img_type == IMG_JPG ||
|
if ($img_type == IMAGETYPE_JPEG ||
|
||||||
$img_type == IMG_PNG
|
$img_type == IMAGETYPE_PNG
|
||||||
) {
|
) {
|
||||||
// if missing width or height in thumb, use the set one
|
// if missing width or height in thumb, use the set one
|
||||||
if ($thumb_width == 0) {
|
if ($thumb_width == 0) {
|
||||||
@@ -2350,7 +2242,7 @@ class Basic
|
|||||||
) {
|
) {
|
||||||
// image, copy source image, offset in image, source x/y, new size, source image size
|
// image, copy source image, offset in image, source x/y, new size, source image size
|
||||||
$thumb = imagecreatetruecolor($thumb_width_r, $thumb_height_r);
|
$thumb = imagecreatetruecolor($thumb_width_r, $thumb_height_r);
|
||||||
if ($img_type == IMG_PNG) {
|
if ($img_type == IMAGETYPE_PNG) {
|
||||||
// preservere transaprency
|
// preservere transaprency
|
||||||
imagecolortransparent(
|
imagecolortransparent(
|
||||||
$thumb,
|
$thumb,
|
||||||
@@ -2361,10 +2253,10 @@ class Basic
|
|||||||
}
|
}
|
||||||
$source = null;
|
$source = null;
|
||||||
switch ($img_type) {
|
switch ($img_type) {
|
||||||
case IMG_JPG:
|
case IMAGETYPE_JPEG:
|
||||||
$source = imagecreatefromjpeg($filename);
|
$source = imagecreatefromjpeg($filename);
|
||||||
break;
|
break;
|
||||||
case IMG_PNG:
|
case IMAGETYPE_PNG:
|
||||||
$source = imagecreatefrompng($filename);
|
$source = imagecreatefrompng($filename);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2378,10 +2270,10 @@ class Basic
|
|||||||
}
|
}
|
||||||
// write file
|
// write file
|
||||||
switch ($img_type) {
|
switch ($img_type) {
|
||||||
case IMG_JPG:
|
case IMAGETYPE_JPEG:
|
||||||
imagejpeg($thumb, $thumbnail_write_path.$thumbnail, $jpeg_quality);
|
imagejpeg($thumb, $thumbnail_write_path.$thumbnail, $jpeg_quality);
|
||||||
break;
|
break;
|
||||||
case IMG_PNG:
|
case IMAGETYPE_PNG:
|
||||||
imagepng($thumb, $thumbnail_write_path.$thumbnail);
|
imagepng($thumb, $thumbnail_write_path.$thumbnail);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2483,10 +2375,10 @@ class Basic
|
|||||||
if ($orientation != 1) {
|
if ($orientation != 1) {
|
||||||
$this->debug('IMAGE FILE ROTATE', 'Need to rotate image ['.$filename.'] from: '.$orientation);
|
$this->debug('IMAGE FILE ROTATE', 'Need to rotate image ['.$filename.'] from: '.$orientation);
|
||||||
switch ($img_type) {
|
switch ($img_type) {
|
||||||
case IMG_JPG:
|
case IMAGETYPE_JPEG:
|
||||||
$img = imagecreatefromjpeg($filename);
|
$img = imagecreatefromjpeg($filename);
|
||||||
break;
|
break;
|
||||||
case IMG_PNG:
|
case IMAGETYPE_PNG:
|
||||||
$img = imagecreatefrompng($filename);
|
$img = imagecreatefrompng($filename);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2509,10 +2401,10 @@ class Basic
|
|||||||
}
|
}
|
||||||
// then rewrite the rotated image back to the disk as $filename
|
// then rewrite the rotated image back to the disk as $filename
|
||||||
switch ($img_type) {
|
switch ($img_type) {
|
||||||
case IMG_JPG:
|
case IMAGETYPE_JPEG:
|
||||||
imagejpeg($img, $filename);
|
imagejpeg($img, $filename);
|
||||||
break;
|
break;
|
||||||
case IMG_PNG:
|
case IMAGETYPE_PNG:
|
||||||
imagepng($img, $filename);
|
imagepng($img, $filename);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -3479,6 +3371,144 @@ class Basic
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// *** MIME PARTS
|
||||||
|
// to be moved to some mime class
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init array for mime type to application name lookup
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function mimeInitApps(): void
|
||||||
|
{
|
||||||
|
// match mime type to some application description
|
||||||
|
// this is NOT translated
|
||||||
|
$this->mime_apps = [
|
||||||
|
// zip
|
||||||
|
'application/zip' => 'Zip File',
|
||||||
|
// Powerpoint
|
||||||
|
'application/vnd.ms-powerpoint' => 'Microsoft Powerpoint',
|
||||||
|
'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'Microsoft Powerpoint',
|
||||||
|
// PDF
|
||||||
|
'pplication/pdf' => 'PDF',
|
||||||
|
// JPEG
|
||||||
|
'image/jpeg' => 'JPEG',
|
||||||
|
// PNG
|
||||||
|
'image/png' => 'PNG',
|
||||||
|
// Indesign
|
||||||
|
'application/x-indesign' => 'Adobe InDesign',
|
||||||
|
// Photoshop
|
||||||
|
'image/vnd.adobe.photoshop' => 'Adobe Photoshop',
|
||||||
|
'application/photoshop' => 'Adobe Photoshop',
|
||||||
|
// Illustrator
|
||||||
|
'application/illustrator' => 'Adobe Illustrator',
|
||||||
|
// Word
|
||||||
|
'application/vnd.ms-word' => 'Microsoft Word',
|
||||||
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'Microsoft Word',
|
||||||
|
// Excel
|
||||||
|
'application/vnd.ms-excel' => 'Microsoft Excel',
|
||||||
|
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'Microsoft Excel',
|
||||||
|
// plain text
|
||||||
|
'text/plain' => 'Text file',
|
||||||
|
// html
|
||||||
|
'text/html' => 'HTML',
|
||||||
|
// mp4 (max 45MB each)
|
||||||
|
'video/mpeg' => 'MPEG Video'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets or updates a mime type
|
||||||
|
* @param string $mime MIME Name, no validiation
|
||||||
|
* @param string $app Applicaiton name
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function mimeSetAppName(string $mime, string $app): void
|
||||||
|
{
|
||||||
|
$this->mime_apps[$mime] = $app;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the application name from mime type
|
||||||
|
* if not set returns "Other file"
|
||||||
|
* @param string $mime MIME Name
|
||||||
|
* @return string Application name matching
|
||||||
|
*/
|
||||||
|
public function mimeGetAppName(string $mime): string
|
||||||
|
{
|
||||||
|
return $this->mime_apps[$mime] ?? 'Other file';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* converts a json string to an array
|
||||||
|
* or inits an empty array on null string
|
||||||
|
* or failed convert to array
|
||||||
|
* In ANY case it will ALWAYS return array.
|
||||||
|
* Does not throw errors
|
||||||
|
* @param string|null $json a json string, or null data
|
||||||
|
* @param bool $override if set to true, then on json error
|
||||||
|
* set original value as array
|
||||||
|
* @return array returns an array from the json values
|
||||||
|
*/
|
||||||
|
public function jsonConvertToArray(?string $json, bool $override = false): array
|
||||||
|
{
|
||||||
|
if ($json !== null) {
|
||||||
|
$_json = json_decode($json, true);
|
||||||
|
if ($this->json_last_error = json_last_error()) {
|
||||||
|
if ($override == true) {
|
||||||
|
// init return as array with original as element
|
||||||
|
$json = [$json];
|
||||||
|
} else {
|
||||||
|
$json = [];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$json = $_json;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$json = [];
|
||||||
|
}
|
||||||
|
// be sure that we return an array
|
||||||
|
return (array)$json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [jsonGetLastError description]
|
||||||
|
* @param bool|boolean $return_string [default=false] if set to true
|
||||||
|
* it will return the message string and not
|
||||||
|
* the error number
|
||||||
|
* @return int|string Either error number (0 for no error)
|
||||||
|
* or error string ('' for no error)
|
||||||
|
*/
|
||||||
|
public function jsonGetLastError(bool $return_string = false)
|
||||||
|
{
|
||||||
|
$json_error_string = '';
|
||||||
|
// valid errors as of php 8.0
|
||||||
|
switch ($this->json_last_error) {
|
||||||
|
case JSON_ERROR_NONE:
|
||||||
|
$json_error_string = '';
|
||||||
|
break;
|
||||||
|
case JSON_ERROR_DEPTH:
|
||||||
|
$json_error_string = 'Maximum stack depth exceeded';
|
||||||
|
break;
|
||||||
|
case JSON_ERROR_STATE_MISMATCH:
|
||||||
|
$json_error_string = 'Underflow or the modes mismatch';
|
||||||
|
break;
|
||||||
|
case JSON_ERROR_CTRL_CHAR:
|
||||||
|
$json_error_string = 'Unexpected control character found';
|
||||||
|
break;
|
||||||
|
case JSON_ERROR_SYNTAX:
|
||||||
|
$json_error_string = 'Syntax error, malformed JSON';
|
||||||
|
break;
|
||||||
|
case JSON_ERROR_UTF8:
|
||||||
|
$json_error_string = 'Malformed UTF-8 characters, possibly incorrectly encoded';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$json_error_string = 'Unknown error';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $return_string === true ? $json_error_string : $this->json_last_error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -51,15 +51,14 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
/**
|
/**
|
||||||
* constructor for the array io class, set the
|
* constructor for the array io class, set the
|
||||||
* primary key name automatically (from array)
|
* primary key name automatically (from array)
|
||||||
* @param array $db_config db connection config
|
* @param array $db_config db connection config
|
||||||
* @param array $table_array table array config
|
* @param array $table_array table array config
|
||||||
* @param string $table_name table name string
|
* @param string $table_name table name string
|
||||||
* @param int|integer $set_control_flag set basic class set/get variable error flags
|
|
||||||
*/
|
*/
|
||||||
public function __construct(array $db_config, array $table_array, string $table_name, int $set_control_flag = 0)
|
public function __construct(array $db_config, array $table_array, string $table_name)
|
||||||
{
|
{
|
||||||
// instance db_io class
|
// instance db_io class
|
||||||
parent::__construct($db_config, $set_control_flag);
|
parent::__construct($db_config);
|
||||||
// more error vars for this class
|
// more error vars for this class
|
||||||
$this->error_string['91'] = 'No Primary Key given';
|
$this->error_string['91'] = 'No Primary Key given';
|
||||||
$this->error_string['92'] = 'Could not run Array Query';
|
$this->error_string['92'] = 'Could not run Array Query';
|
||||||
|
|||||||
@@ -128,13 +128,13 @@
|
|||||||
* - returns an hashed array of table column data
|
* - returns an hashed array of table column data
|
||||||
* function db_prepare($stm_name, $query)
|
* function db_prepare($stm_name, $query)
|
||||||
* - prepares a query with the given stm name, returns false on error
|
* - prepares a query with the given stm name, returns false on error
|
||||||
* function db_execute($stm_name, $data = array())
|
* function db_execute($stm_name, $data = [])
|
||||||
* - execute a query that was previously prepared
|
* - execute a query that was previously prepared
|
||||||
* $string db_escape_string($string)
|
* $string db_escape_string($string)
|
||||||
* - correctly escapes string for db insert
|
* - correctly escapes string for db insert
|
||||||
* $string db_boolean(string)
|
* $string db_boolean(string)
|
||||||
* - if the string value is 't' or 'f' it returns correct TRUE/FALSE for php
|
* - if the string value is 't' or 'f' it returns correct TRUE/FALSE for php
|
||||||
* $primary_key db_write_data($write_array, $not_write_array, $primary_key, $table, $data = array())
|
* $primary_key db_write_data($write_array, $not_write_array, $primary_key, $table, $data = [])
|
||||||
* - writes into one table based on arrays of columns to write and not write, reads data from global vars or optional array
|
* - writes into one table based on arrays of columns to write and not write, reads data from global vars or optional array
|
||||||
* $boolean db_set_schema(schema)
|
* $boolean db_set_schema(schema)
|
||||||
* - sets search path to a schema
|
* - sets search path to a schema
|
||||||
@@ -270,9 +270,10 @@ class IO extends \CoreLibs\Basic
|
|||||||
public $cursor; // actual cursor (DBH)
|
public $cursor; // actual cursor (DBH)
|
||||||
public $num_rows; // how many rows have been found
|
public $num_rows; // how many rows have been found
|
||||||
public $num_fields; // how many fields has the query
|
public $num_fields; // how many fields has the query
|
||||||
public $field_names = array(); // array with the field names of the current query
|
public $field_names = []; // array with the field names of the current query
|
||||||
public $insert_id; // last inserted ID
|
public $insert_id; // last inserted ID
|
||||||
public $insert_id_ext; // extended insert ID (for data outside only primary key)
|
public $insert_id_ext; // extended insert ID (for data outside only primary key)
|
||||||
|
public $insert_id_arr; // always return as array, even if only one
|
||||||
private $temp_sql;
|
private $temp_sql;
|
||||||
// other vars
|
// other vars
|
||||||
private $nbsp = ''; // used by print_array recursion function
|
private $nbsp = ''; // used by print_array recursion function
|
||||||
@@ -289,14 +290,14 @@ class IO extends \CoreLibs\Basic
|
|||||||
// endless loop protection
|
// endless loop protection
|
||||||
private $MAX_QUERY_CALL;
|
private $MAX_QUERY_CALL;
|
||||||
private $DEFAULT_MAX_QUERY_CALL = 20; // default
|
private $DEFAULT_MAX_QUERY_CALL = 20; // default
|
||||||
private $query_called = array();
|
private $query_called = [];
|
||||||
// error string
|
// error string
|
||||||
protected $error_string = array();
|
protected $error_string = [];
|
||||||
// prepared list
|
// prepared list
|
||||||
public $prepare_cursor = array();
|
public $prepare_cursor = [];
|
||||||
// primary key per table list
|
// primary key per table list
|
||||||
// format is 'table' => 'pk_name'
|
// format is 'table' => 'pk_name'
|
||||||
public $pk_name_table = array();
|
public $pk_name_table = [];
|
||||||
// internal primary key name, for cross calls in async
|
// internal primary key name, for cross calls in async
|
||||||
public $pk_name;
|
public $pk_name;
|
||||||
// if we use RETURNING in the INSERT call
|
// if we use RETURNING in the INSERT call
|
||||||
@@ -307,15 +308,14 @@ class IO extends \CoreLibs\Basic
|
|||||||
/**
|
/**
|
||||||
* main DB concstructor with auto connection to DB and failure set on failed connection
|
* main DB concstructor with auto connection to DB and failure set on failed connection
|
||||||
* @param array $db_config DB configuration array
|
* @param array $db_config DB configuration array
|
||||||
* @param int $set_control_flag 0/1/2/3 to set internal class parameter check
|
|
||||||
*/
|
*/
|
||||||
public function __construct(array $db_config, int $set_control_flag = 0)
|
public function __construct(array $db_config)
|
||||||
{
|
{
|
||||||
// start basic class
|
// start basic class
|
||||||
parent::__construct($set_control_flag);
|
parent::__construct();
|
||||||
// dummy init array for db config if not array
|
// dummy init array for db config if not array
|
||||||
if (!is_array($db_config)) {
|
if (!is_array($db_config)) {
|
||||||
$db_config = array();
|
$db_config = [];
|
||||||
}
|
}
|
||||||
// sets the names (for connect/reconnect)
|
// sets the names (for connect/reconnect)
|
||||||
$this->db_name = $db_config['db_name'] ?? '';
|
$this->db_name = $db_config['db_name'] ?? '';
|
||||||
@@ -511,7 +511,7 @@ class IO extends \CoreLibs\Basic
|
|||||||
{
|
{
|
||||||
$string = '';
|
$string = '';
|
||||||
if (!is_array($array)) {
|
if (!is_array($array)) {
|
||||||
$array = array();
|
$array = [];
|
||||||
}
|
}
|
||||||
foreach ($array as $key => $value) {
|
foreach ($array as $key => $value) {
|
||||||
$string .= $this->nbsp.'<b>'.$key.'</b> => ';
|
$string .= $this->nbsp.'<b>'.$key.'</b> => ';
|
||||||
@@ -590,22 +590,22 @@ class IO extends \CoreLibs\Basic
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* if there is the 'to_encoding' var set, and the field is in the wrong encoding converts it to the target
|
* if there is the 'to_encoding' var set, and the field is in the wrong encoding converts it to the target
|
||||||
* @param array|bool $row array from fetch_row
|
* @param array|bool|null $row array from fetch_row
|
||||||
* @return array|bool convert fetch_row array, or false
|
* @return array|bool|null convert fetch_row array, or false
|
||||||
*/
|
*/
|
||||||
private function __dbConvertEncoding($row)
|
private function __dbConvertEncoding($row)
|
||||||
{
|
{
|
||||||
// only do if array, else pass through row (can be false)
|
// only do if array, else pass through row (can be false)
|
||||||
if (is_array($row)) {
|
if (!is_array($row) || empty($this->to_encoding) || empty($this->db_encoding)
|
||||||
if ($this->to_encoding && $this->db_encoding) {
|
) {
|
||||||
// go through each row and convert the encoding if needed
|
return $row;
|
||||||
foreach ($row as $key => $value) {
|
}
|
||||||
$from_encoding = mb_detect_encoding($value);
|
// go through each row and convert the encoding if needed
|
||||||
// convert only if encoding doesn't match and source is not pure ASCII
|
foreach ($row as $key => $value) {
|
||||||
if ($from_encoding != $this->to_encoding && $from_encoding != 'ASCII') {
|
$from_encoding = mb_detect_encoding($value);
|
||||||
$row[$key] = mb_convert_encoding($value, $this->to_encoding, $from_encoding);
|
// convert only if encoding doesn't match and source is not pure ASCII
|
||||||
}
|
if ($from_encoding != $this->to_encoding && $from_encoding != 'ASCII') {
|
||||||
}
|
$row[$key] = mb_convert_encoding($value, $this->to_encoding, $from_encoding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $row;
|
return $row;
|
||||||
@@ -617,7 +617,7 @@ class IO extends \CoreLibs\Basic
|
|||||||
* @param array $data the data array
|
* @param array $data the data array
|
||||||
* @return string string of query with data inside
|
* @return string string of query with data inside
|
||||||
*/
|
*/
|
||||||
private function __dbDebugPrepare(string $stm_name, array $data = array()): string
|
private function __dbDebugPrepare(string $stm_name, array $data = []): string
|
||||||
{
|
{
|
||||||
// get the keys from data array
|
// get the keys from data array
|
||||||
$keys = array_keys($data);
|
$keys = array_keys($data);
|
||||||
@@ -773,7 +773,7 @@ class IO extends \CoreLibs\Basic
|
|||||||
// count the fields
|
// count the fields
|
||||||
$this->num_fields = $this->db_functions->__dbNumFields($this->cursor);
|
$this->num_fields = $this->db_functions->__dbNumFields($this->cursor);
|
||||||
// set field names
|
// set field names
|
||||||
$this->field_names = array();
|
$this->field_names = [];
|
||||||
for ($i = 0; $i < $this->num_fields; $i ++) {
|
for ($i = 0; $i < $this->num_fields; $i ++) {
|
||||||
$this->field_names[] = $this->db_functions->__dbFieldName($this->cursor, $i);
|
$this->field_names[] = $this->db_functions->__dbFieldName($this->cursor, $i);
|
||||||
}
|
}
|
||||||
@@ -788,9 +788,12 @@ class IO extends \CoreLibs\Basic
|
|||||||
// if we do not have a returning, we try to get it via the primary key and another select
|
// if we do not have a returning, we try to get it via the primary key and another select
|
||||||
if (!$this->returning_id) {
|
if (!$this->returning_id) {
|
||||||
$this->insert_id = $this->db_functions->__dbInsertId($this->query, $this->pk_name);
|
$this->insert_id = $this->db_functions->__dbInsertId($this->query, $this->pk_name);
|
||||||
|
$this->insert_id_ext = $this->insert_id;
|
||||||
|
$this->insert_id_arr[] = $this->insert_id;
|
||||||
} else {
|
} else {
|
||||||
$this->insert_id = array();
|
$this->insert_id = [];
|
||||||
$this->insert_id_ext = array();
|
$this->insert_id_ext = [];
|
||||||
|
$this->insert_id_arr = [];
|
||||||
// echo "** PREPARE RETURNING FOR CURSOR: ".$this->cursor."<br>";
|
// echo "** PREPARE RETURNING FOR CURSOR: ".$this->cursor."<br>";
|
||||||
// we have returning, now we need to check if we get one or many returned
|
// we have returning, now we need to check if we get one or many returned
|
||||||
// we'll need to loop this, if we have multiple insert_id returns
|
// we'll need to loop this, if we have multiple insert_id returns
|
||||||
@@ -800,6 +803,7 @@ class IO extends \CoreLibs\Basic
|
|||||||
)) {
|
)) {
|
||||||
// echo "*** RETURNING: ".print_r($_insert_id, true)."<br>";
|
// echo "*** RETURNING: ".print_r($_insert_id, true)."<br>";
|
||||||
$this->insert_id[] = $_insert_id;
|
$this->insert_id[] = $_insert_id;
|
||||||
|
$this->insert_id_arr[] = $_insert_id;
|
||||||
}
|
}
|
||||||
// if we have only one, revert from array to single
|
// if we have only one, revert from array to single
|
||||||
if (count($this->insert_id) == 1) {
|
if (count($this->insert_id) == 1) {
|
||||||
@@ -808,7 +812,9 @@ class IO extends \CoreLibs\Basic
|
|||||||
// if this has only the pk_name, then only return this, else array of all data (but without the position)
|
// 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']
|
// 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 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])) {
|
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_ext = $this->insert_id[0];
|
||||||
if (isset($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];
|
$this->insert_id = $this->insert_id[0][$this->pk_name];
|
||||||
@@ -1200,6 +1206,10 @@ class IO extends \CoreLibs\Basic
|
|||||||
$this->db_functions->__dbResultType($assoc_only)
|
$this->db_functions->__dbResultType($assoc_only)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
// if returned is NOT an array, abort to false
|
||||||
|
if (!is_array($return)) {
|
||||||
|
$return = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// check if cached call or reset call ...
|
// check if cached call or reset call ...
|
||||||
if (!$return && !$reset) {
|
if (!$return && !$reset) {
|
||||||
@@ -1211,7 +1221,7 @@ class IO extends \CoreLibs\Basic
|
|||||||
$return = false;
|
$return = false;
|
||||||
} else {
|
} else {
|
||||||
// unset return value ...
|
// unset return value ...
|
||||||
$return = array();
|
$return = [];
|
||||||
for ($i = 0; $i < $this->cursor_ext[$md5]['num_fields']; $i ++) {
|
for ($i = 0; $i < $this->cursor_ext[$md5]['num_fields']; $i ++) {
|
||||||
// create mixed return array
|
// create mixed return array
|
||||||
if ($assoc_only === false && isset($this->cursor_ext[$md5]['data'][$this->cursor_ext[$md5]['pos']][$i])) {
|
if ($assoc_only === false && isset($this->cursor_ext[$md5]['data'][$this->cursor_ext[$md5]['pos']][$i])) {
|
||||||
@@ -1247,7 +1257,7 @@ class IO extends \CoreLibs\Basic
|
|||||||
$this->cursor_ext[$md5]['read_rows'] ++;
|
$this->cursor_ext[$md5]['read_rows'] ++;
|
||||||
// if reset is <3 caching is done, else no
|
// if reset is <3 caching is done, else no
|
||||||
if ($reset < 3) {
|
if ($reset < 3) {
|
||||||
$temp = array();
|
$temp = [];
|
||||||
foreach ($return as $field_name => $data) {
|
foreach ($return as $field_name => $data) {
|
||||||
$temp[$field_name] = $data;
|
$temp[$field_name] = $data;
|
||||||
}
|
}
|
||||||
@@ -1437,9 +1447,9 @@ class IO extends \CoreLibs\Basic
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$cursor = $this->dbExec($query);
|
$cursor = $this->dbExec($query);
|
||||||
$rows = array();
|
$rows = [];
|
||||||
while ($res = $this->dbFetchArray($cursor, $assoc_only)) {
|
while ($res = $this->dbFetchArray($cursor, $assoc_only)) {
|
||||||
$data = array();
|
$data = [];
|
||||||
for ($i = 0; $i < $this->num_fields; $i ++) {
|
for ($i = 0; $i < $this->num_fields; $i ++) {
|
||||||
$data[$this->field_names[$i]] = $res[$this->field_names[$i]];
|
$data[$this->field_names[$i]] = $res[$this->field_names[$i]];
|
||||||
}
|
}
|
||||||
@@ -1564,8 +1574,9 @@ class IO extends \CoreLibs\Basic
|
|||||||
}
|
}
|
||||||
$match = [];
|
$match = [];
|
||||||
// search for $1, $2, in the query and push it into the control array
|
// search for $1, $2, in the query and push it into the control array
|
||||||
|
// skip counts for same eg $1, $1, $2 = 2 and not 3
|
||||||
preg_match_all('/(\$[0-9]{1,})/', $query, $match);
|
preg_match_all('/(\$[0-9]{1,})/', $query, $match);
|
||||||
$this->prepare_cursor[$stm_name]['count'] = count($match[1]);
|
$this->prepare_cursor[$stm_name]['count'] = count(array_unique($match[1]));
|
||||||
$this->prepare_cursor[$stm_name]['query'] = $query;
|
$this->prepare_cursor[$stm_name]['query'] = $query;
|
||||||
$result = $this->db_functions->__dbPrepare($stm_name, $query);
|
$result = $this->db_functions->__dbPrepare($stm_name, $query);
|
||||||
if ($result) {
|
if ($result) {
|
||||||
@@ -1590,7 +1601,7 @@ class IO extends \CoreLibs\Basic
|
|||||||
* @param array $data data to run for this query, empty array for none
|
* @param array $data data to run for this query, empty array for none
|
||||||
* @return ?mixed false on error, or result on OK
|
* @return ?mixed false on error, or result on OK
|
||||||
*/
|
*/
|
||||||
public function dbExecute(string $stm_name, array $data = array())
|
public function dbExecute(string $stm_name, array $data = [])
|
||||||
{
|
{
|
||||||
// if we do not have no prepare cursor array entry for this statement name, abort
|
// if we do not have no prepare cursor array entry for this statement name, abort
|
||||||
if (!is_array($this->prepare_cursor[$stm_name])) {
|
if (!is_array($this->prepare_cursor[$stm_name])) {
|
||||||
@@ -1607,71 +1618,74 @@ class IO extends \CoreLibs\Basic
|
|||||||
$this->error_id = 23;
|
$this->error_id = 23;
|
||||||
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Array data count does not match prepared fields. Need: '.$this->prepare_cursor[$stm_name]['count'].', has: '.count($data).'</span>', 'DB_ERROR');
|
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Array data count does not match prepared fields. Need: '.$this->prepare_cursor[$stm_name]['count'].', has: '.count($data).'</span>', 'DB_ERROR');
|
||||||
return false;
|
return false;
|
||||||
} else {
|
|
||||||
if ($this->db_debug) {
|
|
||||||
$this->__dbDebug('db', $this->__dbDebugPrepare($stm_name, $data), 'dbExecPrep', 'Q');
|
|
||||||
}
|
|
||||||
$result = $this->db_functions->__dbExecute($stm_name, $data);
|
|
||||||
if (!$result) {
|
|
||||||
$this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[$stm_name]['result'].']: '.$this->printAr($data));
|
|
||||||
$this->error_id = 22;
|
|
||||||
$this->__dbError($this->prepare_cursor[$stm_name]['result']);
|
|
||||||
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Execution failed</span>', 'DB_ERROR');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if ($this->__checkQueryForInsert($this->prepare_cursor[$stm_name]['query'], true) &&
|
|
||||||
$this->prepare_cursor[$stm_name]['pk_name'] != 'NULL'
|
|
||||||
) {
|
|
||||||
if (!$this->prepare_cursor[$stm_name]['returning_id']) {
|
|
||||||
$this->insert_id = $this->db_functions->__dbInsertId($this->prepare_cursor[$stm_name]['query'], $this->prepare_cursor[$stm_name]['pk_name']);
|
|
||||||
} elseif ($result) {
|
|
||||||
$this->insert_id = array();
|
|
||||||
$this->insert_id_ext = array();
|
|
||||||
// we have returning, now we need to check if we get one or many returned
|
|
||||||
// we'll need to loop this, if we have multiple insert_id returns
|
|
||||||
while ($_insert_id = $this->db_functions->__dbFetchArray(
|
|
||||||
$result,
|
|
||||||
$this->db_functions->__dbResultType(true)
|
|
||||||
)) {
|
|
||||||
$this->insert_id[] = $_insert_id;
|
|
||||||
}
|
|
||||||
// if we have only one, revert from arry to single
|
|
||||||
if (count($this->insert_id) == 1) {
|
|
||||||
// echo "+ SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])."<br>";
|
|
||||||
// echo "+ PK DIRECT: ".$this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]."<Br>";
|
|
||||||
// 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->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])
|
|
||||||
) {
|
|
||||||
$this->insert_id_ext = $this->insert_id[0];
|
|
||||||
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
|
|
||||||
} elseif ($this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]) {
|
|
||||||
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
|
|
||||||
}
|
|
||||||
} elseif (count($this->insert_id) == 0) {
|
|
||||||
// failed to get insert id
|
|
||||||
$this->insert_id = '';
|
|
||||||
$this->warning_id = 33;
|
|
||||||
$this->__dbError();
|
|
||||||
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// this error handling is only for pgsql
|
|
||||||
if (is_array($this->insert_id)) {
|
|
||||||
$this->warning_id = 32;
|
|
||||||
$this->__dbError();
|
|
||||||
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id data returned as array</span>', 'DB_WARNING');
|
|
||||||
} elseif (!$this->insert_id) {
|
|
||||||
// NOTE should we keep this inside
|
|
||||||
$this->warning_id = 31;
|
|
||||||
$this->__dbError();
|
|
||||||
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': Could not get insert id</span>', 'DB_WARNING');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
}
|
||||||
|
if ($this->db_debug) {
|
||||||
|
$this->__dbDebug('db', $this->__dbDebugPrepare($stm_name, $data), 'dbExecPrep', 'Q');
|
||||||
|
}
|
||||||
|
$result = $this->db_functions->__dbExecute($stm_name, $data);
|
||||||
|
if (!$result) {
|
||||||
|
$this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[$stm_name]['result'].']: '.$this->printAr($data));
|
||||||
|
$this->error_id = 22;
|
||||||
|
$this->__dbError($this->prepare_cursor[$stm_name]['result']);
|
||||||
|
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Execution failed</span>', 'DB_ERROR');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($this->__checkQueryForInsert($this->prepare_cursor[$stm_name]['query'], true) &&
|
||||||
|
$this->prepare_cursor[$stm_name]['pk_name'] != 'NULL'
|
||||||
|
) {
|
||||||
|
if (!$this->prepare_cursor[$stm_name]['returning_id']) {
|
||||||
|
$this->insert_id = $this->db_functions->__dbInsertId($this->prepare_cursor[$stm_name]['query'], $this->prepare_cursor[$stm_name]['pk_name']);
|
||||||
|
$this->insert_id_ext = $this->insert_id;
|
||||||
|
$this->insert_id_arr[] = $this->insert_id;
|
||||||
|
} elseif ($result) {
|
||||||
|
$this->insert_id = [];
|
||||||
|
$this->insert_id_ext = [];
|
||||||
|
$this->insert_id_arr = [];
|
||||||
|
// we have returning, now we need to check if we get one or many returned
|
||||||
|
// we'll need to loop this, if we have multiple insert_id returns
|
||||||
|
while ($_insert_id = $this->db_functions->__dbFetchArray(
|
||||||
|
$result,
|
||||||
|
$this->db_functions->__dbResultType(true)
|
||||||
|
)) {
|
||||||
|
$this->insert_id[] = $_insert_id;
|
||||||
|
$this->insert_id_arr[] = $_insert_id;
|
||||||
|
}
|
||||||
|
// if we have only one, revert from arry to single
|
||||||
|
if (count($this->insert_id) == 1) {
|
||||||
|
// echo "+ SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])."<br>";
|
||||||
|
// echo "+ PK DIRECT: ".$this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]."<Br>";
|
||||||
|
// 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->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])
|
||||||
|
) {
|
||||||
|
$this->insert_id_ext = $this->insert_id[0];
|
||||||
|
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
|
||||||
|
} elseif ($this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]) {
|
||||||
|
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
|
||||||
|
}
|
||||||
|
} elseif (count($this->insert_id) == 0) {
|
||||||
|
// failed to get insert id
|
||||||
|
$this->insert_id = '';
|
||||||
|
$this->warning_id = 33;
|
||||||
|
$this->__dbError();
|
||||||
|
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// this error handling is only for pgsql
|
||||||
|
if (is_array($this->insert_id)) {
|
||||||
|
$this->warning_id = 32;
|
||||||
|
$this->__dbError();
|
||||||
|
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id data returned as array</span>', 'DB_WARNING');
|
||||||
|
} elseif (!$this->insert_id) {
|
||||||
|
// NOTE should we keep this inside
|
||||||
|
$this->warning_id = 31;
|
||||||
|
$this->__dbError();
|
||||||
|
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': Could not get insert id</span>', 'DB_WARNING');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1817,18 +1831,18 @@ class IO extends \CoreLibs\Basic
|
|||||||
* @param array $data data array to override _POST data
|
* @param array $data data array to override _POST data
|
||||||
* @return int|bool primary key
|
* @return int|bool primary key
|
||||||
*/
|
*/
|
||||||
public function dbWriteData(array $write_array, array $not_write_array, $primary_key, string $table, $data = array())
|
public function dbWriteData(array $write_array, array $not_write_array, $primary_key, string $table, $data = [])
|
||||||
{
|
{
|
||||||
if (!is_array($write_array)) {
|
if (!is_array($write_array)) {
|
||||||
$write_array = array();
|
$write_array = [];
|
||||||
}
|
}
|
||||||
if (!is_array($not_write_array)) {
|
if (!is_array($not_write_array)) {
|
||||||
$not_write_array = array();
|
$not_write_array = [];
|
||||||
}
|
}
|
||||||
if (is_array($table)) {
|
if (is_array($table)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$not_write_update_array = array();
|
$not_write_update_array = [];
|
||||||
return $this->dbWriteDataExt($write_array, $primary_key, $table, $not_write_array, $not_write_update_array, $data);
|
return $this->dbWriteDataExt($write_array, $primary_key, $table, $not_write_array, $not_write_update_array, $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1849,9 +1863,9 @@ class IO extends \CoreLibs\Basic
|
|||||||
array $write_array,
|
array $write_array,
|
||||||
$primary_key,
|
$primary_key,
|
||||||
string $table,
|
string $table,
|
||||||
array $not_write_array = array(),
|
array $not_write_array = [],
|
||||||
array $not_write_update_array = array(),
|
array $not_write_update_array = [],
|
||||||
array $data = array()
|
array $data = []
|
||||||
) {
|
) {
|
||||||
if (!is_array($primary_key)) {
|
if (!is_array($primary_key)) {
|
||||||
$primary_key = array(
|
$primary_key = array(
|
||||||
@@ -1988,16 +2002,10 @@ class IO extends \CoreLibs\Basic
|
|||||||
*/
|
*/
|
||||||
public function dbArrayParse(string $text): array
|
public function dbArrayParse(string $text): array
|
||||||
{
|
{
|
||||||
$output = array();
|
$output = [];
|
||||||
return $this->db_functions->__dbArrayParse($text, $output);
|
return $this->db_functions->__dbArrayParse($text, $output);
|
||||||
}
|
}
|
||||||
|
|
||||||
// METHOD: dbSqlEscape
|
|
||||||
// WAS : db_sql_escape
|
|
||||||
// PARAMS: value -> to escape data
|
|
||||||
// kbn -> escape trigger type
|
|
||||||
// RETURN: escaped value
|
|
||||||
// DESC : clear up any data for valid DB insert
|
|
||||||
/**
|
/**
|
||||||
* clear up any data for valid DB insert
|
* clear up any data for valid DB insert
|
||||||
* @param int|float|string $value to escape data
|
* @param int|float|string $value to escape data
|
||||||
@@ -2025,6 +2033,186 @@ class IO extends \CoreLibs\Basic
|
|||||||
}
|
}
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ***************************
|
||||||
|
// INTERNAL VARIABLES READ
|
||||||
|
// ***************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return current set insert_id as is
|
||||||
|
* @return array|string|int|null Primary key value, most likely int
|
||||||
|
* Array for multiple return set
|
||||||
|
* Empty string for unset
|
||||||
|
* Null for error
|
||||||
|
*/
|
||||||
|
public function dbGetReturning()
|
||||||
|
{
|
||||||
|
return $this->insert_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* alternative name, returns insert_id
|
||||||
|
* @return array|string|int|null Primary key value, most likely int
|
||||||
|
* Array for multiple return set
|
||||||
|
* Empty string for unset
|
||||||
|
* Null for error
|
||||||
|
*/
|
||||||
|
public function dbGetInsertPK()
|
||||||
|
{
|
||||||
|
return $this->dbGetReturning();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return the extended insert return string set
|
||||||
|
* Most likely Array
|
||||||
|
* @param string|null $key Optional key for insert_id_ext array
|
||||||
|
* if found will return only this element,
|
||||||
|
* else will return null
|
||||||
|
* @return array|string|null RETURNING values as array
|
||||||
|
* Empty string for unset
|
||||||
|
* Null for error
|
||||||
|
*/
|
||||||
|
public function dbGetReturningExt($key = null)
|
||||||
|
{
|
||||||
|
if ($key !== null) {
|
||||||
|
if (isset($this->insert_id_ext[$key])) {
|
||||||
|
return $this->insert_id_ext[$key];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->insert_id_ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Always returns the returning block as an array
|
||||||
|
* @return array All returning data as array. even if one row only
|
||||||
|
*/
|
||||||
|
public function dbGetReturningArray(): array
|
||||||
|
{
|
||||||
|
return $this->insert_id_arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns the full array for cursor ext
|
||||||
|
* @param string|null $q Query string, if not null convert to md5
|
||||||
|
* and return set cursor ext for only this
|
||||||
|
* if not found or null return null
|
||||||
|
* @return array|null Cursor Extended array
|
||||||
|
* Key is md5 string from query run
|
||||||
|
*/
|
||||||
|
public function dbGetCursorExt($q = null)
|
||||||
|
{
|
||||||
|
if ($q !== null) {
|
||||||
|
$q_md5 = md5($q);
|
||||||
|
if (isset($this->cursor_ext[$q_md5])) {
|
||||||
|
return $this->cursor_ext[$q_md5];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->cursor_ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns current number of rows that where
|
||||||
|
* affected by UPDATE/SELECT, etc
|
||||||
|
* null on empty
|
||||||
|
* @return int|null Number of rows
|
||||||
|
*/
|
||||||
|
public function dbGetNumRows()
|
||||||
|
{
|
||||||
|
return $this->num_rows ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Switches db debug flag on or off
|
||||||
|
* OR
|
||||||
|
* with the optional parameter fix sets debug
|
||||||
|
* returns current set stats
|
||||||
|
* @param bool|null $debug Flag to turn debug on off
|
||||||
|
* @return bool True for debug is on, False for off
|
||||||
|
*/
|
||||||
|
public function dbToggleDebug(?bool $debug = null)
|
||||||
|
{
|
||||||
|
if ($debug !== null) {
|
||||||
|
$this->db_debug = $debug;
|
||||||
|
} else {
|
||||||
|
$this->db_debug = $this->db_debug ? false : true;
|
||||||
|
}
|
||||||
|
return $this->db_debug;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DEPEREACTED CALLS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* old call for getInserReturnExt
|
||||||
|
* @param string|null $key See above
|
||||||
|
* @return array|string|null See above
|
||||||
|
* @deprecated use getReturningExt($key = null) instead
|
||||||
|
*/
|
||||||
|
public function getInsertReturn($key = null)
|
||||||
|
{
|
||||||
|
trigger_error('Method '.__METHOD__.' is deprecated, use getReturningExt($key = null)', E_USER_DEPRECATED);
|
||||||
|
return $this->dbGetReturningExt($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DEPRECATED: getReturning
|
||||||
|
* @return array|string|int|null [DEPRECATED]
|
||||||
|
* @deprecated use dbGetReturning() instead
|
||||||
|
*/
|
||||||
|
public function getReturning()
|
||||||
|
{
|
||||||
|
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetReturning()', E_USER_DEPRECATED);
|
||||||
|
return $this->dbGetReturning();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DEPRECATED: getInsertPK
|
||||||
|
* @return array|string|int|null [DEPRECATED]
|
||||||
|
* @deprecated use dbGetInsertPK() instead
|
||||||
|
*/
|
||||||
|
public function getInsertPK()
|
||||||
|
{
|
||||||
|
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetInsertPK()', E_USER_DEPRECATED);
|
||||||
|
return $this->dbGetReturning();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DEPRECATED: getReturningExt
|
||||||
|
* @param string|null $key [DEPRECATED]
|
||||||
|
* @return array|string|null [DEPRECATED]
|
||||||
|
* @deprecated use dbGetReturningExt($key = null) instead
|
||||||
|
*/
|
||||||
|
public function getReturningExt($key = null)
|
||||||
|
{
|
||||||
|
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetReturningExt($key = null)', E_USER_DEPRECATED);
|
||||||
|
return $this->dbGetReturningExt($key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DEPRECATED: getCursorExt
|
||||||
|
* @param string|null $q [DEPRECATED]
|
||||||
|
* @return array|null [DEPRECATED]
|
||||||
|
* @deprecated use dbGetCursorExt($q = null) instead
|
||||||
|
*/
|
||||||
|
public function getCursorExt($q = null)
|
||||||
|
{
|
||||||
|
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetCursorExt($q = null)', E_USER_DEPRECATED);
|
||||||
|
return $this->dbGetCursorExt($q);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DEPRECATED: getNumRows
|
||||||
|
* @return int|null [DEPRECATED]
|
||||||
|
* @deprecated use dbGetNumRows() instead
|
||||||
|
*/
|
||||||
|
public function getNumRows()
|
||||||
|
{
|
||||||
|
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetNumRows()', E_USER_DEPRECATED);
|
||||||
|
return $this->dbGetNumRows();
|
||||||
|
}
|
||||||
} // end if db class
|
} // end if db class
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -37,13 +37,13 @@ class L10n extends \CoreLibs\Basic
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* class constructor call for language getstring
|
* class constructor call for language getstring
|
||||||
* @param string $lang language name (optional), fallback is en
|
* @param string $lang language name (optional), fallback is en
|
||||||
* @param string $path path, if empty fallback on default internal path
|
* @param string $path path, if empty fallback on default internal path
|
||||||
* @param int|integer $set_control_flag control flags for Basic class set/get checks
|
|
||||||
*/
|
*/
|
||||||
public function __construct(string $lang = '', string $path = '', int $set_control_flag = 0)
|
public function __construct(string $lang = '', string $path = ''
|
||||||
|
)
|
||||||
{
|
{
|
||||||
parent::__construct($set_control_flag);
|
parent::__construct();
|
||||||
if (!$lang) {
|
if (!$lang) {
|
||||||
$this->lang = 'en';
|
$this->lang = 'en';
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -255,11 +255,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* construct form generator
|
* construct form generator
|
||||||
* @param array $db_config db config array
|
* @param array $db_config db config array
|
||||||
* @param int|integer $table_width table/div width (default 750)
|
* @param int|integer $table_width table/div width (default 750)
|
||||||
* @param int|integer $set_control_flag basic class set/get variable error flags
|
|
||||||
*/
|
*/
|
||||||
public function __construct(array $db_config, int $table_width = 750, int $set_control_flag = 0)
|
public function __construct(array $db_config, int $table_width = 750)
|
||||||
{
|
{
|
||||||
$this->my_page_name = $this->getPageName(1);
|
$this->my_page_name = $this->getPageName(1);
|
||||||
$this->setLangEncoding();
|
$this->setLangEncoding();
|
||||||
@@ -289,7 +288,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
|
|
||||||
// start the array_io class which will start db_io ...
|
// start the array_io class which will start db_io ...
|
||||||
parent::__construct($db_config, $config_array['table_array'], $config_array['table_name'], $set_control_flag);
|
parent::__construct($db_config, $config_array['table_array'], $config_array['table_name']);
|
||||||
// here should be a check if the config_array is correct ...
|
// here should be a check if the config_array is correct ...
|
||||||
if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) {
|
if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) {
|
||||||
$this->field_array = $config_array['show_fields'];
|
$this->field_array = $config_array['show_fields'];
|
||||||
@@ -1231,7 +1230,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
) {
|
) {
|
||||||
$mand_okay = 1;
|
$mand_okay = 1;
|
||||||
$row_okay[$i] = 1;
|
$row_okay[$i] = 1;
|
||||||
} elseif ($data_array['type'] == 'radio_group' && !isset($_POST[$prfx.$el_name])) {
|
} elseif (!empty($data_array['type']) && $data_array['type'] == 'radio_group' &&
|
||||||
|
!isset($_POST[$prfx.$el_name])
|
||||||
|
) {
|
||||||
// radio group and set where one not active
|
// radio group and set where one not active
|
||||||
// $this->debug('edit_error_chk', 'RADIO GROUP');
|
// $this->debug('edit_error_chk', 'RADIO GROUP');
|
||||||
$row_okay[$_POST[$prfx.$el_name][$i] ?? 0] = 0;
|
$row_okay[$_POST[$prfx.$el_name][$i] ?? 0] = 0;
|
||||||
@@ -1590,7 +1591,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: WRITE: ".$no_write[$i]);
|
$this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: WRITE: ".$no_write[$i]);
|
||||||
// flag if data is in the text field and we are in a reference data set
|
// flag if data is in the text field and we are in a reference data set
|
||||||
if (isset($reference_array['type']) && $reference_array['type'] == 'reference_data') {
|
if (isset($reference_array['type']) && $reference_array['type'] == 'reference_data') {
|
||||||
if ($data_array['type'] == 'text' && isset($_POST[$prfx.$el_name][$i])) {
|
if (!empty($data_array['type']) && $data_array['type'] == 'text' &&
|
||||||
|
isset($_POST[$prfx.$el_name][$i])
|
||||||
|
) {
|
||||||
$block_write[$i] = 1;
|
$block_write[$i] = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1645,7 +1648,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$q_names[$i] .= $el_name;
|
$q_names[$i] .= $el_name;
|
||||||
// data part, read from where [POST]
|
// data part, read from where [POST]
|
||||||
// radio group selections (only one can be active)
|
// radio group selections (only one can be active)
|
||||||
if ($data_array['type'] == 'radio_group') {
|
if (isset($data_array['type']) && $data_array['type'] == 'radio_group') {
|
||||||
if (isset($_POST[$prfx.$el_name]) && $i == $_POST[$prfx.$el_name]) {
|
if (isset($_POST[$prfx.$el_name]) && $i == $_POST[$prfx.$el_name]) {
|
||||||
$_value = $i + 1;
|
$_value = $i + 1;
|
||||||
} else {
|
} else {
|
||||||
@@ -1934,7 +1937,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// $this->debug('CFG SELECT', 'Proto: '.$this->printAr($q_select));
|
// $this->debug('CFG SELECT', 'Proto: '.$this->printAr($q_select));
|
||||||
// query for reading in the data
|
// query for reading in the data
|
||||||
$this->debug('edit_error', 'ERR: '.$this->error);
|
$this->debug('edit_error', 'ERR: '.$this->error);
|
||||||
// if we got a read data, build the read select for the read, and read out the 'selected' data
|
// if we got a read data, build the read select for the read, and read out the 'selected'
|
||||||
|
/** @phan-assert array $this->element_list[$table_name]['read_data'] */
|
||||||
if (isset($this->element_list[$table_name]['read_data'])) {
|
if (isset($this->element_list[$table_name]['read_data'])) {
|
||||||
// we need a second one for the query build only
|
// we need a second one for the query build only
|
||||||
// prefix all elements with the $table name
|
// prefix all elements with the $table name
|
||||||
@@ -1942,10 +1946,22 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
foreach ($q_select as $_pos => $element) {
|
foreach ($q_select as $_pos => $element) {
|
||||||
$_q_select[$_pos] = $table_name.'.'.$element;
|
$_q_select[$_pos] = $table_name.'.'.$element;
|
||||||
}
|
}
|
||||||
|
// set if missing
|
||||||
|
if (!isset($this->element_list[$table_name]['read_data']['pk_id'])) {
|
||||||
|
$this->element_list[$table_name]['read_data']['pk_id'] = '';
|
||||||
|
}
|
||||||
|
if (!isset($this->element_list[$table_name]['read_data']['name'])) {
|
||||||
|
$this->element_list[$table_name]['read_data']['name'] = '';
|
||||||
|
}
|
||||||
|
if (!isset($this->element_list[$table_name]['read_data']['table_name'])) {
|
||||||
|
$this->element_list[$table_name]['read_data']['table_name'] = '';
|
||||||
|
}
|
||||||
// add the read names in here, prefix them with the table name
|
// add the read names in here, prefix them with the table name
|
||||||
// earch to read part is split by |
|
// earch to read part is split by |
|
||||||
if ($this->element_list[$table_name]['read_data']['name']) {
|
if (!empty($this->element_list[$table_name]['read_data']['name'])) {
|
||||||
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
foreach (explode('|', $this->element_list[$table_name]['read_data']['name']) as $read_name) {
|
foreach (explode('|', $this->element_list[$table_name]['read_data']['name']) as $read_name) {
|
||||||
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
array_unshift($_q_select, $this->element_list[$table_name]['read_data']['table_name'].'.'.$read_name);
|
array_unshift($_q_select, $this->element_list[$table_name]['read_data']['table_name'].'.'.$read_name);
|
||||||
array_unshift($q_select, $read_name);
|
array_unshift($q_select, $read_name);
|
||||||
}
|
}
|
||||||
@@ -1953,24 +1969,29 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
// @phan HACK
|
// @phan HACK
|
||||||
$data['prefix'] = $data['prefix'] ?? '';
|
$data['prefix'] = $data['prefix'] ?? '';
|
||||||
// set the rest of the data so we can print something out
|
// set the rest of the data so we can print something out
|
||||||
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
$data['type'][$data['prefix'].$this->element_list[$table_name]['read_data']['name']] = 'string';
|
$data['type'][$data['prefix'].$this->element_list[$table_name]['read_data']['name']] = 'string';
|
||||||
// build the read query
|
// build the read query
|
||||||
$q = 'SELECT ';
|
$q = 'SELECT ';
|
||||||
// if (!$this->table_array[$this->int_pk_name]['value'])
|
// if (!$this->table_array[$this->int_pk_name]['value'])
|
||||||
// $q .= 'DISTINCT ';
|
// $q .= 'DISTINCT ';
|
||||||
// prefix join key with table name, and implode the query select part
|
// prefix join key with table name, and implode the query select part
|
||||||
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
$q .= str_replace($table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'], $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'], implode(', ', $_q_select)).' ';
|
$q .= str_replace($table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'], $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'], implode(', ', $_q_select)).' ';
|
||||||
// if (!$this->table_array[$this->int_pk_name]['value'] && $this->element_list[$table_name]['read_data']['order'])
|
// if (!$this->table_array[$this->int_pk_name]['value'] && $this->element_list[$table_name]['read_data']['order'])
|
||||||
// $q .= ', '.$this->element_list[$table_name]['read_data']['order'].' ';
|
// $q .= ', '.$this->element_list[$table_name]['read_data']['order'].' ';
|
||||||
// read from the read table as main, and left join to the sub table to read the actual data
|
// read from the read table as main, and left join to the sub table to read the actual data
|
||||||
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
$q .= 'FROM '.$this->element_list[$table_name]['read_data']['table_name'].' ';
|
$q .= 'FROM '.$this->element_list[$table_name]['read_data']['table_name'].' ';
|
||||||
$q .= 'LEFT JOIN '.$table_name.' ';
|
$q .= 'LEFT JOIN '.$table_name.' ';
|
||||||
$q .= 'ON (';
|
$q .= 'ON (';
|
||||||
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
$q .= $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'].' = '.$table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'].' ';
|
$q .= $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'].' = '.$table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'].' ';
|
||||||
// if ($this->table_array[$this->int_pk_name]['value'])
|
// if ($this->table_array[$this->int_pk_name]['value'])
|
||||||
$q .= 'AND '.$table_name.'.'.$this->int_pk_name.' = '.(!empty($this->table_array[$this->int_pk_name]['value']) ? $this->table_array[$this->int_pk_name]['value'] : 'NULL').' ';
|
$q .= 'AND '.$table_name.'.'.$this->int_pk_name.' = '.(!empty($this->table_array[$this->int_pk_name]['value']) ? $this->table_array[$this->int_pk_name]['value'] : 'NULL').' ';
|
||||||
$q .= ') ';
|
$q .= ') ';
|
||||||
if (isset($this->element_list[$table_name]['read_data']['order'])) {
|
if (isset($this->element_list[$table_name]['read_data']['order'])) {
|
||||||
|
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
|
||||||
$q .= ' ORDER BY '.$this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['order'];
|
$q .= ' ORDER BY '.$this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['order'];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ class SmartyExtend extends SmartyBC
|
|||||||
public $page_name;
|
public $page_name;
|
||||||
|
|
||||||
// array for data parsing
|
// array for data parsing
|
||||||
public $HEADER = array();
|
public $HEADER = [];
|
||||||
public $DATA = array();
|
public $DATA = [];
|
||||||
public $DEBUG_DATA = array();
|
public $DEBUG_DATA = [];
|
||||||
private $CONTENT_DATA = array();
|
private $CONTENT_DATA = [];
|
||||||
// control vars
|
// control vars
|
||||||
public $USE_PROTOTYPE = USE_PROTOTYPE;
|
public $USE_PROTOTYPE = USE_PROTOTYPE;
|
||||||
public $USE_JQUERY = USE_JQUERY;
|
public $USE_JQUERY = USE_JQUERY;
|
||||||
@@ -67,6 +67,11 @@ class SmartyExtend extends SmartyBC
|
|||||||
public $JS_TEMPLATE_NAME;
|
public $JS_TEMPLATE_NAME;
|
||||||
public $CSS_TEMPLATE_NAME;
|
public $CSS_TEMPLATE_NAME;
|
||||||
public $TEMPLATE_TRANSLATE;
|
public $TEMPLATE_TRANSLATE;
|
||||||
|
// core group
|
||||||
|
public $JS_CORE_TEMPLATE_NAME;
|
||||||
|
public $CSS_CORE_TEMPLATE_NAME;
|
||||||
|
public $JS_CORE_INCLUDE;
|
||||||
|
public $CSS_CORE_INCLUDE;
|
||||||
// local names
|
// local names
|
||||||
public $JS_SPECIAL_TEMPLATE_NAME = '';
|
public $JS_SPECIAL_TEMPLATE_NAME = '';
|
||||||
public $CSS_SPECIAL_TEMPLATE_NAME = '';
|
public $CSS_SPECIAL_TEMPLATE_NAME = '';
|
||||||
@@ -147,6 +152,55 @@ class SmartyExtend extends SmartyBC
|
|||||||
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
|
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function setSmartCoreIncludeCssJs(): void
|
||||||
|
{
|
||||||
|
// core CS
|
||||||
|
$this->CSS_CORE_INCLUDE = '';
|
||||||
|
if (file_exists($this->CSS.$this->CSS_CORE_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->CSS.$this->CSS_CORE_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->CSS_CORE_INCLUDE = $this->CSS.$this->CSS_CORE_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// core JS
|
||||||
|
$this->JS_CORE_INCLUDE = '';
|
||||||
|
if (file_exists($this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->JS_CORE_INCLUDE = $this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// additional per page Javascript include
|
||||||
|
$this->JS_INCLUDE = '';
|
||||||
|
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// per page css file
|
||||||
|
$this->CSS_INCLUDE = '';
|
||||||
|
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// optional CSS file
|
||||||
|
$this->CSS_SPECIAL_INCLUDE = '';
|
||||||
|
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
// optional JS file
|
||||||
|
$this->JS_SPECIAL_INCLUDE = '';
|
||||||
|
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
|
||||||
|
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
|
||||||
|
) {
|
||||||
|
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets all internal paths and names that need to be passed on to the smarty template
|
* sets all internal paths and names that need to be passed on to the smarty template
|
||||||
@@ -196,34 +250,8 @@ class SmartyExtend extends SmartyBC
|
|||||||
$this->COMPILE_ID .= '_'.$this->TEMPLATE_NAME;
|
$this->COMPILE_ID .= '_'.$this->TEMPLATE_NAME;
|
||||||
$this->CACHE_ID .= '_'.$this->TEMPLATE_NAME;
|
$this->CACHE_ID .= '_'.$this->TEMPLATE_NAME;
|
||||||
}
|
}
|
||||||
// additional per page Javascript include
|
// set all the additional CSS/JS parths
|
||||||
$this->JS_INCLUDE = '';
|
$this->setSmartCoreIncludeCssJs();
|
||||||
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
// per page css file
|
|
||||||
$this->CSS_INCLUDE = '';
|
|
||||||
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
// optional CSS file
|
|
||||||
$this->CSS_SPECIAL_INCLUDE = '';
|
|
||||||
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
// optional JS file
|
|
||||||
$this->JS_SPECIAL_INCLUDE = '';
|
|
||||||
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
// check if template names exist
|
// check if template names exist
|
||||||
if (!$this->MASTER_TEMPLATE_NAME) {
|
if (!$this->MASTER_TEMPLATE_NAME) {
|
||||||
exit('MASTER TEMPLATE is not set');
|
exit('MASTER TEMPLATE is not set');
|
||||||
@@ -294,36 +322,12 @@ class SmartyExtend extends SmartyBC
|
|||||||
// jquery and prototype should not be used together
|
// jquery and prototype should not be used together
|
||||||
$this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
|
$this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
|
||||||
|
|
||||||
// additional per page Javascript include
|
// set all the additional CSS/JS parths
|
||||||
$this->JS_INCLUDE = '';
|
$this->setSmartCoreIncludeCssJs();
|
||||||
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
// per page css file
|
|
||||||
$this->CSS_INCLUDE = '';
|
|
||||||
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
// optional CSS file
|
|
||||||
$this->CSS_SPECIAL_INCLUDE = '';
|
|
||||||
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
// optional JS file
|
|
||||||
$this->JS_SPECIAL_INCLUDE = '';
|
|
||||||
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
|
|
||||||
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
|
|
||||||
) {
|
|
||||||
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
// the actual include files for javascript (per page)
|
// the actual include files for javascript (per page)
|
||||||
|
$this->HEADER['JS_CORE_INCLUDE'] = $this->JS_CORE_INCLUDE;
|
||||||
|
$this->HEADER['CSS_CORE_INCLUDE'] = $this->CSS_CORE_INCLUDE;
|
||||||
$this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
|
$this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
|
||||||
$this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
|
$this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
|
||||||
$this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;
|
$this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;
|
||||||
@@ -354,7 +358,7 @@ class SmartyExtend extends SmartyBC
|
|||||||
$this->DATA['nav_menu'] = $cms->adbTopMenu();
|
$this->DATA['nav_menu'] = $cms->adbTopMenu();
|
||||||
$this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0;
|
$this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0;
|
||||||
// messages = array('msg' =>, 'class' => 'error/warning/...')
|
// messages = array('msg' =>, 'class' => 'error/warning/...')
|
||||||
$this->DATA['messages'] = $cms->messages ?? array();
|
$this->DATA['messages'] = $cms->messages ?? [];
|
||||||
// the page name
|
// the page name
|
||||||
$this->DATA['page_name'] = $this->page_name;
|
$this->DATA['page_name'] = $this->page_name;
|
||||||
$this->DATA['table_width'] = $this->PAGE_WIDTH ?? PAGE_WIDTH;
|
$this->DATA['table_width'] = $this->PAGE_WIDTH ?? PAGE_WIDTH;
|
||||||
@@ -405,7 +409,9 @@ class SmartyExtend extends SmartyBC
|
|||||||
{
|
{
|
||||||
// array merge HEADER, DATA, DEBUG DATA
|
// array merge HEADER, DATA, DEBUG DATA
|
||||||
foreach (array('HEADER', 'DATA', 'DEBUG_DATA') as $ext_smarty) {
|
foreach (array('HEADER', 'DATA', 'DEBUG_DATA') as $ext_smarty) {
|
||||||
if (is_array($cms->{$ext_smarty})) {
|
if (isset($cms->{$ext_smarty}) &&
|
||||||
|
is_array($cms->{$ext_smarty})
|
||||||
|
) {
|
||||||
$this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty});
|
$this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ if (class_exists('Autoload', false) === false) {
|
|||||||
// print "(2) Class clean: $path<br>";
|
// print "(2) Class clean: $path<br>";
|
||||||
// if path is set and a valid file
|
// if path is set and a valid file
|
||||||
if ($path !== false && is_file($path)) {
|
if ($path !== false && is_file($path)) {
|
||||||
// echo "<b>(3)</b> Load Path: $path<br>";
|
// print "<b>(3)</b> Load Path: $path<br>";
|
||||||
// we should sub that
|
// we should sub that
|
||||||
// self::loadFile($path);
|
// self::loadFile($path);
|
||||||
include $path;
|
include $path;
|
||||||
|
|||||||
Reference in New Issue
Block a user