Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f5daaca598 | ||
|
|
6b4f310cd2 | ||
|
|
7b5bddb529 | ||
|
|
0a6fdf1248 | ||
|
|
3220180d58 | ||
|
|
8c8f14ec74 | ||
|
|
643991c3fd | ||
|
|
c81c46d426 | ||
|
|
d97b173ee7 | ||
|
|
b61152f10e | ||
|
|
0c68ebe652 | ||
|
|
31d0cdb8ad | ||
|
|
0f823bd283 | ||
|
|
6385a48824 | ||
|
|
a754d897cf | ||
|
|
4600f8f7bf | ||
|
|
04e4fe46f2 | ||
|
|
c35d3c9324 | ||
|
|
e92a682a8c | ||
|
|
ea07e4b95b | ||
|
|
88178cb08d | ||
|
|
5d98be06be | ||
|
|
183cadb0fd | ||
|
|
2067a6fe1d | ||
|
|
f5b6c639fb | ||
|
|
cde29c0362 | ||
|
|
10234000b7 | ||
|
|
a63a50a412 | ||
|
|
59da10b649 | ||
|
|
b714de498f | ||
|
|
aa11937ab2 | ||
|
|
d64d5f081c | ||
|
|
3085b52714 | ||
|
|
9949a5ef7f | ||
|
|
74ba935e96 | ||
|
|
39a62ed59d | ||
|
|
1379cf1519 | ||
|
|
2d15b78d21 |
@@ -8,6 +8,9 @@ for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
||||
echo "Translate language ${file}";
|
||||
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||
domain=$(echo "${file}" | cut -d "-" -f 2);
|
||||
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
||||
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
||||
fi;
|
||||
msgfmt -o ${base_folder}/includes/locale/${locale}/LC_MESSAGES/${domain}.mo ${base_folder}../4dev/locale/${locale}-${domain}.po;
|
||||
done;
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
# this list only holds edit_* related table data
|
||||
# functions
|
||||
function/set_uid.sql
|
||||
function/set_generic.sql
|
||||
function/random_string.sql
|
||||
function/set_edit_generic.sql
|
||||
function/edit_set_access_uid.sql
|
||||
function/edit_access_set_uid.sql
|
||||
function/edit_group_set_uid.sql
|
||||
function/edit_log_partition_insert.sql
|
||||
function/edit_user_set_login_user_id_set_date.sql
|
||||
# generic tables
|
||||
table/edit_temp_files.sql
|
||||
table/edit_generic.sql
|
||||
|
||||
@@ -6,20 +6,25 @@
|
||||
#exit;
|
||||
|
||||
# if flagged 'y' then it will ask after each import to continue
|
||||
development='y';
|
||||
development='n';
|
||||
# do not import anything, just order flow output
|
||||
test='n';
|
||||
input='';
|
||||
# write to file do not write to DB directly
|
||||
write='y';
|
||||
# database connection info
|
||||
db='<db name>';
|
||||
host='<db host>';
|
||||
user='<db user>';
|
||||
schema="public";
|
||||
schemas='public';
|
||||
export PGPASSWORD='';
|
||||
|
||||
# log files
|
||||
error_file="log/error";
|
||||
output_file="log/output";
|
||||
error_file='log/error';
|
||||
output_file='log/output';
|
||||
data_file='database_create_data.sql';
|
||||
|
||||
if [ "$write" = 'y' ]; then
|
||||
rm -f "${data_file}";
|
||||
fi;
|
||||
if [ ! -f ORDER ]; then
|
||||
echo "Could not find ORDER file";
|
||||
exit;
|
||||
@@ -40,26 +45,37 @@ while read file <&3; do
|
||||
if [ -f "$file" ]; then
|
||||
for path in "$schemas"; do
|
||||
echo "[+] WORK ON '${file}' @ '${path}'";
|
||||
# skip all on test
|
||||
if [ "$test" = 'n' ]; then
|
||||
echo "=== START [$file] ===>" >> ${error_file};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END [$file] ===>" >> ${error_file};
|
||||
fi;
|
||||
if [ "$development" = "y" ]; then
|
||||
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
||||
fi;
|
||||
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
||||
read -ep "Continue (y|r|^c): " input;
|
||||
if [ "$input" = "r" ]; then
|
||||
echo "Reload File '${file}' ...";
|
||||
if [ "$test" = 'n' ]; then
|
||||
echo "=== START RELOAD [$file] ===>" >> ${error_file};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END RELOAD [$file] ===>" >> ${error_file};
|
||||
# write to file
|
||||
if [ "$write" = 'y' ]; then
|
||||
echo "-- START: ${file}" >> ${data_file};
|
||||
cat "${file}" >> ${data_file};
|
||||
echo "-- END: ${file}" >> ${data_file};
|
||||
else
|
||||
# write to DB
|
||||
echo "=== START [$file] ===>" >> ${error_file};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END [$file] ===>" >> ${error_file};
|
||||
# next wait for dev
|
||||
if [ "$development" = "y" ]; then
|
||||
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
||||
fi;
|
||||
# loop run for reload on failed
|
||||
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
||||
read -ep "Continue (y|r|^c): " input;
|
||||
if [ "$input" = "r" ]; then
|
||||
echo "Reload File '${file}' ...";
|
||||
if [ "$test" = 'n' ]; then
|
||||
echo "=== START RELOAD [$file] ===>" >> ${error_file};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END RELOAD [$file] ===>" >> ${error_file};
|
||||
fi;
|
||||
fi;
|
||||
done;
|
||||
input='';
|
||||
fi;
|
||||
done;
|
||||
input='';
|
||||
fi;
|
||||
done;
|
||||
elif [[ ${file::1} != "#" ]]; then
|
||||
echo "[!] COULD NOT FIND FILE: '${file}'";
|
||||
|
||||
@@ -68,10 +68,11 @@ INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Visitor', 'B0C4B3
|
||||
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('User', '1E789E', 1);
|
||||
|
||||
-- edit language
|
||||
-- short_name = locale without encoding
|
||||
-- iso_name = encoding
|
||||
DELETE FROM edit_language;
|
||||
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('English', 'en_US', 'UTF-8', 1, 1, 1);
|
||||
INSERT INTO edit_language (long_name, short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('Japanese', 'ja_JP', 'UTF-8', 2, 1, 0);
|
||||
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('Japanese', 'ja_JP', 'UTF-8', 2, 1, 0);
|
||||
|
||||
-- edit group
|
||||
DELETE FROM edit_group;
|
||||
@@ -130,7 +131,7 @@ INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_
|
||||
-- inserts admin user so basic users can be created
|
||||
DELETE FROM edit_user;
|
||||
INSERT INTO edit_user (username, password, enabled, debug, db_debug, email, protected, admin, edit_language_id, edit_group_id, edit_scheme_id, edit_access_right_id) VALUES ('admin', 'admin', 1, 1, 1, '', 1, 1,
|
||||
(SELECT edit_language_id FROM edit_language WHERE short_name = 'en'),
|
||||
(SELECT edit_language_id FROM edit_language WHERE short_name = 'en_US'),
|
||||
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
|
||||
(SELECT edit_scheme_id FROM edit_scheme WHERE name = 'Admin'),
|
||||
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
|
||||
|
||||
1031
4dev/database/database_create_data.sql
Normal file
1031
4dev/database/database_create_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
28
4dev/database/function/edit_access_set_uid.sql
Normal file
28
4dev/database/function/edit_access_set_uid.sql
Normal file
@@ -0,0 +1,28 @@
|
||||
-- add uid add for edit_access table
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_edit_access_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_access t WHERE edit_access_id = NEW.edit_access_id;
|
||||
IF FOUND THEN
|
||||
NEW.uid := v_uid;
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
28
4dev/database/function/edit_group_set_uid.sql
Executable file
28
4dev/database/function/edit_group_set_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';
|
||||
@@ -1,28 +0,0 @@
|
||||
-- add uid add for edit_access table
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_edit_access_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_access t WHERE edit_access_id = NEW.edit_access_id;
|
||||
IF FOUND THEN
|
||||
NEW.uid := v_uid;
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
@@ -1,28 +0,0 @@
|
||||
-- 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,0 +1,26 @@
|
||||
-- set edit user login_user_id_set_date if login_user_id is set
|
||||
-- NOW() if not empty
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
BEGIN
|
||||
-- if new is not null/empty
|
||||
-- and old one is null or old one different new one
|
||||
-- set NOW()
|
||||
-- if new one is NULL
|
||||
-- set NULL
|
||||
IF
|
||||
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
||||
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
||||
THEN
|
||||
NEW.login_user_id_set_date = NOW();
|
||||
NEW.login_user_id_last_revalidate = NOW();
|
||||
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||
NEW.login_user_id_set_date = NULL;
|
||||
NEW.login_user_id_last_revalidate = NULL;
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
@@ -1,7 +1,8 @@
|
||||
-- create random string with length X
|
||||
|
||||
CREATE FUNCTION random_string(randomLength int)
|
||||
RETURNS text AS $$
|
||||
RETURNS text AS
|
||||
$$
|
||||
SELECT array_to_string(
|
||||
ARRAY(
|
||||
SELECT substring(
|
||||
@@ -13,6 +14,7 @@ SELECT array_to_string(
|
||||
),
|
||||
''
|
||||
)
|
||||
$$ LANGUAGE SQL
|
||||
$$
|
||||
LANGUAGE SQL
|
||||
RETURNS NULL ON NULL INPUT
|
||||
VOLATILE; -- LEAKPROOF;
|
||||
VOLATILE; -- LEAKPROOF;
|
||||
|
||||
15
4dev/database/function/set_date.sql
Normal file
15
4dev/database/function/set_date.sql
Normal file
@@ -0,0 +1,15 @@
|
||||
-- adds the created or updated date tags
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_date()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
BEGIN
|
||||
IF TG_OP = 'INSERT' THEN
|
||||
NEW.date_created := 'now';
|
||||
ELSIF TG_OP = 'UPDATE' THEN
|
||||
NEW.date_updated := 'now';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
@@ -1,15 +1,18 @@
|
||||
-- adds the created or updated date tags
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
|
||||
DECLARE
|
||||
random_length INT = 12; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = ''INSERT'' THEN
|
||||
NEW.date_created := ''now'';
|
||||
NEW.cuid := random_string(random_length);
|
||||
ELSIF TG_OP = ''UPDATE'' THEN
|
||||
NEW.date_updated := ''now'';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
' LANGUAGE 'plpgsql';
|
||||
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
DECLARE
|
||||
random_length INT = 12; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = 'INSERT' THEN
|
||||
NEW.date_created := 'now';
|
||||
NEW.cuid := random_string(random_length);
|
||||
ELSIF TG_OP = 'UPDATE' THEN
|
||||
NEW.date_updated := 'now';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
-- adds the created or updated date tags
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
||||
BEGIN
|
||||
IF TG_OP = ''INSERT'' THEN
|
||||
NEW.date_created := ''now'';
|
||||
ELSIF TG_OP = ''UPDATE'' THEN
|
||||
NEW.date_updated := ''now'';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
' LANGUAGE 'plpgsql';
|
||||
21
4dev/database/function/set_generic_uid.sql
Normal file
21
4dev/database/function/set_generic_uid.sql
Normal file
@@ -0,0 +1,21 @@
|
||||
-- set generic with date and uid combined
|
||||
-- don't use with set_generic/set_uid together
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_generic()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
DECLARE
|
||||
random_length INT = 32; -- long for massive data
|
||||
BEGIN
|
||||
IF TG_OP = 'INSERT' THEN
|
||||
NEW.date_created := 'now';
|
||||
IF NEW.uid IS NULL THEN
|
||||
NEW.uid := random_string(random_length);
|
||||
END IF;
|
||||
ELSIF TG_OP = 'UPDATE' THEN
|
||||
NEW.date_updated := 'now';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
@@ -1,12 +1,15 @@
|
||||
-- adds the created or updated date tags
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS '
|
||||
DECLARE
|
||||
random_length INT = 32; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = ''INSERT'' THEN
|
||||
NEW.uid := random_string(random_length);
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
' LANGUAGE 'plpgsql';
|
||||
CREATE OR REPLACE FUNCTION set_uid()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
DECLARE
|
||||
random_length INT = 32; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = 'INSERT' THEN
|
||||
NEW.uid := random_string(random_length);
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
|
||||
@@ -2,15 +2,18 @@
|
||||
|
||||
-- OLD, DEPRECATED, use set_generic.sql
|
||||
|
||||
-- CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
||||
-- BEGIN
|
||||
-- IF TG_OP = ''INSERT'' THEN
|
||||
-- NEW.date_created := clock_timestamp();
|
||||
-- NEW.user_created := current_user;
|
||||
-- ELSIF TG_OP = ''UPDATE'' THEN
|
||||
-- NEW.date_updated := clock_timestamp();
|
||||
-- NEW.user_updated := current_user;
|
||||
-- END IF;
|
||||
-- RETURN NEW;
|
||||
-- END;
|
||||
-- ' LANGUAGE 'plpgsql';
|
||||
-- CREATE OR REPLACE FUNCTION set_generic()
|
||||
-- RETURNS TRIGGER AS
|
||||
-- $$
|
||||
-- BEGIN
|
||||
-- IF TG_OP = 'INSERT' THEN
|
||||
-- NEW.date_created := clock_timestamp();
|
||||
-- NEW.user_created := current_user;
|
||||
-- ELSIF TG_OP = 'UPDATE' THEN
|
||||
-- NEW.date_updated := clock_timestamp();
|
||||
-- NEW.user_updated := current_user;
|
||||
-- END IF;
|
||||
-- RETURN NEW;
|
||||
-- END;
|
||||
-- $$
|
||||
-- LANGUAGE 'plpgsql';
|
||||
|
||||
@@ -18,31 +18,82 @@ CREATE TABLE edit_user (
|
||||
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,
|
||||
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,
|
||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||
-- username/password
|
||||
username VARCHAR UNIQUE,
|
||||
password VARCHAR,
|
||||
-- name block
|
||||
first_name VARCHAR,
|
||||
last_name VARCHAR,
|
||||
first_name_furigana VARCHAR,
|
||||
last_name_furigana VARCHAR,
|
||||
-- email
|
||||
email VARCHAR,
|
||||
-- eanbled/deleted flag
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||
-- general flags
|
||||
strict SMALLINT DEFAULT 0,
|
||||
locked SMALLINT DEFAULT 0,
|
||||
protected SMALLINT NOT NULL DEFAULT 0,
|
||||
-- legacy, debug flags
|
||||
debug SMALLINT NOT NULL DEFAULT 0,
|
||||
db_debug SMALLINT NOT NULL DEFAULT 0,
|
||||
email VARCHAR,
|
||||
protected SMALLINT NOT NULL DEFAULT 0,
|
||||
-- is admin user
|
||||
admin SMALLINT NOT NULL DEFAULT 0,
|
||||
-- last login log
|
||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||
-- login error
|
||||
login_error_count INT DEFAULT 0,
|
||||
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
||||
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
||||
strict SMALLINT DEFAULT 0,
|
||||
locked SMALLINT DEFAULT 0,
|
||||
-- time locked
|
||||
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
||||
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
||||
-- password change
|
||||
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_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
||||
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
||||
-- _GET login id for direct login
|
||||
login_user_id VARCHAR UNIQUE, -- the loginUserId, at least 32 chars
|
||||
login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE, -- when above uid was set
|
||||
login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE, -- when the last login was done with user name and password
|
||||
login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE, -- if set, from when the above uid is valid
|
||||
login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE, -- if set, until when the above uid is valid
|
||||
login_user_id_revalidate_after INTERVAL, -- user must login to revalidated loginUserId after set days, 0 for forever
|
||||
login_user_id_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
||||
-- additional ACL json block
|
||||
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
-- create unique index
|
||||
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||
|
||||
COMMENT ON COLUMN edit_user.username IS 'Login username, must set';
|
||||
COMMENT ON COLUMN edit_user.password IS 'Login password, must set';
|
||||
COMMENT ON COLUMN edit_user.enabled IS 'Login is enabled (master switch)';
|
||||
COMMENT ON COLUMN edit_user.deleted IS 'Login is deleted (master switch), overrides all other';
|
||||
COMMENT ON COLUMN edit_user.strict IS 'If too many failed logins user will be locked, default off';
|
||||
COMMENT ON COLUMN edit_user.locked IS 'Locked from too many wrong password logins';
|
||||
COMMENT ON COLUMN edit_user.protected IS 'User can only be chnaged by admin user';
|
||||
COMMENT ON COLUMN edit_user.debug IS 'Turn debug flag on (legacy)';
|
||||
COMMENT ON COLUMN edit_user.db_debug IS 'Turn DB debug flag on (legacy)';
|
||||
COMMENT ON COLUMN edit_user.admin IS 'If set, this user is SUPER admin';
|
||||
COMMENT ON COLUMN edit_user.last_login IS 'Last succesfull login tiemstamp';
|
||||
COMMENT ON COLUMN edit_user.login_error_count IS 'Number of failed logins, reset on successful login';
|
||||
COMMENT ON COLUMN edit_user.login_error_date_last IS 'Last login error date';
|
||||
COMMENT ON COLUMN edit_user.login_error_date_first IS 'First login error date, reset on successfull login';
|
||||
COMMENT ON COLUMN edit_user.lock_until IS 'Account is locked until this date, <';
|
||||
COMMENT ON COLUMN edit_user.lock_after IS 'Account is locked after this date, >';
|
||||
COMMENT ON COLUMN edit_user.password_change_date IS 'Password was changed on';
|
||||
COMMENT ON COLUMN edit_user.password_change_interval IS 'After how many days the password has to be changed';
|
||||
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';
|
||||
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid, one time, invalid after reset successful or time out';
|
||||
COMMENT ON COLUMN edit_user.login_user_id IS 'Min 32 character UID to be used to login without password. Via GET/POST parameter';
|
||||
COMMENT ON COLUMN edit_user.login_user_id_set_date IS 'loginUserId was set at what date';
|
||||
COMMENT ON COLUMN edit_user.login_user_id_last_revalidate IS 'set when username/password login is done and loginUserId is set';
|
||||
COMMENT ON COLUMN edit_user.login_user_id_valid_from IS 'loginUserId is valid from this date, >=';
|
||||
COMMENT ON COLUMN edit_user.login_user_id_valid_until IS 'loginUserId is valid until this date, <=';
|
||||
COMMENT ON COLUMN edit_user.login_user_id_revalidate_after IS 'If set to a number greater 0 then user must login after given amount of days to revalidate the loginUserId, set to 0 for valid forver';
|
||||
COMMENT ON COLUMN edit_user.login_user_id_locked IS 'A separte lock flag for loginUserId, user can still login normal';
|
||||
COMMENT ON COLUMN edit_user.additional_acl IS 'Additional Access Control List stored in JSON format';
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
-- cms tables; generic basic table
|
||||
-- generic basic table with date and uid column
|
||||
-- TABLE: generic
|
||||
-- HISTORY:
|
||||
|
||||
-- DROP TABLE edit_generic;
|
||||
-- DROP TABLE generic;
|
||||
CREATE TABLE generic (
|
||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
||||
uid VARCHAR
|
||||
);
|
||||
|
||||
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
@@ -0,0 +1,81 @@
|
||||
--
|
||||
SELECT
|
||||
eu.cuid, eu.username,
|
||||
eu.lock_until, eu.lock_after,
|
||||
CASE WHEN (
|
||||
(eu.lock_until IS NULL
|
||||
OR (eu.lock_until IS NOT NULL AND NOW() >= eu.lock_until))
|
||||
AND (eu.lock_after IS NULL
|
||||
OR (eu.lock_after IS NOT NULL AND NOW() <= eu.lock_after))
|
||||
) THEN 0::INT ELSE 1::INT END locked_period
|
||||
FROM edit_user eu
|
||||
WHERE eu.username = 'empty';
|
||||
|
||||
UPDATE edit_user SET
|
||||
lock_until = NOW() + '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
UPDATE edit_user SET
|
||||
lock_after = NOW() - '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
|
||||
|
||||
UPDATE edit_user SET
|
||||
lock_until = NOW() - '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
UPDATE edit_user SET
|
||||
lock_after = NOW() + '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
|
||||
UPDATE edit_user SET lock_until = NULL, lock_after = NULL WHERE username = 'empty';
|
||||
|
||||
--
|
||||
SELECT
|
||||
eu.cuid, eu.username,
|
||||
eu.login_user_id, login_user_id_set_date, eu.login_user_id_last_revalidate,
|
||||
(eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE AS reval_date, NOW()::DATE,
|
||||
eu.login_user_id_valid_from, eu.login_user_id_valid_until,
|
||||
eu.login_user_id_revalidate_after,
|
||||
CASE WHEN (
|
||||
(eu.login_user_id_valid_from IS NULL
|
||||
OR (eu.login_user_id_valid_from IS NOT NULL AND NOW() >= eu.login_user_id_valid_from))
|
||||
AND (eu.login_user_id_valid_until IS NULL
|
||||
OR (eu.login_user_id_valid_until IS NOT NULL AND NOW() <= eu.login_user_id_valid_until))
|
||||
) THEN 1::INT ELSE 0::INT END AS login_user_id_valid_date,
|
||||
CASE WHEN eu.login_user_id_revalidate_after IS NOT NULL
|
||||
AND eu.login_user_id_revalidate_after > '0 days'::INTERVAL
|
||||
AND (eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE <= NOW()::DATE
|
||||
THEN 1::INT ELSE 0::INT END AS login_user_id_revalidate
|
||||
FROM edit_user eu
|
||||
WHERE eu.username = 'empty';
|
||||
|
||||
-- init
|
||||
UPDATE edit_user SET login_user_id = random_string(5) WHERE username = 'empty';
|
||||
|
||||
-- outside valid
|
||||
UPDATE edit_user SET
|
||||
login_user_id_valid_from = NOW() - '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
UPDATE edit_user SET
|
||||
login_user_id_valid_until = NOW() + '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
-- inside valid
|
||||
UPDATE edit_user SET
|
||||
login_user_id_valid_from = NOW() + '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
UPDATE edit_user SET
|
||||
login_user_id_valid_until = NOW() - '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
|
||||
-- revalidate must
|
||||
UPDATE edit_user SET
|
||||
login_user_id_last_revalidate = NOW() - '1 day'::interval,
|
||||
login_user_id_revalidate_after = '1 day'::interval
|
||||
WHERE username = 'empty';
|
||||
-- revalidate not yet
|
||||
UPDATE edit_user SET
|
||||
login_user_id_last_revalidate = NOW(),
|
||||
login_user_id_revalidate_after = '6 day'::interval
|
||||
WHERE username = 'empty';
|
||||
|
||||
|
||||
UPDATE edit_user SET login_user_id_set_date = NULL, login_user_id_last_revalidate = NULL, login_user_id_valid_from = NULL, login_user_id_valid_until = NULL, login_user_id_revalidate_after = NULL WHERE username = 'empty';
|
||||
@@ -1,9 +1,9 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
|
||||
CREATE TRIGGER trg_edit_access
|
||||
BEFORE INSERT OR UPDATE ON edit_access
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_set_edit_access_uid ON edit_access;
|
||||
-- DROP TRIGGER IF EXISTS 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();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_access_data ON edit_access_data;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_access_data ON edit_access_data;
|
||||
CREATE TRIGGER trg_edit_access_data
|
||||
BEFORE INSERT OR UPDATE ON edit_access_data
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_access_right ON edit_access_right;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_access_right ON edit_access_right;
|
||||
CREATE TRIGGER trg_edit_access_right
|
||||
BEFORE INSERT OR UPDATE ON edit_access_right
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_access_user ON edit_access_user;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_access_user ON edit_access_user;
|
||||
CREATE TRIGGER trg_edit_access_user
|
||||
BEFORE INSERT OR UPDATE ON edit_access_user
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
|
||||
CREATE TRIGGER trg_edit_group
|
||||
BEFORE INSERT OR UPDATE ON edit_group
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group;
|
||||
-- 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();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
|
||||
CREATE TRIGGER trg_edit_language
|
||||
BEFORE INSERT OR UPDATE ON edit_language
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
|
||||
CREATE TRIGGER trg_edit_log
|
||||
BEFORE INSERT OR UPDATE ON edit_log
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_edit_log_insert_partition ON edit_log;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_log_insert_partition ON edit_log;
|
||||
CREATE TRIGGER trg_edit_log_insert_partition
|
||||
BEFORE INSERT OR UPDATE ON edit_log
|
||||
FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_log_overflow ON edit_log_overflow;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_log_overflow ON edit_log_overflow;
|
||||
CREATE TRIGGER trg_edit_log_overflow
|
||||
BEFORE INSERT OR UPDATE ON edit_log_overflow
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_menu_group ON edit_menu_group;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_menu_group ON edit_menu_group;
|
||||
CREATE TRIGGER trg_edit_menu_group
|
||||
BEFORE INSERT OR UPDATE ON edit_menu_group
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
|
||||
CREATE TRIGGER trg_edit_page
|
||||
BEFORE INSERT OR UPDATE ON edit_page
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_page_access ON edit_page_access;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_page_access ON edit_page_access;
|
||||
CREATE TRIGGER trg_edit_page_access
|
||||
BEFORE INSERT OR UPDATE ON edit_page_access
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_page_content ON edit_page_content;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_page_content ON edit_page_content;
|
||||
CREATE TRIGGER trg_edit_page_content
|
||||
BEFORE INSERT OR UPDATE ON edit_page_content
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_query_string ON edit_query_string;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_query_string ON edit_query_string;
|
||||
CREATE TRIGGER trg_edit_query_string
|
||||
BEFORE INSERT OR UPDATE ON edit_query_string
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
|
||||
CREATE TRIGGER trg_edit_scheme
|
||||
BEFORE INSERT OR UPDATE ON edit_scheme
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
|
||||
CREATE TRIGGER trg_edit_user
|
||||
BEFORE INSERT OR UPDATE ON edit_user
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_user_set_login_user_id_set_date ON edit_user;
|
||||
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||
BEFORE INSERT OR UPDATE ON edit_user
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
||||
-- DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
||||
CREATE TRIGGER trg_edit_visible_group
|
||||
BEFORE INSERT OR UPDATE ON edit_visible_group
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- update missing edit_* table data
|
||||
-- 2019/12/11 update missing edit_* table data
|
||||
|
||||
ALTER TABLE edit_generic ADD cuid VARCHAR;
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
-- 2022/6/17 update edit_user with login uid
|
||||
|
||||
-- !!! COPY TABLE ARRAY FOLDER !!!
|
||||
|
||||
-- the login uid, at least 32 chars
|
||||
ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE;
|
||||
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||
-- ALTER TABLE edit_user ADD CONSTRAINT edit_user_login_user_id_key UNIQUE (login_user_id);
|
||||
-- when above uid was set
|
||||
ALTER TABLE edit_user ADD login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE;
|
||||
ALTER TABLE edit_user ADD login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE;
|
||||
-- if set, from/until when the above uid is valid
|
||||
ALTER TABLE edit_user ADD login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE;
|
||||
ALTER TABLE edit_user ADD login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE;
|
||||
-- user must login to revalidated login id after set days, 0 for forever
|
||||
ALTER TABLE edit_user ADD login_user_id_revalidate_after INTERVAL;
|
||||
-- lock for login user id, but still allow normal login
|
||||
ALTER TABLE edit_user ADD login_user_id_locked SMALLINT NOT NULL DEFAULT 0;
|
||||
|
||||
-- disable login before date
|
||||
ALTER TABLE edit_user ADD lock_until TIMESTAMP WITHOUT TIME ZONE;
|
||||
-- disable login after date
|
||||
ALTER TABLE edit_user ADD lock_after TIMESTAMP WITHOUT TIME ZONE;
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
BEGIN
|
||||
-- if new is not null/empty
|
||||
-- and old one is null or old one different new one
|
||||
-- set NOW()
|
||||
-- if new one is NULL
|
||||
-- set NULL
|
||||
IF
|
||||
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
||||
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
||||
THEN
|
||||
NEW.login_user_id_set_date = NOW();
|
||||
NEW.login_user_id_last_revalidate = NOW();
|
||||
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||
NEW.login_user_id_set_date = NULL;
|
||||
NEW.login_user_id_last_revalidate = NULL;
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
|
||||
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||
BEFORE INSERT OR UPDATE ON edit_user
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||
|
||||
-- __END__
|
||||
@@ -25,7 +25,7 @@ declare(strict_types=1);
|
||||
* 1 for file loadable, but no data inside
|
||||
* 2 for file not readable
|
||||
* 3 for file not found
|
||||
* @deprecated V6 Use \CoreLibs\Get\ReadEnvFile::readEnvFile()
|
||||
* @deprecated V6 Use \CoreLibs\Get\DotEnv::readEnvFile()
|
||||
*/
|
||||
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
||||
{
|
||||
File diff suppressed because it is too large
Load Diff
52
4dev/tests/CoreLibsACLLogin_database_prepare.sh
Executable file
52
4dev/tests/CoreLibsACLLogin_database_prepare.sh
Executable file
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# note: there is currently no port selection, standard 5432 port is assumed
|
||||
# note: we use the default in path postgresql commands and connect to whatever default DB is set
|
||||
|
||||
# PARAMETER 1: database data file to load
|
||||
# PARAMETER 2: db user WHO MUST BE ABLE TO CREATE A DATABASE
|
||||
# PARAMETER 3: db name
|
||||
# PARAMETER 4: db host
|
||||
# PARAMETER 5: print out for testing
|
||||
|
||||
load_sql="${1}";
|
||||
# abort with 1 if we cannot find the file
|
||||
if [ ! -f "${load_sql}" ]; then
|
||||
echo 1;
|
||||
exit 1;
|
||||
fi;
|
||||
db_user="${2}";
|
||||
db_name="${3}";
|
||||
db_host="${4}";
|
||||
# empty db name or db user -> exit with 2
|
||||
if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
|
||||
echo 2;
|
||||
exit 2;
|
||||
fi;
|
||||
# drop database, on error exit with 3
|
||||
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1;
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 3;
|
||||
exit 3;
|
||||
fi;
|
||||
# create database, on error exit with 4
|
||||
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1;
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 4;
|
||||
exit 4;
|
||||
fi;
|
||||
# if error 5 thrown, test with enabled below
|
||||
if [ ! -z "${5}" ]; then
|
||||
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
|
||||
else
|
||||
# load data (redirect ALL error to null), on error exit with 5
|
||||
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null;
|
||||
fi;
|
||||
if [ $? -ne 0 ]; then
|
||||
echo 5;
|
||||
exit 5;
|
||||
fi;
|
||||
echo 0;
|
||||
exit 0;
|
||||
|
||||
# __END__
|
||||
692
4dev/tests/CoreLibsCreateEmailTest.php
Normal file
692
4dev/tests/CoreLibsCreateEmailTest.php
Normal file
@@ -0,0 +1,692 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Test class for Create\Email
|
||||
* @coversDefaultClass \CoreLibs\Create\Email
|
||||
* @testdox \CoreLibs\Create\Email method tests
|
||||
*/
|
||||
final class CoreLibsCreateEmailTest extends TestCase
|
||||
{
|
||||
private static $log;
|
||||
|
||||
/**
|
||||
* start DB conneciton, setup DB, etc
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function setUpBeforeClass(): void
|
||||
{
|
||||
self::$log = new \CoreLibs\Debug\Logging([
|
||||
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
||||
'file_id' => 'CoreLibs-Create-Email-Test',
|
||||
'debug_all' => true,
|
||||
'echo_all' => false,
|
||||
'print_all' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function encodeEmailNameProvider(): array
|
||||
{
|
||||
// 0: email
|
||||
// 1: name
|
||||
// 2: encoding
|
||||
// 3: kv_folding
|
||||
// 4: expected
|
||||
return [
|
||||
'all empty' => [
|
||||
'',
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
''
|
||||
],
|
||||
'email only' => [
|
||||
'test@test.com',
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
'test@test.com'
|
||||
],
|
||||
'email and name' => [
|
||||
'test@test.com',
|
||||
'Test Name',
|
||||
null,
|
||||
null,
|
||||
'"Test Name" <test@test.com>'
|
||||
],
|
||||
'name in mime encoded, default UTF-8' => [
|
||||
'test@test.com',
|
||||
'日本語',
|
||||
null,
|
||||
null,
|
||||
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||
],
|
||||
'name in mime encoded with half width Katakana, default UTF-8' => [
|
||||
'test@test.com',
|
||||
'日本語カタカナパ',
|
||||
null,
|
||||
null,
|
||||
'"=?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=" <test@test.com>'
|
||||
],
|
||||
'name in mime encoded with half width Katakana, folding on, default UTF-8' => [
|
||||
'test@test.com',
|
||||
'日本語カタカナパ',
|
||||
'UTF-8',
|
||||
true,
|
||||
'"=?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=" <test@test.com>'
|
||||
],
|
||||
'name in mime encoded, UTF-8 parameter' => [
|
||||
'test@test.com',
|
||||
'日本語',
|
||||
'UTF-8',
|
||||
null,
|
||||
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||
],
|
||||
// does internal UTF-8 to ISO-2022-JP convert
|
||||
'encoding in ISO-2022-JP' => [
|
||||
'test@test.com',
|
||||
'日本語',
|
||||
'ISO-2022-JP',
|
||||
null,
|
||||
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=" <test@test.com>'
|
||||
],
|
||||
'encoding with half width Katakana in ISO-2022-JP' => [
|
||||
'test@test.com',
|
||||
'日本語カタカナパ',
|
||||
'ISO-2022-JP',
|
||||
null,
|
||||
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
|
||||
],
|
||||
'encoding with half width Katakana, folding on in ISO-2022-JP' => [
|
||||
'test@test.com',
|
||||
'日本語カタカナパ',
|
||||
'ISO-2022-JP',
|
||||
true,
|
||||
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @dataProvider encodeEmailNameProvider
|
||||
* @testdox encode email $email, name $name, encoding $encoding will be $expected [$_dataName]
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testEncodeEmailName(
|
||||
string $email,
|
||||
?string $name,
|
||||
?string $encoding,
|
||||
?bool $kv_folding,
|
||||
string $expected
|
||||
): void {
|
||||
if ($name === null && $encoding === null && $kv_folding === null) {
|
||||
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
|
||||
} elseif ($encoding === null && $kv_folding === null) {
|
||||
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
|
||||
} elseif ($kv_folding === null) {
|
||||
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
|
||||
} else {
|
||||
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding, $kv_folding);
|
||||
}
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$encoded_email
|
||||
);
|
||||
}
|
||||
|
||||
public function sendEmailProvider(): array
|
||||
{
|
||||
// 0: subject
|
||||
// 1: body
|
||||
// 2: from email
|
||||
// 3: from name ('')
|
||||
// 4: array for to email
|
||||
// 5: replace content ([]/null)
|
||||
// 6: encoding (UTF-8/null)
|
||||
// 7: kv_folding
|
||||
// 8: return status
|
||||
// 9: expected content
|
||||
return [
|
||||
'all empty, fail -1' => [
|
||||
'subject' => '',
|
||||
'body' => '',
|
||||
'from_email' => '',
|
||||
'from_name' => '',
|
||||
'to_email' => [],
|
||||
'replace' => null,
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => -1,
|
||||
'expected_content' => [],
|
||||
],
|
||||
'missing to entry, fail -2' => [
|
||||
'subject' => 'SUBJECT',
|
||||
'body' => 'BODY',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [],
|
||||
'replace' => null,
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => -2,
|
||||
'expected_content' => [],
|
||||
],
|
||||
'bad encoding, fail -3' => [
|
||||
'subject' => 'SUBJECT',
|
||||
'body' => 'BODY',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => ['to@test.com'],
|
||||
'replace' => null,
|
||||
'encoding' => 'IDONTEXISTENCODING',
|
||||
'kv_folding' => null,
|
||||
'expected_status' => -3,
|
||||
'expected_content' => [],
|
||||
],
|
||||
'sending email 1' => [
|
||||
'subject' => 'SUBJECT',
|
||||
'body' => 'BODY',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'test@test.com'
|
||||
],
|
||||
'replace' => null,
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT',
|
||||
'body' => 'BODY',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1, encoded' => [
|
||||
'subject' => 'SUBJECT 日本語',
|
||||
'body' => 'BODY 日本語',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'test@test.com'
|
||||
],
|
||||
'replace' => null,
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe?=',
|
||||
'body' => 'BODY 日本語',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1, encoded, with half width katakanata' => [
|
||||
'subject' => 'SUBJECT 日本語カタカナパ',
|
||||
'body' => 'BODY 日本語',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'test@test.com'
|
||||
],
|
||||
'replace' => null,
|
||||
'encoding' => 'UTF-8',
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=',
|
||||
'body' => 'BODY 日本語',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1, encoded, with half width katakanata, folding on' => [
|
||||
'subject' => 'SUBJECT 日本語カタカナパ',
|
||||
'body' => 'BODY 日本語',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'test@test.com'
|
||||
],
|
||||
'replace' => null,
|
||||
'encoding' => 'UTF-8',
|
||||
'kv_folding' => true,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=',
|
||||
'body' => 'BODY 日本語',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1, encoded subject ISO-2022-JP' => [
|
||||
'subject' => 'SUBJECT 日本語',
|
||||
'body' => 'BODY 日本語',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'test@test.com'
|
||||
],
|
||||
'replace' => null,
|
||||
'encoding' => 'ISO-2022-JP',
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=',
|
||||
// body is stored as UTF-8 in log and here, so both must be translated
|
||||
'body' => 'BODY 日本語',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 2' => [
|
||||
'subject' => 'SUBJECT',
|
||||
'body' => 'BODY',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'e1@test.com',
|
||||
'e2@test.com'
|
||||
],
|
||||
'replace' => null,
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'e1@test.com',
|
||||
'subject' => 'SUBJECT',
|
||||
'body' => 'BODY',
|
||||
],
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'e2@test.com',
|
||||
'subject' => 'SUBJECT',
|
||||
'body' => 'BODY',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1: dynamic' => [
|
||||
'subject' => 'SUBJECT {FOO}',
|
||||
'body' => 'BODY {FOO} {VAR}',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'test@test.com'
|
||||
],
|
||||
'replace' => [
|
||||
'FOO' => 'foo',
|
||||
'VAR' => 'bar',
|
||||
],
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT foo',
|
||||
'body' => 'BODY foo bar',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1: dynamic encoded' => [
|
||||
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
'test@test.com'
|
||||
],
|
||||
'replace' => [
|
||||
'FOO' => 'foo',
|
||||
'VAR' => 'bar',
|
||||
],
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||
'body' => 'BODY 日本語 foo bar',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1: dynamic, to override' => [
|
||||
'subject' => 'SUBJECT {FOO}',
|
||||
'body' => 'BODY {FOO} {VAR}',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
[
|
||||
'email' => 'test@test.com',
|
||||
'replace' => [
|
||||
'FOO' => 'foo to'
|
||||
]
|
||||
]
|
||||
],
|
||||
'replace' => [
|
||||
'FOO' => 'foo',
|
||||
'VAR' => 'bar',
|
||||
],
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT foo to',
|
||||
'body' => 'BODY foo to bar',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 1: dynamic, to override encoded' => [
|
||||
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
[
|
||||
'email' => 'test@test.com',
|
||||
'replace' => [
|
||||
'FOO' => 'foo to'
|
||||
]
|
||||
]
|
||||
],
|
||||
'replace' => [
|
||||
'FOO' => 'foo',
|
||||
'VAR' => 'bar',
|
||||
],
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 'test@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0bw==?=',
|
||||
'body' => 'BODY 日本語 foo to bar',
|
||||
]
|
||||
],
|
||||
],
|
||||
'sending email 3: dynamic, to mixed override' => [
|
||||
'subject' => 'SUBJECT {FOO}',
|
||||
'body' => 'BODY {FOO} {VAR}',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
[
|
||||
'email' => 't1@test.com',
|
||||
'replace' => [
|
||||
'FOO' => 'foo to 1'
|
||||
]
|
||||
],
|
||||
[
|
||||
'email' => 't2@test.com',
|
||||
'replace' => [
|
||||
'FOO' => 'foo to 2'
|
||||
]
|
||||
],
|
||||
[
|
||||
'email' => 't3@test.com',
|
||||
],
|
||||
],
|
||||
'replace' => [
|
||||
'FOO' => 'foo',
|
||||
'VAR' => 'bar',
|
||||
],
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 't1@test.com',
|
||||
'subject' => 'SUBJECT foo to 1',
|
||||
'body' => 'BODY foo to 1 bar',
|
||||
],
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 't2@test.com',
|
||||
'subject' => 'SUBJECT foo to 2',
|
||||
'body' => 'BODY foo to 2 bar',
|
||||
],
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 't3@test.com',
|
||||
'subject' => 'SUBJECT foo',
|
||||
'body' => 'BODY foo bar',
|
||||
],
|
||||
],
|
||||
],
|
||||
'sending email 3: dynamic, to mixed override encoded' => [
|
||||
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||
'from_email' => 'test@test.com',
|
||||
'from_name' => '',
|
||||
'to_email' => [
|
||||
[
|
||||
'email' => 't1@test.com',
|
||||
'replace' => [
|
||||
'FOO' => 'foo to 1'
|
||||
]
|
||||
],
|
||||
[
|
||||
'email' => 't2@test.com',
|
||||
'replace' => [
|
||||
'FOO' => 'foo to 2'
|
||||
]
|
||||
],
|
||||
[
|
||||
'email' => 't3@test.com',
|
||||
],
|
||||
],
|
||||
'replace' => [
|
||||
'FOO' => 'foo',
|
||||
'VAR' => 'bar',
|
||||
],
|
||||
'encoding' => null,
|
||||
'kv_folding' => null,
|
||||
'expected_status' => 2,
|
||||
'expected_content' => [
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 't1@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAx?=',
|
||||
'body' => 'BODY 日本語 foo to 1 bar',
|
||||
],
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 't2@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAy?=',
|
||||
'body' => 'BODY 日本語 foo to 2 bar',
|
||||
],
|
||||
[
|
||||
'header' => [
|
||||
'From' => 'test@test.com'
|
||||
],
|
||||
'to' => 't3@test.com',
|
||||
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||
'body' => 'BODY 日本語 foo bar',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @dataProvider sendEmailProvider
|
||||
* @testdox email sending with expected status $expected_status [$_dataName]
|
||||
*
|
||||
* @param string $subject
|
||||
* @param string $body
|
||||
* @param string $from_email
|
||||
* @param string $from_name
|
||||
* @param array $to_email
|
||||
* @param array|null $replace
|
||||
* @param string|null $encoding
|
||||
* @param bool|null $kv_folding
|
||||
* @param int $expected_status
|
||||
* @param array $expected_content
|
||||
* @return void
|
||||
*/
|
||||
public function testSendEmail(
|
||||
string $subject,
|
||||
string $body,
|
||||
string $from_email,
|
||||
string $from_name,
|
||||
array $to_email,
|
||||
?array $replace,
|
||||
?string $encoding,
|
||||
?bool $kv_folding,
|
||||
int $expected_status,
|
||||
array $expected_content
|
||||
): void {
|
||||
if ($replace === null) {
|
||||
$replace = [];
|
||||
}
|
||||
if ($encoding === null) {
|
||||
$encoding = 'UTF-8';
|
||||
}
|
||||
if ($kv_folding === null) {
|
||||
$kv_folding = false;
|
||||
}
|
||||
// force new set for each run
|
||||
self::$log->setLogUniqueId(true);
|
||||
// set on of unique log id
|
||||
self::$log->setLogPer('run', true);
|
||||
// init logger
|
||||
$status = \CoreLibs\Create\Email::sendEmail(
|
||||
$subject,
|
||||
$body,
|
||||
$from_email,
|
||||
$from_name,
|
||||
$to_email,
|
||||
$replace,
|
||||
$encoding,
|
||||
$kv_folding,
|
||||
true,
|
||||
self::$log
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected_status,
|
||||
$status,
|
||||
'Assert sending status'
|
||||
);
|
||||
// assert content: must load JSON from log file
|
||||
if ($status == 2) {
|
||||
// open file, get last entry with 'SEND EMAIL JSON' key
|
||||
$file = file_get_contents(self::$log->getLogFileName());
|
||||
if ($file !== false) {
|
||||
// extract SEND EMAIL JSON line
|
||||
$found = preg_match_all("/^.* <SEND EMAIL JSON> - (.*)$/m", $file, $matches);
|
||||
// print "Found: $found | EMAIL: " . print_r($matches, true) . "\n";
|
||||
if (!empty($matches[1])) {
|
||||
foreach ($matches[1] as $pos => $email_json) {
|
||||
$email = \CoreLibs\Convert\Json::jsonConvertToArray($email_json);
|
||||
// print "EMAIL: " . print_r($email, true) . "\n";
|
||||
$this->assertEquals(
|
||||
$expected_content[$pos]['header']['From'] ?? 'MISSING FROM',
|
||||
$email['header']['From'] ?? '',
|
||||
'Email check: assert header from'
|
||||
);
|
||||
$this->assertEquals(
|
||||
'text/plain; charset=' . $encoding ?? 'UTF-8',
|
||||
$email['header']['Content-type'] ?? '',
|
||||
'Email check: assert header content type'
|
||||
);
|
||||
$this->assertEquals(
|
||||
'1.0',
|
||||
$email['header']['MIME-Version'] ?? '',
|
||||
'Email check: assert header mime version'
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected_content[$pos]['to'] ?? 'MISSING TO',
|
||||
$email['to'] ?? '',
|
||||
'Email check: assert to'
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected_content[$pos]['subject'] ?? 'MISSING SUBJECT',
|
||||
$email['subject'] ?? '',
|
||||
'Email check: assert subject'
|
||||
);
|
||||
// body must be translated back to encoding if encoding is not UTF-8
|
||||
$this->assertEquals(
|
||||
$encoding != 'UTF-8' ?
|
||||
mb_convert_encoding($expected_content[$pos]['body'] ?? '', $encoding, 'UTF-8') :
|
||||
$expected_content[$pos]['body'] ?? 'MISSING BODY',
|
||||
$email['encoding'] != 'UTF-8' ?
|
||||
mb_convert_encoding($email['body'] ?? '', $email['encoding'], 'UTF-8') :
|
||||
$email['body'] ?? '',
|
||||
'Email check: assert body'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
@@ -13,7 +13,11 @@ use PHPUnit\Framework\TestCase;
|
||||
*/
|
||||
final class CoreLibsCreateHashTest extends TestCase
|
||||
{
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function hashData(): array
|
||||
{
|
||||
return [
|
||||
|
||||
@@ -36,9 +36,9 @@ final class CoreLibsDBExtendedArrayIOTest extends TestCase
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testDBIO()
|
||||
public function testArrayDBIO()
|
||||
{
|
||||
$this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
||||
// $this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
||||
$this->markTestIncomplete(
|
||||
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
||||
);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -15,8 +15,6 @@ use PHPUnit\Framework\TestCase;
|
||||
*/
|
||||
final class CoreLibsDebugLoggingTest extends TestCase
|
||||
{
|
||||
public $log;
|
||||
|
||||
/**
|
||||
* test set for options BASIC
|
||||
*
|
||||
@@ -85,6 +83,47 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* init logging class
|
||||
*
|
||||
* @dataProvider optionsProvider
|
||||
* @testdox init test [$_dataName]
|
||||
*
|
||||
* @param array|null $options
|
||||
* @param array $expected
|
||||
* @param array $override
|
||||
* @return void
|
||||
*/
|
||||
public function testClassInit(?array $options, array $expected, array $override): void
|
||||
{
|
||||
if (!empty($override['constant'])) {
|
||||
foreach ($override['constant'] as $var => $value) {
|
||||
define($var, $value);
|
||||
}
|
||||
}
|
||||
if ($options === null) {
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
} else {
|
||||
$log = new \CoreLibs\Debug\Logging($options);
|
||||
}
|
||||
// check that settings match
|
||||
$this->assertEquals(
|
||||
$expected['log_folder'],
|
||||
$log->getSetting('log_folder')
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected['debug_all'],
|
||||
$log->getSetting('debug_output_all')
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected['print_all'],
|
||||
$log->getSetting('print_output_all')
|
||||
);
|
||||
// print "LOG: " . $log->getSetting('log_folder') . "\n";
|
||||
// print "DEBUG: " . $log->getSetting('debug_output_all') . "\n";
|
||||
// print "PRINT: " . $log->getSetting('print_output_all') . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* adds log ID settings based on basic options
|
||||
*
|
||||
@@ -173,6 +212,52 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* test the setting and getting of LogId
|
||||
*
|
||||
* @covers ::setLogId
|
||||
* @dataProvider logIdOptionsProvider
|
||||
* @testdox log id set/get tests [$_dataName]
|
||||
*
|
||||
* @param array|null $options
|
||||
* @param array $expected
|
||||
* @param array $override
|
||||
* @return void
|
||||
*/
|
||||
public function testLogId(?array $options, array $expected, array $override): void
|
||||
{
|
||||
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
|
||||
if (!empty($override['constant'])) {
|
||||
foreach ($override['constant'] as $var => $value) {
|
||||
define($var, $value);
|
||||
}
|
||||
}
|
||||
if (!empty($override['globals'])) {
|
||||
foreach ($override['globals'] as $var => $value) {
|
||||
$GLOBALS[$var] = $value;
|
||||
}
|
||||
}
|
||||
if ($options === null) {
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
} else {
|
||||
$log = new \CoreLibs\Debug\Logging($options);
|
||||
}
|
||||
// check current
|
||||
$this->assertEquals(
|
||||
$log->getLogId(),
|
||||
$expected['log_file_id']
|
||||
);
|
||||
// we need to override now too
|
||||
if (!empty($override['values'])) {
|
||||
// check if we have values, set them post and assert
|
||||
$log->setLogId($override['values']['log_file_id']);
|
||||
$this->assertEquals(
|
||||
$log->getLogId(),
|
||||
$expected['set_log_file_id']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -180,6 +265,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
*/
|
||||
public function logLevelAllProvider(): array
|
||||
{
|
||||
// 0: type
|
||||
// 1: flag
|
||||
// 2: expected set
|
||||
// 3: expected get
|
||||
return [
|
||||
'debug all true' => [
|
||||
'debug',
|
||||
@@ -208,6 +297,38 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* check set/get for log level all flag
|
||||
*
|
||||
* @dataProvider logLevelAllProvider
|
||||
* @testdox set/get all log level $type with flag $flag [$_dataName]
|
||||
*
|
||||
* @param string $type
|
||||
* @param bool $flag
|
||||
* @param bool $expected_set
|
||||
* @param bool $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogLevelAll(
|
||||
string $type,
|
||||
bool $flag,
|
||||
bool $expected_set,
|
||||
bool $expected_get
|
||||
): void {
|
||||
// neutral start with default
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
// set and check
|
||||
$this->assertEquals(
|
||||
$log->setLogLevelAll($type, $flag),
|
||||
$expected_set
|
||||
);
|
||||
// get and check
|
||||
$this->assertEquals(
|
||||
$log->getLogLevelAll($type),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -215,6 +336,12 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
*/
|
||||
public function logLevelProvider(): array
|
||||
{
|
||||
// 0: type
|
||||
// 1: flag
|
||||
// 2: debug on (array)
|
||||
// 3: expected set
|
||||
// 4: level
|
||||
// 5: expected get
|
||||
return [
|
||||
'set debug on for level A,B,C and check full set' => [
|
||||
'debug',
|
||||
@@ -287,6 +414,43 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* checks setting for per log info level
|
||||
*
|
||||
* @covers ::setLogLevel
|
||||
* @dataProvider logLevelProvider
|
||||
* @testdox set/get log level $type to $flag check with $level [$_dataName]
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $flag
|
||||
* @param array $debug_on
|
||||
* @param bool $expected_set
|
||||
* @param string|null $level
|
||||
* @param bool|array<mixed> $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogLevel(
|
||||
string $type,
|
||||
string $flag,
|
||||
array $debug_on,
|
||||
bool $expected_set,
|
||||
?string $level,
|
||||
$expected_get
|
||||
): void {
|
||||
// neutral start with default
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
// set
|
||||
$this->assertEquals(
|
||||
$log->setLogLevel($type, $flag, $debug_on),
|
||||
$expected_set
|
||||
);
|
||||
// get, if level is null compare to?
|
||||
$this->assertEquals(
|
||||
$log->getLogLevel($type, $flag, $level),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -294,6 +458,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
*/
|
||||
public function logPerProvider(): array
|
||||
{
|
||||
// 0: type
|
||||
// 1: set
|
||||
// 2: expected set
|
||||
// 3: expected get
|
||||
return [
|
||||
'level set true' => [
|
||||
'level',
|
||||
@@ -328,6 +496,68 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* set and get per log
|
||||
* for level/class/page/run flags
|
||||
*
|
||||
* @covers ::setLogPer
|
||||
* @dataProvider logPerProvider
|
||||
* @testdox set/get log per $type with $set [$_dataName]
|
||||
*
|
||||
* @param string $type
|
||||
* @param boolean $set
|
||||
* @param boolean $expected_set
|
||||
* @param boolean $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogPer(
|
||||
string $type,
|
||||
bool $set,
|
||||
bool $expected_set,
|
||||
bool $expected_get
|
||||
): void {
|
||||
// neutral start with default
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
// set and check
|
||||
$this->assertEquals(
|
||||
$log->setLogPer($type, $set),
|
||||
$expected_set
|
||||
);
|
||||
// get and check
|
||||
$this->assertEquals(
|
||||
$log->getLogPer($type),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the print log file date part
|
||||
*
|
||||
* @covers ::setGetLogPrintFileDate
|
||||
* @testWith [true, true, true]
|
||||
* [false, false, false]
|
||||
* @testdox set/get log file date to $input [$_dataName]
|
||||
*
|
||||
* @param boolean $input
|
||||
* @param boolean $expected_set
|
||||
* @param boolean $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
|
||||
{
|
||||
// neutral start with default
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
// set and check
|
||||
$this->assertEquals(
|
||||
$log->setGetLogPrintFileDate($input),
|
||||
$expected_set
|
||||
);
|
||||
$this->assertEquals(
|
||||
$log->setGetLogPrintFileDate(),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -369,6 +599,95 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* convert array to string with ## pre replace space holders
|
||||
*
|
||||
* @covers ::prAr
|
||||
* @dataProvider prArProvider
|
||||
* @testdox check prAr array to string conversion [$_dataName]
|
||||
*
|
||||
* @param array $input
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testPrAr(array $input, string $expected): void
|
||||
{
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
$this->assertEquals(
|
||||
$log->prAr($input),
|
||||
$expected
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function prBlProvider(): array
|
||||
{
|
||||
// 0: input flag (bool)
|
||||
// 1: is true
|
||||
// 2: is flase
|
||||
// 3: epxected
|
||||
return [
|
||||
'true bool default' => [
|
||||
true,
|
||||
null,
|
||||
null,
|
||||
'true'
|
||||
],
|
||||
'false bool default' => [
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
'false'
|
||||
],
|
||||
'true bool override' => [
|
||||
true,
|
||||
'ok',
|
||||
'not ok',
|
||||
'ok'
|
||||
],
|
||||
'false bool override' => [
|
||||
false,
|
||||
'ok',
|
||||
'not ok',
|
||||
'not ok'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* check bool to string converter
|
||||
*
|
||||
* @covers ::prBl
|
||||
* @dataProvider prBlProvider
|
||||
* @testdox check prBl $input ($true/$false) is expected $false [$_dataName]
|
||||
*
|
||||
* @param bool $input
|
||||
* @param string|null $true
|
||||
* @param string|null $false
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testPrBl(bool $input, ?string $true, ?string $false, string $expected): void
|
||||
{
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
$return = '';
|
||||
if ($true === null && $false === null) {
|
||||
$return = $log->prBl($input);
|
||||
} elseif ($true !== null || $false !== null) {
|
||||
$return = $log->prBl($input, $true ?? '', $false ?? '');
|
||||
}
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$return
|
||||
);
|
||||
}
|
||||
|
||||
// from here are complex debug tests
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -471,246 +790,6 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* init logging class
|
||||
*
|
||||
* @dataProvider optionsProvider
|
||||
* @testdox init test [$_dataName]
|
||||
*
|
||||
* @param array|null $options
|
||||
* @param array $expected
|
||||
* @param array $override
|
||||
* @return void
|
||||
*/
|
||||
public function testClassInit(?array $options, array $expected, array $override): void
|
||||
{
|
||||
if (!empty($override['constant'])) {
|
||||
foreach ($override['constant'] as $var => $value) {
|
||||
define($var, $value);
|
||||
}
|
||||
}
|
||||
if ($options === null) {
|
||||
$this->log = new \CoreLibs\Debug\Logging();
|
||||
} else {
|
||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
||||
}
|
||||
// check that settings match
|
||||
$this->assertEquals(
|
||||
$expected['log_folder'],
|
||||
$this->log->getSetting('log_folder')
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected['debug_all'],
|
||||
$this->log->getSetting('debug_output_all')
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected['print_all'],
|
||||
$this->log->getSetting('print_output_all')
|
||||
);
|
||||
// print "LOG: " . $this->log->getSetting('log_folder') . "\n";
|
||||
// print "DEBUG: " . $this->log->getSetting('debug_output_all') . "\n";
|
||||
// print "PRINT: " . $this->log->getSetting('print_output_all') . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* test the setting and getting of LogId
|
||||
*
|
||||
* @covers ::setLogId
|
||||
* @dataProvider logIdOptionsProvider
|
||||
* @testdox log id set/get tests [$_dataName]
|
||||
*
|
||||
* @param array|null $options
|
||||
* @param array $expected
|
||||
* @param array $override
|
||||
* @return void
|
||||
*/
|
||||
public function testLogId(?array $options, array $expected, array $override): void
|
||||
{
|
||||
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
|
||||
if (!empty($override['constant'])) {
|
||||
foreach ($override['constant'] as $var => $value) {
|
||||
define($var, $value);
|
||||
}
|
||||
}
|
||||
if (!empty($override['globals'])) {
|
||||
foreach ($override['globals'] as $var => $value) {
|
||||
$GLOBALS[$var] = $value;
|
||||
}
|
||||
}
|
||||
if ($options === null) {
|
||||
$this->log = new \CoreLibs\Debug\Logging();
|
||||
} else {
|
||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
||||
}
|
||||
// check current
|
||||
$this->assertEquals(
|
||||
$this->log->getLogId(),
|
||||
$expected['log_file_id']
|
||||
);
|
||||
// we need to override now too
|
||||
if (!empty($override['values'])) {
|
||||
// check if we have values, set them post and assert
|
||||
$this->log->basicSetLogId($override['values']['log_file_id']);
|
||||
$this->assertEquals(
|
||||
$this->log->getLogId(),
|
||||
$expected['set_log_file_id']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* check set/get for log level all flag
|
||||
*
|
||||
* @dataProvider logLevelAllProvider
|
||||
* @testdox set/get all log level $type with flag $flag [$_dataName]
|
||||
*
|
||||
* @param string $type
|
||||
* @param bool $flag
|
||||
* @param bool $expected_set
|
||||
* @param bool $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogLevelAll(
|
||||
string $type,
|
||||
bool $flag,
|
||||
bool $expected_set,
|
||||
bool $expected_get
|
||||
): void {
|
||||
// neutral start with default
|
||||
$this->log = new \CoreLibs\Debug\Logging();
|
||||
// set and check
|
||||
$this->assertEquals(
|
||||
$this->log->setLogLevelAll($type, $flag),
|
||||
$expected_set
|
||||
);
|
||||
// get and check
|
||||
$this->assertEquals(
|
||||
$this->log->getLogLevelAll($type),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* checks setting for per log info level
|
||||
*
|
||||
* @covers ::setLogLevel
|
||||
* @dataProvider logLevelProvider
|
||||
* @testdox set/get log level $type to $flag check with $level [$_dataName]
|
||||
*
|
||||
* @param string $type
|
||||
* @param string $flag
|
||||
* @param array $debug_on
|
||||
* @param bool $expected_set
|
||||
* @param string|null $level
|
||||
* @param bool|array<mixed> $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogLevel(
|
||||
string $type,
|
||||
string $flag,
|
||||
array $debug_on,
|
||||
bool $expected_set,
|
||||
?string $level,
|
||||
$expected_get
|
||||
): void {
|
||||
// neutral start with default
|
||||
$this->log = new \CoreLibs\Debug\Logging();
|
||||
// set
|
||||
$this->assertEquals(
|
||||
$this->log->setLogLevel($type, $flag, $debug_on),
|
||||
$expected_set
|
||||
);
|
||||
// get, if level is null compare to?
|
||||
$this->assertEquals(
|
||||
$this->log->getLogLevel($type, $flag, $level),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* set and get per log
|
||||
* for level/class/page/run flags
|
||||
*
|
||||
* @covers ::setLogPer
|
||||
* @dataProvider logPerProvider
|
||||
* @testdox set/get log per $type with $set [$_dataName]
|
||||
*
|
||||
* @param string $type
|
||||
* @param boolean $set
|
||||
* @param boolean $expected_set
|
||||
* @param boolean $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogPer(
|
||||
string $type,
|
||||
bool $set,
|
||||
bool $expected_set,
|
||||
bool $expected_get
|
||||
): void {
|
||||
// neutral start with default
|
||||
$this->log = new \CoreLibs\Debug\Logging();
|
||||
// set and check
|
||||
$this->assertEquals(
|
||||
$this->log->setLogPer($type, $set),
|
||||
$expected_set
|
||||
);
|
||||
// get and check
|
||||
$this->assertEquals(
|
||||
$this->log->getLogPer($type),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the print log file date part
|
||||
*
|
||||
* @covers ::setGetLogPrintFileDate
|
||||
* @testWith [true, true, true]
|
||||
* [false, false, false]
|
||||
* @testdox set/get log file date to $input [$_dataName]
|
||||
*
|
||||
* @param boolean $input
|
||||
* @param boolean $expected_set
|
||||
* @param boolean $expected_get
|
||||
* @return void
|
||||
*/
|
||||
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
|
||||
{
|
||||
// neutral start with default
|
||||
$this->log = new \CoreLibs\Debug\Logging();
|
||||
// set and check
|
||||
$this->assertEquals(
|
||||
$this->log->setGetLogPrintFileDate($input),
|
||||
$expected_set
|
||||
);
|
||||
$this->assertEquals(
|
||||
$this->log->setGetLogPrintFileDate(),
|
||||
$expected_get
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* convert array to string with ## pre replace space holders
|
||||
*
|
||||
* @covers ::prAr
|
||||
* @dataProvider prArProvider
|
||||
* @testdox check prAr array to string conversion [$_dataName]
|
||||
*
|
||||
* @param array $input
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testPrAr(array $input, string $expected): void
|
||||
{
|
||||
$this->log = new \CoreLibs\Debug\Logging();
|
||||
$this->assertEquals(
|
||||
$this->log->prAr($input),
|
||||
$expected
|
||||
);
|
||||
}
|
||||
|
||||
// from here are complex debug tests
|
||||
|
||||
/**
|
||||
* Test debug flow
|
||||
*
|
||||
@@ -766,11 +845,11 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
// remove any files named /tmp/error_log_TestDebug*.log
|
||||
array_map('unlink', glob($options['log_folder'] . 'error_msg_' . $options['file_id'] . '*.log'));
|
||||
// init logger
|
||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
||||
$log = new \CoreLibs\Debug\Logging($options);
|
||||
// * debug (A/B)
|
||||
// NULL check for strip/prefix
|
||||
$this->assertEquals(
|
||||
$this->log->debug(
|
||||
$log->debug(
|
||||
$debug_msg['level'],
|
||||
$debug_msg['string'],
|
||||
$debug_msg['strip'],
|
||||
@@ -779,7 +858,7 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
$expected_debug
|
||||
);
|
||||
// * if print check data in log file
|
||||
$log_file = $this->log->getLogFileName();
|
||||
$log_file = $log->getLogFileName();
|
||||
if (!empty($options['debug_all']) && !empty($options['print_all'])) {
|
||||
// file name matching
|
||||
$this->assertStringStartsWith(
|
||||
@@ -808,10 +887,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
);
|
||||
}
|
||||
// ** ECHO ON
|
||||
$log_string = $this->log->printErrorMsg();
|
||||
$log_string = $log->printErrorMsg();
|
||||
// * print
|
||||
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
|
||||
// print $this->log->printErrorMsg() . "\n";
|
||||
// print $log->printErrorMsg() . "\n";
|
||||
// echo string must start with
|
||||
$this->assertStringStartsWith(
|
||||
$expected_string_start,
|
||||
@@ -835,6 +914,77 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: setLogUniqueId/getLogUniqueId
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function logUniqueIdProvider(): array
|
||||
{
|
||||
return [
|
||||
'option set' => [
|
||||
'option' => true,
|
||||
'override' => false,
|
||||
],
|
||||
'direct set' => [
|
||||
'option' => false,
|
||||
'override' => false,
|
||||
],
|
||||
'override set' => [
|
||||
'option' => false,
|
||||
'override' => true,
|
||||
],
|
||||
'option and override set' => [
|
||||
'option' => false,
|
||||
'override' => true,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::setLogUniqueId
|
||||
* @covers ::getLogUniqueId
|
||||
* @dataProvider logUniqueIdProvider
|
||||
* @testdox per run log id set test: option: $option, override: $override [$_dataName]
|
||||
*
|
||||
* @param bool $option
|
||||
* @param bool $override
|
||||
* @return void
|
||||
*/
|
||||
public function testLogUniqueId(bool $option, bool $override): void
|
||||
{
|
||||
if ($option === true) {
|
||||
$log = new \CoreLibs\Debug\Logging(['per_run' => $option]);
|
||||
} else {
|
||||
$log = new \CoreLibs\Debug\Logging();
|
||||
$log->setLogUniqueId();
|
||||
}
|
||||
$per_run_id = $log->getLogUniqueId();
|
||||
$this->assertMatchesRegularExpression(
|
||||
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||
$per_run_id,
|
||||
'assert per log run id 1st'
|
||||
);
|
||||
if ($override === true) {
|
||||
$log->setLogUniqueId(true);
|
||||
$per_run_id_2nd = $log->getLogUniqueId();
|
||||
$this->assertMatchesRegularExpression(
|
||||
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||
$per_run_id_2nd,
|
||||
'assert per log run id 2nd'
|
||||
);
|
||||
$this->assertNotEquals(
|
||||
$per_run_id,
|
||||
$per_run_id_2nd,
|
||||
'1st and 2nd don\'t match'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
|
||||
119
4dev/tests/CoreLibsDebugMemoryUsageTest.php
Normal file
119
4dev/tests/CoreLibsDebugMemoryUsageTest.php
Normal file
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use CoreLibs\Debug\MemoryUsage;
|
||||
|
||||
/**
|
||||
* Test class for Debug\MemoryUsage
|
||||
* @coversDefaultClass \CoreLibs\Debug\MemoryUsage
|
||||
* @testdox \CoreLibs\Debug\MemoryUsage method tests
|
||||
*/
|
||||
final class CoreLibsDebugMemoryUsageTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function memoryUsageProvider(): array
|
||||
{
|
||||
$regex_raw_off = '/^\[[\w\s_-]+\] Peak\/Curr\/Change: \d+(\.\d+)? ?\w{1,2}\/'
|
||||
. '\d+(\.\d+)? ?\w{1,2}\/'
|
||||
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \| '
|
||||
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \| '
|
||||
. 'Since Set: \d+(\.\d+)? ?\w{1,2}$/';
|
||||
$regex_raw_on = '/^\[[\w\s_-]+\] Peak\/Curr\/'
|
||||
// . 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2} \[\d+\]\/'
|
||||
. 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2}/'
|
||||
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||
. 'Since Set: \d+(\.\d+)? ?\w{1,2} \[\d+\]$/';
|
||||
$regex_array = [
|
||||
'prefix' => '/^[\w\s_-]+$/',
|
||||
'peak' => '/^\d+$/',
|
||||
'usage' => '/^\d+$/',
|
||||
'start' => '/^\d+$/',
|
||||
'last' => '/^\d+$/',
|
||||
'set' => '/^\d+$/',
|
||||
];
|
||||
// 0: prefix
|
||||
// 1: raw flag
|
||||
// 2: set flags array
|
||||
// 3: array output expected (as regex)
|
||||
// 4: string output expected (as regex)
|
||||
return [
|
||||
'test normal' => [
|
||||
'test',
|
||||
null,
|
||||
[],
|
||||
$regex_array,
|
||||
$regex_raw_off,
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @cover ::resetMemory
|
||||
* @cover ::debugMemoryFlag
|
||||
* @cover ::setStartMemory
|
||||
* @cover ::setMemory
|
||||
* @cover ::memoryUsage
|
||||
* @cover ::printMemoryUsage
|
||||
* @dataProvider memoryUsageProvider
|
||||
* @testdox memoryUsage with $prefix, raw memory $raw [$_dataName]
|
||||
*
|
||||
* @param string $prefix
|
||||
* @param bool|null $raw
|
||||
* @param array $set_flags
|
||||
* @param array $expected_array
|
||||
* @param string $expected_string
|
||||
* @return void
|
||||
*/
|
||||
public function testMemoryUsage(
|
||||
string $prefix,
|
||||
?bool $raw,
|
||||
array $settings,
|
||||
array $expected_array,
|
||||
string $expected_string
|
||||
): void {
|
||||
// always reeset to null
|
||||
MemoryUsage::resetMemory();
|
||||
MemoryUsage::debugMemoryFlag(true);
|
||||
MemoryUsage::setStartMemory();
|
||||
MemoryUsage::setMemory();
|
||||
// run collector
|
||||
$memory = MemoryUsage::memoryUsage($prefix);
|
||||
if ($raw === null) {
|
||||
$string = MemoryUsage::printMemoryUsage($memory);
|
||||
} else {
|
||||
$string = MemoryUsage::printMemoryUsage($memory, $raw);
|
||||
}
|
||||
|
||||
// expected_array for each
|
||||
foreach ($expected_array as $name => $regex) {
|
||||
$this->assertMatchesRegularExpression(
|
||||
$regex,
|
||||
(string)$memory[$name],
|
||||
'assert memory usage array ' . $name
|
||||
);
|
||||
}
|
||||
|
||||
// regex match string
|
||||
$this->assertMatchesRegularExpression(
|
||||
$expected_string,
|
||||
$string,
|
||||
'assert memory usage string as regex'
|
||||
);
|
||||
|
||||
// TODO additional tests with use more memory and check diff matching
|
||||
// TODO reset memory usage test
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
@@ -15,6 +15,8 @@ final class CoreLibsDebugRunningTimeTest extends TestCase
|
||||
{
|
||||
public function hrRunningTimeProvider(): array
|
||||
{
|
||||
// 0: return time difference
|
||||
// 1: return time on first run in regex
|
||||
return [
|
||||
'default time' => [
|
||||
0 => null,
|
||||
@@ -69,21 +71,73 @@ final class CoreLibsDebugRunningTimeTest extends TestCase
|
||||
*/
|
||||
public function testHrRunningTime(?string $out_time, string $expected): void
|
||||
{
|
||||
// reset for each run
|
||||
\CoreLibs\Debug\RunningTime::hrRunningTimeReset();
|
||||
$start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||
$this->assertEquals(
|
||||
0,
|
||||
$start
|
||||
$start,
|
||||
'assert first run 0'
|
||||
);
|
||||
time_nanosleep(1, 500);
|
||||
if ($out_time === null) {
|
||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||
$second = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||
} else {
|
||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
||||
$second = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
||||
}
|
||||
// print "E: " . $end . "\n";
|
||||
$this->assertMatchesRegularExpression(
|
||||
$expected,
|
||||
(string)$end
|
||||
(string)$second,
|
||||
'assert second run regex'
|
||||
);
|
||||
if ($out_time === null) {
|
||||
$end_second = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart();
|
||||
} else {
|
||||
$end_second = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart($out_time);
|
||||
}
|
||||
$this->assertEquals(
|
||||
$end_second,
|
||||
$second,
|
||||
'assert end is equal second'
|
||||
);
|
||||
// sleep again, second messurement
|
||||
time_nanosleep(1, 500);
|
||||
if ($out_time === null) {
|
||||
$third = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||
} else {
|
||||
$third = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
||||
}
|
||||
// third call is not null
|
||||
$this->assertNotEquals(
|
||||
0,
|
||||
$third,
|
||||
'assert third call not null'
|
||||
);
|
||||
// third call is bigger than end
|
||||
$this->assertNotEquals(
|
||||
$second,
|
||||
$third,
|
||||
'assert third different second'
|
||||
);
|
||||
// last messurement, must match start - end + last
|
||||
if ($out_time === null) {
|
||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart();
|
||||
} else {
|
||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart($out_time);
|
||||
}
|
||||
$this->assertGreaterThan(
|
||||
$third,
|
||||
$end,
|
||||
'assert end greater third'
|
||||
);
|
||||
// new start
|
||||
\CoreLibs\Debug\RunningTime::hrRunningTimeReset();
|
||||
$new_start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||
$this->assertEquals(
|
||||
0,
|
||||
$new_start,
|
||||
'assert new run 0'
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function printArProvider(): array
|
||||
public function printArrayProvider(): array
|
||||
{
|
||||
return [
|
||||
'empty array' => [
|
||||
@@ -62,6 +62,51 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function printBoolProvider(): array
|
||||
{
|
||||
return [
|
||||
'true input default' => [
|
||||
0 => true,
|
||||
1 => [],
|
||||
2 => 'true'
|
||||
],
|
||||
'false input default' => [
|
||||
0 => false,
|
||||
1 => [],
|
||||
2 => 'false'
|
||||
],
|
||||
'false input param name' => [
|
||||
0 => false,
|
||||
1 => [
|
||||
'name' => 'param test'
|
||||
],
|
||||
2 => '<b>param test</b>: false'
|
||||
],
|
||||
'true input param name, true override' => [
|
||||
0 => true,
|
||||
1 => [
|
||||
'name' => 'param test',
|
||||
'true' => 'ok'
|
||||
],
|
||||
2 => '<b>param test</b>: ok'
|
||||
],
|
||||
'false input param name, true override, false override' => [
|
||||
0 => false,
|
||||
1 => [
|
||||
'name' => 'param test',
|
||||
'true' => 'ok',
|
||||
'false' => 'not',
|
||||
],
|
||||
2 => '<b>param test</b>: not'
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -75,6 +120,16 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
null,
|
||||
'a string',
|
||||
],
|
||||
'string with html chars, encode' => [
|
||||
'a string with <> &',
|
||||
true,
|
||||
'a string with <> &',
|
||||
],
|
||||
'string with html chars' => [
|
||||
'a string with <> &',
|
||||
null,
|
||||
'a string with <> &',
|
||||
],
|
||||
'a number' => [
|
||||
1234,
|
||||
null,
|
||||
@@ -135,22 +190,41 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
*/
|
||||
public function debugStringProvider(): array
|
||||
{
|
||||
// 0: input string
|
||||
// 1: replace
|
||||
// 2: html flag
|
||||
// 3: expected
|
||||
return [
|
||||
'null string, default' => [
|
||||
0 => null,
|
||||
1 => null,
|
||||
2 => '-'
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
'-'
|
||||
],
|
||||
'empty string, ... replace' => [
|
||||
0 => '',
|
||||
1 => '...',
|
||||
2 => '...'
|
||||
'',
|
||||
'...',
|
||||
null,
|
||||
'...'
|
||||
],
|
||||
'filled string' => [
|
||||
0 => 'some string',
|
||||
1 => null,
|
||||
2 => 'some string'
|
||||
]
|
||||
'some string',
|
||||
null,
|
||||
null,
|
||||
'some string'
|
||||
],
|
||||
'string with html chars, encode' => [
|
||||
'a string with <> &',
|
||||
'-',
|
||||
true,
|
||||
'a string with <> &',
|
||||
],
|
||||
'string with html chars' => [
|
||||
'a string with <> &',
|
||||
'-',
|
||||
null,
|
||||
'a string with <> &',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -184,8 +258,9 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
* Undocumented function
|
||||
*
|
||||
* @cover ::printAr
|
||||
* @dataProvider printArProvider
|
||||
* @testdox printAr $input will be $expected [$_dataName]
|
||||
* @cover ::printArray
|
||||
* @dataProvider printArrayProvider
|
||||
* @testdox printAr/printArray $input will be $expected [$_dataName]
|
||||
*
|
||||
* @param array $input
|
||||
* @param string $expected
|
||||
@@ -195,7 +270,59 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
{
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Debug\Support::printAr($input)
|
||||
\CoreLibs\Debug\Support::printAr($input),
|
||||
'assert printAr'
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Debug\Support::printArray($input),
|
||||
'assert printArray'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @cover ::printBool
|
||||
* @dataProvider printBoolProvider
|
||||
* @testdox printBool $input will be $expected [$_dataName]
|
||||
*
|
||||
* @param bool $input
|
||||
* @param array $params
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testPrintBool(bool $input, array $params, string $expected): void
|
||||
{
|
||||
if (
|
||||
isset($params['name']) &&
|
||||
isset($params['true']) &&
|
||||
isset($params['false'])
|
||||
) {
|
||||
$string = \CoreLibs\Debug\Support::printBool(
|
||||
$input,
|
||||
$params['name'],
|
||||
$params['true'],
|
||||
$params['false']
|
||||
);
|
||||
} elseif (isset($params['name']) && isset($params['true'])) {
|
||||
$string = \CoreLibs\Debug\Support::printBool(
|
||||
$input,
|
||||
$params['name'],
|
||||
$params['true']
|
||||
);
|
||||
} elseif (isset($params['name'])) {
|
||||
$string = \CoreLibs\Debug\Support::printBool(
|
||||
$input,
|
||||
$params['name']
|
||||
);
|
||||
} else {
|
||||
$string = \CoreLibs\Debug\Support::printBool($input);
|
||||
}
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$string,
|
||||
'assert printBool'
|
||||
);
|
||||
}
|
||||
|
||||
@@ -268,12 +395,14 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
if (count($compare) == 10) {
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Debug\Support::getCallerMethodList()
|
||||
\CoreLibs\Debug\Support::getCallerMethodList(),
|
||||
'assert expected 10'
|
||||
);
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
$expected_group,
|
||||
\CoreLibs\Debug\Support::getCallerMethodList()
|
||||
\CoreLibs\Debug\Support::getCallerMethodList(),
|
||||
'assert expected group'
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -300,24 +429,33 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
*
|
||||
* @cover ::debugString
|
||||
* @dataProvider debugStringProvider
|
||||
* @testdox debugString $input with replace $replace will be $expected [$_dataName]
|
||||
* @testdox debugString $input with replace $replace and html $flag will be $expected [$_dataName]
|
||||
*
|
||||
* @param string|null $input
|
||||
* @param string|null $replace
|
||||
* @param string $expected
|
||||
* @param bool|null $flag
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testDebugString(?string $input, ?string $replace, string $expected)
|
||||
public function testDebugString(?string $input, ?string $replace, ?bool $flag, string $expected): void
|
||||
{
|
||||
if ($replace === null) {
|
||||
if ($replace === null && $flag === null) {
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Debug\Support::debugString($input)
|
||||
\CoreLibs\Debug\Support::debugString($input),
|
||||
'assert all default'
|
||||
);
|
||||
} elseif ($flag === null) {
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Debug\Support::debugString($input, $replace),
|
||||
'assert flag default'
|
||||
);
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Debug\Support::debugString($input, $replace)
|
||||
\CoreLibs\Debug\Support::debugString($input, $replace, $flag),
|
||||
'assert all set'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
162
4dev/tests/CoreLibsGetDotEnvTest.php
Normal file
162
4dev/tests/CoreLibsGetDotEnvTest.php
Normal file
@@ -0,0 +1,162 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use CoreLibs\Get\DotEnv;
|
||||
|
||||
/**
|
||||
* Test class for ACL\Login
|
||||
* @coversDefaultClass \CoreLibs\Get\DotEnv
|
||||
* @testdox \CoreLibs\Get\DotEnv method tests
|
||||
*/
|
||||
final class CoreLibsGetDotEnvTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function envFileProvider(): array
|
||||
{
|
||||
$dot_env_content = [
|
||||
'SOMETHING' => 'A',
|
||||
'OTHER' => 'B IS B',
|
||||
'Complex' => 'A B \"D is F',
|
||||
'HAS_SPACE' => 'ABC',
|
||||
'HAS_COMMENT_QUOTES_SPACE' => 'Comment at end with quotes and space',
|
||||
'HAS_COMMENT_QUOTES_NO_SPACE' => 'Comment at end with quotes no space',
|
||||
'HAS_COMMENT_NO_QUOTES_SPACE' => 'Comment at end no quotes and space',
|
||||
'HAS_COMMENT_NO_QUOTES_NO_SPACE' => 'Comment at end no quotes no space',
|
||||
'COMMENT_IN_TEXT_QUOTES' => 'Foo bar # comment in here',
|
||||
'FAILURE' => 'ABC',
|
||||
'SIMPLEBOX' => 'A B C',
|
||||
'TITLE' => '1',
|
||||
'FOO' => '1.2',
|
||||
'SOME.TEST' => 'Test Var',
|
||||
'SOME.LIVE' => 'Live Var',
|
||||
'A_TEST1' => 'foo',
|
||||
'A_TEST2' => '${TEST1:-bar}',
|
||||
'A_TEST3' => '${TEST4:-bar}',
|
||||
'A_TEST5' => 'null',
|
||||
'A_TEST6' => '${TEST5-bar}',
|
||||
'A_TEST7' => '${TEST6:-bar}',
|
||||
'B_TEST1' => 'foo',
|
||||
'B_TEST2' => '${TEST1:=bar}',
|
||||
'B_TEST3' => '${TEST4:=bar}',
|
||||
'B_TEST5' => 'null',
|
||||
'B_TEST6' => '${TEST5=bar}',
|
||||
'B_TEST7' => '${TEST6=bar}',
|
||||
'Test' => 'A',
|
||||
'TEST' => 'B',
|
||||
'LINE' => "ABC\nDEF",
|
||||
'OTHERLINE' => "ABC\nAF\"ASFASDF\nMORESHIT",
|
||||
'SUPERLINE' => '',
|
||||
'__FOO_BAR_1' => 'b',
|
||||
'__FOOFOO' => 'f ',
|
||||
123123 => 'number',
|
||||
'EMPTY' => '',
|
||||
];
|
||||
// 0: folder relative to test folder, if unset __DIR__
|
||||
// 1: file, if unset .env
|
||||
// 2: status to be returned
|
||||
// 3: _ENV file content to be set
|
||||
// 4: override chmod as octect in string
|
||||
return [
|
||||
'default' => [
|
||||
'folder' => null,
|
||||
'file' => null,
|
||||
'status' => 3,
|
||||
'content' => [],
|
||||
'chmod' => null,
|
||||
],
|
||||
'cannot open file' => [
|
||||
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||
'file' => 'cannot_read.env',
|
||||
'status' => 2,
|
||||
'content' => [],
|
||||
'chmod' => '000',
|
||||
],
|
||||
'empty file' => [
|
||||
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||
'file' => 'empty.env',
|
||||
'status' => 1,
|
||||
'content' => [],
|
||||
'chmod' => null,
|
||||
],
|
||||
'override all' => [
|
||||
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||
'file' => 'test.env',
|
||||
'status' => 0,
|
||||
'content' => $dot_env_content,
|
||||
'chmod' => null,
|
||||
],
|
||||
'override directory' => [
|
||||
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||
'file' => null,
|
||||
'status' => 0,
|
||||
'content' => $dot_env_content,
|
||||
'chmod' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* test read .env file
|
||||
*
|
||||
* @covers ::readEnvFile
|
||||
* @dataProvider envFileProvider
|
||||
* @testdox Read _ENV file from $folder / $file with expected status: $expected_status and chmod $chmod [$_dataName]
|
||||
*
|
||||
* @param string|null $folder
|
||||
* @param string|null $file
|
||||
* @param int $expected_status
|
||||
* @param array $expected_env
|
||||
* @param string|null $chmod
|
||||
* @return void
|
||||
*/
|
||||
public function testReadEnvFile(
|
||||
?string $folder,
|
||||
?string $file,
|
||||
int $expected_status,
|
||||
array $expected_env,
|
||||
?string $chmod
|
||||
): void {
|
||||
// if we have file + chmod set
|
||||
$old_chmod = null;
|
||||
if (
|
||||
is_file($folder . DIRECTORY_SEPARATOR . $file) &&
|
||||
!empty($chmod)
|
||||
) {
|
||||
// get the old permissions
|
||||
$old_chmod = fileperms($folder . DIRECTORY_SEPARATOR . $file);
|
||||
chmod($folder . DIRECTORY_SEPARATOR . $file, octdec($chmod));
|
||||
}
|
||||
if ($folder !== null && $file !== null) {
|
||||
$status = DotEnv::readEnvFile($folder, $file);
|
||||
} elseif ($folder !== null) {
|
||||
$status = DotEnv::readEnvFile($folder);
|
||||
} else {
|
||||
$status = DotEnv::readEnvFile();
|
||||
}
|
||||
$this->assertEquals(
|
||||
$status,
|
||||
$expected_status,
|
||||
'Assert returned status equal'
|
||||
);
|
||||
// now assert read data
|
||||
$this->assertEquals(
|
||||
$_ENV,
|
||||
$expected_env,
|
||||
'Assert _ENV correct'
|
||||
);
|
||||
// if we have file and chmod unset
|
||||
if ($old_chmod !== null) {
|
||||
chmod($folder . DIRECTORY_SEPARATOR . $file, $old_chmod);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputFormElementsTest extends TestCase
|
||||
*/
|
||||
public function testOutputFormElements()
|
||||
{
|
||||
$this->assertTrue(true, 'Output Form Elements Tests not implemented');
|
||||
// $this->assertTrue(true, 'Output Form Elements Tests not implemented');
|
||||
$this->markTestIncomplete(
|
||||
'Output\Form\Elements Tests have not yet been implemented'
|
||||
);
|
||||
|
||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputFormTokenTest extends TestCase
|
||||
*/
|
||||
public function testOutputFormToken()
|
||||
{
|
||||
$this->assertTrue(true, 'Output Form Token Tests not implemented');
|
||||
// $this->assertTrue(true, 'Output Form Token Tests not implemented');
|
||||
$this->markTestIncomplete(
|
||||
'Output\Form\Token Tests have not yet been implemented'
|
||||
);
|
||||
|
||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputImageTest extends TestCase
|
||||
*/
|
||||
public function testOutputImage()
|
||||
{
|
||||
$this->assertTrue(true, 'Output Image Tests not implemented');
|
||||
// $this->assertTrue(true, 'Output Image Tests not implemented');
|
||||
$this->markTestIncomplete(
|
||||
'Output\Image Tests have not yet been implemented'
|
||||
);
|
||||
|
||||
@@ -22,10 +22,10 @@ final class CoreLibsOutputProgressbarTest extends TestCase
|
||||
*/
|
||||
public function testOutputProgressbar()
|
||||
{
|
||||
/* $this->assertTrue(true, 'Output Progressbar Tests not implemented');
|
||||
$this->markTestIncomplete(
|
||||
'Output\Progressbar Tests have not yet been implemented'
|
||||
); */
|
||||
// $this->assertTrue(true, 'Output Progressbar Tests not implemented');
|
||||
// $this->markTestIncomplete(
|
||||
// 'Output\Progressbar Tests have not yet been implemented'
|
||||
// );
|
||||
$this->markTestSkipped('No implementation for Output\Progressbar at the moment');
|
||||
}
|
||||
}
|
||||
|
||||
1031
4dev/tests/database/CoreLibsACLLogin_database_create_data.sql
Normal file
1031
4dev/tests/database/CoreLibsACLLogin_database_create_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
1
4dev/tests/dotenv/.env
Symbolic link
1
4dev/tests/dotenv/.env
Symbolic link
@@ -0,0 +1 @@
|
||||
test.env
|
||||
0
4dev/tests/dotenv/cannot_read.env
Normal file
0
4dev/tests/dotenv/cannot_read.env
Normal file
0
4dev/tests/dotenv/empty.env
Normal file
0
4dev/tests/dotenv/empty.env
Normal file
49
4dev/tests/dotenv/test.env
Normal file
49
4dev/tests/dotenv/test.env
Normal file
@@ -0,0 +1,49 @@
|
||||
# enviroment file
|
||||
SOMETHING=A
|
||||
OTHER="B IS B"
|
||||
Complex="A B \"D is F"
|
||||
# COMMENT
|
||||
HAS_SPACE= "ABC";
|
||||
# COMMENT AT END
|
||||
HAS_COMMENT_QUOTES_SPACE="Comment at end with quotes and space" # Comment QE
|
||||
HAS_COMMENT_QUOTES_NO_SPACE="Comment at end with quotes no space"# Comment QES
|
||||
HAS_COMMENT_NO_QUOTES_SPACE=Comment at end no quotes and space # Comment NQE
|
||||
HAS_COMMENT_NO_QUOTES_NO_SPACE=Comment at end no quotes no space# Comment NQES
|
||||
COMMENT_IN_TEXT_QUOTES="Foo bar # comment in here"
|
||||
FAILURE = ABC
|
||||
SIMPLEBOX= A B C
|
||||
TITLE=1
|
||||
FOO=1.2
|
||||
SOME.TEST=Test Var
|
||||
SOME.LIVE=Live Var
|
||||
# VAR TESTS -
|
||||
A_TEST1 = foo
|
||||
A_TEST2 = ${TEST1:-bar} # TEST1 is set so the value of TEST2 = foo
|
||||
A_TEST3 = ${TEST4:-bar} # TEST4 is not set so the value of TEST3 = bar
|
||||
A_TEST5 = null
|
||||
A_TEST6 = ${TEST5-bar} # TEST5 is set but empty so the value of TEST6 = null
|
||||
A_TEST7 = ${TEST6:-bar} # TEST5 is set and empty so the value of TEST7 = bar
|
||||
# VAR TESTS =
|
||||
B_TEST1 = foo
|
||||
B_TEST2 = ${TEST1:=bar} # TEST1 is set so the value of TEST2 = foo
|
||||
B_TEST3 = ${TEST4:=bar} # TEST4 is not set so the value of TEST3 = bar and TEST4 = bar
|
||||
B_TEST5 = null
|
||||
B_TEST6 = ${TEST5=bar} # TEST5 is set but emtpy so the value of TEST6 = null
|
||||
B_TEST7 = ${TEST6=bar} # TEST5 is set and empty so the value of TEST7 = bar and TEST5 = bar
|
||||
# VAR TEST END
|
||||
Test="A"
|
||||
TEST="B"
|
||||
TEST="D"
|
||||
LINE="ABC
|
||||
DEF"
|
||||
OTHERLINE="ABC
|
||||
AF\"ASFASDF
|
||||
MORESHIT"
|
||||
SUPERLINE=
|
||||
"asfasfasf"
|
||||
__FOO_BAR_1 = b
|
||||
__FOOFOO = f
|
||||
123123=number
|
||||
EMPTY=
|
||||
= flase
|
||||
asfasdf
|
||||
144
www/admin/class_test.create_email.php
Normal file
144
www/admin/class_test.create_email.php
Normal file
@@ -0,0 +1,144 @@
|
||||
<?php // phpcs:ignore warning
|
||||
|
||||
/**
|
||||
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
// will be overwritten in config.master.php depending on location
|
||||
$DEBUG_ALL_OVERRIDE = true; // set to 1 to debug on live/remote server locations
|
||||
$DEBUG_ALL = true;
|
||||
$PRINT_ALL = true;
|
||||
$ECHO_ALL = true;
|
||||
$DB_DEBUG = true;
|
||||
|
||||
if ($DEBUG_ALL) {
|
||||
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||
}
|
||||
|
||||
ob_start();
|
||||
|
||||
// basic class test file
|
||||
define('USE_DATABASE', false);
|
||||
// sample config
|
||||
require 'config.php';
|
||||
// define log file id
|
||||
$LOG_FILE_ID = 'classTest-create_email';
|
||||
ob_end_flush();
|
||||
// override echo all from config.master.php
|
||||
$ECHO_ALL = true;
|
||||
|
||||
use CoreLibs\Create\Email;
|
||||
use CoreLibs\Convert\Html;
|
||||
|
||||
$log = new CoreLibs\Debug\Logging([
|
||||
'log_folder' => BASE . LOG,
|
||||
'file_id' => $LOG_FILE_ID,
|
||||
// add file date
|
||||
'print_file_date' => true,
|
||||
// set debug and print flags
|
||||
'debug_all' => $DEBUG_ALL,
|
||||
'echo_all' => $ECHO_ALL,
|
||||
'print_all' => $PRINT_ALL,
|
||||
]);
|
||||
|
||||
// define a list of from to color sets for conversion test
|
||||
|
||||
$PAGE_NAME = 'TEST CLASS: CREATE EMAIL';
|
||||
print "<!DOCTYPE html>";
|
||||
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||
print "<body>";
|
||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||
|
||||
$from_name = '日本語';
|
||||
$from_email = 'test@test.com';
|
||||
print "SET: $from_name / $from_email: "
|
||||
. Html::htmlent(Email::encodeEmailName($from_email, $from_name)) . "<br>";
|
||||
|
||||
$status = Email::sendEmail(
|
||||
'TEST',
|
||||
'BODY',
|
||||
'test@test.com',
|
||||
'Test Name',
|
||||
[
|
||||
[
|
||||
'name' => 'To 1',
|
||||
'email' => 'to1@test.com'
|
||||
],
|
||||
],
|
||||
[],
|
||||
'UTF-8',
|
||||
false,
|
||||
true,
|
||||
$log
|
||||
);
|
||||
print "SENDING A: " . $status . "<br>";
|
||||
$status = Email::sendEmail(
|
||||
'TEST {REPLACE}',
|
||||
'BODY {OTHER}',
|
||||
'test@test.com',
|
||||
'Test Name',
|
||||
[
|
||||
[
|
||||
'name' => 'To 1-A',
|
||||
'email' => 'to1-a@test.com'
|
||||
],
|
||||
[
|
||||
'name' => 'To 2-A',
|
||||
'email' => 'to2-a@test.com',
|
||||
'replace' => [
|
||||
'OTHER' => '--FOR 2 A other--'
|
||||
]
|
||||
],
|
||||
],
|
||||
[
|
||||
'REPLACE' => '**replaced**',
|
||||
'OTHER' => '**other**'
|
||||
],
|
||||
'UTF-8',
|
||||
false,
|
||||
true,
|
||||
$log
|
||||
);
|
||||
print "SENDING B: " . $status . "<br>";
|
||||
|
||||
$status = Email::sendEmail(
|
||||
'TEST',
|
||||
'BODY',
|
||||
'test@test.com',
|
||||
'Test Name',
|
||||
['a@a.com', 'b@b.com'],
|
||||
[],
|
||||
'UTF-8',
|
||||
false,
|
||||
true,
|
||||
$log
|
||||
);
|
||||
print "SENDING C: " . $status . "<br>";
|
||||
|
||||
// SUBJECT 日本語カタカナパ
|
||||
$status = Email::sendEmail(
|
||||
'TEST 日本語カタカナパカタカナバ',
|
||||
'BODY 日本語カタカナパカタカナバ',
|
||||
'test@test.com',
|
||||
'Test Name 日本語カタカナパ',
|
||||
[
|
||||
['email' => 'a@a.com', 'name' => 'a 日本語カタカナパカタカナバ'],
|
||||
['email' => 'b@b.com', 'name' => 'b 日本語プブガバケブプガバケ'],
|
||||
],
|
||||
[],
|
||||
'UTF-8',
|
||||
false,
|
||||
true,
|
||||
$log
|
||||
);
|
||||
print "SENDING D: " . $status . "<br>";
|
||||
|
||||
// error message
|
||||
print $log->printErrorMsg();
|
||||
|
||||
print "</body></html>";
|
||||
|
||||
// __END__
|
||||
140
www/admin/class_test.db.dbReturn.php
Normal file
140
www/admin/class_test.db.dbReturn.php
Normal file
@@ -0,0 +1,140 @@
|
||||
<?php // phpcs:ignore warning
|
||||
|
||||
/**
|
||||
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
// turn on all error reporting
|
||||
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||
|
||||
ob_start();
|
||||
|
||||
// basic class test file
|
||||
define('USE_DATABASE', true);
|
||||
// sample config
|
||||
require 'config.php';
|
||||
// override ECHO ALL FALSE
|
||||
$ECHO_ALL = true;
|
||||
// define log file id
|
||||
$LOG_FILE_ID = 'classTest-db';
|
||||
ob_end_flush();
|
||||
|
||||
use CoreLibs\Debug\Support;
|
||||
use CoreLibs\Debug\RunningTime;
|
||||
|
||||
$log = new CoreLibs\Debug\Logging([
|
||||
'log_folder' => BASE . LOG,
|
||||
'file_id' => $LOG_FILE_ID,
|
||||
// add file date
|
||||
'print_file_date' => true,
|
||||
// set debug and print flags
|
||||
'debug_all' => $DEBUG_ALL ?? false,
|
||||
'echo_all' => $ECHO_ALL ?? false,
|
||||
'print_all' => $PRINT_ALL ?? false,
|
||||
]);
|
||||
// db connection and attach logger
|
||||
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||
$db->log->debug('START', '=============================>');
|
||||
|
||||
$PAGE_NAME = 'TEST CLASS: DB dbReturn';
|
||||
print "<!DOCTYPE html>";
|
||||
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||
print "<body>";
|
||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||
print '<div><a href="class_test.db.php">Class Test DB</a></div>';
|
||||
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||
|
||||
print "LOGFILE NAME: " . $db->log->getSetting('log_file_name') . "<br>";
|
||||
print "LOGFILE ID: " . $db->log->getSetting('log_file_id') . "<br>";
|
||||
print "DBINFO: " . $db->dbInfo() . "<br>";
|
||||
|
||||
// DB client encoding
|
||||
print "DB client encoding: " . $db->dbGetEncoding() . "<br>";
|
||||
print "DB search path: " . $db->dbGetSchema() . "<br>";
|
||||
|
||||
// SELECT read tests with dbReturn and cache values
|
||||
print "<br>";
|
||||
print "<b>dbReturn CACHE tests</b><br>";
|
||||
// DATA has two rows for reading
|
||||
// delete and repare base data
|
||||
$db->dbExec("DELETE FROM test_db_return");
|
||||
$db->dbExec("INSERT INTO test_db_return (uid, data) VALUES ('A1', 'Test A'), ('B1', 'Test B')");
|
||||
// read query to use
|
||||
$q_db_ret = "SELECT * FROM test_db_return ORDER BY uid";
|
||||
|
||||
RunningTime::hrRunningTime();
|
||||
|
||||
$cache_flag = 'USE_CACHE (0)';
|
||||
print "dbReturn '" . $cache_flag . "'/Default: " . $q_db_ret . "<br>";
|
||||
// SINGLE read on multi row return
|
||||
// Do twice
|
||||
for ($i = 1; $i <= 6; $i++) {
|
||||
$res = $db->dbReturn($q_db_ret);
|
||||
print $i . ") " . $cache_flag . ": "
|
||||
. "res: " . (is_bool($res) ?
|
||||
"<b>Bool:</b> " . $db->log->prBl($res) :
|
||||
(is_array($res) ?
|
||||
"Array: " . $db->log->prBl(is_array($res)) : '{-}')
|
||||
) . ", "
|
||||
. "cursor_ext: <pre>" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "</pre>";
|
||||
print "Run time: " . RunningTime::hrRunningTime() . "<br>";
|
||||
}
|
||||
// reset all read data
|
||||
$db->dbCacheReset($q_db_ret);
|
||||
echo "<hr>";
|
||||
$cache_flag = 'READ_NEW (1)';
|
||||
print "dbReturn '" . $cache_flag . "': " . $q_db_ret . "<br>";
|
||||
// NO CACHE
|
||||
for ($i = 1; $i <= 6; $i++) {
|
||||
$res = $db->dbReturn($q_db_ret, $db::READ_NEW);
|
||||
print $i . ") " . $cache_flag . ": "
|
||||
. "res: " . (is_bool($res) ?
|
||||
"<b>Bool:</b> " . $db->log->prBl($res) :
|
||||
(is_array($res) ?
|
||||
"Array: " . $db->log->prBl(is_array($res)) : '{-}')
|
||||
) . ", "
|
||||
. "cursor_ext: <pre>" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "</pre>";
|
||||
print "Run time: " . RunningTime::hrRunningTime() . "<br>";
|
||||
}
|
||||
// reset all read data
|
||||
$db->dbCacheReset($q_db_ret);
|
||||
echo "<hr>";
|
||||
$cache_flag = 'CLEAR_CACHE (2)';
|
||||
print "dbReturn '" . $cache_flag . "': " . $q_db_ret . "<br>";
|
||||
// NO CACHE
|
||||
for ($i = 1; $i <= 6; $i++) {
|
||||
$res = $db->dbReturn($q_db_ret, $db::CLEAR_CACHE);
|
||||
print $i . ") " . $cache_flag . ": "
|
||||
. "res: " . (is_bool($res) ?
|
||||
"<b>Bool:</b> " . $db->log->prBl($res) :
|
||||
(is_array($res) ?
|
||||
"Array: " . $db->log->prBl(is_array($res)) : '{-}')
|
||||
) . ", "
|
||||
. "cursor_ext: <pre>" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "</pre>";
|
||||
print "Run time: " . RunningTime::hrRunningTime() . "<br>";
|
||||
}
|
||||
// reset all read data
|
||||
$db->dbCacheReset($q_db_ret);
|
||||
echo "<hr>";
|
||||
$cache_flag = 'NO_CACHE (3)';
|
||||
print "dbReturn '" . $cache_flag . "': " . $q_db_ret . "<br>";
|
||||
// NO CACHE
|
||||
for ($i = 1; $i <= 6; $i++) {
|
||||
$res = $db->dbReturn($q_db_ret, $db::NO_CACHE);
|
||||
print $i . ") " . $cache_flag . ": "
|
||||
. "res: " . (is_bool($res) ?
|
||||
"<b>Bool:</b> " . $db->log->prBl($res) :
|
||||
(is_array($res) ?
|
||||
"Array: " . $db->log->prBl(is_array($res)) : '{-}')
|
||||
) . ", "
|
||||
. "cursor_ext: <pre>" . Support::printAr($db->dbGetCursorExt($q_db_ret)) . "</pre>";
|
||||
print "Run time: " . RunningTime::hrRunningTime() . "<br>";
|
||||
}
|
||||
// reset all data
|
||||
$db->dbCacheReset($q_db_ret);
|
||||
print "<br>";
|
||||
print "Overall Run time: " . RunningTime::hrRunningTimeFromStart() . "<br>";
|
||||
|
||||
// __END__
|
||||
@@ -44,6 +44,7 @@ print "<!DOCTYPE html>";
|
||||
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||
print "<body>";
|
||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||
print '<div><a href="class_test.db.dbReturn.php">Class Test DB dbReturn</a></div>';
|
||||
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||
|
||||
print "LOGFILE NAME: " . $db->log->getSetting('log_file_name') . "<br>";
|
||||
@@ -72,6 +73,8 @@ $db->dbSetEncoding('SJIS');
|
||||
print "ENCODING TEST: " . $db->dbVersionInfo('client_encoding') . "/" . $db->dbGetEncoding() . "<br>";
|
||||
$db->dbResetEncoding();
|
||||
|
||||
// TEST CACHE READS
|
||||
|
||||
$res = $db->dbReturn("SELECT * FROM max_test");
|
||||
print "DB RETURN ROWS: " . $db->dbGetNumRows() . "<br>";
|
||||
|
||||
@@ -97,6 +100,12 @@ print "NO CACHED DATA: <pre>" . print_r($db->dbGetCursorExt(), true) . "</pre><b
|
||||
// print "UUD/TIME: " . $res['uid'] . "/" . $res['time'] . "<br>";
|
||||
// }
|
||||
|
||||
// dbReturn tests on separate page
|
||||
print "<br>";
|
||||
print "<b>dbReturn CACHE tests</b><br>";
|
||||
print '<a href="class_test.db.dbReturn.php">Class Test DB dbReturn</a><br>';
|
||||
print "<br>";
|
||||
|
||||
print "<pre>";
|
||||
|
||||
print "SOCKET: " . pg_socket($db->dbGetDbh()) . "<br>";
|
||||
@@ -182,7 +191,6 @@ print "UPDATE WITH PK " . $last_insert_pk
|
||||
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
|
||||
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
|
||||
|
||||
|
||||
// INSERT WITH NO RETURNING
|
||||
$status = $db->dbExec("INSERT INTO test_foobar (type, integer) VALUES ('WITHOUT DATA', 456)");
|
||||
print "INSERT WITH NO PRIMARY KEY NO RETURNING STATUS: " . Support::printToString($status) . " |<br>"
|
||||
@@ -222,7 +230,6 @@ if (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# db write class test
|
||||
$table = 'test_foo';
|
||||
print "TABLE META DATA: " . DgS::printAr($db->dbShowTableMetaData($table)) . "<br>";
|
||||
|
||||
@@ -66,7 +66,12 @@ print "S::GETCALLERMETHOD: " . test() . "<br>";
|
||||
print "S::GETCALLERMETHODLIST: <pre>" . print_r(test2(), true) . "</pre><br>";
|
||||
print "S::PRINTAR: " . DebugSupport::printAr(['Foo', 'Bar']) . "<br>";
|
||||
print "V-S::PRINTAR: " . $debug_support_class::printAr(['Foo', 'Bar']) . "<br>";
|
||||
print "S::PRINTBOOL(default): " . DebugSupport::printBool(true) . "<br>";
|
||||
print "S::PRINTBOOL(name): " . DebugSupport::printBool(true, 'Name') . "<br>";
|
||||
print "S::PRINTBOOL(name, ok): " . DebugSupport::printBool(true, 'Name', 'ok') . "<br>";
|
||||
print "S::PRINTBOOL(name, ok, not): " . DebugSupport::printBool(false, 'Name', 'ok', 'not') . "<br>";
|
||||
print "S::DEBUSTRING(s): " . DebugSupport::debugString('SET') . "<br>";
|
||||
print "S::DEBUSTRING(s>): " . DebugSupport::debugString('<SET>') . "<br>";
|
||||
print "S::DEBUSTRING(''): " . DebugSupport::debugString('') . "<br>";
|
||||
print "S::DEBUSTRING(,s): " . DebugSupport::debugString(null, '{-}') . "<br>";
|
||||
|
||||
@@ -181,6 +186,10 @@ $debug->debug('TEST PER LEVEL', 'Per level test');
|
||||
$debug->debug('()', 'Per level test: invalid chars');
|
||||
$debug->setLogPer('level', false);
|
||||
|
||||
$ar = ['A', 1, ['B' => 'D']];
|
||||
$debug->debug('ARRAY', 'Array: ' . $debug->prAr($ar));
|
||||
$debug->debug('BOOL', 'True: ' . $debug->prBl(true) . ', False: ' . $debug->prBl(false));
|
||||
|
||||
// error message
|
||||
// future DEPRECATED
|
||||
// $debug->debug('BASIC CLASS', 'Debug test');
|
||||
|
||||
91
www/admin/class_test.memoryusage.php
Normal file
91
www/admin/class_test.memoryusage.php
Normal file
@@ -0,0 +1,91 @@
|
||||
<?php // phpcs:ignore warning
|
||||
|
||||
/**
|
||||
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||
$DEBUG_ALL = 1;
|
||||
$PRINT_ALL = 1;
|
||||
$DB_DEBUG = 1;
|
||||
|
||||
if ($DEBUG_ALL) {
|
||||
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||
}
|
||||
|
||||
ob_start();
|
||||
|
||||
// basic class test file
|
||||
define('USE_DATABASE', false);
|
||||
// sample config
|
||||
require 'config.php';
|
||||
// define log file id
|
||||
$LOG_FILE_ID = 'classTest-memoryusage';
|
||||
ob_end_flush();
|
||||
|
||||
use CoreLibs\Debug\MemoryUsage;
|
||||
use CoreLibs\Debug\Support;
|
||||
|
||||
$log = new CoreLibs\Debug\Logging([
|
||||
'log_folder' => BASE . LOG,
|
||||
'file_id' => $LOG_FILE_ID,
|
||||
// add file date
|
||||
'print_file_date' => true,
|
||||
// set debug and print flags
|
||||
'debug_all' => $DEBUG_ALL ?? false,
|
||||
'echo_all' => $ECHO_ALL ?? false,
|
||||
'print_all' => $PRINT_ALL ?? false,
|
||||
]);
|
||||
|
||||
$PAGE_NAME = 'TEST CLASS: MEMORY USAGE';
|
||||
print "<!DOCTYPE html>";
|
||||
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||
print "<body>";
|
||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||
|
||||
MemoryUsage::debugMemoryFlag(true);
|
||||
print "Debug Flag: " . Support::printBool(MemoryUsage::debugMemoryFlag()) . "<br>";
|
||||
MemoryUsage::setStartMemory();
|
||||
MemoryUsage::setMemory();
|
||||
$data = MemoryUsage::memoryUsage('first run');
|
||||
print "Memory usage 1 array: " . Support::printAr($data) . "<br>";
|
||||
print "Memory usage 1 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||
print "Memory usage 1 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||
$var = 'foo';
|
||||
$out = '';
|
||||
for ($i = 1; $i <= 100; $i++) {
|
||||
$out .= $var;
|
||||
}
|
||||
$data = MemoryUsage::memoryUsage('second run');
|
||||
print "Memory usage 2 array: " . Support::printAr($data) . "<br>";
|
||||
print "Memory usage 2 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||
print "Memory usage 2 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||
MemoryUsage::setMemory();
|
||||
$var = 'foasdfasdfasdfasdfasdfo';
|
||||
$out = '';
|
||||
for ($i = 1; $i <= 10000; $i++) {
|
||||
$out .= $var;
|
||||
}
|
||||
$data = MemoryUsage::memoryUsage('third run');
|
||||
print "Memory usage 3 array: " . Support::printAr($data) . "<br>";
|
||||
print "Memory usage 3 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||
print "Memory usage 3 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||
$var = 'foasdfasdfasdasdfasdfasdfadfadfasdfasdfo';
|
||||
$out = '';
|
||||
for ($i = 1; $i <= 100000; $i++) {
|
||||
$out .= $var;
|
||||
}
|
||||
$data = MemoryUsage::memoryUsage('forth run');
|
||||
print "Memory usage 4 array: " . Support::printAr($data) . "<br>";
|
||||
print "Memory usage 4 string: " . MemoryUsage::printMemoryUsage($data) . "<br>";
|
||||
print "Memory usage 4 string raw: " . MemoryUsage::printMemoryUsage($data, true) . "<br>";
|
||||
|
||||
// error message
|
||||
print $log->printErrorMsg();
|
||||
|
||||
print "</body></html>";
|
||||
|
||||
// __END__
|
||||
@@ -54,6 +54,7 @@ print "<html><head><title>TEST CLASS</title><head>";
|
||||
print "<body>";
|
||||
|
||||
print '<div><a href="class_test.db.php">Class Test: DB</a></div>';
|
||||
print '<div><a href="class_test.db.DbReturn.php">Class Test: DB dbReturn</a></div>';
|
||||
print '<div><a href="class_test.colors.php">Class Test: COLORS</a></div>';
|
||||
print '<div><a href="class_test.mime.php">Class Test: MIME</a></div>';
|
||||
print '<div><a href="class_test.json.php">Class Test: JSON</a></div>';
|
||||
@@ -62,6 +63,7 @@ print '<div><a href="class_test.password.php">Class Test: PASSWORD</a></div>';
|
||||
print '<div><a href="class_test.math.php">Class Test: MATH</a></div>';
|
||||
print '<div><a href="class_test.html.php">Class Test: HTML/ELEMENTS</a></div>';
|
||||
print '<div><a href="class_test.email.php">Class Test: EMAIL</a></div>';
|
||||
print '<div><a href="class_test.create_email.php">Class Test: CREATE EMAIL</a></div>';
|
||||
print '<div><a href="class_test.uids.php">Class Test: UIDS</a></div>';
|
||||
print '<div><a href="class_test.phpv.php">Class Test: PHP VERSION</a></div>';
|
||||
print '<div><a href="class_test.hash.php">Class Test: HASH</a></div>';
|
||||
@@ -75,6 +77,7 @@ print '<div><a href="class_test.randomkey.php">Class Test: RANDOM KEY</a></div>'
|
||||
print '<div><a href="class_test.system.php">Class Test: SYSTEM</a></div>';
|
||||
print '<div><a href="class_test.readenvfile.php">Class Test: READ ENV FILE</a></div>';
|
||||
print '<div><a href="class_test.runningtime.php">Class Test: RUNNING TIME</a></div>';
|
||||
print '<div><a href="class_test.memoryusage.php">Class Test: MEMORY USAGE</a></div>';
|
||||
print '<div><a href="class_test.debug.php">Class Test: DEBUG</a></div>';
|
||||
print '<div><a href="class_test.output.form.php">Class Test: OUTPUT FORM</a></div>';
|
||||
print '<div><a href="class_test.admin.backend.php">Class Test: BACKEND ADMIN CLASS</a></div>';
|
||||
@@ -94,13 +97,13 @@ print "<div>READ _ENV ARRAY:</div>";
|
||||
print CoreLibs\Debug\Support::printAr(array_map('htmlentities', $_ENV));
|
||||
// set + check edit access id
|
||||
$edit_access_id = 3;
|
||||
if (is_object($login) && isset($login->acl['unit'])) {
|
||||
print "ACL UNIT: " . print_r(array_keys($login->acl['unit']), true) . "<br>";
|
||||
if (is_object($login) && isset($login->loginGetAcl()['unit'])) {
|
||||
print "ACL UNIT: " . print_r(array_keys($login->loginGetAcl()['unit']), true) . "<br>";
|
||||
print "ACCESS CHECK: " . (string)$login->loginCheckEditAccess($edit_access_id) . "<br>";
|
||||
if ($login->loginCheckEditAccess($edit_access_id)) {
|
||||
$backend->edit_access_id = $edit_access_id;
|
||||
} else {
|
||||
$backend->edit_access_id = $login->acl['unit_id'];
|
||||
$backend->edit_access_id = $login->loginGetAcl()['unit_id'];
|
||||
}
|
||||
} else {
|
||||
print "Something went wrong with the login<br>";
|
||||
@@ -131,8 +134,8 @@ $log->debug('SOME MARK', 'Some error output');
|
||||
// INTERNAL SET
|
||||
print "EDIT ACCESS ID: " . $backend->edit_access_id . "<br>";
|
||||
if (is_object($login)) {
|
||||
// print "ACL: <br>".$backend->print_ar($login->acl)."<br>";
|
||||
$log->debug('ACL', "ACL: " . \CoreLibs\Debug\Support::printAr($login->acl));
|
||||
// print "ACL: <br>".$backend->print_ar($login->loginGetAcl())."<br>";
|
||||
$log->debug('ACL', "ACL: " . \CoreLibs\Debug\Support::printAr($login->loginGetAcl()));
|
||||
// print "DEFAULT ACL: <br>".$backend->print_ar($login->default_acl_list)."<br>";
|
||||
// print "DEFAULT ACL: <br>".$backend->print_ar($login->default_acl_list)."<br>";
|
||||
// $result = array_flip(
|
||||
@@ -147,7 +150,7 @@ if (is_object($login)) {
|
||||
// );
|
||||
// print "DEFAULT ACL: <br>".$backend->print_ar($result)."<br>";
|
||||
// DEPRICATED CALL
|
||||
// $backend->adbSetACL($login->acl);
|
||||
// $backend->adbSetACL($login->loginGetAcl());
|
||||
}
|
||||
|
||||
print "THIS HOST: " . HOST_NAME . ", with PROTOCOL: " . HOST_PROTOCOL . " is running SSL: " . HOST_SSL . "<br>";
|
||||
|
||||
@@ -40,6 +40,9 @@ print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||
print "ALREADY from config.php: " . \CoreLibs\Debug\Support::printAr($_ENV) . "<br>";
|
||||
|
||||
// test .env in local
|
||||
$status = \CoreLibs\Get\DotEnv::readEnvFile('.', 'test.env');
|
||||
print "test.env: STATUS: " . $status . "<br>";
|
||||
print "AFTER reading test.env file: " . \CoreLibs\Debug\Support::printAr($_ENV) . "<br>";
|
||||
|
||||
// error message
|
||||
print $log->printErrorMsg();
|
||||
|
||||
@@ -52,8 +52,17 @@ echo "TIMED [hr]: " . RunningTime::hrRunningTime() . "<br>";
|
||||
echo "TIMED [def]: " . RunningTime::runningTime() . "<br>";
|
||||
echo "TIMED [string]: " . RunningTime::runningTimeString() . "<br>";
|
||||
RunningTime::hrRunningTime();
|
||||
echo "TIMED [hr-end] " . RunningTime::hrRunningTimeFromStart() . "<br>";
|
||||
echo "<br>";
|
||||
echo "RANDOM KEY [default]: " . \CoreLibs\Create\RandomKey::randomKeyGen() . "<br>";
|
||||
echo "TIMED [hr]: " . RunningTime::hrRunningTime() . "<br>";
|
||||
echo "TIMED 1 [hr]: " . RunningTime::hrRunningTime() . "<br>";
|
||||
echo "TIMED 1 [hr-n]: " . RunningTime::hrRunningTime() . "<br>";
|
||||
echo "TIMED 1 [hr-b]: " . RunningTime::hrRunningTime() . "<br>";
|
||||
echo "TIMED 1 [hr-end]: " . RunningTime::hrRunningTimeFromStart() . "<br>";
|
||||
RunningTime::hrRunningTimeReset();
|
||||
RunningTime::hrRunningTime();
|
||||
echo "TIMED 2 [hr]: " . RunningTime::hrRunningTime() . "<br>";
|
||||
echo "TIMED 2 [hr-end]: " . RunningTime::hrRunningTimeFromStart() . "<br>";
|
||||
|
||||
// error message
|
||||
print $log->printErrorMsg();
|
||||
|
||||
61
www/admin/edit_groups_test.php
Normal file
61
www/admin/edit_groups_test.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php // phpcs:ignore PSR1.Files.SideEffects
|
||||
|
||||
// this is an empty test page for login tests only
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
|
||||
$DEBUG_ALL = true;
|
||||
$PRINT_ALL = true;
|
||||
$DB_DEBUG = true;
|
||||
|
||||
if ($DEBUG_ALL) {
|
||||
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||
}
|
||||
|
||||
ob_start();
|
||||
|
||||
// basic class test file
|
||||
define('USE_DATABASE', true);
|
||||
// sample config
|
||||
require 'config.php';
|
||||
// define log file id
|
||||
$LOG_FILE_ID = 'classTest';
|
||||
$SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||
|
||||
// init login & backend class
|
||||
$session = new CoreLibs\Create\Session($SET_SESSION_NAME);
|
||||
$log = new CoreLibs\Debug\Logging([
|
||||
'log_folder' => BASE . LOG,
|
||||
'file_id' => $LOG_FILE_ID,
|
||||
// add file date
|
||||
'print_file_date' => true,
|
||||
// set debug and print flags
|
||||
'debug_all' => $DEBUG_ALL ?? false,
|
||||
'echo_all' => $ECHO_ALL ?? false,
|
||||
'print_all' => $PRINT_ALL ?? false,
|
||||
]);
|
||||
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||
$login = new CoreLibs\ACL\Login($db, $log, $session);
|
||||
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||
$l10n = new \CoreLibs\Language\L10n(
|
||||
$locale['locale'],
|
||||
$locale['domain'],
|
||||
$locale['path'],
|
||||
);
|
||||
|
||||
print "<!DOCTYPE html>";
|
||||
print "<html><head><title>GROUP TESTER</title><head>";
|
||||
print "<body>";
|
||||
|
||||
print '<form method="post" name="loginlogout">';
|
||||
print '<a href="javascript:document.loginlogout.login_logout.value=\'Logou\';'
|
||||
. 'document.loginlogout.submit();">Logout</a>';
|
||||
print '<input type="hidden" name="login_logout" value="">';
|
||||
print '</form>';
|
||||
|
||||
print "<h1>TEST Login</h1>";
|
||||
|
||||
print "</body></html>";
|
||||
|
||||
// __END__
|
||||
1
www/admin/test.env
Symbolic link
1
www/admin/test.env
Symbolic link
@@ -0,0 +1 @@
|
||||
../../4dev/tests/dotenv/test.env
|
||||
38
www/composer.lock
generated
38
www/composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "fb2235a66a37d89e7941a863843d2e15",
|
||||
"content-hash": "a71e6f4fbc06f0efb6ad34538b515c53",
|
||||
"packages": [],
|
||||
"packages-dev": [
|
||||
{
|
||||
@@ -415,16 +415,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/type-resolver",
|
||||
"version": "1.6.0",
|
||||
"version": "1.6.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpDocumentor/TypeResolver.git",
|
||||
"reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706"
|
||||
"reference": "77a32518733312af16a44300404e945338981de3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706",
|
||||
"reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
|
||||
"reference": "77a32518733312af16a44300404e945338981de3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -459,9 +459,9 @@
|
||||
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
|
||||
"support": {
|
||||
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
|
||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0"
|
||||
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
|
||||
},
|
||||
"time": "2022-01-04T19:58:01+00:00"
|
||||
"time": "2022-03-15T21:29:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpspec/prophecy",
|
||||
@@ -850,16 +850,16 @@
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "9.5.19",
|
||||
"version": "9.5.20",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807"
|
||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35ea4b7f3acabb26f4bb640f8c30866c401da807",
|
||||
"reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -937,7 +937,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.19"
|
||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -949,7 +949,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2022-03-15T09:57:31+00:00"
|
||||
"time": "2022-04-01T12:37:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/cli-parser",
|
||||
@@ -1317,16 +1317,16 @@
|
||||
},
|
||||
{
|
||||
"name": "sebastian/environment",
|
||||
"version": "5.1.3",
|
||||
"version": "5.1.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/environment.git",
|
||||
"reference": "388b6ced16caa751030f6a69e588299fa09200ac"
|
||||
"reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
|
||||
"reference": "388b6ced16caa751030f6a69e588299fa09200ac",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
|
||||
"reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -1368,7 +1368,7 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/sebastianbergmann/environment/issues",
|
||||
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
|
||||
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
@@ -1376,7 +1376,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-28T05:52:38+00:00"
|
||||
"time": "2022-04-03T09:37:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/exporter",
|
||||
|
||||
@@ -232,10 +232,16 @@ if (
|
||||
exit;
|
||||
}
|
||||
// set SSL on
|
||||
if (
|
||||
(array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
|
||||
$_SERVER['SERVER_PORT'] == 443
|
||||
$is_secure = false;
|
||||
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
|
||||
$is_secure = true;
|
||||
} elseif (
|
||||
!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ||
|
||||
!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on'
|
||||
) {
|
||||
$is_secure = true;
|
||||
}
|
||||
if ($is_secure) {
|
||||
define('HOST_SSL', true);
|
||||
define('HOST_PROTOCOL', 'https://');
|
||||
} else {
|
||||
|
||||
@@ -50,7 +50,7 @@ for (
|
||||
is_file($__DIR__PATH . $CONFIG_PATH_PREFIX . CONFIG_PATH . 'config.master.php')
|
||||
) {
|
||||
// load enviorment file if it exists
|
||||
\CoreLibs\Get\ReadEnvFile::readEnvFile(
|
||||
\CoreLibs\Get\DotEnv::readEnvFile(
|
||||
$__DIR__PATH . $CONFIG_PATH_PREFIX . CONFIG_PATH
|
||||
);
|
||||
// load master config file that loads all other config files
|
||||
|
||||
@@ -19,15 +19,17 @@ if (!empty($DEBUG_ALL) && !empty($ENABLE_ERROR_HANDLING)) {
|
||||
//------------------------------ library include start
|
||||
// set output to quiet for load of classes & session settings
|
||||
ob_start();
|
||||
// set the session name
|
||||
$SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||
$LOG_FILE_ID = BASE_NAME . 'Admin';
|
||||
//------------------------------ library include end
|
||||
|
||||
//------------------------------ basic variable settings start
|
||||
// set the session name
|
||||
$SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||
$LOG_FILE_ID = BASE_NAME . 'Admin';
|
||||
// ajax page flag
|
||||
if (!isset($AJAX_PAGE)) {
|
||||
$AJAX_PAGE = false;
|
||||
}
|
||||
// zip download flag
|
||||
if (!isset($ZIP_STREAM)) {
|
||||
$ZIP_STREAM = false;
|
||||
}
|
||||
@@ -48,7 +50,7 @@ if ($AJAX_PAGE && !$ZIP_STREAM) {
|
||||
// start session
|
||||
$session = new \CoreLibs\Create\Session($SET_SESSION_NAME);
|
||||
// create logger
|
||||
$log = new CoreLibs\Debug\Logging([
|
||||
$log = new \CoreLibs\Debug\Logging([
|
||||
'log_folder' => BASE . LOG,
|
||||
'file_id' => $LOG_FILE_ID,
|
||||
'print_file_date' => true,
|
||||
@@ -69,9 +71,9 @@ if (
|
||||
}
|
||||
}
|
||||
// db config with logger
|
||||
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||
$db = new \CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||
// login & page access check
|
||||
$login = new CoreLibs\ACL\Login($db, $log, $session);
|
||||
$login = new \CoreLibs\ACL\Login($db, $log, $session);
|
||||
// lang, path, domain
|
||||
// pre auto detect language after login
|
||||
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||
@@ -82,15 +84,15 @@ $l10n = new \CoreLibs\Language\L10n(
|
||||
$locale['path'],
|
||||
);
|
||||
// create smarty object
|
||||
$smarty = new CoreLibs\Template\SmartyExtend($l10n, $locale);
|
||||
$smarty = new \CoreLibs\Template\SmartyExtend($l10n, $locale);
|
||||
// create new Backend class with db and loger attached
|
||||
$cms = new CoreLibs\Admin\Backend($db, $log, $session, $l10n, $locale);
|
||||
$cms = new \CoreLibs\Admin\Backend($db, $log, $session, $l10n, $locale);
|
||||
// the menu show flag (what menu to show)
|
||||
$cms->menu_show_flag = 'main';
|
||||
// db info
|
||||
$cms->db->dbInfo();
|
||||
// set acl
|
||||
$cms->setACL($login->acl);
|
||||
$cms->setACL($login->loginGetAcl());
|
||||
// flush (can we move that to header block above)
|
||||
ob_end_flush();
|
||||
//------------------------------ class init end
|
||||
@@ -106,7 +108,7 @@ $data = [
|
||||
];
|
||||
// log action
|
||||
// no log if login
|
||||
if (!$login->login) {
|
||||
if (!$login->loginActionRun()) {
|
||||
$cms->adbEditLog('Submit', $data, 'BINARY');
|
||||
}
|
||||
//------------------------------ logging end
|
||||
|
||||
@@ -397,10 +397,18 @@ if ($form->my_page_name == 'edit_order') {
|
||||
$elements[] = $form->formCreateElement('login_error_date_last');
|
||||
$elements[] = $form->formCreateElement('login_error_date_first');
|
||||
$elements[] = $form->formCreateElement('enabled');
|
||||
$elements[] = $form->formCreateElement('deleted');
|
||||
$elements[] = $form->formCreateElement('protected');
|
||||
$elements[] = $form->formCreateElement('username');
|
||||
$elements[] = $form->formCreateElement('password');
|
||||
$elements[] = $form->formCreateElement('password_change_interval');
|
||||
$elements[] = $form->formCreateElement('login_user_id');
|
||||
$elements[] = $form->formCreateElement('login_user_id_set_date');
|
||||
$elements[] = $form->formCreateElement('login_user_id_last_revalidate');
|
||||
$elements[] = $form->formCreateElement('login_user_id_locked');
|
||||
$elements[] = $form->formCreateElement('login_user_id_revalidate_after');
|
||||
$elements[] = $form->formCreateElement('login_user_id_valid_from');
|
||||
$elements[] = $form->formCreateElement('login_user_id_valid_until');
|
||||
$elements[] = $form->formCreateElement('email');
|
||||
$elements[] = $form->formCreateElement('last_name');
|
||||
$elements[] = $form->formCreateElement('first_name');
|
||||
@@ -408,6 +416,8 @@ if ($form->my_page_name == 'edit_order') {
|
||||
$elements[] = $form->formCreateElement('edit_access_right_id');
|
||||
$elements[] = $form->formCreateElement('strict');
|
||||
$elements[] = $form->formCreateElement('locked');
|
||||
$elements[] = $form->formCreateElement('lock_until');
|
||||
$elements[] = $form->formCreateElement('lock_after');
|
||||
$elements[] = $form->formCreateElement('admin');
|
||||
$elements[] = $form->formCreateElement('debug');
|
||||
$elements[] = $form->formCreateElement('db_debug');
|
||||
|
||||
@@ -53,6 +53,16 @@ $edit_users = [
|
||||
'0' => 'No'
|
||||
],
|
||||
],
|
||||
'deleted' => [
|
||||
'value' => $GLOBALS['deleted'] ?? '',
|
||||
'output_name' => 'Deleted',
|
||||
'type' => 'binary',
|
||||
'int' => 1,
|
||||
'element_list' => [
|
||||
'1' => 'Yes',
|
||||
'0' => 'No'
|
||||
],
|
||||
],
|
||||
'strict' => [
|
||||
'value' => $GLOBALS['strict'] ?? '',
|
||||
'output_name' => 'Strict (Lock after errors)',
|
||||
@@ -119,6 +129,77 @@ $edit_users = [
|
||||
'output_name' => 'First Name',
|
||||
'type' => 'text'
|
||||
],
|
||||
'lock_until' => [
|
||||
'value' => $GLOBALS['lock_until'] ?? '',
|
||||
'output_name' => 'Lock account until',
|
||||
'type' => 'datetime',
|
||||
'error_check' => 'datetime',
|
||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||
'datetime' => 1,
|
||||
],
|
||||
'lock_after' => [
|
||||
'value' => $GLOBALS['lock_after'] ?? '',
|
||||
'output_name' => 'Lock account after',
|
||||
'type' => 'datetime',
|
||||
'error_check' => 'datetime',
|
||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||
'datetime' => 1,
|
||||
],
|
||||
'login_user_id' => [
|
||||
'value' => $GLOBALS['login_user_id'] ?? '',
|
||||
'output_name' => '_GET/_POST loginUserId direct login ID',
|
||||
'type' => 'text',
|
||||
'error_check' => 'unique|custom',
|
||||
'error_regex' => "/^[A-Za-z0-9]+$/",
|
||||
'emptynull' => 1,
|
||||
],
|
||||
'login_user_id_set_date' => [
|
||||
'output_name' => 'loginUserId set date',
|
||||
'value' => $GLOBALS['login_user_id_set_date'] ?? '',
|
||||
'type' => 'view',
|
||||
'empty' => '-'
|
||||
],
|
||||
'login_user_id_last_revalidate' => [
|
||||
'output_name' => 'loginUserId last revalidate date',
|
||||
'value' => $GLOBALS['login_user_id_last_revalidate'] ?? '',
|
||||
'type' => 'view',
|
||||
'empty' => '-'
|
||||
],
|
||||
'login_user_id_locked' => [
|
||||
'value' => $GLOBALS['login_user_id_locked'] ?? '',
|
||||
'output_name' => 'loginUserId usage locked',
|
||||
'type' => 'binary',
|
||||
'int' => 1,
|
||||
'element_list' => [
|
||||
'1' => 'Yes',
|
||||
'0' => 'No'
|
||||
],
|
||||
],
|
||||
'login_user_id_revalidate_after' => [
|
||||
'value' => $GLOBALS['login_user_id_revalidate_after'] ?? '',
|
||||
'output_name' => 'loginUserId, User must login after n days',
|
||||
'type' => 'text',
|
||||
'error_check' => 'intervalshort',
|
||||
'interval' => 1, // interval needs NULL write for empty
|
||||
'size' => 5, // make it 5 chars long
|
||||
'length' => 5
|
||||
],
|
||||
'login_user_id_valid_from' => [
|
||||
'value' => $GLOBALS['login_user_id_valid_from'] ?? '',
|
||||
'output_name' => 'loginUserId valid from',
|
||||
'type' => 'datetime',
|
||||
'error_check' => 'datetime',
|
||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||
'datetime' => 1,
|
||||
],
|
||||
'login_user_id_valid_until' => [
|
||||
'value' => $GLOBALS['login_user_id_valid_until'] ?? '',
|
||||
'output_name' => 'loginUserId valid until',
|
||||
'type' => 'datetime',
|
||||
'error_check' => 'datetime',
|
||||
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||
'datetime' => 1,
|
||||
],
|
||||
'edit_language_id' => [
|
||||
'value' => $GLOBALS['edit_language_id'] ?? '',
|
||||
'output_name' => 'Language',
|
||||
@@ -187,7 +268,8 @@ $edit_users = [
|
||||
'cols' => 60
|
||||
],
|
||||
],
|
||||
'load_query' => "SELECT edit_user_id, username, enabled, debug, db_debug, strict, locked, login_error_count "
|
||||
'load_query' => "SELECT edit_user_id, username, enabled, deleted, "
|
||||
. "strict, locked, login_error_count "
|
||||
. "FROM edit_user ORDER BY username",
|
||||
'table_name' => 'edit_user',
|
||||
'show_fields' => [
|
||||
@@ -197,31 +279,26 @@ $edit_users = [
|
||||
[
|
||||
'name' => 'enabled',
|
||||
'binary' => ['Yes', 'No'],
|
||||
'before_value' => 'Enabled: '
|
||||
'before_value' => 'ENBL: '
|
||||
],
|
||||
[
|
||||
'name' => 'debug',
|
||||
'name' => 'deleted',
|
||||
'binary' => ['Yes', 'No'],
|
||||
'before_value' => 'Debug: '
|
||||
],
|
||||
[
|
||||
'name' => 'db_debug',
|
||||
'binary' => ['Yes', 'No'],
|
||||
'before_value' => 'DB Debug: '
|
||||
'before_value' => 'DEL: '
|
||||
],
|
||||
[
|
||||
'name' => 'strict',
|
||||
'binary' => ['Yes', 'No'],
|
||||
'before_value' => 'Strict: '
|
||||
'before_value' => 'STRC: '
|
||||
],
|
||||
[
|
||||
'name' => 'locked',
|
||||
'binary' => ['Yes', 'No'],
|
||||
'before_value' => 'Locked: '
|
||||
'before_value' => 'LCK: '
|
||||
],
|
||||
[
|
||||
'name' => 'login_error_count',
|
||||
'before_value' => 'Errors: '
|
||||
'before_value' => 'ERR: '
|
||||
],
|
||||
],
|
||||
'element_list' => [
|
||||
|
||||
@@ -32,7 +32,10 @@
|
||||
<input type="hidden" name="HIDDEN_{$element.data.name}" value="{$element.data.HIDDEN_value}">
|
||||
{/if}
|
||||
{if $element.type == 'date'}
|
||||
<input type="text" name="{$element.data.name}" value="{$element.data.value}" size="10" maxlength="10">
|
||||
<input type="text" name="{$element.data.name}" value="{$element.data.value}" size="10" maxlength="10" placeholder="YYYY-MM-DD">
|
||||
{/if}
|
||||
{if $element.type == 'datetime'}
|
||||
<input type="text" name="{$element.data.name}" value="{$element.data.value}" size="16" maxlength="16" placeholder="YYYY-MM-DD HH:mm">
|
||||
{/if}
|
||||
{if $element.type == 'textarea'}
|
||||
<textarea name="{$element.data.name}"{if $element.data.rows} rows="{$element.data.rows}"{/if}{if $element.data.cols} cols="{$element.data.cols}"{/if}>{$element.data.value}</textarea>
|
||||
|
||||
@@ -14,9 +14,9 @@ if (!DEBUG) {
|
||||
});
|
||||
}*/
|
||||
|
||||
// open overlay boxes counter
|
||||
var GL_OB_S = 30;
|
||||
var GL_OB_BASE = 30;
|
||||
// open overlay boxes counter for z-index
|
||||
var GL_OB_S = 100;
|
||||
var GL_OB_BASE = 100;
|
||||
|
||||
/**
|
||||
* opens a popup window with winName and given features (string)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -116,6 +116,7 @@ class Backend
|
||||
// CONSTRUCTOR / DECONSTRUCTOR |====================================>
|
||||
/**
|
||||
* main class constructor
|
||||
*
|
||||
* @param \CoreLibs\DB\IO $db Database connection class
|
||||
* @param \CoreLibs\Debug\Logging $log Logging class
|
||||
* @param \CoreLibs\Create\Session $session Session interface class
|
||||
@@ -175,6 +176,7 @@ class Backend
|
||||
|
||||
/**
|
||||
* set internal ACL from login ACL
|
||||
*
|
||||
* @param array<mixed> $acl login acl array
|
||||
*/
|
||||
public function setACL(array $acl): void
|
||||
@@ -183,7 +185,8 @@ class Backend
|
||||
}
|
||||
|
||||
/**
|
||||
* writes all action vars plus other info into edit_log tabl
|
||||
* writes all action vars plus other info into edit_log table
|
||||
*
|
||||
* @param string $event any kind of event description,
|
||||
* @param string|array<mixed> $data any kind of data related to that event
|
||||
* @param string $write_type write type can bei STRING or BINARY
|
||||
@@ -255,6 +258,7 @@ class Backend
|
||||
|
||||
/**
|
||||
* Set the menu show flag
|
||||
*
|
||||
* @param string|int $menu_show_flag
|
||||
* @return string|int
|
||||
*/
|
||||
@@ -267,6 +271,7 @@ class Backend
|
||||
|
||||
/**
|
||||
* Return the menu show flag
|
||||
*
|
||||
* @return string|int
|
||||
*/
|
||||
public function adbGetMenuShowFlag()
|
||||
@@ -276,6 +281,7 @@ class Backend
|
||||
|
||||
/**
|
||||
* menu creater (from login menu session pages)
|
||||
*
|
||||
* @param int $flag visible flag trigger
|
||||
* @return array<mixed> menu array for output on page (smarty)
|
||||
*/
|
||||
@@ -403,6 +409,7 @@ class Backend
|
||||
/**
|
||||
* ONLY USED IN adbTopMenu
|
||||
* checks if this filename is in the current situation (user id, etc) available
|
||||
*
|
||||
* @param string|null $filename filename
|
||||
* @return bool true for visible/accessable menu point, false for not
|
||||
*/
|
||||
@@ -422,8 +429,8 @@ class Backend
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* creates out of a normal db_return array an assoc array
|
||||
*
|
||||
* @param array<mixed> $db_array input array
|
||||
* @param string|int|bool $key key
|
||||
* @param string|int|bool $value value
|
||||
@@ -440,8 +447,8 @@ class Backend
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* converts bytes into formated string with KB, MB, etc
|
||||
*
|
||||
* @param string|int|float $number string or int or number
|
||||
* @return string formatted string
|
||||
* @deprecated \CoreLibs\Convert\Byte::humanReadableByteFormat()
|
||||
@@ -456,8 +463,8 @@ class Backend
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* converts picture to a thumbnail with max x and max y size
|
||||
*
|
||||
* @param string $pic source image file with or without path
|
||||
* @param int $size_x maximum size width
|
||||
* @param int $size_y maximum size height
|
||||
@@ -485,6 +492,7 @@ class Backend
|
||||
|
||||
/**
|
||||
* wrapper function to fill up the mssages array
|
||||
*
|
||||
* @param string $level info/warning/error
|
||||
* @param string $msg string, can be printf formated
|
||||
* @param array<mixed> $vars optional data for a possible printf formated msg
|
||||
@@ -514,6 +522,7 @@ class Backend
|
||||
|
||||
/**
|
||||
* writes live queue
|
||||
*
|
||||
* @param string $queue_key string to identfy the queue
|
||||
* @param string $type [description]
|
||||
* @param string $target [description]
|
||||
@@ -559,17 +568,22 @@ class Backend
|
||||
/**
|
||||
* Basic class holds exact the same, except the Year/Month/Day/etc strings
|
||||
* are translated in this call
|
||||
*
|
||||
* @param int $year year YYYY
|
||||
* @param int $month month m
|
||||
* @param int $day day d
|
||||
* @param int $hour hour H
|
||||
* @param int $min min i
|
||||
* @param string $suffix additional info printed after the date time variable in the drop down
|
||||
* @param string $suffix additional info printed after the date time
|
||||
* variable in the drop down
|
||||
* also used for ID in the on change JS call
|
||||
* @param int $min_steps default is 1 (minute), can set to anything, is used as sum up from 0
|
||||
* @param bool $name_pos_back default false, if set to true, the name will be printend
|
||||
* @param int $min_steps default is 1 (minute), can set to anything,
|
||||
* is used as sum up from 0
|
||||
* @param bool $name_pos_back default false, if set to true,
|
||||
* the name will be printend
|
||||
* after the drop down and not before the drop down
|
||||
* @return string HTML formated strings for drop down lists of date and time
|
||||
* @return string HTML formated strings for drop down lists
|
||||
* of date and time
|
||||
*/
|
||||
public function adbPrintDateTime(
|
||||
$year,
|
||||
|
||||
@@ -165,6 +165,7 @@ class Email
|
||||
/**
|
||||
* guesses the email type (mostly for mobile) from the domain
|
||||
* if second is set to true, it will return short naming scheme (only provider)
|
||||
*
|
||||
* @param string $email email string
|
||||
* @param bool $short default false, if true,
|
||||
* returns only short type (pc instead of pc_html)
|
||||
@@ -197,6 +198,7 @@ class Email
|
||||
|
||||
/**
|
||||
* gets the short email type from a long email type
|
||||
*
|
||||
* @param string $email_type email string
|
||||
* @return string|bool short string or false for invalid
|
||||
*/
|
||||
@@ -227,7 +229,7 @@ class Email
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
* check email with all regex checks possible and return errors as array
|
||||
*
|
||||
* @param string $email Email address, will be checkd as lower
|
||||
* @param bool $error_code_only If this is set to true it will only return
|
||||
|
||||
@@ -12,6 +12,7 @@ class File
|
||||
{
|
||||
/**
|
||||
* quick return the extension of the given file name
|
||||
*
|
||||
* @param string $filename file name
|
||||
* @return string extension of the file name
|
||||
*/
|
||||
@@ -23,6 +24,7 @@ class File
|
||||
|
||||
/**
|
||||
* get lines in a file
|
||||
*
|
||||
* @param string $file file for line count read
|
||||
* @return int number of lines or -1 for non readable file
|
||||
*/
|
||||
|
||||
@@ -12,7 +12,6 @@ use CoreLibs\Convert\Json;
|
||||
|
||||
class Jason
|
||||
{
|
||||
|
||||
/**
|
||||
* @param string|null $json a json string, or null data
|
||||
* @param bool $override if set to true, then on json error
|
||||
|
||||
@@ -12,6 +12,7 @@ class Password
|
||||
{
|
||||
/**
|
||||
* creates the password hash
|
||||
*
|
||||
* @param string $password password
|
||||
* @return string hashed password
|
||||
*/
|
||||
@@ -25,6 +26,7 @@ class Password
|
||||
|
||||
/**
|
||||
* checks if the entered password matches the hash
|
||||
*
|
||||
* @param string $password password
|
||||
* @param string $hash password hash
|
||||
* @return bool true or false
|
||||
@@ -40,6 +42,7 @@ class Password
|
||||
|
||||
/**
|
||||
* checks if the password needs to be rehashed
|
||||
*
|
||||
* @param string $hash password hash
|
||||
* @return bool true or false
|
||||
*/
|
||||
|
||||
@@ -10,6 +10,7 @@ class PhpVersion
|
||||
* checks if running PHP version matches given PHP version (min or max)
|
||||
* if either is empty or null it will be ignored
|
||||
* if no min version (null or empty)
|
||||
*
|
||||
* @param string|null $min_version minimum version as string (x, x.y, x.y.x)
|
||||
* @param string|null $max_version optional maximum version as string (x, x.y, x.y.x)
|
||||
* @return bool true if ok, false if not matching version
|
||||
|
||||
@@ -13,6 +13,7 @@ class ArrayHandler
|
||||
/**
|
||||
* searches key = value in an array / array
|
||||
* only returns the first one found
|
||||
*
|
||||
* @param string|int $needle needle (search for)
|
||||
* @param array<mixed> $haystack haystack (search in)
|
||||
* @param string|null $key_search_for the key to look out for, default empty
|
||||
@@ -68,10 +69,12 @@ class ArrayHandler
|
||||
|
||||
/**
|
||||
* recursive array search function, which returns all found not only the first one
|
||||
*
|
||||
* @param string|int $needle needle (search for)
|
||||
* @param array<mixed> $haystack haystack (search in)
|
||||
* @param string|int $key_search_for the key to look for in
|
||||
* @param bool $old [true], if set to false will return new flat layout
|
||||
* @param bool $old [true], if set to false will
|
||||
* return new flat layout
|
||||
* @param array<mixed>|null $path recursive call for previous path
|
||||
* @return array<mixed>|null all array elements paths where
|
||||
* the element was found
|
||||
@@ -148,6 +151,7 @@ class ArrayHandler
|
||||
/**
|
||||
* array search simple. looks for key, value combination, if found, returns true
|
||||
* on default does not strict check, so string '4' will match int 4 and vica versa
|
||||
*
|
||||
* @param array<mixed> $array search in as array
|
||||
* @param string|int $key key (key to search in)
|
||||
* @param string|int $value value (what to find)
|
||||
@@ -184,6 +188,7 @@ class ArrayHandler
|
||||
* ... etc
|
||||
* bool key flag: true: handle keys as string or int
|
||||
* default false: all keys are string
|
||||
*
|
||||
* @return array<mixed>|bool merged array
|
||||
*/
|
||||
public static function arrayMergeRecursive()
|
||||
@@ -240,6 +245,7 @@ class ArrayHandler
|
||||
* array_diff only checks elements from A that are not in B, but not the
|
||||
* other way around.
|
||||
* Note that like array_diff this only checks first level values not keys
|
||||
*
|
||||
* @param array<mixed> $a array to compare a
|
||||
* @param array<mixed> $b array to compare b
|
||||
* @return array<mixed> array with missing elements from a & b
|
||||
@@ -254,9 +260,12 @@ class ArrayHandler
|
||||
* search for the needle array elements in haystack and
|
||||
* return the ones found as an array,
|
||||
* is there nothing found, it returns FALSE (boolean)
|
||||
*
|
||||
* @param array<mixed> $needle elements to search for
|
||||
* @param array<mixed> $haystack array where the $needle elements should be searched int
|
||||
* @return array<mixed>|bool either the found elements or false for nothing found or error
|
||||
* @param array<mixed> $haystack array where the $needle elements should
|
||||
* be searched int
|
||||
* @return array<mixed>|bool either the found elements or
|
||||
* false for nothing found or error
|
||||
*/
|
||||
public static function inArrayAny(array $needle, array $haystack)
|
||||
{
|
||||
@@ -275,6 +284,7 @@ class ArrayHandler
|
||||
|
||||
/**
|
||||
* creates out of a normal db_return array an assoc array
|
||||
*
|
||||
* @param array<mixed> $db_array return array from the database
|
||||
* @param string|int|bool $key key set, false for not set
|
||||
* @param string|int|bool $value value set, false for not set
|
||||
@@ -313,6 +323,7 @@ class ArrayHandler
|
||||
/**
|
||||
* converts multi dimensional array to a flat array
|
||||
* does NOT preserve keys
|
||||
*
|
||||
* @param array<mixed> $array multi dimensionial array
|
||||
* @return array<mixed> flattened array
|
||||
*/
|
||||
@@ -330,6 +341,7 @@ class ArrayHandler
|
||||
|
||||
/**
|
||||
* will loop through an array recursivly and write the array keys back
|
||||
*
|
||||
* @param array<mixed> $array multidemnsional array to flatten
|
||||
* @param array<mixed> $return recoursive pass on array of keys
|
||||
* @return array<mixed> flattened keys array
|
||||
@@ -348,6 +360,7 @@ class ArrayHandler
|
||||
/**
|
||||
* as above will flatten an array, but in this case only the outmost
|
||||
* leave nodes, all other keyswill be skipped
|
||||
*
|
||||
* @param array<mixed> $array multidemnsional array to flatten
|
||||
* @return array<mixed> flattened keys array
|
||||
*/
|
||||
@@ -366,6 +379,7 @@ class ArrayHandler
|
||||
/**
|
||||
* searches for key -> value in an array tree and writes the value one level up
|
||||
* this will remove this leaf will all other values
|
||||
*
|
||||
* @param array<mixed> $array nested array
|
||||
* @param string|int $search key to find that has no sub leaf
|
||||
* and will be pushed up
|
||||
|
||||
@@ -66,9 +66,11 @@ class DateTime
|
||||
/**
|
||||
* a simple wrapper for the date format
|
||||
* if an invalid timestamp is give zero timestamp unix time is used
|
||||
*
|
||||
* @param int|float $timestamp unix timestamp
|
||||
* @param bool $show_micro show the micro time (default false)
|
||||
* @param bool $micro_as_float Add the micro time with . instead of ms (default false)
|
||||
* @param bool $micro_as_float Add the micro time with . instead
|
||||
* of ms (default false)
|
||||
* @return string formated date+time in Y-M-D h:m:s ms
|
||||
*/
|
||||
public static function dateStringFormat(
|
||||
@@ -92,7 +94,9 @@ class DateTime
|
||||
|
||||
/**
|
||||
* formats a timestamp into interval, not into a date
|
||||
* @param string|int|float $timestamp interval in seconds and optional float micro seconds
|
||||
*
|
||||
* @param string|int|float $timestamp interval in seconds and optional
|
||||
* float micro seconds
|
||||
* @param bool $show_micro show micro seconds, default true
|
||||
* @return string interval formatted string or string as is
|
||||
*/
|
||||
@@ -149,6 +153,7 @@ class DateTime
|
||||
/**
|
||||
* does a reverse of the timeStringFormat and converts the string from
|
||||
* xd xh xm xs xms to a timestamp.microtime format
|
||||
*
|
||||
* @param string|int|float $timestring formatted interval
|
||||
* @return string|int|float converted float interval, or string as is
|
||||
*/
|
||||
@@ -190,6 +195,7 @@ class DateTime
|
||||
|
||||
/**
|
||||
* splits & checks date, wrap around for check_date function
|
||||
*
|
||||
* @param string $date a date string in the format YYYY-MM-DD
|
||||
* @return bool true if valid date, false if date not valid
|
||||
*/
|
||||
@@ -214,6 +220,7 @@ class DateTime
|
||||
|
||||
/**
|
||||
* splits & checks date, wrap around for check_date function
|
||||
*
|
||||
* @param string $datetime date (YYYY-MM-DD) + time (HH:MM:SS), SS can be dropped
|
||||
* @return bool true if valid date, false if date not valid
|
||||
*/
|
||||
@@ -263,6 +270,7 @@ class DateTime
|
||||
* 0 if both are equal
|
||||
* 1 if the first date is bigger than the last
|
||||
* false (bool): error
|
||||
*
|
||||
* @param string $start_date start date string in YYYY-MM-DD
|
||||
* @param string $end_date end date string in YYYY-MM-DD
|
||||
* @return int|bool false on error, or int -1/0/1 as difference
|
||||
@@ -297,12 +305,14 @@ class DateTime
|
||||
}
|
||||
|
||||
/**
|
||||
* compares the two dates + times. if seconds missing in one set, add :00, converts / to -
|
||||
* compares the two dates + times. if seconds missing in one set,
|
||||
* add :00, converts / to -
|
||||
* returns int/bool in:
|
||||
* -1 if the first date is smaller the last
|
||||
* 0 if both are equal
|
||||
* 1 if the first date is bigger than the last
|
||||
* false if no valid date/times chould be found
|
||||
*
|
||||
* @param string $start_datetime start date/time in YYYY-MM-DD HH:mm:ss
|
||||
* @param string $end_datetime end date/time in YYYY-MM-DD HH:mm:ss
|
||||
* @return int|bool false for error or -1/0/1 as difference
|
||||
@@ -336,6 +346,7 @@ class DateTime
|
||||
* calculates the days between two dates
|
||||
* return: overall days, week days, weekend days as array 0...2 or named
|
||||
* as overall, weekday and weekend
|
||||
*
|
||||
* @param string $start_date valid start date (y/m/d)
|
||||
* @param string $end_date valid end date (y/m/d)
|
||||
* @param bool $return_named return array type, false (default), true for named
|
||||
|
||||
@@ -30,6 +30,7 @@ class Byte
|
||||
* BYTE_FORMAT_ADJUST [2] use sprintf to always print two decimals
|
||||
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
|
||||
* To use the constant from outside use class::CONSTANT
|
||||
*
|
||||
* @param string|int|float $bytes bytes as string int or pure int
|
||||
* @param int $flags bitwise flag with use space turned on
|
||||
* @return string converted byte number (float) with suffix
|
||||
@@ -106,6 +107,7 @@ class Byte
|
||||
* NOTE: large exabyte numbers will overflow
|
||||
* flag allowed:
|
||||
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
|
||||
*
|
||||
* @param string|int|float $number any string or number to convert
|
||||
* @param int $flags bitwise flag with use space turned on
|
||||
* @return string|int|float converted value or original value
|
||||
|
||||
@@ -23,6 +23,7 @@ class Colors
|
||||
* converts the rgb values from int data to the valid rgb html hex string
|
||||
* optional can turn of leading #
|
||||
* if one value is invalid, will return false
|
||||
*
|
||||
* @param int $red red 0-255
|
||||
* @param int $green green 0-255
|
||||
* @param int $blue blue 0-255
|
||||
@@ -49,6 +50,7 @@ class Colors
|
||||
|
||||
/**
|
||||
* converts a hex RGB color to the int numbers
|
||||
*
|
||||
* @param string $hexStr RGB hexstring
|
||||
* @param bool $return_as_string flag to return as string
|
||||
* @param string $seperator string seperator: default: ","
|
||||
@@ -90,6 +92,7 @@ class Colors
|
||||
* converts RGB to HSB/V values
|
||||
* returns:
|
||||
* array with hue (0-360), sat (0-100%), brightness/value (0-100%)
|
||||
*
|
||||
* @param int $red red 0-255
|
||||
* @param int $green green 0-255
|
||||
* @param int $blue blue 0-255
|
||||
@@ -136,6 +139,7 @@ class Colors
|
||||
* hsb2rgb does not clean convert back to hsb in a round trip
|
||||
* converts HSB/V to RGB values RGB is full INT
|
||||
* if HSB/V value is invalid, sets this value to 0
|
||||
*
|
||||
* @param float $H hue 0-360 (int)
|
||||
* @param float $S saturation 0-100 (int)
|
||||
* @param float $V brightness/value 0-100 (int)
|
||||
@@ -218,6 +222,7 @@ class Colors
|
||||
* converts a RGB (0-255) to HSL
|
||||
* return:
|
||||
* array with hue (0-360), saturation (0-100%) and luminance (0-100%)
|
||||
*
|
||||
* @param int $red red 0-255
|
||||
* @param int $green green 0-255
|
||||
* @param int $blue blue 0-255
|
||||
@@ -271,6 +276,7 @@ class Colors
|
||||
/**
|
||||
* converts an HSL to RGB
|
||||
* if HSL value is invalid, set this value to 0
|
||||
*
|
||||
* @param float $hue hue: 0-360 (degrees)
|
||||
* @param float $sat saturation: 0-100
|
||||
* @param float $lum luminance: 0-100
|
||||
|
||||
@@ -15,6 +15,7 @@ class Html
|
||||
|
||||
/**
|
||||
* full wrapper for html entities
|
||||
*
|
||||
* @param mixed $string string to html encode
|
||||
* @return mixed if string, encoded, else as is (eg null)
|
||||
*/
|
||||
@@ -42,10 +43,14 @@ class Html
|
||||
* returns 'checked' or 'selected' if okay
|
||||
* $needle is a var, $haystack an array or a string
|
||||
* **** THE RETURN: VALUE WILL CHANGE TO A DEFAULT NULL IF NOT FOUND ****
|
||||
* @param array<mixed>|string $haystack (search in) haystack can be an array or a string
|
||||
*
|
||||
* @param array<mixed>|string $haystack (search in) haystack can be
|
||||
* an array or a string
|
||||
* @param string $needle needle (search for)
|
||||
* @param int $type type: 0: returns selected, 1, returns checked
|
||||
* @return ?string returns checked or selected, else returns null
|
||||
* @param int $type type: 0: returns selected, 1,
|
||||
* returns checked
|
||||
* @return ?string returns checked or selected,
|
||||
* else returns null
|
||||
*/
|
||||
public static function checked($haystack, string $needle, int $type = 0): ?string
|
||||
{
|
||||
|
||||
@@ -21,6 +21,7 @@ class Json
|
||||
* 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
|
||||
@@ -49,6 +50,7 @@ class Json
|
||||
|
||||
/**
|
||||
* returns human readable string for json errors thrown in jsonConvertToArray
|
||||
*
|
||||
* @param bool|boolean $return_string [default=false] if set to true
|
||||
* it will return the message string and not
|
||||
* the error number
|
||||
|
||||
@@ -13,6 +13,7 @@ class Math
|
||||
/**
|
||||
* some float numbers will be rounded up even if they have no decimal entries
|
||||
* this function fixes this by pre-rounding before calling ceil
|
||||
*
|
||||
* @param float $number number to round
|
||||
* @param int|integer $precision intermediat round up decimals (default 10)
|
||||
* @return float correct ceil number
|
||||
@@ -25,6 +26,7 @@ class Math
|
||||
/**
|
||||
* round inside an a number, not the decimal part only
|
||||
* eg 48767 with -2 -> 48700
|
||||
*
|
||||
* @param float $number number to round
|
||||
* @param int $precision negative number for position in number (default -2)
|
||||
* @return float rounded number
|
||||
@@ -42,6 +44,7 @@ class Math
|
||||
|
||||
/**
|
||||
* inits input to 0, if value is not numeric
|
||||
*
|
||||
* @param string|int|float $number string or number to check
|
||||
* @return float if not number, then returns 0, else original input
|
||||
*/
|
||||
|
||||
@@ -55,6 +55,7 @@ class MimeAppName
|
||||
|
||||
/**
|
||||
* Sets or updates a mime type
|
||||
*
|
||||
* @param string $mime MIME Name, no validiation
|
||||
* @param string $app Applicaiton name
|
||||
* @return void
|
||||
@@ -71,6 +72,7 @@ class MimeAppName
|
||||
/**
|
||||
* get the application name from mime type
|
||||
* if not set returns "Other file"
|
||||
*
|
||||
* @param string $mime MIME Name
|
||||
* @return string Application name matching
|
||||
*/
|
||||
|
||||
292
www/lib/CoreLibs/Create/Email.php
Normal file
292
www/lib/CoreLibs/Create/Email.php
Normal file
@@ -0,0 +1,292 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Create email class
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace CoreLibs\Create;
|
||||
|
||||
/**
|
||||
* sending simple text emails
|
||||
*/
|
||||
class Email
|
||||
{
|
||||
/** @var array<string> allowed list for encodings that can do KV folding */
|
||||
private static $encoding_kv_allowed = [
|
||||
'UTF-8',
|
||||
'EUC-JP',
|
||||
'SJIS',
|
||||
'SJIS-win',
|
||||
'ISO-2022-JP',
|
||||
'ISO-2022-JP-MS',
|
||||
'JIS',
|
||||
'JIS-ms',
|
||||
];
|
||||
/** @var string normaly this does not need to be changed */
|
||||
private static $mb_convert_kana_mode = 'KV';
|
||||
|
||||
/**
|
||||
* create mime encoded email part for to/from emails.
|
||||
* If encoding is not UTF-8 it will convert the email name to target encoding
|
||||
* FROM UTF-8
|
||||
* Source data is ALWAYS seen as utf-8
|
||||
*
|
||||
* @param string $email E-Mail address
|
||||
* @param string $email_name Name for the email address, in UTF-8, if not set, empty
|
||||
* @param string $encoding Encoding, if not set UTF-8
|
||||
* @param bool $kv_folding If set to true and a valid encoding, do KV folding
|
||||
* @return string Correctly encoded and build email string
|
||||
*/
|
||||
public static function encodeEmailName(
|
||||
string $email,
|
||||
string $email_name = '',
|
||||
string $encoding = 'UTF-8',
|
||||
bool $kv_folding = false
|
||||
): string {
|
||||
if (!empty($email_name)) {
|
||||
// if encoding is not UTF-8 then we convert
|
||||
if ($encoding != 'UTF-8') {
|
||||
$email_name = mb_convert_encoding($email_name, $encoding, 'UTF-8');
|
||||
}
|
||||
$email_name =
|
||||
mb_encode_mimeheader(
|
||||
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
|
||||
mb_convert_kana(
|
||||
$email_name,
|
||||
self::$mb_convert_kana_mode,
|
||||
$encoding
|
||||
) :
|
||||
$email_name,
|
||||
$encoding
|
||||
);
|
||||
return '"' . $email_name . '" '
|
||||
. '<' . (string)$email . '>';
|
||||
} else {
|
||||
return $email;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Subject/Body replace sub function
|
||||
*
|
||||
* @param string $subject Subject string, in UTF-8
|
||||
* @param string $body Body string, in UTF-8
|
||||
* @param array<string,string> $replace Replace the array as key -> value, in UTF-8
|
||||
* @param string $encoding Encoding for subject encode mime header
|
||||
* @param bool $kv_folding If set to true and a valid encoding,
|
||||
* do KV folding
|
||||
* @return array<string> Pos 0: Subject, Pos 1: Body
|
||||
*/
|
||||
private static function replaceContent(
|
||||
string $subject,
|
||||
string $body,
|
||||
array $replace,
|
||||
string $encoding,
|
||||
bool $kv_folding
|
||||
): array {
|
||||
foreach (['subject', 'body'] as $element) {
|
||||
$$element = str_replace(
|
||||
array_map(
|
||||
function ($key) {
|
||||
return '{' . $key . '}';
|
||||
},
|
||||
array_keys($replace)
|
||||
),
|
||||
array_values($replace),
|
||||
$$element
|
||||
);
|
||||
}
|
||||
// if encoding is NOT UTF-8 convert to target
|
||||
if ($encoding != 'UTF-8') {
|
||||
$subject = mb_convert_encoding($subject, $encoding, 'UTF-8');
|
||||
$body = mb_convert_encoding($body, $encoding, 'UTF-8');
|
||||
}
|
||||
// we need to encodde the subject
|
||||
$subject = mb_encode_mimeheader(
|
||||
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
|
||||
// for any non UTF-8 encoding convert kana
|
||||
mb_convert_kana(
|
||||
$subject,
|
||||
self::$mb_convert_kana_mode,
|
||||
$encoding
|
||||
) :
|
||||
$subject,
|
||||
$encoding
|
||||
);
|
||||
return [$subject, $body];
|
||||
}
|
||||
|
||||
/**
|
||||
* Send plain text email with possible to replace subject/body data
|
||||
* either global or per to email set.
|
||||
* replace to tags are in {} in the subject or body
|
||||
*
|
||||
* @param string $subject Mail subject, mandatory, in UTF-8
|
||||
* @param string $body Mail body, mandatory, in UTF-8
|
||||
* @param string $from_email From email, mandatory
|
||||
* @param string $from_name From email name, in UTF-8
|
||||
* if empty '' then not set
|
||||
* @param array<mixed> $send_to_emails to email or array for email/replace
|
||||
* If array: name/email/replace[key,value]
|
||||
* name and replace must be in UTF-8
|
||||
* At least one must be set
|
||||
* @param array<string,string> $replace_content Subject/Body replace as
|
||||
* search -> replace, in UTF-8
|
||||
* @param string $encoding E-Mail encoding, default UTF-8
|
||||
* @param bool $kv_folding If set to true and a valid encoding,
|
||||
* do KV folding
|
||||
* @param bool $test test flag, default off
|
||||
* @param \CoreLibs\Debug\Logging|null $log Logging class,
|
||||
* only used if test flag is true
|
||||
* @return int 2 test only, no sent
|
||||
* 1 for ok,
|
||||
* 0 for send not ok
|
||||
* -1 for nothing set (emails, subject, body)
|
||||
* -2 for empty to list
|
||||
* -3 encoding target not valid or not installed
|
||||
*/
|
||||
public static function sendEmail(
|
||||
string $subject,
|
||||
string $body,
|
||||
string $from_email,
|
||||
string $from_name,
|
||||
array $send_to_emails,
|
||||
array $replace_content = [],
|
||||
string $encoding = 'UTF-8',
|
||||
bool $kv_folding = false,
|
||||
bool $test = false,
|
||||
?\CoreLibs\Debug\Logging $log = null
|
||||
): int {
|
||||
/** @var array<string> */
|
||||
$to_emails = [];
|
||||
/** @var array<string,array<string,string>> */
|
||||
$to_replace = [];
|
||||
/** @var string */
|
||||
$out_subject = $subject;
|
||||
/** @var string */
|
||||
$out_body = $body;
|
||||
// check basic set
|
||||
if (empty($subject) || empty($body) || empty($from_email)) {
|
||||
return -1;
|
||||
}
|
||||
if (
|
||||
$encoding != 'UTF-8' &&
|
||||
!in_array($encoding, mb_list_encodings())
|
||||
) {
|
||||
return -3;
|
||||
}
|
||||
// if not one valid to, abort
|
||||
foreach ($send_to_emails as $to_email) {
|
||||
// to_email can be string, then only to email
|
||||
// else expect 'email' & 'name'
|
||||
if (
|
||||
is_array($to_email) &&
|
||||
isset($to_email['email'])
|
||||
) {
|
||||
$_to_email = self::encodeEmailName(
|
||||
$to_email['email'],
|
||||
$to_email['name'] ?? '',
|
||||
$encoding,
|
||||
$kv_folding
|
||||
);
|
||||
$to_emails[] = $_to_email;
|
||||
// if we have to replacement, this override replace content
|
||||
if (isset($to_email['replace']) && count($to_email['replace'])) {
|
||||
// merge with original replace content,
|
||||
// to data will override original data
|
||||
$to_replace[$_to_email] = array_merge(
|
||||
$replace_content,
|
||||
$to_email['replace']
|
||||
);
|
||||
}
|
||||
} elseif (is_string($to_email)) {
|
||||
$to_emails[] = $to_email;
|
||||
}
|
||||
}
|
||||
if (!count($to_emails)) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
// the email headers needed
|
||||
$headers = [
|
||||
'From' => self::encodeEmailName($from_email, $from_name, $encoding),
|
||||
'Content-type' => "text/plain; charset=" . $encoding,
|
||||
'MIME-Version' => "1.0",
|
||||
];
|
||||
|
||||
// if we have a replace string, we need to do replace run
|
||||
// only if there is no dedicated to replace
|
||||
// also run replace if there is nothing to replace at all
|
||||
// this will mime encode the subject
|
||||
if (!count($to_replace)) {
|
||||
list($out_subject, $out_body) = self::replaceContent(
|
||||
$subject,
|
||||
$body,
|
||||
$replace_content,
|
||||
$encoding,
|
||||
$kv_folding
|
||||
);
|
||||
}
|
||||
|
||||
$mail_delivery_status = 1;
|
||||
// send the email
|
||||
foreach ($to_emails as $to_email) {
|
||||
// default mail status is success
|
||||
$mail_status = true;
|
||||
// if there is a to replace, if not use the original replace content
|
||||
if (count($to_replace)) {
|
||||
$_replace = [];
|
||||
if (!empty($to_replace[$to_email])) {
|
||||
$_replace = $to_replace[$to_email];
|
||||
} elseif (count($replace_content)) {
|
||||
$_replace = $replace_content;
|
||||
}
|
||||
if (count($_replace)) {
|
||||
list($out_subject, $out_body) = self::replaceContent(
|
||||
$subject,
|
||||
$body,
|
||||
$_replace,
|
||||
$encoding,
|
||||
$kv_folding
|
||||
);
|
||||
}
|
||||
}
|
||||
// if we are in test mode, do not send an email and set status to 2
|
||||
if ($test === false) {
|
||||
$mail_status = mail($to_email, $out_subject, $out_body, $headers);
|
||||
} else {
|
||||
$mail_delivery_status = 2;
|
||||
}
|
||||
// log if an log instance exists
|
||||
if ($log instanceof \CoreLibs\Debug\Logging) {
|
||||
// build debug strings: convert to UTF-8 if not utf-8
|
||||
$log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', '
|
||||
. 'ENCODING: ' . $encoding . ', '
|
||||
. 'KV FOLDING: ' . $log->prBl($kv_folding) . ', '
|
||||
. 'TO: ' . $to_email . ', '
|
||||
. 'SUBJECT: ' . $out_subject . ', '
|
||||
. 'BODY: ' . ($encoding == 'UTF-8' ?
|
||||
$out_body :
|
||||
mb_convert_encoding($out_body, 'UTF-8', $encoding)));
|
||||
$log->debug('SEND EMAIL JSON', json_encode([
|
||||
'encoding' => $encoding,
|
||||
'kv_folding' => $kv_folding,
|
||||
'header' => $headers,
|
||||
'to' => $to_email,
|
||||
'subject' => $out_subject,
|
||||
'body' => ($encoding == 'UTF-8' ?
|
||||
$out_body :
|
||||
mb_convert_encoding($out_body, 'UTF-8', $encoding))
|
||||
]) ?: '{}');
|
||||
}
|
||||
if (!$mail_status) {
|
||||
$mail_delivery_status = 0;
|
||||
}
|
||||
}
|
||||
return $mail_delivery_status;
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
@@ -19,6 +19,7 @@ class Hash
|
||||
* hash returns false
|
||||
* preg_replace fails for older php version
|
||||
* Use __hash with crc32b or hash('crc32b', ...) for correct output
|
||||
*
|
||||
* @param string $string string to crc
|
||||
* @return string crc32b hash (old type)
|
||||
*/
|
||||
@@ -39,6 +40,7 @@ class Hash
|
||||
|
||||
/**
|
||||
* replacement for __crc32b call
|
||||
*
|
||||
* @param string $string string to hash
|
||||
* @param bool $use_sha use sha instead of crc32b (default false)
|
||||
* @return string hash of the string
|
||||
@@ -58,6 +60,7 @@ class Hash
|
||||
* defaults to adler 32
|
||||
* allowed crc32b, adler32, fnv132, fnv1a32, joaat
|
||||
* all that create 8 char long hashes
|
||||
*
|
||||
* @param string $string string to hash
|
||||
* @param string $hash_type hash type (default adler32)
|
||||
* @return string hash of the string
|
||||
@@ -79,6 +82,7 @@ class Hash
|
||||
|
||||
/**
|
||||
* Wrapper function for standard long hashd
|
||||
*
|
||||
* @param string $string String to be hashed
|
||||
* @return string Hashed string
|
||||
*/
|
||||
|
||||
@@ -29,6 +29,7 @@ class RandomKey
|
||||
}
|
||||
/**
|
||||
* sets the random key range with the default values
|
||||
*
|
||||
* @return void has no return
|
||||
*/
|
||||
private static function initRandomKeyData()
|
||||
@@ -44,6 +45,7 @@ class RandomKey
|
||||
|
||||
/**
|
||||
* validates they key length for random string generation
|
||||
*
|
||||
* @param int $key_length key length
|
||||
* @return bool true for valid, false for invalid length
|
||||
*/
|
||||
@@ -63,6 +65,7 @@ class RandomKey
|
||||
/**
|
||||
* sets the key length and checks that they key given is valid
|
||||
* if failed it will not change the default key length and return false
|
||||
*
|
||||
* @param int $key_length key length
|
||||
* @return bool true/false for set status
|
||||
*/
|
||||
@@ -91,6 +94,7 @@ class RandomKey
|
||||
* creates a random key based on the key_range with key_length
|
||||
* if override key length is set, it will check on valid key and use this
|
||||
* this will not set the class key length variable
|
||||
*
|
||||
* @param int $key_length key length override, -1 for use default
|
||||
* @return string random key
|
||||
*/
|
||||
|
||||
@@ -18,6 +18,19 @@ class Session
|
||||
/** @var string list for errors */
|
||||
private $session_intern_error_str = '';
|
||||
|
||||
/**
|
||||
* Start session
|
||||
* startSession should be called for complete check
|
||||
* If this is called without any name set before the php.ini name is
|
||||
* used.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function startSessionCall(): void
|
||||
{
|
||||
session_start();
|
||||
}
|
||||
|
||||
/**
|
||||
* init a session, if array is empty or array does not have session_name set
|
||||
* then no auto init is run
|
||||
@@ -58,19 +71,6 @@ class Session
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start session
|
||||
* startSession should be called for complete check
|
||||
* If this is called without any name set before the php.ini name is
|
||||
* used.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function startSessionCall(): void
|
||||
{
|
||||
session_start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return set error string, empty if none set
|
||||
* Error strings are only set in the startSession method
|
||||
@@ -206,6 +206,39 @@ class Session
|
||||
return session_write_close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proper destroy a session
|
||||
* - unset the _SESSION array
|
||||
* - unset cookie if cookie on and we have not strict mode
|
||||
* - destroy session
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function sessionDestroy(): bool
|
||||
{
|
||||
$_SESSION = [];
|
||||
if (
|
||||
ini_get('session.use_cookies') &&
|
||||
!ini_get('session.use_strict_mode')
|
||||
) {
|
||||
$session_name = $this->getSessionName();
|
||||
if ($session_name === false) {
|
||||
$session_name = '';
|
||||
}
|
||||
$params = session_get_cookie_params();
|
||||
setcookie(
|
||||
(string)$session_name,
|
||||
'',
|
||||
time() - 42000,
|
||||
$params['path'],
|
||||
$params['domain'],
|
||||
$params['secure'],
|
||||
$params['httponly']
|
||||
);
|
||||
}
|
||||
return session_destroy();
|
||||
}
|
||||
|
||||
/**
|
||||
* get session status
|
||||
* PHP_SESSION_DISABLED if sessions are disabled.
|
||||
|
||||
@@ -15,6 +15,7 @@ class Uids
|
||||
* creates psuedo random uuid v4
|
||||
* Code take from class here:
|
||||
* https://www.php.net/manual/en/function.uniqid.php#94959
|
||||
*
|
||||
* @return string pseudo random uuid v4
|
||||
*/
|
||||
public static function uuidv4(): string
|
||||
@@ -44,6 +45,7 @@ class Uids
|
||||
* TODO: make this a proper uniq ID creation
|
||||
* add uuidv4 subcall to the uuid function too
|
||||
* creates a uniq id
|
||||
*
|
||||
* @param string $type uniq id type, currently md5 or sha256 allowed
|
||||
* if not set will use DEFAULT_HASH if set
|
||||
* @return string uniq id
|
||||
@@ -81,7 +83,7 @@ class Uids
|
||||
return $uniq_id;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* create a unique id with the standard hash type defined in __hash
|
||||
*
|
||||
* @return string Unique ID with fixed length of 8 characters
|
||||
|
||||
@@ -50,6 +50,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
/**
|
||||
* constructor for the array io class, set the
|
||||
* primary key name automatically (from array)
|
||||
*
|
||||
* @param array<mixed> $db_config db connection config
|
||||
* @param array<mixed> $table_array table array config
|
||||
* @param string $table_name table name string
|
||||
@@ -93,6 +94,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
* works for <b>,<i>, and <a> (thought <a> can be / or should
|
||||
* be handled with the magic links functions
|
||||
* used with the read function
|
||||
*
|
||||
* @param string $text any html encoded string
|
||||
* @return string decoded html string
|
||||
*/
|
||||
@@ -111,6 +113,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
|
||||
/**
|
||||
* changeds all HTML entities into non HTML ones
|
||||
*
|
||||
* @param string $text encoded html string
|
||||
* @return string decoded html string
|
||||
*/
|
||||
@@ -126,6 +129,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
|
||||
/**
|
||||
* dumps the current data
|
||||
*
|
||||
* @param bool $write write to error message, default false
|
||||
* @return string the array data as html string entry
|
||||
*/
|
||||
@@ -144,7 +148,9 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if pk is set and if not, set from pk_id and if this also not set return 0
|
||||
* checks if pk is set and if not, set from pk_id and
|
||||
* if this also not set return 0
|
||||
*
|
||||
* @return bool true if pk value is set, else false
|
||||
*/
|
||||
public function dbCheckPkSet()
|
||||
@@ -171,7 +177,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
public function dbResetArray($reset_pk = false): void
|
||||
{
|
||||
reset($this->table_array);
|
||||
foreach ($this->table_array as $column => $data_array) {
|
||||
foreach (array_keys($this->table_array) as $column) {
|
||||
if (!$this->table_array[$column]['pk']) {
|
||||
unset($this->table_array[$column]['value']);
|
||||
} elseif ($reset_pk) {
|
||||
@@ -182,6 +188,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
|
||||
/**
|
||||
* deletes one dataset
|
||||
*
|
||||
* @param array<mixed> $table_array optional override for table array set
|
||||
* set this as new table array too
|
||||
* @return array<mixed> returns the table array that was deleted
|
||||
@@ -201,7 +208,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
// delete files and build FK query
|
||||
reset($this->table_array);
|
||||
$q_where = '';
|
||||
foreach ($this->table_array as $column => $data_array) {
|
||||
foreach (array_keys($this->table_array) as $column) {
|
||||
// suchen nach bildern und lschen ...
|
||||
if (
|
||||
!empty($this->table_array[$column]['file']) &&
|
||||
@@ -241,8 +248,10 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
|
||||
/**
|
||||
* reads one row into the array
|
||||
*
|
||||
* @param boolean $edit on true convert data, else as is
|
||||
* @param array<mixed> $table_array optional table array, overwrites internal set array
|
||||
* @param array<mixed> $table_array optional table array, overwrites
|
||||
* internal set array
|
||||
* @return array<mixed> set table array with values
|
||||
*/
|
||||
public function dbRead($edit = false, $table_array = [])
|
||||
@@ -262,11 +271,22 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
if ($q_select) {
|
||||
$q_select .= ', ';
|
||||
}
|
||||
$q_select .= $column;
|
||||
if (
|
||||
!empty($data_array['type']) && $data_array['type'] == 'datetime' &&
|
||||
!empty($data_array['sql_read'])
|
||||
) {
|
||||
// convert tom different timestamp type
|
||||
$q_select .= "TO_CHAR($column, '" . $data_array['sql_read'] . "') AS $column";
|
||||
} else {
|
||||
$q_select .= $column;
|
||||
}
|
||||
|
||||
// check FK ...
|
||||
if (isset($this->table_array[$column]['fk']) && isset($this->table_array[$column]['value'])) {
|
||||
if ($q_where) {
|
||||
if (
|
||||
isset($this->table_array[$column]['fk']) &&
|
||||
isset($this->table_array[$column]['value'])
|
||||
) {
|
||||
if (!empty($q_where)) {
|
||||
$q_where .= ' AND ';
|
||||
}
|
||||
$q_where .= $column .= ' = ' . $this->table_array[$column]['value'];
|
||||
@@ -315,6 +335,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
|
||||
/**
|
||||
* writes one set into DB or updates one set (if PK exists)
|
||||
*
|
||||
* @param boolean $addslashes old convert entities and set set escape
|
||||
* @param array<mixed> $table_array optional table array, overwrites internal one
|
||||
* @return array<mixed> table array or null
|
||||
@@ -440,7 +461,12 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
} elseif (isset($this->table_array[$column]['bool'])) {
|
||||
// boolean storeage (reverse check on ifset)
|
||||
$q_data .= "'" . $this->dbBoolean($this->table_array[$column]['value'], true) . "'";
|
||||
} elseif (isset($this->table_array[$column]['interval'])) {
|
||||
} elseif (
|
||||
isset($this->table_array[$column]['interval']) ||
|
||||
isset($this->table_array[$column]['date']) ||
|
||||
isset($this->table_array[$column]['datetime']) ||
|
||||
isset($this->table_array[$column]['emptynull'])
|
||||
) {
|
||||
// for interval we check if no value, then we set null
|
||||
if (
|
||||
!isset($this->table_array[$column]['value']) ||
|
||||
@@ -448,7 +474,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
) {
|
||||
$_value = 'NULL';
|
||||
} elseif (isset($this->table_array[$column]['value'])) {
|
||||
$_value = $this->table_array[$column]['value'];
|
||||
$_value = $this->dbEscapeLiteral($this->table_array[$column]['value']);
|
||||
} else {
|
||||
// fallback
|
||||
$_value = 'NULL';
|
||||
@@ -490,7 +516,10 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
// create select part & addition FK part
|
||||
foreach ($this->table_array as $column => $data_array) {
|
||||
// check FK ...
|
||||
if (isset($this->table_array[$column]['fk']) && isset($this->table_array[$column]['value'])) {
|
||||
if (
|
||||
isset($this->table_array[$column]['fk']) &&
|
||||
isset($this->table_array[$column]['value'])
|
||||
) {
|
||||
if (!empty($q_where)) {
|
||||
$q_where .= ' AND ';
|
||||
}
|
||||
@@ -536,7 +565,6 @@ class ArrayIO extends \CoreLibs\DB\IO
|
||||
}
|
||||
// set primary key
|
||||
if ($insert) {
|
||||
// FIXME: this has to be fixes by fixing DB::IO clas
|
||||
$insert_id = $this->dbGetInsertPK();
|
||||
if (is_array($insert_id)) {
|
||||
$insert_id = 0;
|
||||
|
||||
@@ -263,15 +263,15 @@ use CoreLibs\Create\Uids;
|
||||
class IO
|
||||
{
|
||||
// 0: normal read, store in cache
|
||||
// 1: read cache, clean at the end
|
||||
// 2: read new, clean at end
|
||||
// 1: read new, keep at end, clean before new run
|
||||
// 2: read new, clean at the end (temporary cache)
|
||||
// 3: never cache
|
||||
/** @var int */
|
||||
public const USE_CACHE = 0;
|
||||
/** @var int */
|
||||
public const CLEAR_CACHE = 1;
|
||||
public const READ_NEW = 1;
|
||||
/** @var int */
|
||||
public const READ_NEW = 2;
|
||||
public const CLEAR_CACHE = 2;
|
||||
/** @var int */
|
||||
public const NO_CACHE = 3;
|
||||
/** @var string */
|
||||
@@ -1682,18 +1682,18 @@ class IO
|
||||
* data, or with reset flag set calls data from DB again
|
||||
* NOTE on $cache param:
|
||||
* - if set to 0, if same query run again, will read from cache
|
||||
* - if set to 1, at the end of the query (last row returned),
|
||||
* the stored array will be deleted ...
|
||||
* - if set to 2, the data will be read new and cached
|
||||
* - if set to 1, the data will be read new and cached, cache reset a new run
|
||||
* (wheres 1 reads cache AND destroys at end of read)
|
||||
* - if set to 2, at the end of the query (last row returned),
|
||||
* the stored array will be deleted ...
|
||||
* - if set to 3, after EACH row, the data will be reset,
|
||||
* no caching is done except for basic (count, etc)
|
||||
* @param string $query Query string
|
||||
* @param int $cache reset status: default: USE_CACHE
|
||||
* USE_CACHE/0: normal read from cache on second run
|
||||
* CLEAR_CACHE/1: read cache, clean at the end
|
||||
* READ_NEW/2: read new, clean at end
|
||||
* NO_CACHE/3: never cache [default]
|
||||
* READ_NEW/1: write to cache, clean before new run
|
||||
* CLEAR_CACHE/2: write cache, clean after finished
|
||||
* NO_CACHE/3: don't write cache
|
||||
* @param bool $assoc_only True to only returned the named and not
|
||||
* index position ones
|
||||
* @return array<mixed>|bool return array data or false on error/end
|
||||
@@ -1714,17 +1714,44 @@ class IO
|
||||
// pre declare array
|
||||
if (!isset($this->cursor_ext[$query_hash])) {
|
||||
$this->cursor_ext[$query_hash] = [
|
||||
// cursor, null: unset, 1: finished read/cache, 2: object/resource reading
|
||||
'cursor' => null,
|
||||
// cached data
|
||||
'data' => [],
|
||||
// field names as array
|
||||
'field_names' => [],
|
||||
'firstcall' => 0,
|
||||
// number of fields (field names)
|
||||
'num_fields' => 0,
|
||||
// number of rows that will be maximum returned
|
||||
'num_rows' => 0,
|
||||
'pos' => 0,
|
||||
'query' => '',
|
||||
// how many rows have been read from db
|
||||
'read_rows' => 0,
|
||||
// current read pos (db/cache), 0 on last read (finished)
|
||||
'pos' => 0,
|
||||
// the query used in this call
|
||||
'query' => '',
|
||||
// cache flag from method call
|
||||
'cache_flag' => $cache,
|
||||
// flag if we only have assoc data
|
||||
'assoc_flag' => $assoc_only,
|
||||
// flag if we have cache data stored at the moment
|
||||
'cached' => false,
|
||||
// when fetch array or cache read returns false
|
||||
// in loop read that means dbReturn retuns false without erro
|
||||
'finished' => false,
|
||||
// read from cache/db (pos == rows)
|
||||
'read_finished' => false,
|
||||
// read from db only (read == rows)
|
||||
'db_read_finished' => false,
|
||||
// for debug
|
||||
'log_pos' => 1, // how many times called overall
|
||||
'log' => [], // current run log
|
||||
];
|
||||
} else {
|
||||
$this->cursor_ext[$query_hash]['log_pos'] ++;
|
||||
}
|
||||
// reset log for each read
|
||||
$this->cursor_ext[$query_hash]['log'] = [];
|
||||
// set the query
|
||||
$this->cursor_ext[$query_hash]['query'] = $query;
|
||||
// before doing ANYTHING check if query is "SELECT ..." everything else does not work
|
||||
@@ -1732,20 +1759,25 @@ class IO
|
||||
$this->__dbError(17, false, $this->cursor_ext[$query_hash]['query']);
|
||||
return false;
|
||||
}
|
||||
// set first call to false
|
||||
$first_call = false;
|
||||
// init return als false
|
||||
$return = false;
|
||||
// if it is a call with reset in it we reset the cursor,
|
||||
// so we get an uncached return
|
||||
// but only for the FIRST call (pos == 0)
|
||||
if ($cache > self::USE_CACHE && !$this->cursor_ext[$query_hash]['pos']) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'Reset cursor';
|
||||
$this->cursor_ext[$query_hash]['cursor'] = null;
|
||||
if ($cache == self::READ_NEW) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'Cache reset';
|
||||
$this->cursor_ext[$query_hash]['data'] = [];
|
||||
}
|
||||
}
|
||||
// $this->debug('MENU', 'Reset: '.$reset.', Cursor: '
|
||||
// .$this->cursor_ext[$query_hash]['cursor'].', Pos: '.$this->cursor_ext[$query_hash]['pos']
|
||||
// .', Query: '.$query);
|
||||
|
||||
// if no cursor yet, execute
|
||||
if (!$this->cursor_ext[$query_hash]['cursor']) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'No cursor';
|
||||
// for DEBUG, print out each query executed
|
||||
if ($this->db_debug) {
|
||||
$this->__dbDebug('db', $this->cursor_ext[$query_hash]['query'], 'dbReturn', 'Q');
|
||||
@@ -1773,13 +1805,14 @@ class IO
|
||||
$this->__dbError(13, $this->cursor_ext[$query_hash]['cursor']);
|
||||
return false;
|
||||
} else {
|
||||
$this->cursor_ext[$query_hash]['firstcall'] = 1;
|
||||
$first_call = true;
|
||||
}
|
||||
} // only go if NO cursor exists
|
||||
|
||||
// if cursor exists ...
|
||||
if ($this->cursor_ext[$query_hash]['cursor']) {
|
||||
if ($this->cursor_ext[$query_hash]['firstcall'] == 1) {
|
||||
if ($first_call === true) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'First call';
|
||||
// count the rows returned (if select)
|
||||
$this->cursor_ext[$query_hash]['num_rows'] =
|
||||
$this->db_functions->__dbNumRows($this->cursor_ext[$query_hash]['cursor']);
|
||||
@@ -1799,35 +1832,51 @@ class IO
|
||||
);
|
||||
}
|
||||
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
|
||||
// reset first call vars
|
||||
$this->cursor_ext[$query_hash]['firstcall'] = 0;
|
||||
// reset first call var
|
||||
$first_call = false;
|
||||
// reset the internal pos counter
|
||||
$this->cursor_ext[$query_hash]['pos'] = 0;
|
||||
// reset the global (for cache) read counter
|
||||
$this->cursor_ext[$query_hash]['read_rows'] = 0;
|
||||
// reset read finished flag
|
||||
$this->cursor_ext[$query_hash]['finished'] = false;
|
||||
$this->cursor_ext[$query_hash]['read_finished'] = false;
|
||||
$this->cursor_ext[$query_hash]['db_read_finished'] = false;
|
||||
// set cursor ccached flag based on cache flag
|
||||
if ($cache < self::NO_CACHE) {
|
||||
$this->cursor_ext[$query_hash]['cached'] = true;
|
||||
}
|
||||
}
|
||||
// read data for further work ... but only if necessarry
|
||||
// main database read if not all read and we have an active cursor
|
||||
if (
|
||||
$this->cursor_ext[$query_hash]['read_rows'] ==
|
||||
$this->cursor_ext[$query_hash]['num_rows']
|
||||
$this->cursor_ext[$query_hash]['read_rows'] !=
|
||||
$this->cursor_ext[$query_hash]['num_rows'] &&
|
||||
!is_int($this->cursor_ext[$query_hash]['cursor'])
|
||||
) {
|
||||
$return = false;
|
||||
} else {
|
||||
$return = $this->__dbConvertEncoding(
|
||||
$this->db_functions->__dbFetchArray(
|
||||
$this->cursor_ext[$query_hash]['cursor'],
|
||||
$this->db_functions->__dbResultType($assoc_only)
|
||||
)
|
||||
);
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'DB Reading data: '
|
||||
. (is_bool($return) ? 'EOF' : 'DATA');
|
||||
// if returned is NOT an array, abort to false
|
||||
if (!is_array($return)) {
|
||||
$return = false;
|
||||
}
|
||||
}
|
||||
// check if cached call or reset call ...
|
||||
// read from cache, or do partial cache set and caching
|
||||
if (!$return && $cache == self::USE_CACHE) {
|
||||
// check if end of output ...
|
||||
if ($this->cursor_ext[$query_hash]['pos'] >= $this->cursor_ext[$query_hash]['num_rows']) {
|
||||
if (
|
||||
$this->cursor_ext[$query_hash]['pos'] >=
|
||||
$this->cursor_ext[$query_hash]['num_rows']
|
||||
) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'USE CACHE, end';
|
||||
// finish read
|
||||
$this->cursor_ext[$query_hash]['finished'] = true;
|
||||
// reset pos for next read
|
||||
$this->cursor_ext[$query_hash]['pos'] = 0;
|
||||
// if not reset given, set the cursor to true, so in a cached
|
||||
// call on a different page we don't get problems from
|
||||
@@ -1835,36 +1884,55 @@ class IO
|
||||
$this->cursor_ext[$query_hash]['cursor'] = 1;
|
||||
$return = false;
|
||||
} else {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'USE CACHE, read data';
|
||||
$this->cursor_ext[$query_hash]['read_finished'] = false;
|
||||
$this->cursor_ext[$query_hash]['finished'] = false;
|
||||
// cached data read
|
||||
$return = $this->__dbReturnCacheRead($query_hash, $assoc_only);
|
||||
if (
|
||||
$this->cursor_ext[$query_hash]['pos'] ==
|
||||
$this->cursor_ext[$query_hash]['num_rows']
|
||||
) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'USE CACHE, all cache rows read';
|
||||
$this->cursor_ext[$query_hash]['read_finished'] = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// return row, if last && reset, then unset the hole hash array
|
||||
if (
|
||||
!$return &&
|
||||
($cache == self::CLEAR_CACHE || $cache == self::NO_CACHE) &&
|
||||
$this->cursor_ext[$query_hash]['pos']
|
||||
) {
|
||||
// unset data block only
|
||||
$this->cursor_ext[$query_hash]['data'] = [];
|
||||
$this->cursor_ext[$query_hash]['pos'] = 0;
|
||||
} elseif (
|
||||
!$return && $cache == self::READ_NEW &&
|
||||
$this->cursor_ext[$query_hash]['pos']
|
||||
) {
|
||||
// at end of read reset pos & set cursor to 1
|
||||
// (so it does not get lost in session transfer)
|
||||
// return row, if last && reset, then unset the whole hash array
|
||||
if (!$return && $this->cursor_ext[$query_hash]['pos']) {
|
||||
$this->cursor_ext[$query_hash]['pos'] = 0;
|
||||
$this->cursor_ext[$query_hash]['cursor'] = 1;
|
||||
$return = false;
|
||||
$this->cursor_ext[$query_hash]['finished'] = true;
|
||||
// for clear cache, clear cache, else only write log info
|
||||
if ($cache == self::CLEAR_CACHE) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'CLEAR CACHE, end';
|
||||
// unset data block only
|
||||
$this->cursor_ext[$query_hash]['data'] = [];
|
||||
$this->cursor_ext[$query_hash]['cached'] = false;
|
||||
} elseif ($cache == self::READ_NEW) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'READ NEW, end';
|
||||
} elseif ($cache == self::NO_CACHE) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'NO CACHE, end';
|
||||
}
|
||||
}
|
||||
// if something found, write data into hash array
|
||||
if ($return) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'Return Data';
|
||||
// internal position counter
|
||||
$this->cursor_ext[$query_hash]['pos'] ++;
|
||||
$this->cursor_ext[$query_hash]['read_rows'] ++;
|
||||
// read is finished
|
||||
if (
|
||||
$this->cursor_ext[$query_hash]['read_rows'] ==
|
||||
$this->cursor_ext[$query_hash]['num_rows']
|
||||
) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'Return data all db rows read';
|
||||
$this->cursor_ext[$query_hash]['db_read_finished'] = true;
|
||||
$this->cursor_ext[$query_hash]['read_finished'] = true;
|
||||
}
|
||||
// if reset is < NO_CACHE level caching is done, else no
|
||||
if ($cache < self::NO_CACHE) {
|
||||
$this->cursor_ext[$query_hash]['log'][] = 'Cache Data';
|
||||
// why was this here?
|
||||
// $temp = [];
|
||||
// foreach ($return as $field_name => $data) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user