Compare commits

..

49 Commits

Author SHA1 Message Date
Clemens Schwaighofer
70a30c3182 Javascript byte human readable functions
Add a new format bytes with using bytes for lowest tear instead of 0.n
kb

Add a new reverse function to convert from human readable bytes to byte
number
2021-05-20 10:25:37 +09:00
Clemens Schwaighofer
9d54d6b0d1 Bug fix in human readable byte convert 2021-05-19 11:01:23 +09:00
Clemens Schwaighofer
a46888d101 Supress array errors in form generate 2021-05-17 09:35:09 +09:00
Clemens Schwaighofer
be092fc449 Add some missing array set checks 2021-05-17 08:57:50 +09:00
Clemens Schwaighofer
6059b83637 Fix IMG_PNG constant error, jquery update, other minor fixes
Big fix with IMG_PNG constant use. Switched to IMAGETYPE_*

Some code cleanup in config files (array, DEFINE->define, etc)

Code cleanup in DB:IO class, especially for consistent returning
array/single data blocks

Some javascript core lib update
2021-04-28 11:03:26 +09:00
Clemens Schwaighofer
b6c6d76b43 Basic::json handling, better string to bytes function
Some basic json string to array with second function to check last
cought error.

Updated string to bytes convert to make it shorter and more compact

Some minor fixes in DB::IO helper methods
2021-02-09 14:55:32 +09:00
Clemens Schwaighofer
80993a06ac Main Template CORE css/js, remove unused JS code, fix method names DB/IO
DB::IO all public names are prefixed with db. All others are set as
deprecated.
2021-02-09 06:49:30 +09:00
Clemens Schwaighofer
50073479d4 Last login value, minor update for array to [, smarty include core
When logged in, the last loggedin time is stored in the edit_user table,
additional to the normal logging.

More array() to [] conversion in config files, etc

Javascript: add math.round

Basic Class: Fix key length array mapping to more efficiont loop run
DB/IO: some name fixes in get key function description/comments
SmartyExtended: add CORE CSS/JS file include if exists. Follows after
MAIN and BEFORE page and special
2021-01-21 06:55:28 +09:00
Clemens Schwaighofer
85f701ab2a Core Class Updates
Basic: remove all error handling override for any class vars to avoid
exploiting private/public/protected settings

Basic: Add MIME lookup table with array. So you can return a File name
description (human understandable) to a mime handler.
See mimeInitApps for basic list

IO: Bug fix for counting prepared statment place holders. If there are
$1, $1, $2 then those are TWO and not THREE

IO: various wrappers for returning PK, Extended return set, Number for
rows
Those will be extended to all variables
2020-11-25 20:38:25 +09:00
Clemens Schwaighofer
519de8a23c Fix smarty extended variable access check 2020-09-08 11:33:50 +09:00
Clemens Schwaighofer
d5fdb22e93 Remove all __set/__get class variable check
It ultimate failed for the following reason.

If base class is passed on to some other class as object parameter
then accessing protected/private variables will be possible because the
__get method will interfer.
Also __set of protected/private variables is possible.

I rather run check for setting variables without defining them than
haveing open protected/private var access
2020-09-08 11:24:15 +09:00
Clemens Schwaighofer
0ec0007569 Fix for edit tables declare, add return function for DB IO
DB IO return functions for inserted primary key and extended RETURNING
data

Add dev set for html options grouping addition for nested arrays/object
lists

Fix edit tables edit access uid declaration
2020-09-07 07:09:23 +09:00
Clemens Schwaighofer
7165a50b4d edit* table updates, config master updates, edit js updates
Add password reset time/uid for a password reset flow
Add password valid regex check constants in master config
Add deep copy javascript object instead of direct copy to truly create
new element for attaching in the cel flow
Add attach array of cel elements intead of object with cel sub block
2020-08-26 15:42:30 +09:00
Clemens Schwaighofer
71ee80fa06 Add javascrip function check & call from string functions
Check if a string is a function.
And call this string with arguments.

Update SQL files for better layout order
2020-07-21 11:30:34 +09:00
Clemens Schwaighofer
bb5276ee44 Smarty test, Basic class debug function upate
Write out debug data had two nested ifs that are combined into one if

Smarty test update with loop
2020-07-01 07:12:06 +09:00
Clemens Schwaighofer
9c242ed1b9 Psalm config update, add JS object deep copy function 2020-06-25 15:05:32 +09:00
Clemens Schwaighofer
0fcbe91ea2 Ignore vscode settings folder 2020-06-19 09:12:10 +09:00
Clemens Schwaighofer
ee4417fc52 Settings update for phpstan 2020-06-18 13:49:57 +09:00
Clemens Schwaighofer
ee1dafd8d8 PHP stan settings update, vscode config file 2020-06-18 13:44:57 +09:00
Clemens Schwaighofer
96104095d0 Flatpickr update, minor fixes in edit base javascript 2020-06-12 09:53:31 +09:00
Clemens Schwaighofer
a311552c56 Bug fixes for not initialized array calls 2020-05-29 06:30:53 +09:00
Clemens Schwaighofer
f694539a0b ignore switch with only default call 2020-05-11 08:46:01 +09:00
Clemens Schwaighofer
2f1388494f Remove standard js lib comments 2020-05-11 08:18:57 +09:00
Clemens Schwaighofer
06fe9657e2 Stub fo convert encoding string is actual source encoding check 2020-04-10 10:04:42 +09:00
Clemens Schwaighofer
d4e5f92277 Add DB/IO max loop override
The max query call loop checker can be set to any number, or overridden
with -1

call dbSetMaxQueryCall

on set with -1 will throw warning, if not larger than 0 will throw error

if called with null or empty, it will reset to default value

get current set value with dbGetMaxQueryCall
2020-04-08 17:30:40 +09:00
Clemens Schwaighofer
b2c0a57924 javascript hide overlay with auto hide if element id given 2020-03-30 09:10:43 +09:00
Clemens Schwaighofer
5522348c8a edit.js update
This is jquery only update

Add new overlay and action indicator for auto any overlay boxes.
Stack with GS_OB_S and min zIndex layer 10 and raise +1 for each new
show overlay call and lower for each hide call
2020-03-11 18:05:03 +09:00
Clemens Schwaighofer
ed01d248ec Minor updates for database base declare scripts 2020-03-06 15:28:32 +09:00
Clemens Schwaighofer
899ddc011c edit*js files update 2020-03-03 09:41:49 +09:00
Clemens Schwaighofer
a86eaf0f02 Add aelxar js method, fixes for core libs, edit base file
aelxar is like aelx but it uses an array and does not use objects
directly

fixed various possible empty array access issues in various core lib &
edit base files
2020-02-27 15:42:32 +09:00
Clemens Schwaighofer
3e29073664 phan config update 2020-02-17 14:52:49 +09:00
Clemens Schwaighofer
5601b14d5f DEFINE capital fix, JS action indicator fix, basic class date check fix
- captial DEFINE is now lower case
- indicator is visible check in javascript for showing indicator
- remove not needed overlay box 100% css, this is set in the stylesheet
anway
- Fix array pad missing in date compare functions in Basic class
2020-02-06 18:07:04 +09:00
Clemens Schwaighofer
a1afc1fb2e edit table add missing log overflow and update log partition function 2020-01-30 10:37:07 +09:00
Clemens Schwaighofer
d445bc3526 Database edit tables updates and fixes, remove all zero size index files 2020-01-29 13:50:25 +09:00
Clemens Schwaighofer
719d82d4ee Update missing order settings in database import order file 2020-01-28 11:07:12 +09:00
Clemens Schwaighofer
6807f33120 Update table layout construction files 2020-01-28 10:59:46 +09:00
Clemens Schwaighofer
114ca6c24a Update all isset()? to ??
All the old isset($var) ? $var : <other> have been changed to $var ??
<other>
2020-01-24 17:52:38 +09:00
Clemens Schwaighofer
e46d0fa4a4 Phan fixes with smarty class and file uploader class 2020-01-22 15:48:34 +09:00
Clemens Schwaighofer
f7db84c62f Minor fixes in corelibs 2020-01-22 15:14:25 +09:00
Clemens Schwaighofer
3267fc0266 Updates and fixes, remove .htaccess
Remove .htaccess file with php variable settings as this will not work
on FPM calls.
Various minor fixes in core libs

Basic lib debug output check is now a sub class so we can use this
everywhere without writing the whole if statement again

Basic lib has a dummy uniq id method added. Not yet finished
2020-01-22 14:55:23 +09:00
Clemens Schwaighofer
d9e13ae14c Updates and fixes to CoreLibs
- fixed all DEFINE to define in config* files
- Updates Login class with missing strict declarations
- some fixes in Login class for possible errors
- Basic class return array layout updates for all rgb sets plus correct
  static update
- Basic class timestamp method fix for not full set (eg missing seconds)
- Basic class add method for getting linecount from a file
- DB IO class gets a get settings return value method
2020-01-07 15:45:24 +09:00
Clemens Schwaighofer
50db770992 Move the convert config setting to config other
the convert constant setting for inmage magick is now in config.other as
it is no longer core

Also add the base Progress and functions perl modules for central
tagging.

We will add config.pm, import_functions.pm, layout.pm and a basic test
script later too
2019-12-11 18:02:42 +09:00
Clemens Schwaighofer
e439945a54 Add edit_base* with admin/frontend folder file listing
Before it only listed files in current directory. Because of the hard
split select from both.
Add hostname/folder input (optional) to prefix files outside the same
folder.

Note: If no hostname/folder is set and two files in admin and frontend
have the same name they will be both highlighted as the point to the
same place.
2019-12-11 16:08:00 +09:00
Clemens Schwaighofer
8223441ca9 Add Front folder for web fonts
The font folder is set in the layout folder for frontend and holds web
fonts.

There is a new symlink folder in the libs directory to match the FONT
folder name for backend fonts
2019-12-11 13:54:37 +09:00
Clemens Schwaighofer
0153c9721f Add missing return in CoreLibs Basic internal url parser
Just to fulfill check, is only used internal
2019-12-06 15:35:07 +09:00
Clemens Schwaighofer
b6f6eeac9b Update byteStringFormat with si units and bitwise mask
The old method name byteStringFormat is currently deprecated and it is
recommended to move to the new humanReadableByteFormat method.
Difference is that the new version uses a bitfield settings mask
BYTE_FORMAT_NOSPACE, BYTE_FORMAT_ADJUST, BYTE_FORMAT_SI
2019-12-06 15:29:06 +09:00
Clemens Schwaighofer
beedf629e5 Fixups for phan 2.4.4 run checks
Lines with @phan HACK comment are added to supress phan warnings, but do
actually no additional work.
On newer phan version those lines should be checked and removed if
needed
2019-12-05 16:01:44 +09:00
Clemens Schwaighofer
04b47574eb CoreLibs\Basic arrayDiff for full array diff
PHP array_diff only compares missing elements in the second and existing
in the first so a full diff is only achieved if compares both ways (a,b)
and (b,a)
This function uns a full compare and returns difference in an array
2019-12-04 12:12:43 +09:00
Clemens Schwaighofer
ecc52e2dbd Basic class if layout fixes 2019-11-28 15:44:39 +09:00
103 changed files with 4417 additions and 1671 deletions

View File

@@ -56,6 +56,7 @@ return [
"./www/configs/config.db.php", "./www/configs/config.db.php",
"./www/configs/config.host.php", "./www/configs/config.host.php",
"./www/configs/config.path.php", "./www/configs/config.path.php",
"./www/configs/config.other.php",
"./www/configs/config.master.php", "./www/configs/config.master.php",
"./www/includes/admin_header.php", "./www/includes/admin_header.php",
], ],
@@ -83,7 +84,7 @@ return [
// to parse, but not analyze // to parse, but not analyze
"exclude_analysis_directory_list" => [ "exclude_analysis_directory_list" => [
'www/vendor', 'www/vendor',
'www/lib/FileUpload', // 'www/lib/FileUpload',
'www/lib/pChart', 'www/lib/pChart',
'www/lib/pChart2.1.4', 'www/lib/pChart2.1.4',
'www/lib/Smarty', 'www/lib/Smarty',
@@ -108,6 +109,9 @@ return [
// ignore the old qq tests // ignore the old qq tests
'www/admin/qq_file_upload_front.php', 'www/admin/qq_file_upload_front.php',
'www/admin/qq_file_upload_ajax.php', 'www/admin/qq_file_upload_ajax.php',
// symlink ignore
'www/lib/smarty-3.1.30/SmartyBC.class.php',
'www/lib/htmlMimeMail-2.5.1/HtmlMimeMailCreate.php',
], ],
// what not to show as problem // what not to show as problem

View File

@@ -1,7 +1,10 @@
# functions # functions
function/update_function.sql function/set_uid.sql
function/set_generic.sql
function/random_string.sql function/random_string.sql
function/set_edit_generic.sql
function/edit_set_access_uid.sql function/edit_set_access_uid.sql
function/edit_log_partition_insert.sql
# generic tables # generic tables
table/edit_temp_files.sql table/edit_temp_files.sql
table/edit_generic.sql table/edit_generic.sql
@@ -19,6 +22,7 @@ table/edit_page_access.sql
table/edit_page_content.sql table/edit_page_content.sql
table/edit_user.sql table/edit_user.sql
table/edit_log.sql table/edit_log.sql
table/edit_log_overflow.sql
table/edit_access.sql table/edit_access.sql
table/edit_access_user.sql table/edit_access_user.sql
table/edit_access_data.sql table/edit_access_data.sql
@@ -27,9 +31,9 @@ trigger/trg_edit_access_right.sql
trigger/trg_edit_access.sql trigger/trg_edit_access.sql
trigger/trg_edit_access_data.sql trigger/trg_edit_access_data.sql
trigger/trg_edit_access_user.sql trigger/trg_edit_access_user.sql
trigger/trg_edit_generic.sql
trigger/trg_edit_group.sql trigger/trg_edit_group.sql
trigger/trg_edit_language.sql trigger/trg_edit_language.sql
trigger/trg_edit_log_overflow.sql
trigger/trg_edit_log.sql trigger/trg_edit_log.sql
trigger/trg_edit_page_access.sql trigger/trg_edit_page_access.sql
trigger/trg_edit_page_content.sql trigger/trg_edit_page_content.sql
@@ -39,6 +43,5 @@ trigger/trg_edit_scheme.sql
trigger/trg_edit_user.sql trigger/trg_edit_user.sql
trigger/trg_edit_visible_group.sql trigger/trg_edit_visible_group.sql
trigger/trg_edit_menu_group.sql trigger/trg_edit_menu_group.sql
trigger/trg_set_edit_access_uid.sql
# insert data # insert data
data/edit_tables.sql data/edit_tables.sql

View File

@@ -15,22 +15,20 @@ function_name="set_generic";
#sql_path_prep=`echo $sql_path | sed -e "s/\///g"`; #sql_path_prep=`echo $sql_path | sed -e "s/\///g"`;
# goes for each file and strips headers and endings, and creates trigger name # goes for each file and strips headers and endings, and creates trigger name
for name in $sql_path*; for name in $sql_path*; do
do
echo "Wokring on $name"; echo "Wokring on $name";
# strip ending # strip ending
# t_name=`echo $name | sed -e 's/.sql$//g' | sed -e "s/^$sql_path_prep//g" | sed -e 's/\///g'`; # t_name=`echo $name | sed -e 's/.sql$//g' | sed -e "s/^$sql_path_prep//g" | sed -e 's/\///g'`;
t_name=`echo $name | sed -e 's/^.*\///g' | sed -e 's/.sql$//g'`; t_name=`echo $name | sed -e 's/^.*\///g' | sed -e 's/.sql$//g'`;
# clean all beginnings # clean all beginnings
for prefix in $file_prefix; for prefix in $file_prefix; do
do
prefix=$prefix"_"; prefix=$prefix"_";
t_name=`echo $t_name | sed -e "s/\$prefix//g"`; t_name=`echo $t_name | sed -e "s/\$prefix//g"`;
done; done;
# those tables don't need a trigger # those tables don't need a trigger
# edit_generic # edit_generic
# generic # generic
# copy the trigger template to the target # copy the trigger template to the target
trg_filename=$trigger_path$trigger_prefix"_"$t_name".sql"; trg_filename=$trigger_path$trigger_prefix"_"$t_name".sql";

View File

@@ -14,17 +14,14 @@ file_prefix="trg";
trigger_prefix="trg"; trigger_prefix="trg";
index_prefix="idx"; index_prefix="idx";
for file in `cat ORDER`; for file in `cat ORDER`; do
do if [ -f $file ]; then
if [ -f $file ];
then
# write them into a var, so we can re order them in the other way # write them into a var, so we can re order them in the other way
new_order=$file" "$new_order; new_order=$file" "$new_order;
fi; fi;
done; done;
for file in $new_order; for file in $new_order; do
do
sqltype=`echo $file | egrep "table/"`; sqltype=`echo $file | egrep "table/"`;
trgtype=`echo $file | egrep "trigger/"`; trgtype=`echo $file | egrep "trigger/"`;
idxtype=`echo $file | egrep "index/"`; idxtype=`echo $file | egrep "index/"`;
@@ -32,43 +29,34 @@ do
datatype=`echo $file | egrep "data/"`; datatype=`echo $file | egrep "data/"`;
# remove all around to get table name # remove all around to get table name
t_file=`echo $file | sed -e 's/^.*\///g' | sed -e 's/.sql$//g'`; t_file=`echo $file | sed -e 's/^.*\///g' | sed -e 's/.sql$//g'`;
for prefix in $file_prefix; for prefix in $file_prefix; do
do
prefix=$prefix"_"; prefix=$prefix"_";
t_file=`echo $t_file | sed -e "s/\$prefix//g"`; t_file=`echo $t_file | sed -e "s/\$prefix//g"`;
done; done;
# copy the trigger template to the target # copy the trigger template to the target
for path in $schema; for path in $schemas; do
do if [ $sqltype ]; then
if [ $sqltype ];
then
echo "SQL "$path"."$t_file; echo "SQL "$path"."$t_file;
echo "DROP TABLE "$path"."$t_file" CASCADE;" | psql -U $user -h $host $db echo "DROP TABLE "$path"."$t_file" CASCADE;" | psql -U $user -h $host $db
fi; fi;
if [ $trgtype ]; if [ $trgtype ]; then
then
trigger=$trigger_prefix"_"$t_file; trigger=$trigger_prefix"_"$t_file;
echo "TRG $trigger TBL "$path".$t_file"; echo "TRG $trigger TBL "$path".$t_file";
echo "DROP TRIGGER "$path".$trigger ON "$t_file" CASCADE;" | psql -U $user -h $host $db echo "DROP TRIGGER "$path".$trigger ON "$t_file" CASCADE;" | psql -U $user -h $host $db
fi; fi;
if [ $fcttype ]; if [ $fcttype ]; then
then
echo "FCT "$path"."$t_file; echo "FCT "$path"."$t_file;
echo "DROP FUNCTION "$path"."$t_file"();" | psql -U $user -h $host $db echo "DROP FUNCTION "$path"."$t_file"();" | psql -U $user -h $host $db
fi; fi;
if [ $idxtype ]; if [ $idxtype ]; then
then
index=$index_prefix"_"$t_file; index=$index_prefix"_"$t_file;
# echo "IDX "$t_file; # echo "IDX "$t_file;
# echo "DROP INDEX $index ON $t_file;" | psql -U $user -h $host $db # echo "DROP INDEX $index ON $t_file;" | psql -U $user -h $host $db
fi; fi;
if [ $datatype ]; if [ $datatype ]; then
then
echo "DATA "$t_file; echo "DATA "$t_file;
# echo "DROP FUNCTION "$t_file"();" | psql -U $user -h $host $db # echo "DROP FUNCTION "$t_file"();" | psql -U $user -h $host $db
fi; fi;
# psql -U cms_user -h 192.168.12.14 -f $file CMSv2
done; done;
done; done;

View File

@@ -1,3 +1,10 @@
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2018-07-17
-- DESCRIPTION:
-- partition the edit_log table by year
-- auto creates table if missing, if failure writes to overflow table
-- HISTORY:
CREATE OR REPLACE FUNCTION edit_log_insert_trigger () CREATE OR REPLACE FUNCTION edit_log_insert_trigger ()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
@@ -6,18 +13,23 @@ DECLARE
end_date DATE; end_date DATE;
timeformat TEXT := 'YYYY'; timeformat TEXT := 'YYYY';
selector TEXT := 'year'; selector TEXT := 'year';
_interval INTERVAL; base_table TEXT := 'edit_log';
_interval INTERVAL := '1 ' || selector;
_interval_next INTERVAL := '2 ' || selector;
table_name TEXT; table_name TEXT;
-- compare date column
compare_date DATE := NEW.event_date;
compare_date_name TEXT := 'event_date';
-- the create commands
command_create_table TEXT := 'CREATE TABLE IF NOT EXISTS {TABLE_NAME} (CHECK({COMPARE_DATE_NAME} >= {START_DATE} AND {COMPARE_DATE_NAME} < {END_DATE})) INHERITS ({BASE_NAME})';
command_create_primary_key TEXT := 'ALTER TABLE {TABLE_NAME} ADD PRIMARY KEY ({BASE_TABLE}_id)';
command_create_foreign_key_1 TEXT := 'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT {TABLE_NAME}_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL';
command_create_trigger_1 TEXT = 'CREATE TRIGGER trg_{TABLE_NAME} BEFORE INSERT OR UPDATE ON {TABLE_NAME} FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()';
BEGIN BEGIN
-- get year and month from edit_log date so we can build the target edit_log table
-- move interval
_interval := '1 ' || selector;
-- current table name
table_name := 'edit_log_' || to_char(NEW.event_date, timeformat);
-- we are in valid start time area -- we are in valid start time area
IF (NEW.event_date >= start_date) THEN IF (NEW.event_date >= start_date) THEN
-- current table name
table_name := base_table || '_' || to_char(NEW.event_date, timeformat);
BEGIN BEGIN
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW; EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
-- if insert failed because of missing table, create new below -- if insert failed because of missing table, create new below
@@ -25,17 +37,45 @@ BEGIN
WHEN undefined_table THEN WHEN undefined_table THEN
-- another block, so in case the creation fails here too -- another block, so in case the creation fails here too
BEGIN BEGIN
-- create new talbe here + all indexes -- create new table here + all indexes
start_date := date_trunc(selector, NEW.event_date); start_date := date_trunc(selector, NEW.event_date);
end_date := date_trunc(selector, NEW.event_date + _interval); end_date := date_trunc(selector, NEW.event_date + _interval);
-- creat table -- creat table
EXECUTE 'CREATE TABLE IF NOT EXISTS ' || quote_ident(table_name) || ' ( CHECK ( event_date >= ' || quote_literal(start_date) || ' AND event_date < ' || quote_literal(end_date) || ' ) ) INHERITS (edit_log)'; EXECUTE format(REPLACE( -- end date
REPLACE( -- start date
REPLACE( -- compare date name
REPLACE( -- base name (inherit)
REPLACE( -- table name
command_create_table,
'{TABLE_NAME}',
table_name
),
'{BASE_NAME}',
base_table
),
'{COMPARE_DATE_NAME}',
compare_date_name
),
'{START_DATE}',
quote_literal(start_date)
),
'{END_DATE}',
quote_literal(end_date)
));
-- create all indexes and triggers -- create all indexes and triggers
EXECUTE 'ALTER TABLE ' || quote_ident(table_name) || ' ADD PRIMARY KEY (edit_log_id)'; EXECUTE format(REPLACE(
REPLACE(
command_create_primary_key,
'{TABLE_NAME}',
table_name
),
'{BASE_TABLE}',
base_table
));
-- FK constraints -- FK constraints
EXECUTE 'ALTER TABLE ' || quote_ident(table_name) || ' ADD CONSTRAINT fk_' || quote_ident(table_name) || '_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE CASCADE'; EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
-- generic trigger -- generic trigger
EXECUTE 'CREATE TRIGGER trg_' || quote_ident(table_name) || ' BEFORE INSERT OR UPDATE ON ' || quote_ident(table_name) || ' FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()'; EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
-- insert try again -- insert try again
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW; EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
@@ -49,6 +89,57 @@ BEGIN
-- if this faled, throw it into the overflow table (so we don't loose anything) -- if this faled, throw it into the overflow table (so we don't loose anything)
INSERT INTO edit_log_overflow VALUES (NEW.*); INSERT INTO edit_log_overflow VALUES (NEW.*);
END; END;
-- main insert run done, check if we have to create next months table
BEGIN
-- check if next month table exists
table_name := base_table || '_' || to_char((SELECT NEW.event_date + _interval)::DATE, timeformat);
-- RAISE NOTICE 'SEARCH NEXT: %', table_name;
IF (SELECT to_regclass(table_name)) IS NULL THEN
-- move inner interval same
start_date := date_trunc(selector, NEW.event_date + _interval);
end_date := date_trunc(selector, NEW.event_date + _interval_next);
-- RAISE NOTICE 'CREATE NEXT: %', table_name;
-- create table
EXECUTE format(REPLACE( -- end date
REPLACE( -- start date
REPLACE( -- compare date name
REPLACE( -- base name (inherit)
REPLACE( -- table name
command_create_table,
'{TABLE_NAME}',
table_name
),
'{BASE_NAME}',
base_table
),
'{COMPARE_DATE_NAME}',
compare_date_name
),
'{START_DATE}',
quote_literal(start_date)
),
'{END_DATE}',
quote_literal(end_date)
));
-- create all indexes and triggers
EXECUTE format(REPLACE(
REPLACE(
command_create_primary_key,
'{TABLE_NAME}',
table_name
),
'{BASE_TABLE}',
base_table
));
-- FK constraints
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
-- generic trigger
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
END IF;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Failed to create next table: %', table_name;
END;
ELSE ELSE
-- if outside valid date, insert into overflow -- if outside valid date, insert into overflow
INSERT INTO edit_log_overflow VALUES (NEW.*); INSERT INTO edit_log_overflow VALUES (NEW.*);

View File

@@ -0,0 +1,28 @@
-- add uid add for edit_group table
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
$$
DECLARE
myrec RECORD;
v_uid VARCHAR;
BEGIN
-- skip if NEW.name is not set
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
-- use NEW.name as base, remove all spaces
-- name data is already unique, so we do not need to worry about this here
v_uid := REPLACE(NEW.name, ' ', '');
IF TG_OP = 'INSERT' THEN
-- always set
NEW.uid := v_uid;
ELSIF TG_OP = 'UPDATE' THEN
-- check if not set, then set
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
IF FOUND THEN
NEW.uid := v_uid;
END IF;
END IF;
END IF;
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

0
4dev/database/function/random_string.sql Executable file → Normal file
View File

2
4dev/database/function/set_uid.sql Executable file → Normal file
View File

@@ -2,7 +2,7 @@
CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS ' CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS '
DECLARE DECLARE
random_length INT = 12; -- that should be long enough random_length INT = 32; -- that should be long enough
BEGIN BEGIN
IF TG_OP = ''INSERT'' THEN IF TG_OP = ''INSERT'' THEN
NEW.uid := random_string(random_length); NEW.uid := random_string(random_length);

View File

@@ -1,14 +1,16 @@
-- adds the created or updated date tags -- adds the created or updated date tags
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS ' -- OLD, DEPRECATED, use set_generic.sql
BEGIN
IF TG_OP = ''INSERT'' THEN -- CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
NEW.date_created := clock_timestamp(); -- BEGIN
NEW.user_created := current_user; -- IF TG_OP = ''INSERT'' THEN
ELSIF TG_OP = ''UPDATE'' THEN -- NEW.date_created := clock_timestamp();
NEW.date_updated := clock_timestamp(); -- NEW.user_created := current_user;
NEW.user_updated := current_user; -- ELSIF TG_OP = ''UPDATE'' THEN
END IF; -- NEW.date_updated := clock_timestamp();
RETURN NEW; -- NEW.user_updated := current_user;
END; -- END IF;
' LANGUAGE 'plpgsql'; -- RETURN NEW;
-- END;
-- ' LANGUAGE 'plpgsql';

2
4dev/database/log/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -8,12 +8,12 @@
-- DROP TABLE edit_access; -- DROP TABLE edit_access;
CREATE TABLE edit_access ( CREATE TABLE edit_access (
edit_access_id SERIAL PRIMARY KEY, edit_access_id SERIAL PRIMARY KEY,
enabled SMALLINT NOT NULL DEFAULT 0,
protected SMALLINT DEFAULT 0,
deleted SMALLINT DEFAULT 0,
uid VARCHAR,
name VARCHAR UNIQUE, name VARCHAR UNIQUE,
description VARCHAR, description VARCHAR,
color VARCHAR, color VARCHAR,
uid VARCHAR,
enabled SMALLINT NOT NULL DEFAULT 0,
protected INT,
deleted SMALLINT DEFAULT 0,
additional_acl JSONB additional_acl JSONB
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -9,8 +9,8 @@
CREATE TABLE edit_access_data ( CREATE TABLE edit_access_data (
edit_access_data_id SERIAL PRIMARY KEY, edit_access_data_id SERIAL PRIMARY KEY,
edit_access_id INT NOT NULL, edit_access_id INT NOT NULL,
name VARCHAR, FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
value VARCHAR,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE name VARCHAR,
value VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,12 +8,12 @@
-- DROP TABLE edit_access_user; -- DROP TABLE edit_access_user;
CREATE TABLE edit_access_user ( CREATE TABLE edit_access_user (
edit_access_user_id SERIAL PRIMARY KEY, edit_access_user_id SERIAL PRIMARY KEY,
edit_default SMALLINT DEFAULT 0,
edit_access_id INT NOT NULL, edit_access_id INT NOT NULL,
edit_user_id INT NOT NULL,
edit_access_right_id INT NOT NULL,
enabled SMALLINT NOT NULL DEFAULT 0,
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_user_id INT NOT NULL,
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_default SMALLINT DEFAULT 0,
enabled SMALLINT NOT NULL DEFAULT 0
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,12 +8,13 @@
-- DROP TABLE edit_group; -- DROP TABLE edit_group;
CREATE TABLE edit_group ( CREATE TABLE edit_group (
edit_group_id SERIAL PRIMARY KEY, edit_group_id SERIAL PRIMARY KEY,
name VARCHAR, edit_scheme_id INT,
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
deleted SMALLINT DEFAULT 0, deleted SMALLINT DEFAULT 0,
edit_scheme_id INT, uid VARCHAR,
edit_access_right_id INT NOT NULL, name VARCHAR,
additional_acl JSONB, additional_acl JSONB
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -9,10 +9,10 @@
-- DROP TABLE edit_language; -- DROP TABLE edit_language;
CREATE TABLE edit_language ( CREATE TABLE edit_language (
edit_language_id SERIAL PRIMARY KEY, edit_language_id SERIAL PRIMARY KEY,
short_name VARCHAR,
long_name VARCHAR,
iso_name VARCHAR,
order_number INT,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
lang_default SMALLINT NOT NULL DEFAULT 0 lang_default SMALLINT NOT NULL DEFAULT 0,
long_name VARCHAR,
short_name VARCHAR,
iso_name VARCHAR,
order_number INT
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,6 +8,8 @@
-- DROP TABLE edit_log; -- DROP TABLE edit_log;
CREATE TABLE edit_log ( CREATE TABLE edit_log (
edit_log_id SERIAL PRIMARY KEY, edit_log_id SERIAL PRIMARY KEY,
euid INT, -- this is a foreign key, but I don't nedd to reference to it
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
username VARCHAR, username VARCHAR,
password VARCHAR, password VARCHAR,
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP, event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
@@ -26,7 +28,6 @@ CREATE TABLE edit_log (
action_value VARCHAR, action_value VARCHAR,
action_type VARCHAR, action_type VARCHAR,
action_error VARCHAR, action_error VARCHAR,
euid INT, -- this is a foreign key, but I don't nedd to reference to it
user_agent VARCHAR, user_agent VARCHAR,
referer VARCHAR, referer VARCHAR,
script_name VARCHAR, script_name VARCHAR,
@@ -36,6 +37,5 @@ CREATE TABLE edit_log (
http_accept VARCHAR, http_accept VARCHAR,
http_accept_charset VARCHAR, http_accept_charset VARCHAR,
http_accept_encoding VARCHAR, http_accept_encoding VARCHAR,
session_id VARCHAR, session_id VARCHAR
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -0,0 +1,12 @@
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2020/1/28
-- DESCRIPTION:
-- edit log overflow table
-- this is the overflow table for partition
-- TABLE: edit_log_overflow
-- HISTORY:
-- DROP TABLE edit_log_overflow;
CREATE TABLE IF NOT EXISTS edit_log_overflow () INHERITS (edit_log);
ALTER TABLE edit_log_overflow ADD PRIMARY KEY (edit_log_id);
ALTER TABLE edit_log_overflow ADD CONSTRAINT edit_log_overflow_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL;

View File

@@ -9,6 +9,7 @@
CREATE TABLE edit_page ( CREATE TABLE edit_page (
edit_page_id SERIAL PRIMARY KEY, edit_page_id SERIAL PRIMARY KEY,
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
filename VARCHAR, filename VARCHAR,
name VARCHAR UNIQUE, name VARCHAR UNIQUE,
order_number INT NOT NULL, order_number INT NOT NULL,
@@ -17,5 +18,5 @@ CREATE TABLE edit_page (
popup SMALLINT NOT NULL DEFAULT 0, popup SMALLINT NOT NULL DEFAULT 0,
popup_x SMALLINT, popup_x SMALLINT,
popup_y SMALLINT, popup_y SMALLINT,
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE, hostname VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,13 +8,13 @@
-- DROP TABLE edit_page_access; -- DROP TABLE edit_page_access;
CREATE TABLE edit_page_access ( CREATE TABLE edit_page_access (
edit_page_access_id SERIAL PRIMARY KEY, edit_page_access_id SERIAL PRIMARY KEY,
enabled SMALLINT NOT NULL DEFAULT 0,
edit_group_id INT NOT NULL, edit_group_id INT NOT NULL,
edit_page_id INT NOT NULL,
edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
enabled SMALLINT NOT NULL DEFAULT 0
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

10
4dev/database/table/edit_page_content.sql Executable file → Normal file
View File

@@ -10,11 +10,11 @@
CREATE TABLE edit_page_content ( CREATE TABLE edit_page_content (
edit_page_content_id SERIAL PRIMARY KEY, edit_page_content_id SERIAL PRIMARY KEY,
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL, edit_access_right_id INT NOT NULL,
name VARCHAR,
uid VARCHAR UNIQUE,
order_number INT NOT NULL,
online SMALLINT NOT NULL DEFAULT 0,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE uid VARCHAR UNIQUE,
name VARCHAR,
order_number INT NOT NULL,
online SMALLINT NOT NULL DEFAULT 0
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,7 +8,7 @@
-- DROP TABLE edit_page_menu_group; -- DROP TABLE edit_page_menu_group;
CREATE TABLE edit_page_menu_group ( CREATE TABLE edit_page_menu_group (
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
edit_menu_group_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_menu_group_id INT NOT NULL,
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
); );

View File

@@ -8,7 +8,7 @@
-- DROP TABLE edit_page_visible_group; -- DROP TABLE edit_page_visible_group;
CREATE TABLE edit_page_visible_group ( CREATE TABLE edit_page_visible_group (
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
edit_visible_group_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_visible_group_id INT NOT NULL,
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
); );

View File

@@ -8,10 +8,10 @@
-- DROP TABLE edit_query_string; -- DROP TABLE edit_query_string;
CREATE TABLE edit_query_string ( CREATE TABLE edit_query_string (
edit_query_string_id SERIAL PRIMARY KEY, edit_query_string_id SERIAL PRIMARY KEY,
edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
enabled SMALLINT NOT NULL DEFAULT 0,
name VARCHAR, name VARCHAR,
value VARCHAR, value VARCHAR,
enabled SMALLINT NOT NULL DEFAULT 0, dynamic SMALLINT NOT NULL DEFAULT 0
dynamic SMALLINT NOT NULL DEFAULT 0,
edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,5 +7,6 @@
-- DROP TABLE temp_files; -- DROP TABLE temp_files;
CREATE TABLE temp_files ( CREATE TABLE temp_files (
filename VARCHAR filename VARCHAR,
folder VARCHAR
); );

View File

@@ -9,34 +9,40 @@
CREATE TABLE edit_user ( CREATE TABLE edit_user (
edit_user_id SERIAL PRIMARY KEY, edit_user_id SERIAL PRIMARY KEY,
connect_edit_user_id INT, -- possible reference to other user connect_edit_user_id INT, -- possible reference to other user
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_language_id INT NOT NULL,
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_group_id INT NOT NULL,
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_scheme_id INT,
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL,
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 VARCHAR UNIQUE, username VARCHAR UNIQUE,
password VARCHAR, password VARCHAR,
first_name VARCHAR, first_name VARCHAR,
last_name VARCHAR, last_name VARCHAR,
first_name_furigana VARCHAR, first_name_furigana VARCHAR,
last_name_furigana VARCHAR, last_name_furigana VARCHAR,
enabled SMALLINT NOT NULL DEFAULT 0,
deleted SMALLINT NOT NULL DEFAULT 0,
debug SMALLINT NOT NULL DEFAULT 0, debug SMALLINT NOT NULL DEFAULT 0,
db_debug SMALLINT NOT NULL DEFAULT 0, db_debug SMALLINT NOT NULL DEFAULT 0,
email VARCHAR, email VARCHAR,
protected SMALLINT NOT NULL DEFAULT 0, protected SMALLINT NOT NULL DEFAULT 0,
admin SMALLINT NOT NULL DEFAULT 0, admin SMALLINT NOT NULL DEFAULT 0,
edit_language_id INT NOT NULL, last_login TIMESTAMP WITHOUT TIME ZONE,
edit_group_id INT NOT NULL, login_error_count INT DEFAULT 0,
edit_scheme_id INT,
edit_access_right_id INT NOT NULL,
login_error_count INT,
login_error_date_last TIMESTAMP WITHOUT TIME ZONE, login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
login_error_date_first TIMESTAMP WITHOUT TIME ZONE, login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
strict SMALLINT DEFAULT 0, strict SMALLINT DEFAULT 0,
locked SMALLINT DEFAULT 0, locked SMALLINT DEFAULT 0,
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
additional_acl JSONB, -- additional ACL as JSON string (can be set by other pages) password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, password_reset_uid VARCHAR, -- the uid to access the password reset page
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid';

View File

@@ -11,7 +11,3 @@ CREATE TABLE edit_visible_group (
name VARCHAR, name VARCHAR,
flag VARCHAR flag VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;
DELETE FROM edit_visible_group;
INSERT INTO edit_visible_group (name, flag) VALUES ('Main Menu', 'main');
INSERT INTO edit_visible_group (name, flag) VALUES ('Data popup Menu', 'datapopup');

View File

@@ -1,9 +1,9 @@
DROP TRIGGER trg_edit_access ON edit_access; DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
CREATE TRIGGER trg_edit_access CREATE TRIGGER trg_edit_access
BEFORE INSERT OR UPDATE ON edit_access BEFORE INSERT OR UPDATE ON edit_access
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
DROP TRIGGER 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 CREATE TRIGGER trg_set_edit_access_uid
BEFORE INSERT OR UPDATE ON edit_access BEFORE INSERT OR UPDATE ON edit_access
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid(); FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_access_data
BEFORE INSERT OR UPDATE ON edit_access_data BEFORE INSERT OR UPDATE ON edit_access_data
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_access_right
BEFORE INSERT OR UPDATE ON edit_access_right BEFORE INSERT OR UPDATE ON edit_access_right
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_access_user
BEFORE INSERT OR UPDATE ON edit_access_user BEFORE INSERT OR UPDATE ON edit_access_user
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,9 @@
DROP TRIGGER trg_edit_group ON edit_group; DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
CREATE TRIGGER trg_edit_group CREATE TRIGGER trg_edit_group
BEFORE INSERT OR UPDATE ON edit_group BEFORE INSERT OR UPDATE ON edit_group
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group;
CREATE TRIGGER trg_set_edit_group_uid
BEFORE INSERT OR UPDATE ON edit_group
FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER trg_edit_language ON edit_language; DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
CREATE TRIGGER trg_edit_language CREATE TRIGGER trg_edit_language
BEFORE INSERT OR UPDATE ON edit_language BEFORE INSERT OR UPDATE ON edit_language
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,9 +1,9 @@
DROP TRIGGER trg_edit_log ON edit_log; DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
CREATE TRIGGER trg_edit_log CREATE TRIGGER trg_edit_log
BEFORE INSERT OR UPDATE ON edit_log BEFORE INSERT OR UPDATE ON edit_log
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
DROP TRIGGER 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 CREATE TRIGGER trg_edit_log_insert_partition
BEFORE INSERT OR UPDATE ON edit_log BEFORE INSERT OR UPDATE ON edit_log
FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger(); FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger();

View File

@@ -0,0 +1,4 @@
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();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_menu_group
BEFORE INSERT OR UPDATE ON edit_menu_group BEFORE INSERT OR UPDATE ON edit_menu_group
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER trg_edit_page ON edit_page; DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
CREATE TRIGGER trg_edit_page CREATE TRIGGER trg_edit_page
BEFORE INSERT OR UPDATE ON edit_page BEFORE INSERT OR UPDATE ON edit_page
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_page_access
BEFORE INSERT OR UPDATE ON edit_page_access BEFORE INSERT OR UPDATE ON edit_page_access
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

2
4dev/database/trigger/trg_edit_page_content.sql Executable file → Normal file
View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_page_content
BEFORE INSERT OR UPDATE ON edit_page_content BEFORE INSERT OR UPDATE ON edit_page_content
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_query_string
BEFORE INSERT OR UPDATE ON edit_query_string BEFORE INSERT OR UPDATE ON edit_query_string
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER trg_edit_scheme ON edit_scheme; DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
CREATE TRIGGER trg_edit_scheme CREATE TRIGGER trg_edit_scheme
BEFORE INSERT OR UPDATE ON edit_scheme BEFORE INSERT OR UPDATE ON edit_scheme
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER trg_edit_user ON edit_user; DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
CREATE TRIGGER trg_edit_user CREATE TRIGGER trg_edit_user
BEFORE INSERT OR UPDATE ON edit_user BEFORE INSERT OR UPDATE ON edit_user
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER 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 CREATE TRIGGER trg_edit_visible_group
BEFORE INSERT OR UPDATE ON edit_visible_group BEFORE INSERT OR UPDATE ON edit_visible_group
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();

View File

@@ -0,0 +1,14 @@
-- update missing edit_* table data
ALTER TABLE edit_generic ADD cuid VARCHAR;
ALTER TABLE edit_access ADD enabled SMALLINT DEFAULT 0;
ALTER TABLE edit_access ADD protected SMALLINT DEFAULT 0;
ALTER TABLE edit_group ADD uid VARCHAR;
ALTER TABLE edit_group ADD deleted SMALLINT DEFAULT 0;
ALTER TABLE temp_files ADD folder VARCHAR;
ALTER TABLE edit_page ADD hostname VARCHAR;
ALTER TABLE edit_user ADD deleted SMALLINT DEFAULT 0;

0
4dev/database/update/edit_update_missing_cuid.sql Executable file → Normal file
View File

View File

@@ -88,3 +88,5 @@ UPDATE edit_query_string SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_scheme SET cuid = random_string(12) WHERE cuid IS NULL; UPDATE edit_scheme SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_user SET cuid = random_string(12) WHERE cuid IS NULL; UPDATE edit_user SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_visible_group SET cuid = random_string(12) WHERE cuid IS NULL; UPDATE edit_visible_group SET cuid = random_string(12) WHERE cuid IS NULL;
-- update all triggers

498
bin/Progress.pm Normal file
View File

@@ -0,0 +1,498 @@
package Progress;
# AUTHOR: Clemens Schwaighofer
# DATE CREATED: 2009/6/16
# DESCRIPTION: progress percent class
# METHODS
# * init
# my $prg = Progress->new();
# will init a new progress class in the var $prg
# the following parameters can be set directly during a new call
# - verbose (1/0)
# - precision (-1~10)
# - wide_time (0/1)
# - microtime (0/1)
# setting is done via
# my $prg = Progress->new(verbose => 1, microtime = 1);
# * setting methods
# verbose($level int)
# $level has to be int, if not set there is no output show, at least 1 has to be given to see visible output
# precision($decimals int)
# $decimals has to be int, if set to -1 then the steps are done in 10 increase, else it sets how many decimals are visible, 0 for no decimals
# wide_time(0/1 int)
# sets the flag for wide time, if set to 1 the estimated time to end and time run is left prefixed with 15 chars
# microtime(0/1 int)
# sets the flag to always show microtime (1) or only if the previous time was the same (0)
# reset()
# resets all the internal vars for another new run
# SetStartTime(optional timestamp)
# sets the start times for this progress run, the overall start/end time is set, and the time used for the actual progress
# in case there is some processing done before the run starts, it is highly recommended to call SetETAStartTime before the actual processing starts
# if no timestamp is given, internal timestamp is used (this is recommended)
# SetETAStartTime(optional timestamp)
# only sets the start/end time for the actual "estimated time" calculation. It is recommended to call this right before the processing loop starts
# eg if there is a big query running that takes a lot of time, this method should be called before the reading loop
# as with SetStartTime a timestamp can be given, if not then the internal timestamp is used (this is recommended)
# SetEndTime(optional timestamp)
# sets the end time for the overall processing. This should be called at the very end of the script before any final stat data is printed
# linecount($lines int)
# sets the maximum lines that will be processed, used for percentage calculation. If non int is given, will set to 1. This will be only set once, to
# reset used reset() method.
# Either this or filesize NEED to be set
# filesize($bytes int)
# filesize in bytes, if non valid data is given, then it is set to 1.
# filesize() and linecount() can both be set, but at least one of them has to be set.
# if filesize is set a byte data output is added, if only linecount is given, only the linecount output will be given (no bytes per second, etc)
# ShowPosition(optional current byte position int)
# this is the main processing and has to be called at the end of the loop where the data is processed. If no bytes are given the internal counter (linecount)
# is used.
# for bytes it is recommended to use IO::File and $FH->tell to pass on the bytes
#
# VARIABLES
# * internal set
# change: flagged 1 if output is given or would be given. can be used for any post processing after the ShowPosition is called
# precision_ten_step: flagged 1 if the precision was set to -1
# start: overall start time
# end: overall end time
# count: count of processed lines
# [TODO: describe the others too, at the moment only below in %fields]
use strict;
use warnings;
use utf8;
BEGIN {
use POSIX;
use Carp;
use Time::HiRes qw(time);
use File::Basename;
use Number::Format qw(format_number);
use vars qw($AUTOLOAD);
push(@INC, File::Basename::dirname($0).'/');
}
# important includes
use functions;
# variable declarationf or access
# * can be set
# = only for read
# unmarked are internal only, but can be read if they are needed in further processing in the script
my %fields = (
linecount => 0, # * max lines in input
filesize => 0, # * max file size
precision => 1, # * comma after percent
wide_time => 0, # * if flagged 1, then the wide 15 char left bound format is used
verbose => 0, # * verbose status from outside
microtime => 0, # * microtime output for last run time (1 for enable, 0 for auto, -1 for disable)
change => 0, # = flag if output was given
start => undef, # = global start for the full script running time
start_run => undef, # = for the eta time, can be set after a query or long read in, to not create a wrong ETA time
start_time => undef, # loop start
end => undef, # = global end
end_time => undef, # loop end
count_size => undef, # = filesize current
count => 0, # = position current
current_count => 0, # last count (position)
lines_processed => 0, # lines processed in the last run
last_group => 0, # time in seconds for the last group run (until percent change)
lines_in_last_group => 0, # float value, lines processed per second to the last group run
lines_in_global => 0, # float values, lines processed per second to complete run
bytes_in_last_group => 0, # flaot value, bytes processes per second in the last group run
bytes_in_global => 0, # float value, bytes processed per second to complete run
size_in_last_group => 0, # bytes processed in last run (in bytes)
current_size => 0, # current file position (size)
last_percent => 0, # last percent position
precision_ten_step => 0, # if we have normal % or in steps of 10
percent_print => 5, # the default size, this is precision + 4
percent_precision => 1, # this is 1 if it is 1 or 0 for precision, or precision size
eta => undef, # estimated time to finish
full_time_needed => undef, # run time since start
lg_microtime => 0 # last group microtime, this is auto set during process.
);
# class init
sub new
{
my $proto = shift;
my $class = ref($proto) || $proto;
my %data = @_;
my $self = {
_permitted => \%fields,
%fields,
};
# vars to init
bless ($self, $class);
if ($data{'verbose'} && $data{'verbose'} =~ /^\d{1}$/) {
$self->{verbose} = $data{'verbose'};
}
if (exists($data{'precision'}) && (($data{'precision'} || $data{'precision'} == 0) && $data{'precision'} =~ /^\-?\d{1,2}$/)) {
$self->precision($data{'precision'});
}
if ($data{'microtime'} && $data{'microtime'} =~ /^(0|1)$/) {
$self->microtime($data{'microtime'});
}
if ($data{'wide_time'} && $data{'wide_time'} =~ /^(0|1)$/) {
$self->wide_time($data{'wide_time'});
}
return $self;
}
# auto load for vars
sub AUTOLOAD
{
my $self = shift;
my $type = ref($self) || croak "$self is not an object";
my $name = $AUTOLOAD;
$name =~ s/.*://;
unless (exists $self->{_permitted}->{$name}) {
croak "Can't access '$name' field in class $type";
}
if (@_) {
return $self->{$name} = shift;
} else {
return $self->{$name};
}
}
# destructor
sub DESTROY
{
# do nothing, there is nothing to close or finish
}
# SUB: reset
# PARAMS: none
# DESC: resets all the current counters only and current start times
sub reset
{
my $self = shift;
# reset what always gets reset
$self->{count} = 0;
$self->{count_size} = undef;
$self->{current_count} = 0;
$self->{linecount} = 0;
$self->{lines_processed} = 0;
$self->{last_group} = 0;
$self->{lines_in_last_group} = 0;
$self->{lines_in_global} = 0;
$self->{bytes_in_last_group} = 0;
$self->{bytes_in_global} = 0;
$self->{size_in_last_group} = 0;
$self->{filesize} = 0;
$self->{current_size} = 0;
$self->{last_percent} = 0;
$self->{eta} = 0;
$self->{full_time_needed} = 0;
$self->{start_run} = undef;
$self->{start_time} = undef;
$self->{end_time} = undef;
}
# SUB: microtime
# PARAMS: 1/0
# DESC: flag to set microtime on or off in the time output
# if not 1 or 0, set to 0
sub microtime
{
my $self = shift;
my $microtime;
if (@_) {
$microtime = shift;
if ($microtime == 1 || $microtime == 0) {
$self->{microtime} = $microtime;
} else {
$self->{microtime} = 0;
}
}
return $self->{microtime};
}
# SUB: wide_time
# PARAMS: 1/0
# DESC: flag to set wide_time (15 char spacer).
# if not 1 or 0, set to 0
sub wide_time
{
my $self = shift;
my $wide;
if (@_) {
$wide = shift;
if ($wide == 1 || $wide == 0) {
$self->{wide_time} = $wide;
} else {
$self->{wide_time} = 0;
}
}
return $self->{wide_time};
}
# SUB: precision
# PARAMS: precision in int
# DESC: sets the output percent precision calculation and printf width
# if negative, to ten step, if bigger 10, set to one
sub precision
{
my $self = shift;
my $comma;
if (@_) {
$comma = shift;
$comma = 0 if ($comma !~ /^\-?\d{1,}$/);
if ($comma < 0) {
# -2 is 5 step
# -1 is 10 step
if ($comma < -1) {
$self->{precision_ten_step} = 5;
} else {
$self->{precision_ten_step} = 10;
}
$self->{precision} = 0; # no comma
$self->{percent_precision} = 0; # no print precision
$self->{percent_print} = 3; # max 3 length
} else {
$self->{precision} = $comma < 0 || $comma > 10 ? 10 : $comma;
$self->{percent_precision} = $comma < 0 || $comma > 10 ? 10 : $comma;
$self->{percent_print} = ($comma == 0 ? 3 : 4) + $self->{percent_precision};
}
}
return $self->{precision};
}
# SUB: linecount
# PARAMS: max number of lines to be processed
# DESC: sets the max number for lines for the percent calculation, if negative or not number, set to 1
# can only be set ONCE
sub linecount
{
my $self = shift;
my $linecount;
if (!$self->{linecount}) {
if (@_) {
$linecount = shift;
$self->{linecount} = $linecount;
$self->{linecount} = 1 if ($linecount < 0 || $linecount !~ /\d+/)
}
}
return $self->{linecount};
}
# SUB: filesize
# PARAMS: max filesize for the to processed data
# DESC: sets the max filesize for the to processed data, if negative or not number, set to 1
# input data has to be in bytes without any suffix (no b, kb, etc)
# can only be set ONCE
sub filesize
{
my $self = shift;
my $filesize;
if (!$self->{filesize}) {
if (@_) {
$filesize = shift;
$self->{filesize} = $filesize;
$self->{filesize} = 1 if ($filesize < 0 || $filesize !~ /\d+/)
}
}
return $self->{filesize};
}
# SUB: SetStartTime
# PARAMS: time, or nothing
# DESC: sets all the start times
sub SetStartTime
{
my $self = shift;
if (@_) {
$self->{start} = shift;
} else {
$self->{start} = time();
}
$self->{start_time} = $self->{start};
$self->{start_run} = $self->{start};
}
# SUB: SetETAStartTime
# PARAMS: time, or nothing
# DESC: sets the loop & run time, for correct ETA callculation
sub SetETAStartTime
{
my $self = shift;
if (@_) {
$self->{start_time} = shift;
} else {
$self->{start_time} = time();
}
$self->{start_run} = $self->{start_time};
}
# SUB: SetEndTime
# PARAMS: time, or nothing
# DESC: sets the end time for running time calculation
sub SetEndTime
{
my $self = shift;
if (@_) {
$self->{end} = shift;
} else {
$self->{end} = time();
}
}
# SUB: ShowPosition
# PARAMS: optiona; file position (via file pointer)
# RETURN: string for percent position output
# DESC: calculates the current percent position based on the passed parameter, if no parameter uses intneral counter
sub ShowPosition
{
my $self = shift;
# set local vars
my $percent; # current percent
my $full_time_needed; # complete process time
my $full_time_per_line; # time per line
my $eta; # estimated end time
my $string = ''; # percent string that gets output
my $show_filesize = 1;
# microtime flags
my $eta_microtime = 0;
my $ftn_microtime = 0;
my $lg_microtime = 0;
# percent precision calc
my $_p_spf = "%.".$self->{precision}."f";
# output format for percent
my $_pr_p_spf = "%".$self->{percent_print}.".".$self->{percent_precision}."f";
# set the linecount precision based on the final linecount, if not, leave it empty
my $_pr_lc = "%s";
$_pr_lc = "%".length(format_number($self->{linecount}))."s" if ($self->{linecount});
# time format, if flag is set, the wide format is used
my $_pr_tf = "%s";
$_pr_tf = "%-15s" if ($self->{'wide_time'});
# do the smae for file size
# my $_pr_fs = "%s";
# $_pr_fs = "%".length(function::convert_number($self->{filesize}))."s" if ($self->{filesize});
# increase position by one
$self->{count} ++;
# see if we get anything from IO tell
if (@_) {
$self->{file_pos} = shift;
} else {
# we did not, so we set internal value
$self->{file_pos} = $self->{count};
# we also check if the filesize was set now
if (!$self->{filesize}) {
$self->{filesize} = $self->{linecount};
}
# set ignore filesize output (no data)
$show_filesize = 0;
}
# set the count size based on the file pos, is only used if we have filesize
$self->{count_size} = $self->{file_pos};
# do normal or down to 10 (0, 10, ...) %
if ($self->{precision_ten_step}) {
# calc 0 comma precision, so just do a floor
my $_percent = sprintf("%d", ($self->{file_pos} / $self->{filesize}) * 100);
# mod that to 10
my $mod = $_percent % $self->{precision_ten_step};
# either write this one, or write the previous, old one
$percent = $mod == 0 ? $_percent : $self->last_percent;
# print "P: $percent, Last: ".$self->last_percent.", Mod: ".$mod.", Calc: ".$_percent."\n";
} else {
$percent = sprintf($_p_spf, ($self->{file_pos} / $self->{filesize}) * 100);
}
# print "POS: ".$self->{file_pos}.", PERCENT: $percent / ".$self->last_percent."\n";
if ($percent != $self->last_percent) {
$self->{end_time} = time();
# for from the beginning
$full_time_needed = $self->{end_time} - $self->{start_run}; # how long from the start;
$self->{last_group} = $self->{end_time} - $self->{start_time};
$self->{lines_processed} = $self->{count} - $self->{current_count};
# lines in last group
$self->{lines_in_last_group} = $self->{'last_group'} ? ($self->{lines_processed} / $self->{last_group}) : 0;
# lines in global
$self->{lines_in_global} = $full_time_needed ? ($self->{'count'} / $full_time_needed) : 0;
# if we have linecount
if (!$self->{linecount}) {
$full_time_per_line = (($full_time_needed) ? $full_time_needed : 1) / $self->{count_size}; # how long for all
$eta = $full_time_per_line * ($self->{filesize} - $self->{count_size}); # estimate for the rest
} else {
$full_time_per_line = (($full_time_needed) ? $full_time_needed : 1) / $self->{count}; # how long for all
$eta = $full_time_per_line * ($self->{linecount} - $self->{count}); # estimate for the rest
}
# just in case ...
$eta = '0' if ($eta < 0);
# check if to show microtime
# ON: if microtime is flagged as one
$eta_microtime = $ftn_microtime = $lg_microtime = 1 if ($self->{microtime} == 1);
# AUTO: foir microtime
if ($self->{microtime} == 0) {
$eta_microtime = 1 if ($eta > 0 && $eta < 1);
$ftn_microtime = 1 if ($full_time_needed > 0 && $full_time_needed < 1);
# pre check last group: if pre comma part is same add microtime anyway
$lg_microtime = 1 if ($self->{last_group} > 0 && $self->{last_group} < 1);
}
# print out
if ($show_filesize) {
# last group size
$self->{size_in_last_group} = $self->{count_size} - $self->{current_size};
# calc kb/s if there is any filesize data
# last group
$self->{bytes_in_last_group} = $self->{'last_group'} ? ($self->{size_in_last_group} / $self->{last_group}) : 0;
# global
$self->{bytes_in_global} = $full_time_needed ? ($self->{count_size} / $full_time_needed) : 0;
# only used if we run with file size for the next check
$self->{current_size} = $self->{count_size};
$string = sprintf(
"Processed ".$_pr_p_spf."%% [%s / %s] | ".$_pr_lc." / ".$_pr_lc." Lines | ETA: ".$_pr_tf." / TR: ".$_pr_tf." / LR: %s lines (%s) in %s, %s (%s) lines/s, %s (%s) b/s\n",
$percent,
function::convert_number($self->{count_size}),
function::convert_number($self->{filesize}),
format_number($self->{count}),
format_number($self->{linecount}),
function::convert_time($eta, $eta_microtime),
function::convert_time($full_time_needed, $ftn_microtime),
format_number($self->{lines_processed}),
function::convert_number($self->{size_in_last_group}),
function::convert_time($self->{last_group}, $lg_microtime),
format_number($self->{lines_in_global}, 2, 1),
format_number($self->{lines_in_last_group}, 2, 1),
function::convert_number($self->{bytes_in_global}),
function::convert_number($self->{bytes_in_last_group})
) if ($self->{verbose} >= 1);
} else {
$string = sprintf(
"Processed ".$_pr_p_spf."%% | ".$_pr_lc." / ".$_pr_lc." Lines | ETA: ".$_pr_tf." / TR: ".$_pr_tf." / LR: %s lines in %s, %s (%s) lines/s\n",
$percent,
format_number($self->{count}),
format_number($self->{linecount}),
function::convert_time($eta, $eta_microtime),
function::convert_time($full_time_needed, $ftn_microtime),
format_number($self->{lines_processed}),
function::convert_time($self->{last_group}, $lg_microtime),
format_number($self->{lines_in_global}, 2, 1),
format_number($self->{lines_in_last_group}, 2, 1)
) if ($self->{verbose} >= 1);
}
# write back vars
$self->{last_percent} = $percent;
$self->{eta} = $eta;
$self->{full_time_needed} = $full_time_needed;
$self->{lg_microtime} = $lg_microtime;
# for the next run, check data
$self->{start_time} = time();
$self->{current_count} = $self->{count};
# trigger if this is a change
$self->{change} = 1;
} else {
# trigger if this is a change
$self->{change} = 0;
}
return $string;
}
1;

501
bin/functions.pm Normal file
View File

@@ -0,0 +1,501 @@
package function;
# AUTHOR: Clemens Schwaighofer
# DATE CREATED: 2004/11/09
# DESCRIPTION: functions collection for Adidas scripts
# HISTORY:
# 2005/06/22 (cs) added header key check function
# 2005/02/10 (cs) added debug flag to print output, added two new functions to format a number into B, KB, etc
# 2005/01/13 (cs) fixed array problem with the clean up and int function
use strict;
use warnings;
use 5.000_000;
use POSIX qw(floor);
use File::Copy;
use Digest::SHA qw(sha1_hex);
use utf8;
#require Exporter;
#our @ISA = qw(Exporter);
#our @EXPORT = qw();
# depending on the options given to the program, it gets the correct settings
# to which db it should connect
sub get_db_user
{
my ($target, $db) = @_;
# the parts of the hash array (tab seperated)
my @array_names = qw{db_name db_port db_user db_pass db_host db_type db_test db_ssl};
my %db_out = ();
# based on the two parameters find the correct vars
# each level can hold data, higher level data overrules lower data
# eg $config::db{'test'}{'db_user'} overrules $config::db{'db_user'}
for (my $i = 1; $i <= 3; $i ++) {
foreach my $name (@array_names) {
# depending on the level check the level of data
if ($i == 1) {
$db_out{$name} = $config::db{$name} if (defined($config::db{$name}));
} elsif ($i == 2) {
$db_out{$name} = $config::db{$target}{$name} if (defined($config::db{$target}{$name}));
} elsif ($i == 3) {
$db_out{$name} = $config::db{$target}{$db}{$name} if (defined($config::db{$target}{$db}{$name}));
}
} # for each db data var
} # for each data level in the hash
return (
$db_out{'db_name'},
$db_out{'db_port'},
$db_out{'db_user'},
$db_out{'db_pass'},
$db_out{'db_host'},
$db_out{'db_type'},
$db_out{'db_test'},
$db_out{'db_ssl'}
);
}
# get the DSN string for the DB connect
sub get_db_dsn
{
my (
$db_name,
$db_port,
$db_user,
$db_pass,
$db_host,
$db_type,
$db_ssl
) = @_;
my $dsn = '';
if ($db_type eq 'mysql' && $db_name && $db_host && $db_user) {
$dsn = "DBI:mysql:database=".$db_name.";host=".$db_host.";port=".$db_port;
} elsif ($db_type eq 'pgsql' && $db_name && $db_host && $db_user) {
$dsn = "DBI:Pg:dbname=".$db_name.";host=".$db_host.";port=".$db_port.";sslmode=".$db_ssl;
} else {
# invalid db type
$dsn = -1;
}
return $dsn;
}
sub strip_white_spaces
{
my ($element) = @_;
# get rid of spaces at the end and at the beginning of each bloack
$element =~ s/^\s+//g;
$element =~ s/\s+$//g;
return $element;
}
sub prepare_hash_keys
{
my($csv, $data, $csv_header) = @_;
# unset value starts at 1000 and goes up ...
my $unset_value = 1000;
my %keys = ();
# parse header
if ($csv->parse($data)) {
my @cols = $csv->fields();
for (my $i = 0; $i < @cols; $i ++) {
# remove all spaces before and afterward
$cols[$i] = function::strip_white_spaces($cols[$i]);
# write key - id number
$keys{$cols[$i]} = $i;
print $::DEBUG "\tPostion [".$i."]: ".$cols[$i]."\n" if ($::debug);
print "\tPosition [".$i."]: ".$cols[$i]."\n" if ($::verbose > 1);
}
} else {
die "ERROR[".$csv->error_diag()."]: ".$csv->error_input()."\n";
}
# add empty values
foreach my $csv_header_value (@$csv_header) {
if (!defined($keys{$csv_header_value})) {
$keys{$csv_header_value} = $unset_value;
$unset_value ++;
print $::DEBUG "\tKey [$csv_header_value] gets position [".$keys{$csv_header_value}."]\n" if ($::debug);
print "\tKey [$csv_header_value] gets position [".$keys{$csv_header_value}."]\n" if ($::verbose > 1);
}
}
return %keys;
}
sub error_check_keys
{
my($csv_header, $keys) = @_;
if ((keys %$keys) != @$csv_header) {
print $::ERR "TOTAL WRONG COUNT: CSV header ".(keys %$keys)." vs Needed headers ".@$csv_header.": perhaps your input file is not fitting this?\n";
print "TOTAL WRONG COUNT: CSV header ".(keys %$keys)." vs Needed headers ".@$csv_header.": perhaps your input file is not fitting this?\n";
# if there are more keys in CSV file, then in the header defined in here
if ((keys %$keys) > @$csv_header) {
print $::ERR "Listing Perl Header missing\n";
print "Listing Perl Header missing\n";
foreach my $key (keys %$keys) {
print $::ERR "Missing in perl Header list: $key\n" if (!grep {$_ eq $key} @$csv_header);
print "Missing in perl Header list: $key\n" if (!grep {$_ eq $key} @$csv_header);
}
# if more keys are in the header defined than in the csv file
} else {
print $::ERR "Listing CSV Header missing\n";
print "Listing CSV Header missing\n";
for (my $i = 0; $i < @$csv_header; $i ++) {
print $::ERR "Missing in CSV file: ".$$csv_header[$i]."\n" if (!defined($$keys{$$csv_header[$i]}));
print "Missing in CSV file: ".$$csv_header[$i]."\n" if (!defined($$keys{$$csv_header[$i]}));
}
}
return 0;
}
return 1;
}
sub clean_up_row
{
my ($row) = @_;
for (my $i = 0; $i < @$row; $i++) {
# get rid of spaces at the end and at the beginning of each bloack
$$row[$i] =~ s/^\s+//g;
$$row[$i] =~ s/\s+$//g;
# convert all half width Katakan to Full width Katakana
$$row[$i] = Unicode::Japanese->new($$row[$i])->h2zKana->get;
# need to decode the converted string, somehow Unicode::Japanese does not return proper utf8 if use utf8 is on
utf8::decode($$row[$i]);
}
return @$row;
}
sub set_int_fields
{
my ($row, $keys, $int_fields) = @_;
# check ALL smallint/int/etc rows to be set to a number
for (my $i = 0; $i < @$int_fields; $i++) {
print "\t\tCheck ".$$int_fields[$i]." {".$$keys{$$int_fields[$i]}."} ... " if ($::verbose > 1);
if (!$$row[$$keys{$$int_fields[$i]}]) {
$$row[$$keys{$$int_fields[$i]}] = 0;
}
# if its filled, but not a digit, set to 1
if ($$row[$$keys{$$int_fields[$i]}] =~ /\D/) {
$$row[$$keys{$$int_fields[$i]}] = 1;
}
print "[".$$row[$$keys{$$int_fields[$i]}]."] [DONE]\n" if ($::verbose > 1);
}
return @$row;
}
# formats a number with dots and ,
sub format_number
{
my ($number) = @_;
# dummy, does nothing now
# should put . or , every 3 digits later
return $number;
}
# converts bytes to human readable format
sub convert_number
{
my ($number) = @_;
my $pos; # the original position in the labels array
# divied number until its division would be < 1024. count that position for label usage
for ($pos = 0; $number > 1024; $pos ++) {
$number = $number / 1024;
}
# before we return it, we format it [rounded to 2 digits, if has decimals, else just int]
# we add the right label to it and return
return sprintf(!$pos ? '%d' : '%.2f', $number)." ".qw(B KB MB GB TB PB EB)[$pos];
}
# make time from seconds string
sub convert_time
{
my ($timestamp, $show_micro) = @_;
my $ms = '';
# cut of the ms, but first round them up to four
$timestamp = sprintf("%.4f", $timestamp);
# print "T: ".$timestamp."\n";
($timestamp, $ms) = split(/\./, $timestamp);
my @timegroups = ("86400", "3600", "60", "1");
my @output = ();
for (my $i = 0; $i < @timegroups; $i ++) {
push(@output, floor($timestamp / $timegroups[$i]));
$timestamp = $timestamp % $timegroups[$i];
}
# output has days|hours|min|sec
return (($output[0]) ? $output[0]."d " : "").
(($output[1] || $output[0]) ? $output[1]."h " : "").
(($output[2] ||$output[1] || $output[0]) ? $output[2]."m " : "").
$output[3]."s".
(($show_micro) ? " ".((!$ms) ? 0 : $ms)."ms" : "");
}
# get a timestamp and create a proper formated date/time field
sub create_time
{
my ($timestamp, $show_micro) = @_;
my $ms = '';
$timestamp = 0 if (!$timestamp);
# round ms to 4 numbers
$timestamp = sprintf("%.4f", $timestamp);
($timestamp, $ms) = split(/\./, $timestamp);
# array for time
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
# year, month fix
$year += 1900;
$month += 1;
# string for return
return $year."-".
($month < 10 ? '0'.$month : $month)."-".
($day < 10 ? '0'.$day : $day)." ".
($hour < 10 ? '0'.$hour : $hour).":".
($min < 10 ? '0'.$min : $min).":".
($sec < 10 ? '0'.$sec : $sec).
(($ms && $show_micro) ? ".".$ms : "");
}
# create YYYYMMDD data
sub create_date
{
my ($timestamp, $split_string) = @_;
my $split = $split_string ? $split_string : '';
$timestamp = time() if (!$timestamp);
# array for time
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
# year, month fix
$year += 1900;
$month += 1;
# string for return
return $year.$split.
($month < 10 ? '0'.$month : $month).$split.
($day < 10 ? '0'.$day : $day);
}
# create YYYYMMDD_HHMMSS data
sub create_datetime
{
my ($timestamp, $split_string) = @_;
my $split = $split_string ? $split_string : '';
$timestamp = time() if (!$timestamp);
# array for time
my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime($timestamp);
# year, month fix
$year += 1900;
$month += 1;
# string for return
return $year.$split.
($month < 10 ? '0'.$month : $month).$split.
($day < 10 ? '0'.$day : $day).'_'.
($hour < 10 ? '0'.$hour : $hour).$split.
($min < 10 ? '0'.$min : $min).$split.
($sec < 10 ? '0'.$sec : $sec);
}
sub left_fill
{
my($number, $size, $char) = @_;
return sprintf($char x ($size - length($number)).$number);
}
# wrapper to flip the crc32 hex string, so it is like buggy php one (php <= 5.2.6)
sub crc32b_fix
{
my ($crc) = @_;
# left pad with 0 to 8 chars
$crc = ('0' x (8 - length($crc))).$crc;
# flip two chars (byte hex)
$crc =~ s/^([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})$/$4$3$2$1/;
return $crc;
}
# short sha1 (9 char) function
sub sha1_short
{
my ($string) = @_;
return substr(sha1_hex($string), 0, 9);
}
# DEBUG helpers for dumping data
# from: http://www.perlmonks.org/?node_id=390153
# alternative use Dump::Dumper and print Dump(VAR);
sub dump_data
{
my ($level, $base, $data) = @_;
my $nextlevel = $level + 1;
if (ref($data) eq 'ARRAY') {
foreach my $k (0 .. $#{$data}) {
my $baseval = $base.'['.$k.']';
dump_it($nextlevel, $baseval, $data->[$k]);
}
} elsif (ref($data) eq 'HASH') {
foreach my $k (sort(keys(%{$data}))) {
my $baseval = $base.'{'.$k.'}';
dump_it($nextlevel, $baseval, $data->{$k});
}
} elsif (ref($data) eq 'SCALAR') {
my $baseval = $base;
dump_it($nextlevel, $baseval, ${$data});
}
}
sub dump_it
{
my ($nextlevel, $baseval, $datum) = @_;
my $reftype = ref($datum);
if ($reftype eq 'HASH') {
dump_data($nextlevel, $baseval, \%{$datum});
} elsif ($reftype eq 'ARRAY') {
dump_data($nextlevel, $baseval, \@{$datum});
} else {
process_data($nextlevel, $baseval, $datum);
}
}
sub process_data
{
my ($nextlevel, $baseval, $datum) = @_;
my $indentation = ' ' x $nextlevel;
print $indentation, $baseval, ' = ', $datum, "\n";
}
# METHOD: lock_run
# PARAMS: file (plus path) to lock to
# the current running pid (if not given will be set in script)
# the current name of the script (auto set if not given)
# optional write encoding (set to utf8 if not given)
# RETURN: nothing
# DESC: checks if this script is already running based on the lock file, if if yes will abort
# if file is there but pid not find it automatically cleans up the stale lock file
sub lock_run
{
my ($file, $run_pid, $name, $encoding) = @_;
# if no encoding, set utf8
$encoding = 'utf8' if (!$encoding);
# set the run pid if no pid is given
$run_pid = $$ if (!$run_pid);
# set the script base name
$name = File::Basename::fileparse($0) if (!$name);
# if lock file exists
if (-f $file) {
my $exists = 0;
my $pid = `cat $file`;
chomp($pid);
# printDebug("Lock file found for $pid", 1);
# check if process excists with this pid
# better todo A for ALL processes
# ps axu OR short ps a
open(PS, 'ps axu|') || die("$!");
while (<PS>) {
# search for pid and run file name
if ($_ =~ /\ $pid\ / && $_ =~ /$name/) {
$exists = 1;
}
last if ($exists);
}
close(PS);
if (!$exists) {
# printDebug("Lock file cleaned up for $pid", 1);
unlink($file);
} else {
die("Script is already running with PID $pid\n");
}
}
# write current PID into lock file
open(FP, '>:encoding('.$encoding.')', $file) || die ("Cannot open run lock file '$file' for writing\n");
print FP $run_pid;
close(FP);
}
# METHOD: printDebug
# PARAMS: message, verbose level
# RETURN: nothing
# DESC: depeding on the verbose and debug settings it will print out message and or write it to a debug file
sub printDebug
{
my($msg, $vrb, $dbg) = @_;
# print debug only if debug is on and debug file is available
print $::DEBUG '['.create_time(time(), 1).'] '.$msg."\n" if ($::debug && $::DEBUG);
# print to log if log is accessable and the verbose flag matches, or for debug flag if debug statement is set and not log only, or if log only, if not debug statement
print $::LOG $msg."\n" if (($::verbose >= $vrb || (!$::log_only && $dbg && $::debug) || ($::log_only && !$dbg)) && $::LOG);
# print to screen if verbose matches, but it is not a log only, or if it is debug statement and debug flag is set
print $msg."\n" if (($::verbose >= $vrb && !$::log_only) || ($dbg && $::debug));
}
# METHOD: waitAbort
# PARAMS: time in seconds, if not provided set to 5
# RETURN: nothing
# DESC: simple prints out a char while waiting for an abort command
sub waitAbort
{
my($sleep) = @_;
$sleep = 5 if ($sleep !~ /\d/);
print "Waiting $sleep seconds (Press CTRL + C to abort)\n";
for (my $i = 1; $i <= $sleep; $i ++) {
print ".";
sleep 1;
}
print "\n\n";
}
# METHOD: copyToTemporary
# PARAMS: file to copy, and target file name
# RETURN: the target file name
# DESC : sets the source to read only and makes a copy, the copy is also set to read only
sub copyToTemporary
{
my ($source, $target) = @_;
# get the current rights
my $current_chmod = (stat $source)[2];
# set source file ARGV to read only
# we skip that, the source might be NOT from the same user as the script read, just copy the file and set the target read only
chmod(0444, $source);
# create tmp backup file from which we read, data gets removed at the end of an run, or during an abort call
copy($source, $target) || die("Copy failed: $!\n");
# set read rights to r only for the copied file
chmod(0444, $target);
# set old access rights for ARGV file
chmod($current_chmod, $source);
# return target file name
return $target;
}
# METHOD: uniq
# PARAMS: @array
# RETURN: array with only unique entries
# DESC : used in uniq(@array) to get only unique data back
sub uniq
{
my %seen;
grep !$seen{$_}++, @_;
}
# METHOD: clean_test
# PARAMS: array of data
# RETURN: cleaned up array of data
# DESC : sets all undefs to '' for debug output
sub clean_test
{
my (@data) = @_;
# map check for defined, if not, return ''
return map { defined($_) ? $_ : '' } @data;
}
# METHOD: clean_test_string
# PARAMS: string to be checked
# RETURN: data or empty for output
# DESC : sets all input data to '' if it is undefined
sub clean_test_string
{
my ($data) = @_;
return defined($data) ? $data : '';
}
1;

View File

@@ -5,14 +5,17 @@ parameters:
level: 1 level: 1
paths: paths:
- %currentWorkingDirectory%/www - %currentWorkingDirectory%/www
#bootstrap: %currentWorkingDirectory%/phpstan-bootstrap.php bootstrapFiles:
#bootstrap: phpstan-bootstrap.php
autoload_directories:
autoload_files:
- %currentWorkingDirectory%/phpstan-bootstrap.php - %currentWorkingDirectory%/phpstan-bootstrap.php
scanDirectories:
- www/lib/Smarty
scanFiles:
- www/configs/config.php
- www/configs/config.master.php - www/configs/config.master.php
- www/lib/autoloader.php - www/lib/autoloader.php
- www/vendor/autoload.php - www/vendor/autoload.php
- www/lib/Smarty/Autoloader.php
- www/lib/CoreLibs/Template/SmartyExtend.php
excludes_analyse: excludes_analyse:
# no check admin # no check admin
- www/admin/qq_file_upload_front.php - www/admin/qq_file_upload_front.php
@@ -40,10 +43,12 @@ parameters:
- www/tmp - www/tmp
- www/lib/pChart - www/lib/pChart
- www/lib/pChart2.1.4 - www/lib/pChart2.1.4
- www/lib/Smarty/ - www/lib/Smarty
- www/lib/smarty-3.1.30/ - www/lib/smarty-3.1.30
# ignore composer # ignore composer
- www/vendor - www/vendor
# ignore the smartyextend
- www/lib/CoreLibs/Template/SmartyExtend.php
# ignore errores with # ignore errores with
# ignoreErrors: # ignoreErrors:
#- 'error regex' #- 'error regex'

View File

@@ -107,23 +107,62 @@ while ($res = $basic->dbReturn("SELECT * FROM max_test")) {
print "[CACHED] TIME: ".$res['time']."<br>"; print "[CACHED] TIME: ".$res['time']."<br>";
} }
print "<pre>";
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test"); $status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>"; print "DIRECT INSERT STATUS: $status | "
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>"; ."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// should throw deprecated error
// $basic->getReturningExt();
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
$basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)"); $basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
$status = $basic->dbExecute("ins_foo", array('BAR TEST '.time())); $status = $basic->dbExecute("ins_foo", array('BAR TEST '.time()));
print "PREPARE INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>"; print "PREPARE INSERT STATUS: $status | "
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>"; ."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING RETURN: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
// returning test with multiple entries // returning test with multiple entries
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id"); // $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
$status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test"); $status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
print "DIRECT MULTIPLE INSERT STATUS: $status | PRIMARY KEYS: ".print_r($basic->insert_id, true)." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>"; print "DIRECT MULTIPLE INSERT STATUS: $status | "
."PRIMARY KEYS: ".print_r($basic->dbGetInsertPK(), true)." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// no returning, but not needed ; // no returning, but not needed ;
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');"); $status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');");
print "DIRECT INSERT STATUS: $status | PRIMARY KEY: ".$basic->insert_id." | PRIMARY KEY EXT: ".print_r($basic->insert_id_ext, true)."<br>"; print "DIRECT INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// UPDATE WITH RETURNING // UPDATE WITH RETURNING
$status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test"); $status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test");
print "UPDATE STATUS: $status | RETURNING EXT: ".print_r($basic->insert_id_ext, true)."<br>"; print "UPDATE STATUS: $status | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "</pre>";
// REEAD PREPARE
if ($basic->dbPrepare('sel_foo', "SELECT foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time FROM foo ORDER BY foo_id DESC LIMIT 5") === false) {
print "Error in sel_foo prepare<br>";
} else {
$max_rows = 6;
// do not run this in dbFetchArray directly as
// dbFetchArray(dbExecute(...))
// this will end in an endless loop
$cursor = $basic->dbExecute('sel_foo', []);
$i = 1;
while (($res = $basic->dbFetchArray($cursor, true)) !== false) {
print "DB PREP EXEC FETCH ARR: ".$i.": <pre>".print_r($res, true)."</pre><br>";
$i ++;
}
}
# db write class test # db write class test
$table = 'foo'; $table = 'foo';
@@ -213,6 +252,16 @@ print "RETURN DATA FOR search_path: ".$data."<br>";
$status = $basic->dbExec("INSERT INTO test.schema_test (contents, id) VALUES ('TIME: ".time()."', ".rand(1, 10).")"); $status = $basic->dbExec("INSERT INTO test.schema_test (contents, id) VALUES ('TIME: ".time()."', ".rand(1, 10).")");
print "OTHER SCHEMA INSERT STATUS: ".$status." | PK NAME: ".$basic->pk_name.", PRIMARY KEY: ".$basic->insert_id."<br>"; print "OTHER SCHEMA INSERT STATUS: ".$status." | PK NAME: ".$basic->pk_name.", PRIMARY KEY: ".$basic->insert_id."<br>";
print "<b>NULL TEST DB READ</b><br>";
$q = "SELECT uid, null_varchar, null_int FROM test_null_data WHERE uid = 'A'";
$res = $basic->dbReturnRow($q);
var_dump($res);
print "RES: ".$basic->printAr($res)."<br>";
print "ISSET: ".isset($res['null_varchar'])."<br>";
print "EMPTY: ".empty($res['null_varchar'])."<br>";
// data read test
// time string thest // time string thest
$timestamp = 5887998.33445; $timestamp = 5887998.33445;
$time_string = $basic->timeStringFormat($timestamp); $time_string = $basic->timeStringFormat($timestamp);
@@ -224,6 +273,13 @@ if (round($timestamp, 4) == $basic->stringToTime($time_string)) {
} else { } else {
print "REVERSE TRIME STRING DO NOT MATCH<br>"; print "REVERSE TRIME STRING DO NOT MATCH<br>";
} }
print "ZERO TIME STRING: ".$basic->timeStringFormat(0, true)."<br>";
print "ZERO TIME STRING: ".$basic->timeStringFormat(0.0, true)."<br>";
print "ZERO TIME STRING: ".$basic->timeStringFormat(1.005, true)."<br>";
echo "HTML ENT INT: ".$basic->htmlent(5)."<br>";
echo "HTML ENT STRING: ".$basic->htmlent('5<<>')."<br>";
echo "HTML ENT NULL: ".$basic->htmlent(null)."<br>";
// magic links test // magic links test
print $basic->magicLinks('user@bubu.at').'<br>'; print $basic->magicLinks('user@bubu.at').'<br>';
@@ -254,6 +310,45 @@ echo "SOURCE ARRAY: ".$basic->printAr($test_array)."<br>";
echo "FOUND ELEMENTS [base]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array, 'type'))."<br>"; echo "FOUND ELEMENTS [base]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array, 'type'))."<br>";
echo "FOUND ELEMENTS [input]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array['input'], 'type'))."<br>"; echo "FOUND ELEMENTS [input]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array['input'], 'type'))."<br>";
// *** BYTES TEST ***
$bytes = array(
-123123123,
999999, // KB-1
999999999, // MB-1
254779258, // MB-n
999999999999999, // TB-1
588795544887632, // TB-n
999999999999999999, // PB-1
9223372036854775807, // MAX INT
999999999999999999999, // EB-1
);
print "<b>BYTE FORMAT TESTS</b><br>";
foreach ($bytes as $byte) {
print '<div style="display: flex; border-bottom: 1px dashed gray;">';
//
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
print "(".number_format($byte)."/".$byte.") bytes :";
print '</div><div style="width: 40%;">';
print $basic->humanReadableByteFormat($byte);
print "</div>";
//
print "</div>";
//
print '<div style="display: flex; border-bottom: 1px dotted red;">';
//
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
print "bytes [si]:";
print '</div><div style="width: 40%;">';
// print $basic->byteStringFormat($byte, true, false, true);
print $basic->humanReadableByteFormat($byte, $basic::BYTE_FORMAT_SI);
print "</div>";
//
print "</div>";
}
// *** IMAGE TESTS ***
echo "<hr>";
// image thumbnail // image thumbnail
$images = array( $images = array(
// height bigger // height bigger
@@ -272,7 +367,6 @@ $images = array(
// Photoshop // Photoshop
'photoshop_test.psd', 'photoshop_test.psd',
); );
echo "<hr>";
$thumb_width = 250; $thumb_width = 250;
$thumb_height = 300; $thumb_height = 300;
// return mime type ala mimetype // return mime type ala mimetype
@@ -292,6 +386,12 @@ foreach ($images as $image) {
echo "<hr>"; echo "<hr>";
} }
// mime test
$mime = 'application/vnd.ms-excel';
print "App for mime: ".$basic->mimeGetAppName($mime)."<br>";
$basic->mimeSetAppName($mime, 'Microsoft Excel');
print "App for mime changed: ".$basic->mimeGetAppName($mime)."<br>";
// print error messages // print error messages
// print $login->printErrorMsg(); // print $login->printErrorMsg();
print $basic->printErrorMsg(); print $basic->printErrorMsg();

View File

@@ -21,8 +21,8 @@ if ($base->getConnectionStatus()) {
} }
print "Start time: ".$base->runningTime()."<br>"; print "Start time: ".$base->runningTime()."<br>";
print "ByteStringFormat: ".$base->ByteStringFormat(1234567.12)."<br>"; print "HumanReadableByteFormat: ".$base->HumanReadableByteFormat(1234567.12)."<br>";
print "byteStringFormat: ".$base->byteStringFormat(1234567.12)."<br>"; print "humanReadableByteFormat: ".$base->humanReadableByteFormat(1234567.12)."<br>";
// print "get_page_name [DEPRECATED]: ".$base->get_page_name()."<br>"; // print "get_page_name [DEPRECATED]: ".$base->get_page_name()."<br>";
print "getPageName: ".$base->getPageName()."<br>"; print "getPageName: ".$base->getPageName()."<br>";

9
www/admin/phan_test.php Executable file
View File

@@ -0,0 +1,9 @@
<?php declare(strict_types=1);
require 'config.php';
require BASE.INCLUDES.'admin_header.php';
// $DATA['foo'] = 'bar';
// $messages['foo'] = 'bar';
// __END__

View File

@@ -10,26 +10,28 @@ define('USE_DATABASE', true);
define('USE_HEADER', true); define('USE_HEADER', true);
require 'config.php'; require 'config.php';
require BASE.INCLUDES.'admin_header.php'; require BASE.INCLUDES.'admin_header.php';
$smarty->MASTER_TEMPLATE_NAME = 'main_body.tpl'; if (is_object($smarty)) {
$smarty->TEMPLATE_NAME = 'smarty_test.tpl'; $smarty->MASTER_TEMPLATE_NAME = 'main_body.tpl';
$smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css'; $smarty->TEMPLATE_NAME = 'smarty_test.tpl';
$smarty->USE_PROTOTYPE = false; $smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css';
$smarty->USE_JQUERY = true; $smarty->USE_PROTOTYPE = false;
$smarty->JS_DATEPICKR = false; $smarty->USE_JQUERY = true;
if ($smarty->USE_PROTOTYPE) { $smarty->JS_DATEPICKR = false;
$smarty->ADMIN_JAVASCRIPT = 'edit.pt.js'; if ($smarty->USE_PROTOTYPE) {
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js'; $smarty->ADMIN_JAVASCRIPT = 'edit.pt.js';
} elseif ($smarty->USE_JQUERY) { $smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js';
$smarty->ADMIN_JAVASCRIPT = 'edit.jq.js'; } elseif ($smarty->USE_JQUERY) {
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js'; $smarty->ADMIN_JAVASCRIPT = 'edit.jq.js';
} $smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js';
$smarty->PAGE_WIDTH = "100%"; }
// require BASE.INCLUDES.'admin_set_paths.php'; $smarty->PAGE_WIDTH = '100%';
$smarty->setSmartyPaths(); // require BASE.INCLUDES.'admin_set_paths.php';
$smarty->setSmartyPaths();
// smarty test // smarty test
$smarty->DATA['SMARTY_TEST'] = 'Test Data'; $smarty->DATA['SMARTY_TEST'] = 'Test Data';
$smarty->DATA['TRANSLATE_TEST'] = $cms->l->__('Are we translated?'); $smarty->DATA['TRANSLATE_TEST'] = $cms->l->__('Are we translated?');
}
// drop down test with optgroups // drop down test with optgroups
$options = array ( $options = array (
@@ -48,8 +50,10 @@ $options = array (
) )
); );
$smarty->DATA['drop_down_test'] = $options; if (is_object($smarty)) {
$smarty->DATA['drop_down_test'] = $options;
// require BASE.INCLUDES.'admin_smarty.php'; $smarty->DATA['loop_start'] = 2;
$smarty->setSmartyVarsAdmin(); // require BASE.INCLUDES.'admin_smarty.php';
$smarty->setSmartyVarsAdmin();
}
require BASE.INCLUDES.'admin_footer.php'; require BASE.INCLUDES.'admin_footer.php';

View File

@@ -8,8 +8,8 @@
*********************************************************************/ *********************************************************************/
// please be VERY carefull only to change the right side // please be VERY carefull only to change the right side
$DB_CONFIG = array( $DB_CONFIG = [
'test' => array( 'test' => [
'db_name' => 'gullevek', 'db_name' => 'gullevek',
'db_user' => 'gullevek', 'db_user' => 'gullevek',
'db_pass' => 'gullevek', 'db_pass' => 'gullevek',
@@ -19,7 +19,7 @@ $DB_CONFIG = array(
'db_type' => 'pgsql', 'db_type' => 'pgsql',
'db_encoding' => '', 'db_encoding' => '',
'db_ssl' => 'disable' // allow, disable, require, prefer 'db_ssl' => 'disable' // allow, disable, require, prefer
) ]
); ];
// __END__ // __END__

View File

@@ -12,18 +12,18 @@
*********************************************************************/ *********************************************************************/
// other master config to attach // other master config to attach
// $__LOCAL_CONFIG = array( // $__LOCAL_CONFIG = [
// 'db_host' => '', // 'db_host' => '',
// 'location' => '', // 'location' => '',
// 'debug_flag' => true, // 'debug_flag' => true,
// 'site_lang' => 'en_utf8', // 'site_lang' => 'en_utf8',
// 'login_enabled' => true // 'login_enabled' => true
// ); // ];
// each host has a different db_host // each host has a different db_host
$SITE_CONFIG = array( $SITE_CONFIG = [
// development host // development host
'soba.tokyo.tequila.jp' => array( 'soba.tokyo.tequila.jp' => [
// db config selection // db config selection
'db_host' => 'test', 'db_host' => 'test',
// other db connections // other db connections
@@ -37,8 +37,8 @@ $SITE_CONFIG = array(
'site_lang' => 'en_utf8', 'site_lang' => 'en_utf8',
// enable/disable login override // enable/disable login override
'login_enabled' => true 'login_enabled' => true
), ],
// 'other.host.com' => $__LOCAL_CONFIG // 'other.host.com' => $__LOCAL_CONFIG
); ];
// __END__ // __END__

View File

@@ -9,177 +9,192 @@
/************* PATHS *********************/ /************* PATHS *********************/
// directory seperator // directory seperator
DEFINE('DS', DIRECTORY_SEPARATOR); define('DS', DIRECTORY_SEPARATOR);
// ** NEW/BETTER DIR DECLARATIONS ** // ** NEW/BETTER DIR DECLARATIONS **
// path to original file (if symlink) // path to original file (if symlink)
DEFINE('DIR', __DIR__.DS); define('DIR', __DIR__.DS);
// base dir root folder level // base dir root folder level
DEFINE('BASE', str_replace('/configs', '', __DIR__).DS); define('BASE', str_replace('/configs', '', __DIR__).DS);
// ** OLD DIR DECLARATIONS ** // ** OLD DIR DECLARATIONS **
// path to document root of file called // path to document root of file called
DEFINE('ROOT', getcwd().DS); define('ROOT', getcwd().DS);
// libs path // libs path
DEFINE('LIB', 'lib'.DS); define('LIB', 'lib'.DS);
DEFINE('LIBS', 'lib'.DS); define('LIBS', 'lib'.DS);
// configs folder // configs folder
DEFINE('CONFIGS', 'configs'.DS); define('CONFIGS', 'configs'.DS);
// includes (strings, arrays for static, etc) // includes (strings, arrays for static, etc)
DEFINE('INCLUDES', 'includes'.DS); define('INCLUDES', 'includes'.DS);
// data folder (mostly in includes) // data folder (mostly in includes, or root for internal data)
DEFINE('DATA', 'data'.DS); define('DATA', 'data'.DS);
// layout base path // layout base path
DEFINE('LAYOUT', 'layout'.DS); define('LAYOUT', 'layout'.DS);
// pic-root (compatible to CMS) // pic-root (compatible to CMS)
DEFINE('PICTURES', 'images'.DS); define('PICTURES', 'images'.DS);
// images // images
DEFINE('IMAGES', 'images'.DS); define('IMAGES', 'images'.DS);
// icons (below the images/ folder) // icons (below the images/ folder)
DEFINE('ICONS', 'icons'.DS); define('ICONS', 'icons'.DS);
// media // media (accessable from outside)
DEFINE('MEDIA', 'media'.DS); define('MEDIA', 'media'.DS);
// flash-root (below media) // flash-root (below media or data)
DEFINE('FLASH', 'flash'.DS); define('FLASH', 'flash'.DS);
// uploads (anything to keep) // uploads (anything to keep or data)
DEFINE('UPLOADS', 'uploads'.DS); define('UPLOADS', 'uploads'.DS);
// files (binaries) (below media) // files (binaries) (below media or data)
DEFINE('BINARIES', 'binaries'.DS); define('BINARIES', 'binaries'.DS);
// files (videos) (below media) // files (videos) (below media or data)
DEFINE('VIDEOS', 'videos'.DS); define('VIDEOS', 'videos'.DS);
// files (documents) (below media) // files (documents) (below media or data)
DEFINE('DOCUMENTS', 'documents'.DS); define('DOCUMENTS', 'documents'.DS);
// files (pdfs) (below media) // files (pdfs) (below media or data)
DEFINE('PDFS', 'documents'.DS); define('PDFS', 'documents'.DS);
// files (general) (below media or data)
define('FILES', 'files'.DS);
// CSV // CSV
DEFINE('CSV', 'csv'.DS); define('CSV', 'csv'.DS);
// css // css
DEFINE('CSS', 'css'.DS); define('CSS', 'css'.DS);
// font (web)
define('FONT', 'font'.DS);
// js // js
DEFINE('JS', 'javascript'.DS); define('JS', 'javascript'.DS);
// table arrays // table arrays
DEFINE('TABLE_ARRAYS', 'table_arrays'.DS); define('TABLE_ARRAYS', 'table_arrays'.DS);
// smarty libs path // smarty libs path
DEFINE('SMARTY', 'Smarty'.DS); define('SMARTY', 'Smarty'.DS);
// po langs // po langs
DEFINE('LANG', 'lang'.DS); define('LANG', 'lang'.DS);
// cache path // cache path
DEFINE('CACHE', 'cache'.DS); define('CACHE', 'cache'.DS);
// temp path // temp path
DEFINE('TMP', 'tmp'.DS); define('TMP', 'tmp'.DS);
// log files // log files
DEFINE('LOG', 'log'.DS); define('LOG', 'log'.DS);
// compiled template folder // compiled template folder
DEFINE('TEMPLATES_C', 'templates_c'.DS); define('TEMPLATES_C', 'templates_c'.DS);
// template base // template base
DEFINE('TEMPLATES', 'templates'.DS); define('TEMPLATES', 'templates'.DS);
/************* HASH / ACL DEFAULT / ERROR SETTINGS / SMARTY *************/ /************* HASH / ACL DEFAULT / ERROR SETTINGS / SMARTY *************/
// default hash type // default hash type
DEFINE('DEFAULT_HASH', 'sha256'); define('DEFAULT_HASH', 'sha256');
// default acl level // default acl level
DEFINE('DEFAULT_ACL_LEVEL', 80); define('DEFAULT_ACL_LEVEL', 80);
// SSL host name // SSL host name
// DEFINE('SSL_HOST', 'ssl.host.name'); // define('SSL_HOST', 'ssl.host.name');
// error page strictness, Default is 3 // error page strictness, Default is 3
// 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all // 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all
// 2: if template not found, do not search, show error template // 2: if template not found, do not search, show error template
// 3: if default template is not found, show error template, do not fall back to default tree // 3: if default template is not found, show error template, do not fall back to default tree
// 4: very strict, even on normal fixable errors through error // 4: very strict, even on normal fixable errors through error
// DEFINE('ERROR_STRICT', 3); // define('ERROR_STRICT', 3);
// allow page caching in general, set to 'FALSE' if you do debugging or development! // allow page caching in general, set to 'false' if you do debugging or development!
// DEFINE('ALLOW_SMARTY_CACHE', FALSE); // define('ALLOW_SMARTY_CACHE', false);
// cache life time, in second', default here is 2 days (172800s) // cache life time, in second', default here is 2 days (172800s)
// -1 is never expire cache // -1 is never expire cache
// DEFINE('SMARTY_CACHE_LIFETIME', -1); // define('SMARTY_CACHE_LIFETIME', -1);
/************* LOGOUT ********************/ /************* LOGOUT ********************/
// logout target // logout target
DEFINE('LOGOUT_TARGET', ''); define('LOGOUT_TARGET', '');
// password change allowed // password change allowed
DEFINE('PASSWORD_CHANGE', false); define('PASSWORD_CHANGE', false);
DEFINE('PASSWORD_FORGOT', false); define('PASSWORD_FORGOT', false);
// min/max password length // min/max password length
DEFINE('PASSWORD_MIN_LENGTH', 8); define('PASSWORD_MIN_LENGTH', 9);
DEFINE('PASSWORD_MAX_LENGTH', 255); define('PASSWORD_MAX_LENGTH', 255);
// defines allowed special characters
define('PASSWORD_SPECIAL_RANGE', '@$!%*?&');
// password must have upper case, lower case, number, special
// comment out for not mandatory
define('PASSWORD_LOWER', '(?=.*[a-z])');
define('PASSWORD_UPPER', '(?=.*[A-Z])');
define('PASSWORD_NUMBER', '(?=.*\d)');
define('PASSWORD_SPECIAL', "(?=.*[".PASSWORD_SPECIAL_RANGE."])");
// define full regex
define('PASSWORD_REGEX', "/^".
(defined('PASSWORD_LOWER') ? PASSWORD_LOWER : '').
(defined('PASSWORD_UPPER') ? PASSWORD_UPPER : '').
(defined('PASSWORD_NUMBER') ? PASSWORD_NUMBER : '').
(defined('PASSWORD_SPECIAL') ? PASSWORD_SPECIAL : '').
"[A-Za-z\d".PASSWORD_SPECIAL_RANGE."]{".PASSWORD_MIN_LENGTH.",".PASSWORD_MAX_LENGTH."}$/");
/************* AJAX / ACCESS *************/ /************* AJAX / ACCESS *************/
// ajax request type // ajax request type
DEFINE('AJAX_REQUEST_TYPE', 'POST'); define('AJAX_REQUEST_TYPE', 'POST');
// what AJAX type to use // what AJAX type to use
DEFINE('USE_PROTOTYPE', false); define('USE_PROTOTYPE', false);
DEFINE('USE_SCRIPTACULOUS', false); define('USE_SCRIPTACULOUS', false);
DEFINE('USE_JQUERY', true); define('USE_JQUERY', true);
/************* LAYOUT WIDTHS *************/ /************* LAYOUT WIDTHS *************/
DEFINE('PAGE_WIDTH', 800); define('PAGE_WIDTH', 800);
define('CONTENT_WIDTH', 800);
// the default template name // the default template name
DEFINE('MASTER_TEMPLATE_NAME', 'main_body.tpl'); define('MASTER_TEMPLATE_NAME', 'main_body.tpl');
/************* OVERALL CONTROL NAMES *************/ /************* OVERALL CONTROL NAMES *************/
// BELOW has HAS to be changed // BELOW has HAS to be changed
// base name for all session and log names // base name for all session and log names
DEFINE('BASE_NAME', 'CoreLibs'); define('BASE_NAME', 'CoreLibs');
/************* SESSION NAMES *************/ /************* SESSION NAMES *************/
// server name HASH // server name HASH
DEFINE('SERVER_NAME_HASH', hash('crc32b', $_SERVER['HTTP_HOST'])); define('SERVER_NAME_HASH', hash('crc32b', $_SERVER['HTTP_HOST']));
DEFINE('SERVER_PATH_HASH', hash('crc32b', BASE)); define('SERVER_PATH_HASH', hash('crc32b', BASE));
// backend // backend
DEFINE('EDIT_SESSION_NAME', BASE_NAME.'Admin'.SERVER_NAME_HASH.SERVER_PATH_HASH); define('EDIT_SESSION_NAME', BASE_NAME.'Admin'.SERVER_NAME_HASH.SERVER_PATH_HASH);
// frontend // frontend
DEFINE('SESSION_NAME', BASE_NAME.SERVER_NAME_HASH.SERVER_PATH_HASH); define('SESSION_NAME', BASE_NAME.SERVER_NAME_HASH.SERVER_PATH_HASH);
// SET_SESSION_NAME should be set in the header if a special session name is needed // SET_SESSION_NAME should be set in the header if a special session name is needed
DEFINE('SET_SESSION_NAME', SESSION_NAME); define('SET_SESSION_NAME', SESSION_NAME);
/************* CACHE/COMPILE IDS *************/ /************* CACHE/COMPILE IDS *************/
DEFINE('CACHE_ID', 'CACHE_'.BASE_NAME.'_'.SERVER_NAME_HASH); define('CACHE_ID', 'CACHE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
DEFINE('COMPILE_ID', 'COMPILE_'.BASE_NAME.'_'.SERVER_NAME_HASH); define('COMPILE_ID', 'COMPILE_'.BASE_NAME.'_'.SERVER_NAME_HASH);
/************* LANGUAGE / ENCODING *******/ /************* LANGUAGE / ENCODING *******/
DEFINE('DEFAULT_LANG', 'en_utf8'); define('DEFAULT_LANG', 'en_utf8');
// default web page encoding setting // default web page encoding setting
DEFINE('DEFAULT_ENCODING', 'UTF-8'); define('DEFAULT_ENCODING', 'UTF-8');
/************* LOGGING *******************/ /************* LOGGING *******************/
// below two can be defined here, but they should be // below two can be defined here, but they should be
// defined in either the header file or the file itself // defined in either the header file or the file itself
// as $LOG_FILE_ID which takes presence over LOG_FILE_ID // as $LOG_FILE_ID which takes presence over LOG_FILE_ID
// see Basic class constructor // see Basic class constructor
DEFINE('LOG_FILE_ID', BASE_NAME); define('LOG_FILE_ID', BASE_NAME);
/************* CLASS ERRORS *******************/
// 0 = default all OFF
// 1 = throw notice on unset class var
// 2 = no notice on unset class var, but do not set undefined class var
// 3 = throw error and do not set class var
define('CLASS_VARIABLE_ERROR_MODE', 3);
/************* QUEUE TABLE *************/ /************* QUEUE TABLE *************/
// if we have a dev/live system // if we have a dev/live system
// set_live is a per page/per item // set_live is a per page/per item
// live_queue is a global queue system // live_queue is a global queue system
// DEFINE('QUEUE', 'live_queue'); // define('QUEUE', 'live_queue');
/************* DB PATHS (PostgreSQL) *****************/ /************* DB PATHS (PostgreSQL) *****************/
// schema names, can also be defined per <DB INFO> // schema names, can also be defined per <DB INFO>
DEFINE('PUBLIC_SCHEMA', 'public'); define('PUBLIC_SCHEMA', 'public');
DEFINE('DEV_SCHEMA', 'public'); define('DEV_SCHEMA', 'public');
DEFINE('TEST_SCHEMA', 'public'); define('TEST_SCHEMA', 'public');
DEFINE('LIVE_SCHEMA', 'public'); define('LIVE_SCHEMA', 'public');
define('GLOBAL_DB_SCHEMA', '');
define('LOGIN_DB_SCHEMA', '');
/************* CORE HOST SETTINGS *****************/ /************* CORE HOST SETTINGS *****************/
if (file_exists(BASE.CONFIGS.'config.host.php')) { if (file_exists(BASE.CONFIGS.'config.host.php')) {
require BASE.CONFIGS.'config.host.php'; require BASE.CONFIGS.'config.host.php';
} }
if (!isset($SITE_CONFIG)) { if (!isset($SITE_CONFIG)) {
$SITE_CONFIG = array(); $SITE_CONFIG = [];
} }
/************* DB ACCESS *****************/ /************* DB ACCESS *****************/
if (file_exists(BASE.CONFIGS.'config.db.php')) { if (file_exists(BASE.CONFIGS.'config.db.php')) {
require BASE.CONFIGS.'config.db.php'; require BASE.CONFIGS.'config.db.php';
} }
if (!isset($DB_CONFIG)) { if (!isset($DB_CONFIG)) {
$DB_CONFIG = array(); $DB_CONFIG = [];
} }
/************* OTHER PATHS *****************/ /************* OTHER PATHS *****************/
if (file_exists(BASE.CONFIGS.'config.path.php')) { if (file_exists(BASE.CONFIGS.'config.path.php')) {
@@ -192,7 +207,7 @@ if (file_exists(BASE.CONFIGS.'config.path.php')) {
// get the name without the port // get the name without the port
list($HOST_NAME) = array_pad(explode(':', $_SERVER['HTTP_HOST'], 2), 2, null); list($HOST_NAME) = array_pad(explode(':', $_SERVER['HTTP_HOST'], 2), 2, null);
// set HOST name // set HOST name
DEFINE('HOST_NAME', $HOST_NAME); define('HOST_NAME', $HOST_NAME);
// BAIL ON MISSING MASTER SITE CONFIG // BAIL ON MISSING MASTER SITE CONFIG
if (!isset($SITE_CONFIG[HOST_NAME]['location'])) { if (!isset($SITE_CONFIG[HOST_NAME]['location'])) {
echo 'Missing SITE_CONFIG entry for: "'.HOST_NAME.'". Contact Administrator'; echo 'Missing SITE_CONFIG entry for: "'.HOST_NAME.'". Contact Administrator';
@@ -217,41 +232,41 @@ if ((!isset($SITE_CONFIG[HOST_NAME]['db_host']) && count($DB_CONFIG)) ||
// set SSL on // set SSL on
if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
$_SERVER['SERVER_PORT'] == 443) { $_SERVER['SERVER_PORT'] == 443) {
DEFINE('HOST_SSL', true); define('HOST_SSL', true);
DEFINE('HOST_PROTOCOL', 'https://'); define('HOST_PROTOCOL', 'https://');
} else { } else {
DEFINE('HOST_SSL', false); define('HOST_SSL', false);
DEFINE('HOST_PROTOCOL', 'http://'); define('HOST_PROTOCOL', 'http://');
} }
// define the db config set name, the db config and the db schema // define the db config set name, the db config and the db schema
DEFINE('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']); define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']);
DEFINE('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : array()); define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAME] : []);
// DEFINE('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']); // define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
// DEFINE('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']); // define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
// override for login and global schemas // override for login and global schemas
// DEFINE('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA); // where the edit* tables are // define('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA); // where the edit* tables are
// DEFINE('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA); // where global tables are that are used by all schemas (eg queue tables for online, etc) // define('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA); // where global tables are that are used by all schemas (eg queue tables for online, etc)
// debug settings, site lang, etc // debug settings, site lang, etc
DEFINE('TARGET', $SITE_CONFIG[HOST_NAME]['location']); define('TARGET', $SITE_CONFIG[HOST_NAME]['location']);
DEFINE('DEBUG', $SITE_CONFIG[HOST_NAME]['debug_flag']); define('DEBUG', $SITE_CONFIG[HOST_NAME]['debug_flag']);
DEFINE('SITE_LANG', $SITE_CONFIG[HOST_NAME]['site_lang']); define('SITE_LANG', $SITE_CONFIG[HOST_NAME]['site_lang']);
DEFINE('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled']); define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled']);
// paths // paths
// DEFINE('CSV_PATH', $PATHS[TARGET]['csv_path']); // define('CSV_PATH', $PATHS[TARGET]['csv_path']);
// DEFINE('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']); // define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']);
// DEFINE('REDIRECT_URL', $PATHS[TARGET]['redirect_url']); // define('REDIRECT_URL', $PATHS[TARGET]['redirect_url']);
// show all errors if debug_all & show_error_handling are enabled // show all errors if debug_all & show_error_handling are enabled
DEFINE('SHOW_ALL_ERRORS', true); define('SHOW_ALL_ERRORS', true);
/************* GENERAL PAGE TITLE ********/ /************* GENERAL PAGE TITLE ********/
DEFINE('G_TITLE', '<OVERALL FALLBACK PAGE TITLE>'); define('G_TITLE', '<OVERALL FALLBACK PAGE TITLE>');
/************ STYLE SHEETS / JS **********/ /************ STYLE SHEETS / JS **********/
DEFINE('ADMIN_STYLESHEET', 'edit.css'); define('ADMIN_STYLESHEET', 'edit.css');
DEFINE('ADMIN_JAVASCRIPT', 'edit.js'); define('ADMIN_JAVASCRIPT', 'edit.js');
DEFINE('STYLESHEET', 'frontend.css'); define('STYLESHEET', 'frontend.css');
DEFINE('JAVASCRIPT', 'frontend.js'); define('JAVASCRIPT', 'frontend.js');
// anything optional // anything optional
/************* INTERNAL ******************/ /************* INTERNAL ******************/
@@ -260,22 +275,6 @@ if (file_exists(BASE.CONFIGS.'config.other.php')) {
require BASE.CONFIGS.'config.other.php'; require BASE.CONFIGS.'config.other.php';
} }
/************* CONVERT *******************/
// this only needed if the external thumbnail create is used
$paths = array(
'/bin',
'/usr/bin',
'/usr/local/bin'
);
// find convert
foreach ($paths as $path) {
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
// image magick convert location
DEFINE('CONVERT', $path.DS.'convert');
}
}
unset($paths);
/************* DEBUG *******************/ /************* DEBUG *******************/
// turn off debug if debug flag is OFF // turn off debug if debug flag is OFF
if (defined('DEBUG') && DEBUG == false) { if (defined('DEBUG') && DEBUG == false) {

View File

@@ -9,4 +9,20 @@
// DEFINE('SOME_ID', <SOME VALUE>); // DEFINE('SOME_ID', <SOME VALUE>);
/************* CONVERT *******************/
// this only needed if the external thumbnail create is used
$paths = [
'/bin',
'/usr/bin',
'/usr/local/bin'
];
// find convert
foreach ($paths as $path) {
if (file_exists($path.DS.'convert') && is_file($path.DS.'convert')) {
// image magick convert location
define('CONVERT', $path.DS.'convert');
}
}
unset($paths);
// __END__ // __END__

View File

@@ -10,12 +10,12 @@
// File and Folder paths // File and Folder paths
// ID is TARGET (first array element) // ID is TARGET (first array element)
/*$PATHS = array( /*$PATHS = [
'test' => array( 'test' => [
'csv_path' => '', 'csv_path' => '',
'perl_bin' => '', 'perl_bin' => '',
'other_url' => '', 'other_url' => '',
) ]
)*/ ];*/
// __END__ // __END__

View File

@@ -22,7 +22,7 @@ if (!defined('DS')) {
exit('Base config unloadable'); exit('Base config unloadable');
} }
// find trigger name "admin/" or "frontend/" in the getcwd() folder // find trigger name "admin/" or "frontend/" in the getcwd() folder
foreach (array('admin', 'frontend') as $folder) { foreach (['admin', 'frontend'] as $folder) {
if (strstr(getcwd(), DS.$folder)) { if (strstr(getcwd(), DS.$folder)) {
define('CONTENT_PATH', $folder.DS); define('CONTENT_PATH', $folder.DS);
break; break;

View File

@@ -14,8 +14,6 @@ if ($DEBUG_ALL && $ENABLE_ERROR_HANDLING) {
} }
// predefine vars // predefine vars
$messages = array(); $messages = array();
// import all POST vars
// extract($_POST, EXTR_SKIP);
//------------------------------ variable init end //------------------------------ variable init end
//------------------------------ library include start //------------------------------ library include start

View File

@@ -85,12 +85,12 @@ $table_width = '100%';
// define all needed smarty stuff for the general HTML/page building // define all needed smarty stuff for the general HTML/page building
$HEADER['CSS'] = CSS; $HEADER['CSS'] = CSS;
$HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING; $HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
$HEADER['STYLESHEET'] = isset($ADMIN_STYLESHEET) ? $ADMIN_STYLESHEET : ADMIN_STYLESHEET; $HEADER['STYLESHEET'] = $ADMIN_STYLESHEET ?? ADMIN_STYLESHEET;
if ($form->my_page_name == 'edit_order') { if ($form->my_page_name == 'edit_order') {
// get is for "table_name" and "where" only // get is for "table_name" and "where" only
$table_name = isset($_GET['table_name']) ? $_GET['table_name'] : ''; $table_name = $_GET['table_name'] ?? '';
// $where = isset($_GET['where']) ? $_GET['where'] : ''; // $where = $_GET['where'] ?? '';
// order name is _always_ order_number for the edit interface // order name is _always_ order_number for the edit interface
// follwing arrays do exist here: // follwing arrays do exist here:
@@ -102,7 +102,7 @@ if ($form->my_page_name == 'edit_order') {
if (!isset($position)) { if (!isset($position)) {
$position = array(); $position = array();
} }
$row_data_id = $_POST['row_data_id']; $row_data_id = $_POST['row_data_id'] ?? [];
$original_id = $row_data_id; $original_id = $row_data_id;
if (count($position)) { if (count($position)) {
$row_data_order = $_POST['row_data_order']; $row_data_order = $_POST['row_data_order'];
@@ -116,8 +116,8 @@ if ($form->my_page_name == 'edit_order') {
// this gets the old before (moves one "up") // this gets the old before (moves one "up")
// is done for every element in row // is done for every element in row
// echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>"; // echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
$temp_id = $row_data_id[$position[$i]]; $temp_id = $row_data_id[$position[$i]] ?? null;
$row_data_id[$position[$i]] = $row_data_id[$position[$i] - 1]; $row_data_id[$position[$i]] = $row_data_id[$position[$i] - 1] ?? null;
$row_data_id[$position[$i] - 1] = $temp_id; $row_data_id[$position[$i] - 1] = $temp_id;
// echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>"; // echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
} // for } // for
@@ -129,8 +129,8 @@ if ($form->my_page_name == 'edit_order') {
// same as up, just up in other way, starts from bottom (last element) and moves "up" // same as up, just up in other way, starts from bottom (last element) and moves "up"
// element before actuel gets temp, this element, becomes element after this, // element before actuel gets temp, this element, becomes element after this,
// element after this, gets this // element after this, gets this
$temp_id = $row_data_id[$position[$i] + 1]; $temp_id = $row_data_id[$position[$i] + 1] ?? null;
$row_data_id[$position[$i] + 1] = $row_data_id[$position[$i]]; $row_data_id[$position[$i] + 1] = $row_data_id[$position[$i]] ?? null;
$row_data_id[$position[$i]] = $temp_id; $row_data_id[$position[$i]] = $temp_id;
} // for } // for
} // if down } // if down
@@ -140,8 +140,10 @@ if ($form->my_page_name == 'edit_order') {
(isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1))) (isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1)))
) { ) {
for ($i = 0; $i < count($row_data_id); $i ++) { for ($i = 0; $i < count($row_data_id); $i ++) {
$q = "UPDATE ".$table_name." SET order_number = ".$row_data_order[$i]." WHERE ".$table_name."_id = ".$row_data_id[$i]; if (isset($row_data_order[$i]) && isset($row_data_id[$i])) {
$q = $form->dbExec($q); $q = "UPDATE ".$table_name." SET order_number = ".$row_data_order[$i]." WHERE ".$table_name."_id = ".$row_data_id[$i];
$q = $form->dbExec($q);
}
} // for all article ids ... } // for all article ids ...
} // if write } // if write
} // if there is something to move } // if there is something to move
@@ -187,7 +189,9 @@ if ($form->my_page_name == 'edit_order') {
// list of points to order // list of points to order
for ($j = 0; $j < count($position); $j++) { for ($j = 0; $j < count($position); $j++) {
// if matches, put into select array // if matches, put into select array
if ($original_id[$position[$j]] == $row_data[$i]['id']) { if (isset($original_id[$position[$j]]) && isset($row_data[$i]['id']) &&
$original_id[$position[$j]] == $row_data[$i]['id']
) {
$options_selected[] = $i; $options_selected[] = $i;
} }
} }
@@ -208,7 +212,7 @@ if ($form->my_page_name == 'edit_order') {
// hidden names for the table & where string // hidden names for the table & where string
$DATA['table_name'] = $table_name; $DATA['table_name'] = $table_name;
$DATA['where_string'] = isset($where_string) ? $where_string : ''; $DATA['where_string'] = $where_string ?? '';
$EDIT_TEMPLATE = 'edit_order.tpl'; $EDIT_TEMPLATE = 'edit_order.tpl';
} else { } else {
@@ -270,43 +274,63 @@ if ($form->my_page_name == 'edit_order') {
$position = 0; $position = 0;
$menu_data = array(); $menu_data = array();
for ($i = 1; $i <= count($menuarray); $i ++) { // for ($i = 1; $i <= count($menuarray); $i ++) {
foreach ($menuarray as $i => $data) {
// do that for new array // do that for new array
$j = $i - 1; $j = $i + 1;
$menu_data[$j]['pagename'] = htmlentities($menuarray[($i-1)]['page_name']); $menu_data[$i]['pagename'] = htmlentities($data['page_name']);
$menu_data[$j]['filename'] = $menuarray[($i-1)]['filename'].(isset($menuarray[$j]['query_string']) ? $menuarray[$j]['query_string'] : ''); $menu_data[$i]['filename'] =
if ($i == 1 || !($j % $SPLIT_FACTOR)) { // prefix folder or host name
$menu_data[$j]['splitfactor_in'] = 1; (isset($data['hostname']) && $data['hostname'] ?
$data['hostname'] :
''
).
// filename
($data['filename'] ?? '').
// query string
(isset($data['query_string']) && $data['query_string'] ?
$data['query_string'] :
''
);
if ($j == 1 || !($i % $SPLIT_FACTOR)) {
$menu_data[$i]['splitfactor_in'] = 1;
} else { } else {
$menu_data[$j]['splitfactor_in'] = 0; $menu_data[$i]['splitfactor_in'] = 0;
} }
if ($menuarray[$j]['filename'] == $form->getPageName()) { // on matching, we also need to check if we are in the same folder
$position = $j; if (isset($data['filename']) &&
$menu_data[$j]['position'] = 1; $data['filename'] == $form->getPageName() &&
$menu_data[$j]['popup'] = 0; (!isset($data['hostname']) || (
isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
))
) {
$position = $i;
$menu_data[$i]['position'] = 1;
$menu_data[$i]['popup'] = 0;
} else { } else {
// add query stuff // add query stuff
// HAS TO DONE LATER ... set urlencode, etc ... // HAS TO DONE LATER ... set urlencode, etc ...
// check if popup needed // check if popup needed
if (isset($menuarray[$j]['popup']) && $menuarray[$j]['popup'] == 1) { if (isset($data['popup']) && $data['popup'] == 1) {
$menu_data[$j]['popup'] = 1; $menu_data[$i]['popup'] = 1;
$menu_data[$j]['rand'] = uniqid((string)rand()); $menu_data[$i]['rand'] = uniqid((string)rand());
$menu_data[$j]['width'] = $menuarray[$j]['popup_x']; $menu_data[$i]['width'] = $data['popup_x'];
$menu_data[$j]['height'] = $menuarray[$j]['popup_y']; $menu_data[$i]['height'] = $data['popup_y'];
} else { } else {
$menu_data[$j]['popup'] = 0; $menu_data[$i]['popup'] = 0;
} }
$menu_data[$j]['position'] = 0; $menu_data[$i]['position'] = 0;
} // highlight or not } // highlight or not
if (!($i % $SPLIT_FACTOR) || (($i + 1) > count($menuarray))) { if (!($j % $SPLIT_FACTOR) || (($j + 1) > count($menuarray))) {
$menu_data[$j]['splitfactor_out'] = 1; $menu_data[$i]['splitfactor_out'] = 1;
} else { } else {
$menu_data[$j]['splitfactor_out'] = 0; $menu_data[$i]['splitfactor_out'] = 0;
} }
} // for } // for
// $form->debug('MENU ARRAY', $form->printAr($menu_data)); // $form->debug('MENU ARRAY', $form->printAr($menu_data));
$DATA['menu_data'] = $menu_data; $DATA['menu_data'] = $menu_data;
$DATA['page_name'] = $menuarray[$position]['page_name']; $DATA['page_name'] = $menuarray[$position]['page_name'] ?? '-Undefined ['.$position.'] -';
$L_TITLE = $DATA['page_name']; $L_TITLE = $DATA['page_name'];
// html title // html title
$HEADER['HTML_TITLE'] = $form->l->__($L_TITLE); $HEADER['HTML_TITLE'] = $form->l->__($L_TITLE);
@@ -357,14 +381,35 @@ if ($form->my_page_name == 'edit_order') {
if (!isset($form->table_array['edit_page_id']['value'])) { if (!isset($form->table_array['edit_page_id']['value'])) {
$q = "DELETE FROM temp_files"; $q = "DELETE FROM temp_files";
$form->dbExec($q); $form->dbExec($q);
// gets all files in the current dir ending with .php // gets all files in the current dir and dirs given ending with .php
$crap = exec('ls *.php', $output, $status); $folders = array('../admin/', '../frontend/');
// now get all that are NOT in de DB $files = array('*.php');
$q = "INSERT INTO temp_files VALUES "; $search_glob = array();
for ($i = 0; $i < count($output); $i ++) { foreach ($folders as $folder) {
$t_q = "('".$form->dbEscapeString($output[$i])."')"; // make sure this folder actually exists
$form->dbExec($q.$t_q, 'NULL'); if (is_dir(ROOT.$folder)) {
foreach ($files as $file) {
$search_glob[] = $folder.$file;
}
}
} }
$crap = exec('ls '.join(' ', $search_glob), $output, $status);
// now get all that are NOT in de DB
$q = "INSERT INTO temp_files (folder, filename) VALUES ";
$t_q = '';
foreach ($output as $output_file) {
// split the ouput into folder and file
// eg ../admin/test.php is ../admin/ and test.php
preg_match("/([\.\/\w]+\/)+(\w+\.\w{1,})$/", $output_file, $matches);
// if named config.php, skip
if ($matches[2] != 'config.php') {
if ($t_q) {
$t_q .= ', ';
}
$t_q .= "('".$form->dbEscapeString($matches[1])."', '".$form->dbEscapeString($matches[2])."')";
}
}
$form->dbExec($q.$t_q, 'NULL');
$elements[] = $form->formCreateElement('filename'); $elements[] = $form->formCreateElement('filename');
} else { } else {
// show file menu // show file menu
@@ -372,6 +417,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['filename_exist'] = 1; $DATA['filename_exist'] = 1;
$DATA['filename'] = $form->table_array['filename']['value']; $DATA['filename'] = $form->table_array['filename']['value'];
} // File Name View IF } // File Name View IF
$elements[] = $form->formCreateElement('hostname');
$elements[] = $form->formCreateElement('name'); $elements[] = $form->formCreateElement('name');
// $elements[] = $form->formCreateElement('tag'); // $elements[] = $form->formCreateElement('tag');
// $elements[] = $form->formCreateElement('min_acl'); // $elements[] = $form->formCreateElement('min_acl');
@@ -435,7 +481,7 @@ if ($form->my_page_name == 'edit_order') {
} }
// debug data, if DEBUG flag is on, this data is print out // debug data, if DEBUG flag is on, this data is print out
$DEBUG_DATA['DEBUG'] = isset($DEBUG_TMPL) ? $DEBUG_TMPL : ''; $DEBUG_DATA['DEBUG'] = $DEBUG_TMPL ?? '';
// create main data array // create main data array
$CONTENT_DATA = array_merge($HEADER, $DATA, $DEBUG_DATA); $CONTENT_DATA = array_merge($HEADER, $DATA, $DEBUG_DATA);

View File

@@ -12,11 +12,16 @@ $edit_pages = array(
'output_name' => 'Add File ...', 'output_name' => 'Add File ...',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.filename AS name ". 'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.folder || temp_files.filename AS name ".
"FROM temp_files ". "FROM temp_files ".
"LEFT JOIN edit_page ep ON temp_files.filename = ep.filename ". "LEFT JOIN edit_page ep ON temp_files.filename = ep.filename ".
"WHERE ep.filename IS NULL" "WHERE ep.filename IS NULL"
), ),
'hostname' => array(
'value' => isset($GLOBALS['hostname']) ? $GLOBALS['hostname'] : '',
'output_name' => 'Hostname or folder',
'type' => 'text'
),
'name' => array( 'name' => array(
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '',
'output_name' => 'Page name', 'output_name' => 'Page name',
@@ -107,7 +112,7 @@ $edit_pages = array(
// "ORDER BY order_number" // "ORDER BY order_number"
) )
), ),
'load_query' => "SELECT edit_page_id, filename, name, online, menu, popup FROM edit_page ORDER BY order_number", 'load_query' => "SELECT edit_page_id, CASE WHEN hostname IS NOT NULL THEN hostname ELSE ''::VARCHAR END || filename AS filename, name, online, menu, popup FROM edit_page ORDER BY order_number",
'table_name' => 'edit_page', 'table_name' => 'edit_page',
'show_fields' => array( 'show_fields' => array(
array( array(

View File

@@ -12,13 +12,19 @@
<div class="jq-container"> <div class="jq-container">
<div id="jq-test" class="jp-test"> <div id="jq-test" class="jp-test">
<div id="test-div" class="test-div"> <div id="test-div" class="test-div">
Some content ehre or asdfasdfasf Some content here or asdfasdfasf
</div> </div>
<div id="translate-div"> <div id="translate-div">
TRANSLATION SMARTY: {t}I should be translated{/t} TRANSLATION SMARTY: {t}I should be translated{/t}
</div> </div>
</div> </div>
</div> </div>
<div class="loop-test">
<div>LOOP TEST</div>
{section name=page_list start=1 loop=$loop_start+1}
<div>LOOP OUTPUT: {$smarty.section.page_list.index}</div>
{/section}
</div>
{* progresss indicator *} {* progresss indicator *}
<div id="indicator"></div> <div id="indicator"></div>
{* the action confirm box *} {* the action confirm box *}

View File

@@ -16,6 +16,9 @@
{if $STYLESHEET} {if $STYLESHEET}
<link rel=stylesheet type="text/css" href="{$css}{$STYLESHEET}"> <link rel=stylesheet type="text/css" href="{$css}{$STYLESHEET}">
{/if} {/if}
{if $CSS_CORE_INCLUDE}
<link rel=stylesheet type="text/css" href="{$CSS_CORE_INCLUDE}">
{/if}
{if $CSS_INCLUDE} {if $CSS_INCLUDE}
<link rel=stylesheet type="text/css" href="{$CSS_INCLUDE}"> <link rel=stylesheet type="text/css" href="{$CSS_INCLUDE}">
{/if} {/if}
@@ -23,9 +26,6 @@
<link rel=stylesheet type="text/css" href="{$CSS_SPECIAL_INCLUDE}"> <link rel=stylesheet type="text/css" href="{$CSS_SPECIAL_INCLUDE}">
{/if} {/if}
<script language="JavaScript" src="{$js}/firebug.js"></script> <script language="JavaScript" src="{$js}/firebug.js"></script>
{if $JAVASCRIPT}
<script language="JavaScript" src="{$js}{$JAVASCRIPT}"></script>
{/if}
{if $USE_JQUERY} {if $USE_JQUERY}
{* JQuery *} {* JQuery *}
<script type="text/javascript" src="{$js}/jquery.min.js"></script> <script type="text/javascript" src="{$js}/jquery.min.js"></script>
@@ -37,6 +37,12 @@
<script src="{$js}/scriptaculous/scriptaculous.js" type="text/javascript"></script> <script src="{$js}/scriptaculous/scriptaculous.js" type="text/javascript"></script>
{/if} {/if}
{/if} {/if}
{if $JAVASCRIPT}
<script language="JavaScript" src="{$js}{$JAVASCRIPT}"></script>
{/if}
{if $JS_CORE_INCLUDE}
<script language="JavaScript" src="{$JS_CORE_INCLUDE}"></script>
{/if}
{if $JS_INCLUDE} {if $JS_INCLUDE}
<script language="JavaScript" src="{$JS_INCLUDE}"></script> <script language="JavaScript" src="{$JS_INCLUDE}"></script>
{/if} {/if}

View File

View File

View File

@@ -382,7 +382,7 @@ input[type="text"]:focus, textarea:focus, select:focus {
left: 0; left: 0;
top: 0; top: 0;
position: absolute; position: absolute;
z-index: 100; z-index: 1000;
} }
/* Animation for above progress */ /* Animation for above progress */
@keyframes rotate { @keyframes rotate {

View File

@@ -12,6 +12,10 @@ if (!DEBUG) {
}); });
}*/ }*/
// open overlay boxes counter
var GL_OB_S = 30;
var GL_OB_BASE = 30;
/** /**
* opens a popup window with winName and given features (string) * opens a popup window with winName and given features (string)
* @param {String} theURL the url * @param {String} theURL the url
@@ -86,9 +90,10 @@ function getScrollOffset()
function setCenter(id, left, top) function setCenter(id, left, top)
{ {
// get size of id // get size of id
var dimensions = {}; var dimensions = {
dimensions.height = $('#' + id).height(); height: $('#' + id).height(),
dimensions.width = $('#' + id).width(); width: $('#' + id).width()
};
var type = $('#' + id).css('position'); var type = $('#' + id).css('position');
var viewport = getWindowSize(); var viewport = getWindowSize();
var offset = getScrollOffset(); var offset = getScrollOffset();
@@ -114,17 +119,18 @@ function setCenter(id, left, top)
/** /**
* goes to an element id position * goes to an element id position
* @param {String} element element id to move to * @param {String} element element id to move to
* @param {Number} offset offset from top, default is 0 (px) * @param {Number} [offset=0] offset from top, default is 0 (px)
* @param {Number} [duration=500] animation time, default 500ms
* @param {String} [base='body,html'] base element for offset scroll
*/ */
function goToPos(element, offset = 0) function goToPos(element, offset = 0, duration = 500, base = 'body,html')
{ {
try { try {
if ($('#' + element).length) if ($('#' + element).length) {
{ $(base).animate({
$('body,html').animate({
scrollTop: $('#' + element).offset().top - offset scrollTop: $('#' + element).offset().top - offset
}, 500); }, duration);
} }
} catch (err) { } catch (err) {
errorCatch(err); errorCatch(err);
@@ -150,8 +156,8 @@ function __(string)
* simple sprintf formater for replace * simple sprintf formater for replace
* usage: "{0} is cool, {1} is not".format("Alpha", "Beta"); * usage: "{0} is cool, {1} is not".format("Alpha", "Beta");
* First, checks if it isn't implemented yet. * First, checks if it isn't implemented yet.
* @param {String} !String.prototype.format string with elements to be replaced * @param {String} String.prototype.format string with elements to be replaced
* @return {String} Formated string * @return {String} Formated string
*/ */
if (!String.prototype.format) { if (!String.prototype.format) {
String.prototype.format = function() String.prototype.format = function()
@@ -167,6 +173,18 @@ if (!String.prototype.format) {
}; };
} }
/**
* round to digits (float)
* @param {Float} Number.prototype.round Float type number to round
* @param {Number} prec Precision to round to
* @return {Float} Rounded number
*/
if (Number.prototype.round) {
Number.prototype.round = function (prec) {
return Math.round(this * Math.pow(10, prec)) / Math.pow(10, prec);
};
}
/** /**
* formats flat number 123456 to 123,456 * formats flat number 123456 to 123,456
* @param {Number} x number to be formated * @param {Number} x number to be formated
@@ -174,9 +192,9 @@ if (!String.prototype.format) {
*/ */
function numberWithCommas(x) function numberWithCommas(x)
{ {
var parts = x.toString().split("."); var parts = x.toString().split('.');
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return parts.join("."); return parts.join('.');
} }
/** /**
@@ -278,12 +296,48 @@ function randomIdF()
return Math.random().toString(36).substring(2); return Math.random().toString(36).substring(2);
} }
/**
* check if name is a function
* @param {string} name Name of function to check if exists
* @return {Boolean} true/false
*/
function isFunction(name)
{
if (typeof window[name] !== 'undefined' &&
typeof window[name] === 'function') {
return true;
} else {
return false;
}
}
/**
* call a function by its string name
* https://stackoverflow.com/a/359910
* example: executeFunctionByName("My.Namespace.functionName", window, arguments);
* @param {string} functionName The function name or namespace + function
* @param {mixed} context context (window or first namespace)
* hidden next are all the arguments
* @return {mixed} Return values from functon
*/
function executeFunctionByName(functionName, context /*, args */)
{
var args = Array.prototype.slice.call(arguments, 2);
var namespaces = functionName.split('.');
var func = namespaces.pop();
for (var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(context, args);
}
/** /**
* checks if a variable is an object * checks if a variable is an object
* @param {Mixed} val possible object * @param {Mixed} val possible object
* @return {Boolean} true/false if it is an object or not * @return {Boolean} true/false if it is an object or not
*/ */
function isObject(val) { function isObject(val)
{
if (val === null) { if (val === null) {
return false; return false;
} }
@@ -295,7 +349,8 @@ function isObject(val) {
* @param {Object} object object to check * @param {Object} object object to check
* @return {Number} number of entry * @return {Number} number of entry
*/ */
function getObjectCount(object) { function getObjectCount(object)
{
return Object.keys(object).length; return Object.keys(object).length;
} }
@@ -338,6 +393,31 @@ function valueInObject(object, value)
// }) ? true : false; // }) ? true : false;
} }
/**
* true deep copy for Javascript objects
* if Object.assign({}, obj) is not working (shallow)
* or if JSON.parse(JSON.stringify(obj)) is failing
* @param {Object} inObject Object to copy
* @return {Object} Copied Object
*/
function deepCopyFunction(inObject)
{
var outObject, value, key;
if (typeof inObject !== "object" || inObject === null) {
return inObject; // Return the value if inObject is not an object
}
// Create an array or object to hold the values
outObject = Array.isArray(inObject) ? [] : {};
// loop over ech entry in object
for (key in inObject) {
value = inObject[key];
// Recursively (deep) copy for nested objects, including arrays
outObject[key] = deepCopyFunction(value);
}
return outObject;
}
/** /**
* checks if a DOM element actually exists * checks if a DOM element actually exists
* @param {String} id Element id to check for * @param {String} id Element id to check for
@@ -364,6 +444,49 @@ function formatBytes(bytes)
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
} }
/**
* like formatBytes, but returns bytes for <1KB and not 0.n KB
* @param {Number} bytes bytes in int
* @return {String} string in GB/MB/KB
*/
function formatBytesLong(bytes)
{
var i = Math.floor(Math.log(bytes) / Math.log(1024));
var sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
return (bytes / Math.pow(1024, i)).toFixed(2) * 1 + ' ' + sizes[i];
}
/**
* Convert a string with B/K/M/etc into a byte number
* @param {String} bytes Any string with B/K/M/etc
* @return {Number} A byte number, or original string as is
*/
function stringByteFormat(bytes)
{
// early abort if this is a number already
if (!isNaN(bytes)) {
return bytes;
}
// for pow exponent list
let valid_units = 'bkmgtpezy';
// valid string that can be converted
let regex = /([\d.,]*)\s?(eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i;
let matches = bytes.match(regex);
// if nothing found, return original input
if (matches !== null) {
// remove all non valid entries outside numbers and .
// convert to float number
let m1 = parseFloat(matches[1].replace(/[^0-9.]/,''));
// only get the FIRST letter from the size, convert it to lower case
let m2 = matches[2].replace(/[^bkmgtpezy]/i, '').charAt(0).toLowerCase();
if (m2) {
// use the position in the valid unit list to do the math conversion
bytes = m1 * Math.pow(1024, valid_units.indexOf(m2));
}
}
return bytes;
}
/** /**
* prints out error messages based on data available from the browser * prints out error messages based on data available from the browser
* @param {Object} err error from try/catch block * @param {Object} err error from try/catch block
@@ -393,6 +516,20 @@ function errorCatch(err)
} }
} }
/*************************************************************
* OLD action indicator and overlay boxes calls
* DO NOT USE
* actionIndicator -> showActionIndicator
* actionIndicator -> hideActionIndicator
* actionIndicatorShow -> showActionIndicator
* actionIndicatorHide -> hideActionIndicator
* overlayBoxShow -> showOverlayBoxLayers
* overlayBoxHide -> hideOverlayBoxLayers
* setOverlayBox -> showOverlayBoxLayers
* hideOverlayBox -> hideOverlayBoxLayers
* ClearCall -> ClearCallActionBox
* ***********************************************************/
/** /**
* show or hide the "do" overlay * show or hide the "do" overlay
* @param {String} loc location name for action indicator * @param {String} loc location name for action indicator
@@ -401,10 +538,10 @@ function errorCatch(err)
*/ */
function actionIndicator(loc, overlay = true) function actionIndicator(loc, overlay = true)
{ {
if ($('#overlayBox').is(':visible')) { if ($('#indicator').is(':visible')) {
actionIndicatorHide(loc, overlay); actionIndicatorHide(loc, overlay);
} else { } else {
actionIndicatorShow(loc, overlay); actionIndicatorShow(loc, overlay);
} }
} }
@@ -417,10 +554,14 @@ function actionIndicator(loc, overlay = true)
*/ */
function actionIndicatorShow(loc, overlay = true) function actionIndicatorShow(loc, overlay = true)
{ {
console.log('Indicator: SHOW [%s]', loc); // console.log('Indicator: SHOW [%s]', loc);
$('#indicator').addClass('progress'); if (!$('#indicator').is(':visible')) {
setCenter('indicator', true, true); if (!$('#indicator').hasClass('progress')) {
$('#indicator').show(); $('#indicator').addClass('progress');
}
setCenter('indicator', true, true);
$('#indicator').show();
}
if (overlay === true) { if (overlay === true) {
overlayBoxShow(); overlayBoxShow();
} }
@@ -435,16 +576,15 @@ function actionIndicatorShow(loc, overlay = true)
*/ */
function actionIndicatorHide(loc, overlay = true) function actionIndicatorHide(loc, overlay = true)
{ {
console.log('Indicator: HIDE [%s]', loc); // console.log('Indicator: HIDE [%s]', loc);
$('#indicator').hide(); $('#indicator').hide();
$('#indicator').removeClass('progress');
if (overlay === true) { if (overlay === true) {
overlayBoxHide(); overlayBoxHide();
} }
} }
/** /**
* shows the overlay box * shows the overlay box or if already visible, bumps the zIndex to 100
*/ */
function overlayBoxShow() function overlayBoxShow()
{ {
@@ -453,16 +593,17 @@ function overlayBoxShow()
$('#overlayBox').css('zIndex', '100'); $('#overlayBox').css('zIndex', '100');
} else { } else {
$('#overlayBox').show(); $('#overlayBox').show();
$('#overlayBox').css('zIndex', '98');
} }
} }
/** /**
* hides the overlay box * hides the overlay box or if zIndex is 100 bumps it down to previous level
*/ */
function overlayBoxHide() function overlayBoxHide()
{ {
// if the overlay box z-index is 100, do no hide, but set to 98 // if the overlay box z-index is 100, do no hide, but set to 98
if ($('#overlayBox').css('zIndex') == 100) { if ($('#overlayBox').css('zIndex') >= 100) {
$('#overlayBox').css('zIndex', '98'); $('#overlayBox').css('zIndex', '98');
} else { } else {
$('#overlayBox').hide(); $('#overlayBox').hide();
@@ -474,12 +615,19 @@ function overlayBoxHide()
*/ */
function setOverlayBox() function setOverlayBox()
{ {
var viewport = document.viewport.getDimensions(); if (!$('#overlayBox').is(':visible')) {
$('#overlayBox').setStyle ({ $('#overlayBox').show();
width: '100%', }
height: '100%' }
});
$('#overlayBox').show(); /**
* opposite of set, always hides overlay box
*/
function hideOverlayBox()
{
if ($('#overlayBox').is(':visible')) {
$('#overlayBox').hide();
}
} }
/** /**
@@ -487,11 +635,167 @@ function setOverlayBox()
*/ */
function ClearCall() function ClearCall()
{ {
$('#actionBox').innerHTML = ''; $('#actionBox').html('');
$('#actionBox').hide(); $('#actionBox').hide();
$('#overlayBox').hide(); $('#overlayBox').hide();
} }
/*************************************************************
* NEW action indicator and overlay box calls
* USE THIS
* ***********************************************************/
/**
* show action indicator
* - checks if not existing and add
* - only shows if not visible (else ignore)
* - overlaybox check is called and shown on a fixzed
* zIndex of 1000
* - indicator is page centered
* @param {String} loc ID string, only used for console log
*/
function showActionIndicator(loc)
{
// console.log('Indicator: SHOW [%s]', loc);
// check if indicator element exists
if ($('#indicator').length == 0) {
var el = document.createElement('div');
el.className = 'progress hide';
el.id = 'indicator';
$('body').append(el);
} else if (!$('#indicator').hasClass('progress')) {
// if I add a class it will not be hidden anymore
// hide it
$('#indicator').addClass('progress').hide();
}
// indicator not visible
if (!$('#indicator').is(':visible')) {
// check if overlay box element exits
checkOverlayExists();
// if not visible show
if (!$('#overlayBox').is(':visible')) {
$('#overlayBox').show();
}
// always set to 1000 zIndex to be top
$('#overlayBox').css('zIndex', 1000);
// show indicator
$('#indicator').show();
// center it
setCenter('indicator', true, true);
}
}
/**
* hide action indicator, if it is visiable
* If the global variable GL_OB_S is > GL_OB_BASE then
* the overlayBox is not hidden but the zIndex
* is set to this value
* @param {String} loc ID string, only used for console log
*/
function hideActionIndicator(loc)
{
// console.log('Indicator: HIDE [%s]', loc);
// check if indicator is visible
if ($('#indicator').is(':visible')) {
// hide indicator
$('#indicator').hide();
// if global overlay box count is > 0
// then set it to this level and keep
if (GL_OB_S > GL_OB_BASE) {
$('#overlayBox').css('zIndex', GL_OB_S);
} else {
// else hide overlay box and set zIndex to 0
$('#overlayBox').hide();
$('#overlayBox').css('zIndex', GL_OB_BASE);
}
}
}
/**
* checks if overlayBox exists, if not it is
* added as hidden item at the body end
*/
function checkOverlayExists()
{
// check if overlay box exists, if not create it
if ($('#overlayBox').length == 0) {
var el = document.createElement('div');
el.className = 'overlayBoxElement hide';
el.id = 'overlayBox';
$('body').append(el);
}
}
/**
* show overlay box
* if not visible show and set zIndex to 10 (GL_OB_BASE)
* if visible, add +1 to the GL_OB_S variable and
* up zIndex by this value
*/
function showOverlayBoxLayers(el_id)
{
// console.log('SHOW overlaybox: %s', GL_OB_S);
// if overlay box is not visible show and set zIndex to 0
if (!$('#overlayBox').is(':visible')) {
$('#overlayBox').show();
$('#overlayBox').css('zIndex', GL_OB_BASE);
// also set start variable to 0
GL_OB_S = GL_OB_BASE;
}
// up the overlay box counter by 1
GL_OB_S ++;
// set zIndex
$('#overlayBox').css('zIndex', GL_OB_S);
// if element given raise zIndex and show
if (el_id) {
if ($('#' + el_id).length > 0) {
$('#' + el_id).css('zIndex', GL_OB_S + 1);
$('#' + el_id).show();
}
}
// console.log('SHOW overlaybox NEW zIndex: %s', $('#overlayBox').css('zIndex'));
}
/**
* hide overlay box
* lower GL_OB_S value by -1
* if we are 10 (GL_OB_BASE) or below hide the overlayIndex
* and set zIndex and GL_OB_S to 0
* else just set zIndex to the new GL_OB_S value
* @param {String} el_id Target to hide layer
*/
function hideOverlayBoxLayers(el_id)
{
// console.log('HIDE overlaybox: %s', GL_OB_S);
// remove on layer
GL_OB_S --;
// if 0 or lower (overflow) hide it and
// set zIndex to 0
if (GL_OB_S <= GL_OB_BASE) {
GL_OB_S = GL_OB_BASE;
$('#overlayBox').hide();
$('#overlayBox').css('zIndex', GL_OB_BASE);
} else {
// if OB_S > 0 then set new zIndex
$('#overlayBox').css('zIndex', GL_OB_S);
}
if (el_id) {
$('#' + el_id).hide();
$('#' + el_id).css('zIndex', 0);
}
// console.log('HIDE overlaybox NEW zIndex: %s', $('#overlayBox').css('zIndex'));
}
/**
* only for single action box
*/
function clearCallActionBox()
{
$('#actionBox').html('');
$('#actionBox').hide();
hideOverlayBoxLayers();
}
// *** DOM MANAGEMENT FUNCTIONS // *** DOM MANAGEMENT FUNCTIONS
/** /**
* reates object for DOM element creation flow * reates object for DOM element creation flow
@@ -527,7 +831,8 @@ function ael(base, attach, id = '')
if (id) { if (id) {
// base id match already // base id match already
if (base.id == id) { if (base.id == id) {
base.sub.push(Object.assign({}, attach)); // base.sub.push(Object.assign({}, attach));
base.sub.push(deepCopyFunction(attach));
} else { } else {
// sub check // sub check
if (isObject(base.sub) && base.sub.length > 0) { if (isObject(base.sub) && base.sub.length > 0) {
@@ -538,7 +843,8 @@ function ael(base, attach, id = '')
} }
} }
} else { } else {
base.sub.push(Object.assign({}, attach)); // base.sub.push(Object.assign({}, attach));
base.sub.push(deepCopyFunction(attach));
} }
return base; return base;
} }
@@ -553,7 +859,24 @@ function ael(base, attach, id = '')
function aelx(base, ...attach) function aelx(base, ...attach)
{ {
for (var i = 0; i < attach.length; i ++) { for (var i = 0; i < attach.length; i ++) {
base.sub.push(Object.assign({}, attach[i])); // base.sub.push(Object.assign({}, attach[i]));
base.sub.push(deepCopyFunction(attach[i]));
}
return base;
}
/**
* same as aelx, but instead of using objects as parameters
* get an array of objects to attach
* @param {Object} base object to where we attach the elements
* @param {Array} attach array of objects to attach
* @return {Object} "none", technically there is no return needed, global attach
*/
function aelxar(base, attach)
{
for (var i = 0; i < attach.length; i ++) {
// base.sub.push(Object.assign({}, attach[i]));
base.sub.push(deepCopyFunction(attach[i]));
} }
return base; return base;
} }
@@ -677,6 +1000,22 @@ function phfo(tree)
// combine to string // combine to string
return content.join(''); return content.join('');
} }
/**
* Create HTML elements from array list
* as a flat element without master object file
* Is like tree.sub call
* @param {Array} list Array of cel created objects
* @return {String} HTML String
*/
function phfa(list)
{
var content = [];
for (var i = 0; i < list.length; i ++) {
content.push(phfo(list[i]));
}
return content.join('');
}
// *** DOM MANAGEMENT FUNCTIONS // *** DOM MANAGEMENT FUNCTIONS
// BLOCK: html wrappers for quickly creating html data blocks // BLOCK: html wrappers for quickly creating html data blocks
@@ -717,9 +1056,10 @@ function html_options(name, data, selected = '', options_only = false, return_st
* @param {Boolean} [return_string=false] return as string and not as element * @param {Boolean} [return_string=false] return as string and not as element
* @param {String} [sort=''] if empty as is, else allowed 'keys', * @param {String} [sort=''] if empty as is, else allowed 'keys',
* 'values' all others are ignored * 'values' all others are ignored
* @param {String} [onchange=''] onchange trigger call, default unset
* @return {String} html with build options block * @return {String} html with build options block
*/ */
function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '') function html_options_block(name, data, selected = '', multiple = 0, options_only = false, return_string = false, sort = '', onchange = '')
{ {
var content = []; var content = [];
var element_select; var element_select;
@@ -727,13 +1067,16 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
var element_option; var element_option;
var data_list = []; // for sorted output var data_list = []; // for sorted output
var value; var value;
var option; // var option;
if (multiple > 0) { if (multiple > 0) {
select_options.multiple = ''; select_options.multiple = '';
if (multiple > 1) { if (multiple > 1) {
select_options.size = multiple; select_options.size = multiple;
} }
} }
if (onchange) {
select_options.OnChange = onchange;
}
// set outside select, gets stripped on return if options only is true // set outside select, gets stripped on return if options only is true
element_select = cel('select', name, '', [], select_options); element_select = cel('select', name, '', [], select_options);
// console.log('Call for %s, options: %s', name, options_only); // console.log('Call for %s, options: %s', name, options_only);
@@ -824,6 +1167,9 @@ function html_options_refill(name, data, sort = '')
element_option.label = value; element_option.label = value;
element_option.value = key; element_option.value = key;
element_option.innerHTML = value; element_option.innerHTML = value;
if (key == option_selected) {
element_option.selected = true;
}
document.getElementById(name).appendChild(element_option); document.getElementById(name).appendChild(element_option);
} }
} }

View File

@@ -1 +1 @@
edit.pt.js edit.jq.js

View File

@@ -176,7 +176,7 @@ function setCenter(id, left, top)
var viewport = getWindowSize(); var viewport = getWindowSize();
var offset = getScrollOffset(); var offset = getScrollOffset();
console.log('Id %s, type: %s, dimensions %s x %s, viewport %s x %s', id, type, dimensions.width, dimensions.height, viewport.width, viewport.height); // console.log('Id %s, type: %s, dimensions %s x %s, viewport %s x %s', id, type, dimensions.width, dimensions.height, viewport.width, viewport.height);
// console.log('Scrolloffset left: %s, top: %s', offset.left, offset.top); // console.log('Scrolloffset left: %s, top: %s', offset.left, offset.top);
// console.log('Left: %s, Top: %s (%s)', parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left), parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top), parseInt((viewport.height / 2) - (dimensions.height / 2))); // console.log('Left: %s, Top: %s (%s)', parseInt((viewport.width / 2) - (dimensions.width / 2) + offset.left), parseInt((viewport.height / 2) - (dimensions.height / 2) + offset.top), parseInt((viewport.height / 2) - (dimensions.height / 2)));
if (left) { if (left) {
@@ -201,8 +201,7 @@ function setCenter(id, left, top)
function goToPos(element, offset = 0) function goToPos(element, offset = 0)
{ {
try { try {
if ($(element)) if ($(element)) {
{
// get the element pos // get the element pos
var pos = $(element).cumulativeOffset(); var pos = $(element).cumulativeOffset();
// if not top element and no offset given, set auto offset for top element // if not top element and no offset given, set auto offset for top element
@@ -485,7 +484,7 @@ function actionIndicator(loc = '')
*/ */
function actionIndicatorShow(loc = '') function actionIndicatorShow(loc = '')
{ {
console.log('Indicator: SHOW [%s]', loc); // console.log('Indicator: SHOW [%s]', loc);
$('indicator').addClassName('progress'); $('indicator').addClassName('progress');
setCenter('indicator', true, true); setCenter('indicator', true, true);
$('indicator').show(); $('indicator').show();
@@ -499,14 +498,14 @@ function actionIndicatorShow(loc = '')
*/ */
function actionIndicatorHide(loc = '') function actionIndicatorHide(loc = '')
{ {
console.log('Indicator: HIDE [%s]', loc); // console.log('Indicator: HIDE [%s]', loc);
$('indicator').hide(); $('indicator').hide();
$('indicator').removeClassName('progress'); $('indicator').removeClassName('progress');
overlayBoxHide(); overlayBoxHide();
} }
/** /**
* shows the overlay box * shows the overlay box or if already visible, bumps the zIndex to 100
*/ */
function overlayBoxShow() function overlayBoxShow()
{ {
@@ -519,7 +518,7 @@ function overlayBoxShow()
} }
/** /**
* hides the overlay box * hides the overlay box or if zIndex is 100 bumps it down to previous level
*/ */
function overlayBoxHide() function overlayBoxHide()
{ {
@@ -544,6 +543,16 @@ function setOverlayBox()
$('overlayBox').show(); $('overlayBox').show();
} }
/**
* opposite of set, always hides overlay box
*/
function hideOverlayBox()
{
if ($('overlayBox').visible()) {
$('overlayBox').hide();
}
}
/** /**
* the abort call, clears the action box and hides it and the overlay box * the abort call, clears the action box and hides it and the overlay box
*/ */
@@ -618,6 +627,21 @@ function aelx(base, ...attach)
return base; return base;
} }
/**
* same as aelx, but instead of using objects as parameters
* get an array of objects to attach
* @param {Object} base object to where we attach the elements
* @param {Array} attach array of objects to attach
* @return {Object} "none", technically there is no return needed, global attach
*/
function aelxar(base, attach)
{
attach.each(function(t) {
base.sub.push(Object.assign({}, t));
});
return base;
}
/** /**
* resets the sub elements of the base element given * resets the sub elements of the base element given
* @param {Object} base cel created element * @param {Object} base cel created element

View File

@@ -3,8 +3,9 @@
* firebug 1.2+ and the webkit console */ * firebug 1.2+ and the webkit console */
var ConsoleSetup = function() { var ConsoleSetup = function() {
if (!window.console) if (!window.console) {
window.console = {}; window.console = {};
}
var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd']; var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'];

View File

@@ -53,7 +53,8 @@
] ]
}, },
time_24hr: true, time_24hr: true,
rangeSeparator: ' から ' rangeSeparator: " から ",
firstDayOfWeek: 1
}; };
fp.l10ns.ja = Japanese; fp.l10ns.ja = Japanese;
var ja = fp.l10ns; var ja = fp.l10ns;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
jquery-3.4.1.js jquery-3.6.0.js

View File

@@ -1 +1 @@
jquery-3.4.1.min.js jquery-3.6.0.min.js

View File

View File

@@ -114,16 +114,15 @@ class Login extends \CoreLibs\DB\IO
/** /**
* constructor, does ALL, opens db, works through connection checks, closes itself * constructor, does ALL, opens db, works through connection checks, closes itself
* @param array $db_config db config array * @param array $db_config db config array
* @param int $set_control_flag class variable check flags
*/ */
public function __construct(array $db_config, int $set_control_flag = 0) public function __construct(array $db_config)
{ {
// log login data for this class only // log login data for this class only
$this->log_per_class = 1; $this->log_per_class = 1;
// create db connection and init base class // create db connection and init base class
parent::__construct($db_config, $set_control_flag); parent::__construct($db_config);
if ($this->db_init_error === true) { if ($this->db_init_error === true) {
echo 'Could not connect to DB<br>'; echo 'Could not connect to DB<br>';
// if I can't connect to the DB to auth exit hard. No access allowed // if I can't connect to the DB to auth exit hard. No access allowed
@@ -161,8 +160,7 @@ class Login extends \CoreLibs\DB\IO
// if we have a search path we need to set it, to use the correct DB to login // if we have a search path we need to set it, to use the correct DB to login
// check what schema to use. if there is a login schema use this, else check if there is a schema set in the config, or fall back to DB_SCHEMA if this exists, if this also does not exists use public schema // check what schema to use. if there is a login schema use this, else check if there is a schema set in the config, or fall back to DB_SCHEMA if this exists, if this also does not exists use public schema
if (defined('LOGIN_DB_SCHEMA')) { if (defined('LOGIN_DB_SCHEMA') && LOGIN_DB_SCHEMA) {
/** @phan-suppress-next-line PhanUndeclaredConstant */
$SCHEMA = LOGIN_DB_SCHEMA; $SCHEMA = LOGIN_DB_SCHEMA;
} elseif (isset($db_config['db_schema']) && $db_config['db_schema']) { } elseif (isset($db_config['db_schema']) && $db_config['db_schema']) {
$SCHEMA = $db_config['db_schema']; $SCHEMA = $db_config['db_schema'];
@@ -178,44 +176,17 @@ class Login extends \CoreLibs\DB\IO
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0; // if there is none, there is none, saves me POST/GET check $this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0; // if there is none, there is none, saves me POST/GET check
// get login vars, are so, can't be changed // get login vars, are so, can't be changed
// prepare // prepare
if (!isset($_POST['login_login'])) {
$_POST['login_login'] = '';
}
if (!isset($_POST['login_username'])) {
$_POST['login_username'] = '';
}
if (!isset($_POST['login_password'])) {
$_POST['login_password'] = '';
}
if (!isset($_POST['login_logout'])) {
$_POST['login_logout'] = '';
}
if (!isset($_POST['change_password'])) {
$_POST['change_password'] = '';
}
if (!isset($_POST['pw_username'])) {
$_POST['pw_username'] = '';
}
if (!isset($_POST['pw_old_password'])) {
$_POST['pw_old_password'] = '';
}
if (!isset($_POST['pw_new_password'])) {
$_POST['pw_new_password'] = '';
}
if (!isset($_POST['pw_new_password_confirm'])) {
$_POST['pw_new_password_confirm'] = '';
}
// pass on vars to Object vars // pass on vars to Object vars
$this->login = $_POST['login_login']; $this->login = $_POST['login_login'] ?? '';
$this->username = $_POST['login_username']; $this->username = $_POST['login_username'] ?? '';
$this->password = $_POST['login_password']; $this->password = $_POST['login_password'] ?? '';
$this->logout = $_POST['login_logout']; $this->logout = $_POST['login_logout'] ?? '';
// password change vars // password change vars
$this->change_password = $_POST['change_password']; $this->change_password = $_POST['change_password'] ?? '';
$this->pw_username = $_POST['pw_username']; $this->pw_username = $_POST['pw_username'] ?? '';
$this->pw_old_password = $_POST['pw_old_password']; $this->pw_old_password = $_POST['pw_old_password'] ?? '';
$this->pw_new_password = $_POST['pw_new_password']; $this->pw_new_password = $_POST['pw_new_password'] ?? '';
$this->pw_new_password_confirm = $_POST['pw_new_password_confirm']; $this->pw_new_password_confirm = $_POST['pw_new_password_confirm'] ?? '';
// logout target (from config) // logout target (from config)
$this->logout_target = LOGOUT_TARGET; $this->logout_target = LOGOUT_TARGET;
// disallow user list for password change // disallow user list for password change
@@ -372,7 +343,7 @@ class Login extends \CoreLibs\DB\IO
* if user pressed login button this script is called, but only if there is no preview euid set] * if user pressed login button this script is called, but only if there is no preview euid set]
* @return void has not return * @return void has not return
*/ */
private function loginLoginUser() private function loginLoginUser(): void
{ {
// have to get the global stuff here for setting it later // have to get the global stuff here for setting it later
if (!$this->euid && $this->login) { if (!$this->euid && $this->login) {
@@ -445,8 +416,8 @@ class Login extends \CoreLibs\DB\IO
$_SESSION['GROUP_ACL_LEVEL'] = $res['group_level']; $_SESSION['GROUP_ACL_LEVEL'] = $res['group_level'];
$_SESSION['GROUP_ACL_TYPE'] = $res['group_type']; $_SESSION['GROUP_ACL_TYPE'] = $res['group_type'];
// deprecated TEMPLATE setting // deprecated TEMPLATE setting
$_SESSION['TEMPLATE'] = ($res['template']) ? $res['template'] : ''; $_SESSION['TEMPLATE'] = $res['template'] ? $res['template'] : '';
$_SESSION['HEADER_COLOR'] = ($res['second_header_color']) ? $res['second_header_color'] : $res['first_header_color']; $_SESSION['HEADER_COLOR'] = $res['second_header_color'] ? $res['second_header_color'] : $res['first_header_color'];
$_SESSION['LANG'] = $res['lang_short']; $_SESSION['LANG'] = $res['lang_short'];
$_SESSION['DEFAULT_CHARSET'] = $res['lang_iso']; $_SESSION['DEFAULT_CHARSET'] = $res['lang_iso'];
$_SESSION['DEFAULT_LANG'] = $res['lang_short'].'_'.strtolower(str_replace('-', '', $res['lang_iso'])); $_SESSION['DEFAULT_LANG'] = $res['lang_short'].'_'.strtolower(str_replace('-', '', $res['lang_iso']));
@@ -461,7 +432,9 @@ class Login extends \CoreLibs\DB\IO
$pages = array(); $pages = array();
$pages_acl = array(); $pages_acl = array();
// set pages access // set pages access
$q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, ep.filename, ep.name AS edit_page_name, ep.order_number AS edit_page_order, ep.menu, "; $q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, ";
$q .= "ep.hostname, ep.filename, ep.name AS edit_page_name, ";
$q .= "ep.order_number AS edit_page_order, ep.menu, ";
$q .= "ep.popup, ep.popup_x, ep.popup_y, ep.online, ear.level, ear.type "; $q .= "ep.popup, ep.popup_x, ep.popup_y, ep.online, ear.level, ear.type ";
$q .= "FROM edit_page ep "; $q .= "FROM edit_page ep ";
$q .= "LEFT JOIN edit_page epca ON (epca.edit_page_id = ep.content_alias_edit_page_id)"; $q .= "LEFT JOIN edit_page epca ON (epca.edit_page_id = ep.content_alias_edit_page_id)";
@@ -477,6 +450,7 @@ class Login extends \CoreLibs\DB\IO
'edit_page_id' => $res['edit_page_id'], 'edit_page_id' => $res['edit_page_id'],
'cuid' => $res['cuid'], 'cuid' => $res['cuid'],
'content_alias_uid' => $res['content_alias_uid'], // for reference of content data on a differen page 'content_alias_uid' => $res['content_alias_uid'], // for reference of content data on a differen page
'hostname' => $res['hostname'],
'filename' => $res['filename'], 'filename' => $res['filename'],
'page_name' => $res['edit_page_name'], 'page_name' => $res['edit_page_name'],
'order' => $res['edit_page_order'], 'order' => $res['edit_page_order'],
@@ -611,7 +585,7 @@ class Login extends \CoreLibs\DB\IO
* for every page the user access this script checks if he is allowed to do so * for every page the user access this script checks if he is allowed to do so
* @return bool permission okay as true/false * @return bool permission okay as true/false
*/ */
public function loginCheckPermissions() public function loginCheckPermissions(): bool
{ {
if ($this->euid && $this->login_error != 103) { if ($this->euid && $this->login_error != 103) {
$q = "SELECT filename "; $q = "SELECT filename ";
@@ -622,7 +596,7 @@ class Login extends \CoreLibs\DB\IO
// unset mem limit if debug is set to 1 // unset mem limit if debug is set to 1
// if (($GLOBALS["DEBUG_ALL"] || $GLOBALS["DB_DEBUG"] || $_SESSION["DEBUG_ALL"] || $_SESSION["DB_DEBUG"]) && ini_get('memory_limit') != -1) // if (($GLOBALS["DEBUG_ALL"] || $GLOBALS["DB_DEBUG"] || $_SESSION["DEBUG_ALL"] || $_SESSION["DB_DEBUG"]) && ini_get('memory_limit') != -1)
// ini_set('memory_limit', -1); // ini_set('memory_limit', -1);
if ($res['filename'] == $this->page_name) { if (isset($res['filename']) && $res['filename'] == $this->page_name) {
$this->permission_okay = true; $this->permission_okay = true;
} else { } else {
$this->login_error = 103; $this->login_error = 103;
@@ -637,7 +611,7 @@ class Login extends \CoreLibs\DB\IO
* if a user pressed on logout, destroyes session and unsets all global vars * if a user pressed on logout, destroyes session and unsets all global vars
* @return void has no return * @return void has no return
*/ */
public function loginLogoutUser() public function loginLogoutUser(): void
{ {
if ($this->logout || $this->login_error) { if ($this->logout || $this->login_error) {
// unregister and destroy session vars // unregister and destroy session vars
@@ -697,7 +671,7 @@ class Login extends \CoreLibs\DB\IO
* set all base ACL levels as a list keyword -> ACL number * set all base ACL levels as a list keyword -> ACL number
* @return void has no return * @return void has no return
*/ */
private function loginSetAcl() private function loginSetAcl(): void
{ {
// only set acl if we have permission okay // only set acl if we have permission okay
if ($this->permission_okay) { if ($this->permission_okay) {
@@ -790,8 +764,8 @@ class Login extends \CoreLibs\DB\IO
/** /**
* checks if this edit access id is valid * checks if this edit access id is valid
* @param int $edit_access_id access id pk to check * @param int|null $edit_access_id access id pk to check
* @return bool true/false: if the edit access is not in the valid list: false * @return bool true/false: if the edit access is not in the valid list: false
*/ */
public function loginCheckEditAccess($edit_access_id): bool public function loginCheckEditAccess($edit_access_id): bool
{ {
@@ -807,7 +781,7 @@ class Login extends \CoreLibs\DB\IO
* @param string $password the new password * @param string $password the new password
* @return bool true or false if valid password or not * @return bool true or false if valid password or not
*/ */
private function loginPasswordChangeValidPassword($password) private function loginPasswordChangeValidPassword($password): bool
{ {
$is_valid_password = true; $is_valid_password = true;
// check for valid in regex arrays in list // check for valid in regex arrays in list
@@ -829,7 +803,7 @@ class Login extends \CoreLibs\DB\IO
* dummy declare for password forget * dummy declare for password forget
* @return void has no return * @return void has no return
*/ */
private function loginPasswordForgot() private function loginPasswordForgot(): void
{ {
// will do some password recovert, eg send email // will do some password recovert, eg send email
} }
@@ -855,7 +829,7 @@ class Login extends \CoreLibs\DB\IO
* changes a user password * changes a user password
* @return void has no return * @return void has no return
*/ */
private function loginPasswordChange() private function loginPasswordChange(): void
{ {
if ($this->change_password) { if ($this->change_password) {
$event = 'Password Change'; $event = 'Password Change';
@@ -1037,7 +1011,7 @@ class Login extends \CoreLibs\DB\IO
* checks if there are external templates, if not uses internal fallback ones * checks if there are external templates, if not uses internal fallback ones
* @return void has no return * @return void has no return
*/ */
private function loginSetTemplates() private function loginSetTemplates(): void
{ {
$strings = array( $strings = array(
'HTML_TITLE' => $this->l->__('LOGIN'), 'HTML_TITLE' => $this->l->__('LOGIN'),
@@ -1196,7 +1170,7 @@ EOM;
* @param string $username login user username * @param string $username login user username
* @return void has no return * @return void has no return
*/ */
private function writeLog(string $event, string $data, $error = '', string $username = '') private function writeLog(string $event, string $data, $error = '', string $username = ''): void
{ {
if ($this->login) { if ($this->login) {
$this->action = 'Login'; $this->action = 'Login';
@@ -1218,7 +1192,7 @@ EOM;
$q .= "(username, password, euid, event_date, event, error, data, data_binary, page, "; $q .= "(username, password, euid, event_date, event, error, data, data_binary, page, ";
$q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, "; $q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, ";
$q .= "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) "; $q .= "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) ";
$q .= "VALUES ('".$this->dbEscapeString($username)."', 'PASSWORD', ".(($this->euid) ? $this->euid : 'NULL').", "; $q .= "VALUES ('".$this->dbEscapeString($username)."', 'PASSWORD', ".($this->euid ? $this->euid : 'NULL').", ";
$q .= "NOW(), '".$this->dbEscapeString($event)."', '".$this->dbEscapeString((string)$error)."', '".$this->dbEscapeString($data)."', '".$data_binary."', '".$this->page_name."', "; $q .= "NOW(), '".$this->dbEscapeString($event)."', '".$this->dbEscapeString((string)$error)."', '".$this->dbEscapeString($data)."', '".$data_binary."', '".$this->page_name."', ";
foreach (array( foreach (array(
'REMOTE_ADDR', 'HTTP_USER_AGENT', 'HTTP_REFERER', 'SCRIPT_FILENAME', 'QUERY_STRING', 'SERVER_NAME', 'HTTP_HOST', 'HTTP_ACCEPT', 'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_ENCODING' 'REMOTE_ADDR', 'HTTP_USER_AGENT', 'HTTP_REFERER', 'SCRIPT_FILENAME', 'QUERY_STRING', 'SERVER_NAME', 'HTTP_HOST', 'HTTP_ACCEPT', 'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_ENCODING'
@@ -1241,28 +1215,33 @@ EOM;
} }
/** /**
*checks that the given edit access id is valid for this user * checks that the given edit access id is valid for this user
* @param int $edit_access_id edit access id to check * @param int|null $edit_access_id edit access id to check
* @return int same edit access id if ok, or the default edit access id if given one is not valid * @return int|null same edit access id if ok
* or the default edit access id if given one is not valid
*/ */
public function loginCheckEditAccessId(int $edit_access_id) public function loginCheckEditAccessId(?int $edit_access_id): ?int
{ {
if (!array_key_exists($edit_access_id, $_SESSION["UNIT"])) { if (isset($_SESSION['UNIT']) &&
return $_SESSION["UNIT_DEFAULT"]; is_array($_SESSION['UNIT']) &&
!array_key_exists($edit_access_id, $_SESSION['UNIT'])
) {
return (int)$_SESSION['UNIT_DEFAULT'];
} else { } else {
return $edit_access_id; return $edit_access_id;
} }
} }
/** /**
* [loginSetEditAccessData description] * retunrn a set entry from the UNIT session for an edit access_id
* if not found return false
* @param int $edit_access_id edit access id * @param int $edit_access_id edit access id
* @param string|int $data_key key value to search for * @param string|int $data_key key value to search for
* @return bool|string false for not found or string for found data * @return bool|string false for not found or string for found data
*/ */
public function loginSetEditAccessData(int $edit_access_id, $data_key) public function loginSetEditAccessData(int $edit_access_id, $data_key)
{ {
if (!$_SESSION['UNIT'][$edit_access_id]['data'][$data_key]) { if (!isset($_SESSION['UNIT'][$edit_access_id]['data'][$data_key])) {
return false; return false;
} else { } else {
return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key]; return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key];

View File

@@ -68,21 +68,20 @@ class Backend extends \CoreLibs\DB\IO
// CONSTRUCTOR / DECONSTRUCTOR |====================================> // CONSTRUCTOR / DECONSTRUCTOR |====================================>
/** /**
* main class constructor * main class constructor
* @param array $db_config db config array * @param array $db_config db config array
* @param int|integer $set_control_flag class variable check flag
*/ */
public function __construct(array $db_config, int $set_control_flag = 0) public function __construct(array $db_config)
{ {
$this->setLangEncoding(); $this->setLangEncoding();
// get the language sub class & init it // get the language sub class & init it
$this->l = new \CoreLibs\Language\L10n($this->lang); $this->l = new \CoreLibs\Language\L10n($this->lang);
// init the database class // init the database class
parent::__construct($db_config, $set_control_flag); parent::__construct($db_config);
// set the action ids // set the action ids
foreach ($this->action_list as $_action) { foreach ($this->action_list as $_action) {
$this->$_action = (isset($_POST[$_action])) ? $_POST[$_action] : ''; $this->$_action = $_POST[$_action] ?? '';
} }
$this->default_acl = DEFAULT_ACL_LEVEL; $this->default_acl = DEFAULT_ACL_LEVEL;
@@ -105,6 +104,7 @@ class Backend extends \CoreLibs\DB\IO
/** /**
* set the language encoding and language settings * set the language encoding and language settings
* use $OVERRIDE_LANG to override all language settings
* the default charset from _SESSION login or from * the default charset from _SESSION login or from
* config DEFAULT ENCODING * config DEFAULT ENCODING
* the lang full name for mo loading from _SESSION login * the lang full name for mo loading from _SESSION login
@@ -168,8 +168,7 @@ class Backend extends \CoreLibs\DB\IO
} }
// check schema // check schema
if (defined('LOGIN_DB_SCHEMA')) { if (defined('LOGIN_DB_SCHEMA') && LOGIN_DB_SCHEMA) {
/** @phan-suppress-next-line PhanUndeclaredConstant */
$SCHEMA = LOGIN_DB_SCHEMA; $SCHEMA = LOGIN_DB_SCHEMA;
} elseif ($this->dbGetSchema()) { } elseif ($this->dbGetSchema()) {
$SCHEMA = $this->dbGetSchema(); $SCHEMA = $this->dbGetSchema();
@@ -186,16 +185,16 @@ class Backend extends \CoreLibs\DB\IO
$q .= "VALUES "; $q .= "VALUES ";
$q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? $_SESSION['EUID'] : 'NULL').", "; $q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? $_SESSION['EUID'] : 'NULL').", ";
$q .= "NOW(), "; $q .= "NOW(), ";
$q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString($this->page_name)."', "; $q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString((string)$this->page_name)."', ";
$q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT'])."', "; $q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT'])."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['HTTP_REFERER'] ?? '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['SCRIPT_FILENAME']) ? $_SERVER['SCRIPT_FILENAME'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['SCRIPT_FILENAME'] ?? '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['QUERY_STRING'] ?? '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['SERVER_NAME'] ?? '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['HTTP_HOST'] ?? '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['HTTP_ACCEPT'] ?? '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT_CHARSET']) ? $_SERVER['HTTP_ACCEPT_CHARSET'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['HTTP_ACCEPT_CHARSET'] ?? '')."', ";
$q .= "'".$this->dbEscapeString(isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '')."', "; $q .= "'".$this->dbEscapeString($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '')."', ";
$q .= "'".session_id()."', "; $q .= "'".session_id()."', ";
$q .= "'".$this->dbEscapeString($this->action)."', "; $q .= "'".$this->dbEscapeString($this->action)."', ";
$q .= "'".$this->dbEscapeString($this->action_id)."', "; $q .= "'".$this->dbEscapeString($this->action_id)."', ";
@@ -220,7 +219,7 @@ class Backend extends \CoreLibs\DB\IO
} }
// get the session pages array // get the session pages array
$PAGES = isset($_SESSION['PAGES']) ? $_SESSION['PAGES'] : null; $PAGES = $_SESSION['PAGES'] ?? null;
if (!isset($PAGES) || !is_array($PAGES)) { if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array(); $PAGES = array();
} }
@@ -232,13 +231,14 @@ class Backend extends \CoreLibs\DB\IO
// if flag is 0, then we show all, else, we show only the matching flagges array points // if flag is 0, then we show all, else, we show only the matching flagges array points
// array is already sorted after correct order // array is already sorted after correct order
reset($pages); reset($pages);
for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) { foreach ($pages as $i => $data) {
// for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
$show = 0; $show = 0;
// is it visible in the menu & is it online // is it visible in the menu & is it online
if ($pages[$i]['menu'] && $pages[$i]['online']) { if ($data['menu'] && $data['online']) {
// check if it falls into our flag if we have a flag // check if it falls into our flag if we have a flag
if ($flag) { if ($flag) {
foreach ($pages[$i]['visible'] as $name => $key) { foreach ($data['visible'] as $name => $key) {
if ($key == $flag) { if ($key == $flag) {
$show = 1; $show = 1;
} }
@@ -250,40 +250,67 @@ class Backend extends \CoreLibs\DB\IO
if ($show) { if ($show) {
// if it is popup, write popup arrayound // if it is popup, write popup arrayound
if (isset($pages[$i]['popup']) && $pages[$i]['popup']) { if (isset($data['popup']) && $data['popup']) {
$type = 'popup'; $type = 'popup';
} else { } else {
$type = 'normal'; $type = 'normal';
$pages[$i]['popup'] = 0; $data['popup'] = 0;
} }
$query_string = ''; $query_string = '';
if (isset($pages[$i]['query']) && count($pages[$i]['query'])) {
for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) { if (isset($data['query']) &&
if (strlen($query_string)) { is_array($data['query']) &&
$query_string .= '&'; count($data['query'])
} ) {
$query_string .= $pages[$i]['query'][$j]['name'].'='; // for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
if (!$pages[$i]['query'][$j]['dynamic']) { foreach ($data['query'] as $j => $query) {
$query_string .= urlencode($pages[$i]['query'][$j]['value']); if (!empty($query['name']) &&
} else { !empty($query['value'])
$query_string .= $_GET[$pages[$i]['query'][$j]['value']] ? urlencode($_GET[$pages[$i]['query'][$j]['value']]) : urlencode($_POST[$pages[$i]['query'][$j]['value']]); ) {
if (strlen($query_string)) {
$query_string .= '&';
}
$query_string .= $query['name'].'=';
if (isset($query['dynamic']) &&
$query['dynamic']
) {
if (isset($_GET[$query['value']])) {
$query_string .= urlencode($_GET[$query['value']]);
} elseif (isset($_POST[$query['value']])) {
$query_string .= urlencode($_POST[$query['value']]);
}
} else {
$query_string .= urlencode($query['value']);
}
} }
} }
} }
$url = $pages[$i]['filename']; $url = '';
if (isset($data['hostname']) && $data['hostname']) {
$url .= $data['hostname'];
}
$url .= $data['filename'] ?? '';
if (strlen($query_string)) { if (strlen($query_string)) {
$url .= '?'.$query_string; $url .= '?'.$query_string;
} }
$name = $pages[$i]['page_name']; $name = $data['page_name'] ?? '';
// if page name matchs -> set selected flag // if page name matchs -> set selected flag
$selected = 0; $selected = 0;
if ($this->getPageName() == $pages[$i]['filename']) { if (isset($data['filename']) &&
$this->getPageName() == $data['filename'] &&
(!isset($data['hostname']) || (
isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
))
) {
$selected = 1; $selected = 1;
$this->page_name = $name; $this->page_name = $name;
} }
// last check, is this menu point okay to show // last check, is this menu point okay to show
$enabled = 0; $enabled = 0;
if ($this->adbShowMenuPoint($pages[$i]['filename'])) { if (isset($data['filename']) &&
$this->adbShowMenuPoint($data['filename'])
) {
$enabled = 1; $enabled = 1;
} }
// write in to view menu array // write in to view menu array
@@ -303,12 +330,16 @@ class Backend extends \CoreLibs\DB\IO
/** /**
* checks if this filename is in the current situation (user id, etc) available * checks if this filename is in the current situation (user id, etc) available
* @param string $filename filename * @param string|null $filename filename
* @return bool true for visible/accessable menu point, false for not * @return bool true for visible/accessable menu point, false for not
*/ */
public function adbShowMenuPoint(string $filename): bool public function adbShowMenuPoint(?string $filename): bool
{ {
$enabled = false; $enabled = false;
if ($filename === null) {
return $enabled;
}
/** @phan-suppress-next-line PhanNoopSwitchCases */
switch ($filename) { switch ($filename) {
default: default:
$enabled = true; $enabled = true;
@@ -340,7 +371,7 @@ class Backend extends \CoreLibs\DB\IO
public function adbByteStringFormat($number): string public function adbByteStringFormat($number): string
{ {
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED); trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED);
return $this->byteStringFormat($number); return $this->humanReadableByteFormat($number);
} }
/** /**
@@ -410,8 +441,7 @@ class Backend extends \CoreLibs\DB\IO
string $associate = null, string $associate = null,
string $file = null string $file = null
): void { ): void {
if (defined('GLOBAL_DB_SCHEMA')) { if (defined('GLOBAL_DB_SCHEMA') && GLOBAL_DB_SCHEMA) {
/** @phan-suppress-next-line PhanUndeclaredConstant */
$SCHEMA = GLOBAL_DB_SCHEMA; $SCHEMA = GLOBAL_DB_SCHEMA;
} elseif ($this->dbGetSchema()) { } elseif ($this->dbGetSchema()) {
$SCHEMA = $this->dbGetSchema(); $SCHEMA = $this->dbGetSchema();

File diff suppressed because it is too large Load Diff

View File

@@ -51,15 +51,14 @@ class ArrayIO extends \CoreLibs\DB\IO
/** /**
* constructor for the array io class, set the * constructor for the array io class, set the
* primary key name automatically (from array) * primary key name automatically (from array)
* @param array $db_config db connection config * @param array $db_config db connection config
* @param array $table_array table array config * @param array $table_array table array config
* @param string $table_name table name string * @param string $table_name table name string
* @param int|integer $set_control_flag set basic class set/get variable error flags
*/ */
public function __construct(array $db_config, array $table_array, string $table_name, int $set_control_flag = 0) public function __construct(array $db_config, array $table_array, string $table_name)
{ {
// instance db_io class // instance db_io class
parent::__construct($db_config, $set_control_flag); parent::__construct($db_config);
// more error vars for this class // more error vars for this class
$this->error_string['91'] = 'No Primary Key given'; $this->error_string['91'] = 'No Primary Key given';
$this->error_string['92'] = 'Could not run Array Query'; $this->error_string['92'] = 'Could not run Array Query';

View File

@@ -128,13 +128,13 @@
* - returns an hashed array of table column data * - returns an hashed array of table column data
* function db_prepare($stm_name, $query) * function db_prepare($stm_name, $query)
* - prepares a query with the given stm name, returns false on error * - prepares a query with the given stm name, returns false on error
* function db_execute($stm_name, $data = array()) * function db_execute($stm_name, $data = [])
* - execute a query that was previously prepared * - execute a query that was previously prepared
* $string db_escape_string($string) * $string db_escape_string($string)
* - correctly escapes string for db insert * - correctly escapes string for db insert
* $string db_boolean(string) * $string db_boolean(string)
* - if the string value is 't' or 'f' it returns correct TRUE/FALSE for php * - if the string value is 't' or 'f' it returns correct TRUE/FALSE for php
* $primary_key db_write_data($write_array, $not_write_array, $primary_key, $table, $data = array()) * $primary_key db_write_data($write_array, $not_write_array, $primary_key, $table, $data = [])
* - writes into one table based on arrays of columns to write and not write, reads data from global vars or optional array * - writes into one table based on arrays of columns to write and not write, reads data from global vars or optional array
* $boolean db_set_schema(schema) * $boolean db_set_schema(schema)
* - sets search path to a schema * - sets search path to a schema
@@ -270,9 +270,10 @@ class IO extends \CoreLibs\Basic
public $cursor; // actual cursor (DBH) public $cursor; // actual cursor (DBH)
public $num_rows; // how many rows have been found public $num_rows; // how many rows have been found
public $num_fields; // how many fields has the query public $num_fields; // how many fields has the query
public $field_names = array(); // array with the field names of the current query public $field_names = []; // array with the field names of the current query
public $insert_id; // last inserted ID public $insert_id; // last inserted ID
public $insert_id_ext; // extended insert ID (for data outside only primary key) public $insert_id_ext; // extended insert ID (for data outside only primary key)
public $insert_id_arr; // always return as array, even if only one
private $temp_sql; private $temp_sql;
// other vars // other vars
private $nbsp = ''; // used by print_array recursion function private $nbsp = ''; // used by print_array recursion function
@@ -288,14 +289,15 @@ class IO extends \CoreLibs\Basic
// endless loop protection // endless loop protection
private $MAX_QUERY_CALL; private $MAX_QUERY_CALL;
private $query_called = array(); private $DEFAULT_MAX_QUERY_CALL = 20; // default
private $query_called = [];
// error string // error string
protected $error_string = array(); protected $error_string = [];
// prepared list // prepared list
public $prepare_cursor = array(); public $prepare_cursor = [];
// primary key per table list // primary key per table list
// format is 'table' => 'pk_name' // format is 'table' => 'pk_name'
public $pk_name_table = array(); public $pk_name_table = [];
// internal primary key name, for cross calls in async // internal primary key name, for cross calls in async
public $pk_name; public $pk_name;
// if we use RETURNING in the INSERT call // if we use RETURNING in the INSERT call
@@ -306,22 +308,21 @@ class IO extends \CoreLibs\Basic
/** /**
* main DB concstructor with auto connection to DB and failure set on failed connection * main DB concstructor with auto connection to DB and failure set on failed connection
* @param array $db_config DB configuration array * @param array $db_config DB configuration array
* @param int $set_control_flag 0/1/2/3 to set internal class parameter check
*/ */
public function __construct(array $db_config, int $set_control_flag = 0) public function __construct(array $db_config)
{ {
// start basic class // start basic class
parent::__construct($set_control_flag); parent::__construct();
// dummy init array for db config if not array // dummy init array for db config if not array
if (!is_array($db_config)) { if (!is_array($db_config)) {
$db_config = array(); $db_config = [];
} }
// sets the names (for connect/reconnect) // sets the names (for connect/reconnect)
$this->db_name = $db_config['db_name'] ?? ''; $this->db_name = $db_config['db_name'] ?? '';
$this->db_user = $db_config['db_user'] ?? ''; $this->db_user = $db_config['db_user'] ?? '';
$this->db_pwd = $db_config['db_pass'] ?? ''; $this->db_pwd = $db_config['db_pass'] ?? '';
$this->db_host = $db_config['db_host'] ?? ''; $this->db_host = $db_config['db_host'] ?? '';
$this->db_port = !empty($db_config['db_port']) ? $db_config['db_port'] : '5432'; $this->db_port = !empty($db_config['db_port']) ? $db_config['db_port'] : 5432;
$this->db_schema = !empty($db_config['db_schema']) ? $db_config['db_schema'] : ''; // do not set to 'public' if not set, because the default is already public $this->db_schema = !empty($db_config['db_schema']) ? $db_config['db_schema'] : ''; // do not set to 'public' if not set, because the default is already public
$this->db_encoding = !empty($db_config['db_encoding']) ? $db_config['db_encoding'] : ''; $this->db_encoding = !empty($db_config['db_encoding']) ? $db_config['db_encoding'] : '';
$this->db_type = $db_config['db_type'] ?? ''; $this->db_type = $db_config['db_type'] ?? '';
@@ -357,6 +358,8 @@ class IO extends \CoreLibs\Basic
$this->error_string['40'] = 'Query async call failed.'; $this->error_string['40'] = 'Query async call failed.';
$this->error_string['41'] = 'Connection is busy with a different query. Cannot execute.'; $this->error_string['41'] = 'Connection is busy with a different query. Cannot execute.';
$this->error_string['42'] = 'Cannot check for async query, none has been started yet.'; $this->error_string['42'] = 'Cannot check for async query, none has been started yet.';
$this->error_string['50'] = 'Setting max query call to -1 will disable loop protection for all subsequent runs';
$this->error_string['51'] = 'Max query call needs to be set to at least 1';
// set debug, either via global var, or debug var during call // set debug, either via global var, or debug var during call
$this->db_debug = false; $this->db_debug = false;
@@ -508,7 +511,7 @@ class IO extends \CoreLibs\Basic
{ {
$string = ''; $string = '';
if (!is_array($array)) { if (!is_array($array)) {
$array = array(); $array = [];
} }
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
$string .= $this->nbsp.'<b>'.$key.'</b> => '; $string .= $this->nbsp.'<b>'.$key.'</b> => ';
@@ -587,22 +590,22 @@ class IO extends \CoreLibs\Basic
/** /**
* if there is the 'to_encoding' var set, and the field is in the wrong encoding converts it to the target * if there is the 'to_encoding' var set, and the field is in the wrong encoding converts it to the target
* @param array|bool $row array from fetch_row * @param array|bool|null $row array from fetch_row
* @return array|bool convert fetch_row array, or false * @return array|bool|null convert fetch_row array, or false
*/ */
private function __dbConvertEncoding($row) private function __dbConvertEncoding($row)
{ {
// only do if array, else pass through row (can be false) // only do if array, else pass through row (can be false)
if (is_array($row)) { if (!is_array($row) || empty($this->to_encoding) || empty($this->db_encoding)
if ($this->to_encoding && $this->db_encoding) { ) {
// go through each row and convert the encoding if needed return $row;
foreach ($row as $key => $value) { }
$from_encoding = mb_detect_encoding($value); // go through each row and convert the encoding if needed
// convert only if encoding doesn't match and source is not pure ASCII foreach ($row as $key => $value) {
if ($from_encoding != $this->to_encoding && $from_encoding != 'ASCII') { $from_encoding = mb_detect_encoding($value);
$row[$key] = mb_convert_encoding($value, $this->to_encoding, $from_encoding); // convert only if encoding doesn't match and source is not pure ASCII
} if ($from_encoding != $this->to_encoding && $from_encoding != 'ASCII') {
} $row[$key] = mb_convert_encoding($value, $this->to_encoding, $from_encoding);
} }
} }
return $row; return $row;
@@ -614,7 +617,7 @@ class IO extends \CoreLibs\Basic
* @param array $data the data array * @param array $data the data array
* @return string string of query with data inside * @return string string of query with data inside
*/ */
private function __dbDebugPrepare(string $stm_name, array $data = array()): string private function __dbDebugPrepare(string $stm_name, array $data = []): string
{ {
// get the keys from data array // get the keys from data array
$keys = array_keys($data); $keys = array_keys($data);
@@ -633,6 +636,7 @@ class IO extends \CoreLibs\Basic
*/ */
private function __dbReturnTable(string $query): array private function __dbReturnTable(string $query): array
{ {
$matches = [];
if (preg_match("/^SELECT /i", $query)) { if (preg_match("/^SELECT /i", $query)) {
preg_match("/ (FROM) (([\w_]+)\.)?([\w_]+) /i", $query, $matches); preg_match("/ (FROM) (([\w_]+)\.)?([\w_]+) /i", $query, $matches);
} else { } else {
@@ -655,6 +659,7 @@ class IO extends \CoreLibs\Basic
*/ */
private function __dbPrepareExec(string $query, string $pk_name) private function __dbPrepareExec(string $query, string $pk_name)
{ {
$matches= [];
// to either use the returning method or the guess method for getting primary keys // to either use the returning method or the guess method for getting primary keys
$this->returning_id = false; $this->returning_id = false;
// set the query // set the query
@@ -729,7 +734,10 @@ class IO extends \CoreLibs\Basic
$this->query_called[$md5] = 0; $this->query_called[$md5] = 0;
} }
// count up the run, if this is run more than the max_run then exit with error // count up the run, if this is run more than the max_run then exit with error
if ($this->query_called[$md5] > $this->MAX_QUERY_CALL) { // if set to -1, then ignore it
if ($this->MAX_QUERY_CALL != -1 &&
$this->query_called[$md5] > $this->MAX_QUERY_CALL
) {
$this->error_id = 30; $this->error_id = 30;
$this->__dbError(); $this->__dbError();
$this->__dbDebug('db', $this->query, 'dbExec', 'Q[nc]'); $this->__dbDebug('db', $this->query, 'dbExec', 'Q[nc]');
@@ -765,7 +773,7 @@ class IO extends \CoreLibs\Basic
// count the fields // count the fields
$this->num_fields = $this->db_functions->__dbNumFields($this->cursor); $this->num_fields = $this->db_functions->__dbNumFields($this->cursor);
// set field names // set field names
$this->field_names = array(); $this->field_names = [];
for ($i = 0; $i < $this->num_fields; $i ++) { for ($i = 0; $i < $this->num_fields; $i ++) {
$this->field_names[] = $this->db_functions->__dbFieldName($this->cursor, $i); $this->field_names[] = $this->db_functions->__dbFieldName($this->cursor, $i);
} }
@@ -780,9 +788,12 @@ class IO extends \CoreLibs\Basic
// if we do not have a returning, we try to get it via the primary key and another select // if we do not have a returning, we try to get it via the primary key and another select
if (!$this->returning_id) { if (!$this->returning_id) {
$this->insert_id = $this->db_functions->__dbInsertId($this->query, $this->pk_name); $this->insert_id = $this->db_functions->__dbInsertId($this->query, $this->pk_name);
$this->insert_id_ext = $this->insert_id;
$this->insert_id_arr[] = $this->insert_id;
} else { } else {
$this->insert_id = array(); $this->insert_id = [];
$this->insert_id_ext = array(); $this->insert_id_ext = [];
$this->insert_id_arr = [];
// echo "** PREPARE RETURNING FOR CURSOR: ".$this->cursor."<br>"; // echo "** PREPARE RETURNING FOR CURSOR: ".$this->cursor."<br>";
// we have returning, now we need to check if we get one or many returned // we have returning, now we need to check if we get one or many returned
// we'll need to loop this, if we have multiple insert_id returns // we'll need to loop this, if we have multiple insert_id returns
@@ -792,6 +803,7 @@ class IO extends \CoreLibs\Basic
)) { )) {
// echo "*** RETURNING: ".print_r($_insert_id, true)."<br>"; // echo "*** RETURNING: ".print_r($_insert_id, true)."<br>";
$this->insert_id[] = $_insert_id; $this->insert_id[] = $_insert_id;
$this->insert_id_arr[] = $_insert_id;
} }
// if we have only one, revert from array to single // if we have only one, revert from array to single
if (count($this->insert_id) == 1) { if (count($this->insert_id) == 1) {
@@ -800,7 +812,9 @@ class IO extends \CoreLibs\Basic
// if this has only the pk_name, then only return this, else array of all data (but without the position) // if this has only the pk_name, then only return this, else array of all data (but without the position)
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar'] // example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id // if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
if (count($this->insert_id[0]) > 1 || !array_key_exists($this->pk_name, $this->insert_id[0])) { if (count($this->insert_id[0]) > 1 ||
!array_key_exists($this->pk_name, $this->insert_id[0])
) {
$this->insert_id_ext = $this->insert_id[0]; $this->insert_id_ext = $this->insert_id[0];
if (isset($this->insert_id[0][$this->pk_name])) { if (isset($this->insert_id[0][$this->pk_name])) {
$this->insert_id = $this->insert_id[0][$this->pk_name]; $this->insert_id = $this->insert_id[0][$this->pk_name];
@@ -855,6 +869,52 @@ class IO extends \CoreLibs\Basic
return $this->db_debug; return $this->db_debug;
} }
/**
* set max query calls, set to --1 to disable loop
* protection. this will generate a warning
* empty call (null) will reset to default
* @param int|null $max_calls Set the max loops allowed
* @return bool True for succesfull set
*/
public function dbSetMaxQueryCall(?int $max_calls = null): bool
{
$success = false;
// if null then reset to default
if ($max_calls === null) {
$max_calls = $this->DEFAULT_MAX_QUERY_CALL;
}
// if -1 then disable loop check
// DANGEROUS, WARN USER
if ($max_calls == -1) {
$this->warning_id = 50;
$this->__dbError();
}
// negative or 0
if ($max_calls < -1 || $max_calls == 0) {
$this->error_id = 51;
$this->__dbError();
// early abort
return false;
}
// ok entry, set
if ($max_calls == -1 ||
$max_calls > 0
) {
$this->MAX_QUERY_CALL = $max_calls;
$succes = true;
}
return $success;
}
/**
* returns current set max query calls for loop avoidance
* @return int Integer number, if -1 the loop check is disabled
*/
public function dbGetMaxQueryCall(): int
{
return $this->MAX_QUERY_CALL;
}
/** /**
* resets the call times for the max query called to 0 * resets the call times for the max query called to 0
* USE CAREFULLY: rather make the query prepare -> execute * USE CAREFULLY: rather make the query prepare -> execute
@@ -957,6 +1017,28 @@ class IO extends \CoreLibs\Basic
return $this->dbReturnRow('SHOW client_encoding')['client_encoding']; return $this->dbReturnRow('SHOW client_encoding')['client_encoding'];
} }
/**
* get certain settings like username, db name
* @param string $name what setting to query
* @return mixed setting value, if not allowed name return false
*/
public function dbGetSetting(string $name)
{
$setting = '';
switch ($name) {
case 'name':
$setting = $this->db_name;
break;
case 'user':
$setting = $this->db_user;
break;
default:
$setting = false;
break;
}
return $setting;
}
/** /**
* prints out status info from the connected DB (might be usefull for debug stuff) * prints out status info from the connected DB (might be usefull for debug stuff)
* @param bool|boolean $show show db connection info, default true * @param bool|boolean $show show db connection info, default true
@@ -972,7 +1054,7 @@ class IO extends \CoreLibs\Basic
$string .= 'at host <b>\''.$this->db_host.'\'</b> '; $string .= 'at host <b>\''.$this->db_host.'\'</b> ';
$string .= 'on port <b>\''.$this->db_port.'\'</b> '; $string .= 'on port <b>\''.$this->db_port.'\'</b> ';
$string .= 'with ssl mode <b>\''.$this->db_ssl.'\'</b><br>'; $string .= 'with ssl mode <b>\''.$this->db_ssl.'\'</b><br>';
$string .= '<b>-DB-info-></b> DB IO Class debug output: <b>'.(($this->db_debug) ? 'Yes' : 'No').'</b>'; $string .= '<b>-DB-info-></b> DB IO Class debug output: <b>'.($this->db_debug ? 'Yes' : 'No').'</b>';
if ($show === true) { if ($show === true) {
$this->__dbDebug('db', $string, 'dbInfo'); $this->__dbDebug('db', $string, 'dbInfo');
} else { } else {
@@ -1124,6 +1206,10 @@ class IO extends \CoreLibs\Basic
$this->db_functions->__dbResultType($assoc_only) $this->db_functions->__dbResultType($assoc_only)
) )
); );
// if returned is NOT an array, abort to false
if (!is_array($return)) {
$return = false;
}
} }
// check if cached call or reset call ... // check if cached call or reset call ...
if (!$return && !$reset) { if (!$return && !$reset) {
@@ -1135,7 +1221,7 @@ class IO extends \CoreLibs\Basic
$return = false; $return = false;
} else { } else {
// unset return value ... // unset return value ...
$return = array(); $return = [];
for ($i = 0; $i < $this->cursor_ext[$md5]['num_fields']; $i ++) { for ($i = 0; $i < $this->cursor_ext[$md5]['num_fields']; $i ++) {
// create mixed return array // create mixed return array
if ($assoc_only === false && isset($this->cursor_ext[$md5]['data'][$this->cursor_ext[$md5]['pos']][$i])) { if ($assoc_only === false && isset($this->cursor_ext[$md5]['data'][$this->cursor_ext[$md5]['pos']][$i])) {
@@ -1171,7 +1257,7 @@ class IO extends \CoreLibs\Basic
$this->cursor_ext[$md5]['read_rows'] ++; $this->cursor_ext[$md5]['read_rows'] ++;
// if reset is <3 caching is done, else no // if reset is <3 caching is done, else no
if ($reset < 3) { if ($reset < 3) {
$temp = array(); $temp = [];
foreach ($return as $field_name => $data) { foreach ($return as $field_name => $data) {
$temp[$field_name] = $data; $temp[$field_name] = $data;
} }
@@ -1361,9 +1447,9 @@ class IO extends \CoreLibs\Basic
return false; return false;
} }
$cursor = $this->dbExec($query); $cursor = $this->dbExec($query);
$rows = array(); $rows = [];
while ($res = $this->dbFetchArray($cursor, $assoc_only)) { while ($res = $this->dbFetchArray($cursor, $assoc_only)) {
$data = array(); $data = [];
for ($i = 0; $i < $this->num_fields; $i ++) { for ($i = 0; $i < $this->num_fields; $i ++) {
$data[$this->field_names[$i]] = $res[$this->field_names[$i]]; $data[$this->field_names[$i]] = $res[$this->field_names[$i]];
} }
@@ -1385,7 +1471,7 @@ class IO extends \CoreLibs\Basic
return false; return false;
} }
$md5 = md5($query); $md5 = md5($query);
return $this->cursor_ext[$md5]['pos']; return (int)$this->cursor_ext[$md5]['pos'];
} }
/** /**
@@ -1401,7 +1487,7 @@ class IO extends \CoreLibs\Basic
return false; return false;
} }
$md5 = md5($query); $md5 = md5($query);
return $this->cursor_ext[$md5]['num_rows']; return (int)$this->cursor_ext[$md5]['num_rows'];
} }
/** /**
@@ -1432,6 +1518,7 @@ class IO extends \CoreLibs\Basic
*/ */
public function dbPrepare(string $stm_name, string $query, string $pk_name = '') public function dbPrepare(string $stm_name, string $query, string $pk_name = '')
{ {
$matches = [];
if (!$query) { if (!$query) {
$this->error_id = 11; $this->error_id = 11;
$this->__dbError(); $this->__dbError();
@@ -1462,7 +1549,7 @@ class IO extends \CoreLibs\Basic
if (!$pk_name) { if (!$pk_name) {
// read the primary key from the table, if we do not have one, we get nothing in return // read the primary key from the table, if we do not have one, we get nothing in return
list($schema, $table) = $this->__dbReturnTable($query); list($schema, $table) = $this->__dbReturnTable($query);
if (!$this->pk_name_table[$table]) { if (empty($this->pk_name_table[$table])) {
$this->pk_name_table[$table] = $this->db_functions->__dbPrimaryKey($table, $schema); $this->pk_name_table[$table] = $this->db_functions->__dbPrimaryKey($table, $schema);
} }
$pk_name = $this->pk_name_table[$table]; $pk_name = $this->pk_name_table[$table];
@@ -1485,9 +1572,11 @@ class IO extends \CoreLibs\Basic
$this->prepare_cursor[$stm_name]['pk_name'] = $pk_name; $this->prepare_cursor[$stm_name]['pk_name'] = $pk_name;
} }
} }
$match = [];
// search for $1, $2, in the query and push it into the control array // search for $1, $2, in the query and push it into the control array
// skip counts for same eg $1, $1, $2 = 2 and not 3
preg_match_all('/(\$[0-9]{1,})/', $query, $match); preg_match_all('/(\$[0-9]{1,})/', $query, $match);
$this->prepare_cursor[$stm_name]['count'] = count($match[1]); $this->prepare_cursor[$stm_name]['count'] = count(array_unique($match[1]));
$this->prepare_cursor[$stm_name]['query'] = $query; $this->prepare_cursor[$stm_name]['query'] = $query;
$result = $this->db_functions->__dbPrepare($stm_name, $query); $result = $this->db_functions->__dbPrepare($stm_name, $query);
if ($result) { if ($result) {
@@ -1512,7 +1601,7 @@ class IO extends \CoreLibs\Basic
* @param array $data data to run for this query, empty array for none * @param array $data data to run for this query, empty array for none
* @return ?mixed false on error, or result on OK * @return ?mixed false on error, or result on OK
*/ */
public function dbExecute(string $stm_name, array $data = array()) public function dbExecute(string $stm_name, array $data = [])
{ {
// if we do not have no prepare cursor array entry for this statement name, abort // if we do not have no prepare cursor array entry for this statement name, abort
if (!is_array($this->prepare_cursor[$stm_name])) { if (!is_array($this->prepare_cursor[$stm_name])) {
@@ -1529,71 +1618,74 @@ class IO extends \CoreLibs\Basic
$this->error_id = 23; $this->error_id = 23;
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Array data count does not match prepared fields. Need: '.$this->prepare_cursor[$stm_name]['count'].', has: '.count($data).'</span>', 'DB_ERROR'); $this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Array data count does not match prepared fields. Need: '.$this->prepare_cursor[$stm_name]['count'].', has: '.count($data).'</span>', 'DB_ERROR');
return false; return false;
} else {
if ($this->db_debug) {
$this->__dbDebug('db', $this->__dbDebugPrepare($stm_name, $data), 'dbExecPrep', 'Q');
}
$result = $this->db_functions->__dbExecute($stm_name, $data);
if (!$result) {
$this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[$stm_name]['result'].']: '.$this->printAr($data));
$this->error_id = 22;
$this->__dbError($this->prepare_cursor[$stm_name]['result']);
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Execution failed</span>', 'DB_ERROR');
return false;
}
if ($this->__checkQueryForInsert($this->prepare_cursor[$stm_name]['query'], true) &&
$this->prepare_cursor[$stm_name]['pk_name'] != 'NULL'
) {
if (!$this->prepare_cursor[$stm_name]['returning_id']) {
$this->insert_id = $this->db_functions->__dbInsertId($this->prepare_cursor[$stm_name]['query'], $this->prepare_cursor[$stm_name]['pk_name']);
} elseif ($result) {
$this->insert_id = array();
$this->insert_id_ext = array();
// we have returning, now we need to check if we get one or many returned
// we'll need to loop this, if we have multiple insert_id returns
while ($_insert_id = $this->db_functions->__dbFetchArray(
$result,
$this->db_functions->__dbResultType(true)
)) {
$this->insert_id[] = $_insert_id;
}
// if we have only one, revert from arry to single
if (count($this->insert_id) == 1) {
// echo "+ SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])."<br>";
// echo "+ PK DIRECT: ".$this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]."<Br>";
// if this has only the pk_name, then only return this, else array of all data (but without the position)
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
if (count($this->insert_id[0]) > 1 ||
!array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])
) {
$this->insert_id_ext = $this->insert_id[0];
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
} elseif ($this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]) {
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
}
} elseif (count($this->insert_id) == 0) {
// failed to get insert id
$this->insert_id = '';
$this->warning_id = 33;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
}
}
// this error handling is only for pgsql
if (is_array($this->insert_id)) {
$this->warning_id = 32;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id data returned as array</span>', 'DB_WARNING');
} elseif (!$this->insert_id) {
// NOTE should we keep this inside
$this->warning_id = 31;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': Could not get insert id</span>', 'DB_WARNING');
}
}
return $result;
} }
if ($this->db_debug) {
$this->__dbDebug('db', $this->__dbDebugPrepare($stm_name, $data), 'dbExecPrep', 'Q');
}
$result = $this->db_functions->__dbExecute($stm_name, $data);
if (!$result) {
$this->debug('ExecuteData', 'ERROR in STM['.$stm_name.'|'.$this->prepare_cursor[$stm_name]['result'].']: '.$this->printAr($data));
$this->error_id = 22;
$this->__dbError($this->prepare_cursor[$stm_name]['result']);
$this->__dbDebug('db', '<span style="color: red;"><b>DB-Error</b> '.$stm_name.': Execution failed</span>', 'DB_ERROR');
return false;
}
if ($this->__checkQueryForInsert($this->prepare_cursor[$stm_name]['query'], true) &&
$this->prepare_cursor[$stm_name]['pk_name'] != 'NULL'
) {
if (!$this->prepare_cursor[$stm_name]['returning_id']) {
$this->insert_id = $this->db_functions->__dbInsertId($this->prepare_cursor[$stm_name]['query'], $this->prepare_cursor[$stm_name]['pk_name']);
$this->insert_id_ext = $this->insert_id;
$this->insert_id_arr[] = $this->insert_id;
} elseif ($result) {
$this->insert_id = [];
$this->insert_id_ext = [];
$this->insert_id_arr = [];
// we have returning, now we need to check if we get one or many returned
// we'll need to loop this, if we have multiple insert_id returns
while ($_insert_id = $this->db_functions->__dbFetchArray(
$result,
$this->db_functions->__dbResultType(true)
)) {
$this->insert_id[] = $_insert_id;
$this->insert_id_arr[] = $_insert_id;
}
// if we have only one, revert from arry to single
if (count($this->insert_id) == 1) {
// echo "+ SINGLE DATA CONVERT: ".count($this->insert_id[0])." => ".array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])."<br>";
// echo "+ PK DIRECT: ".$this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]."<Br>";
// if this has only the pk_name, then only return this, else array of all data (but without the position)
// example if insert_id[0]['foo'] && insert_id[0]['bar'] it will become insert_id['foo'] & insert_id['bar']
// if only ['foo_id'] and it is the PK then the PK is directly written to the insert_id
if (count($this->insert_id[0]) > 1 ||
!array_key_exists($this->prepare_cursor[$stm_name]['pk_name'], $this->insert_id[0])
) {
$this->insert_id_ext = $this->insert_id[0];
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
} elseif ($this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']]) {
$this->insert_id = $this->insert_id[0][$this->prepare_cursor[$stm_name]['pk_name']];
}
} elseif (count($this->insert_id) == 0) {
// failed to get insert id
$this->insert_id = '';
$this->warning_id = 33;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id returned no data</span>', 'DB_WARNING');
}
}
// this error handling is only for pgsql
if (is_array($this->insert_id)) {
$this->warning_id = 32;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': insert id data returned as array</span>', 'DB_WARNING');
} elseif (!$this->insert_id) {
// NOTE should we keep this inside
$this->warning_id = 31;
$this->__dbError();
$this->__dbDebug('db', '<span style="color: orange;"><b>DB-Warning</b> '.$stm_name.': Could not get insert id</span>', 'DB_WARNING');
}
}
return $result;
} }
/** /**
@@ -1643,6 +1735,7 @@ class IO extends \CoreLibs\Basic
*/ */
public function dbCompareVersion(string $compare): bool public function dbCompareVersion(string $compare): bool
{ {
$matches = [];
// compare has =, >, < prefix, and gets stripped, if the rest is not X.Y format then error // compare has =, >, < prefix, and gets stripped, if the rest is not X.Y format then error
preg_match("/^([<>=]{1,})(\d{1,})\.(\d{1,})/", $compare, $matches); preg_match("/^([<>=]{1,})(\d{1,})\.(\d{1,})/", $compare, $matches);
$compare = $matches[1]; $compare = $matches[1];
@@ -1738,18 +1831,18 @@ class IO extends \CoreLibs\Basic
* @param array $data data array to override _POST data * @param array $data data array to override _POST data
* @return int|bool primary key * @return int|bool primary key
*/ */
public function dbWriteData(array $write_array, array $not_write_array, $primary_key, string $table, $data = array()) public function dbWriteData(array $write_array, array $not_write_array, $primary_key, string $table, $data = [])
{ {
if (!is_array($write_array)) { if (!is_array($write_array)) {
$write_array = array(); $write_array = [];
} }
if (!is_array($not_write_array)) { if (!is_array($not_write_array)) {
$not_write_array = array(); $not_write_array = [];
} }
if (is_array($table)) { if (is_array($table)) {
return false; return false;
} }
$not_write_update_array = array(); $not_write_update_array = [];
return $this->dbWriteDataExt($write_array, $primary_key, $table, $not_write_array, $not_write_update_array, $data); return $this->dbWriteDataExt($write_array, $primary_key, $table, $not_write_array, $not_write_update_array, $data);
} }
@@ -1770,25 +1863,39 @@ class IO extends \CoreLibs\Basic
array $write_array, array $write_array,
$primary_key, $primary_key,
string $table, string $table,
array $not_write_array = array(), array $not_write_array = [],
array $not_write_update_array = array(), array $not_write_update_array = [],
array $data = array() array $data = []
) { ) {
if (!is_array($primary_key)) { if (!is_array($primary_key)) {
$primary_key = array( $primary_key = array(
'row' => $table.'_id', 'row' => $table.'_id',
'value' => $primary_key 'value' => $primary_key
); );
} elseif (!isset($primary_key['value'])) { } else {
$primary_key['value'] = ''; if (!isset($primary_key['row'])) {
$primary_key['row'] = '';
}
if (!isset($primary_key['value'])) {
$primary_key['value'] = '';
}
} }
// var set for strings // var set for strings
$q_sub_value = ''; $q_sub_value = '';
$q_sub_data = ''; $q_sub_data = '';
// get the table layout and row types // get the table layout and row types
$table_data = $this->dbShowTableMetaData(($this->db_schema ? $this->db_schema.'.' : '').$table); $table_data = $this->dbShowTableMetaData(($this->db_schema ? $this->db_schema.'.' : '').$table);
// @phan HACK
$primary_key['value'] = $primary_key['value'] ?? '';
$primary_key['row'] = $primary_key['row'] ?? '';
// loop through the write array and each field to build the query
foreach ($write_array as $field) { foreach ($write_array as $field) {
if ((!$primary_key['value'] || ($primary_key['value'] && !in_array($field, $not_write_update_array))) && !in_array($field, $not_write_array)) { if ((!$primary_key['value'] ||
($primary_key['value'] &&
!in_array($field, $not_write_update_array))
) &&
!in_array($field, $not_write_array)
) {
// data from external or data field // data from external or data field
$_data = null; $_data = null;
if (count($data) >= 1 && array_key_exists($field, $data)) { if (count($data) >= 1 && array_key_exists($field, $data)) {
@@ -1832,7 +1939,7 @@ class IO extends \CoreLibs\Basic
} }
// write data into sql string // write data into sql string
if (strstr($table_data[$field]['type'], 'int')) { if (strstr($table_data[$field]['type'], 'int')) {
$q_sub_data .= (is_numeric($_data)) ? $_data : 'NULL'; $q_sub_data .= is_numeric($_data) ? $_data : 'NULL';
} else { } else {
// if bool -> set bool, else write data // if bool -> set bool, else write data
$q_sub_data .= isset($_data) ? "'".($is_bool ? $this->dbBoolean($_data, true) : $this->dbEscapeString($_data))."'" : 'NULL'; $q_sub_data .= isset($_data) ? "'".($is_bool ? $this->dbBoolean($_data, true) : $this->dbEscapeString($_data))."'" : 'NULL';
@@ -1842,7 +1949,7 @@ class IO extends \CoreLibs\Basic
} }
// first work contact itself (we need contact id for everything else) // first work contact itself (we need contact id for everything else)
if ($primary_key['value']) { if ($primary_key['value'] && $primary_key['row']) {
$q = 'UPDATE '.$table.' SET '; $q = 'UPDATE '.$table.' SET ';
$q .= $q_sub_data.' '; $q .= $q_sub_data.' ';
$q .= 'WHERE '.$primary_key['row'].' = '.$primary_key['value']; $q .= 'WHERE '.$primary_key['row'].' = '.$primary_key['value'];
@@ -1861,8 +1968,8 @@ class IO extends \CoreLibs\Basic
if (!$primary_key['value']) { if (!$primary_key['value']) {
$primary_key['value'] = $this->insert_id; $primary_key['value'] = $this->insert_id;
} }
// if there is not priamry key value field return false
return $primary_key['value']; return $primary_key['value'] ?? false;
} }
/** /**
@@ -1873,10 +1980,10 @@ class IO extends \CoreLibs\Basic
*/ */
public function dbTimeFormat(string $age, bool $show_micro = false): string public function dbTimeFormat(string $age, bool $show_micro = false): string
{ {
$matches = [];
// in string (datetime diff): 1786 days 22:11:52.87418 // in string (datetime diff): 1786 days 22:11:52.87418
// or (age): 4 years 10 mons 21 days 12:31:11.87418 // or (age): 4 years 10 mons 21 days 12:31:11.87418
// also -09:43:54.781021 or without - prefix // also -09:43:54.781021 or without - prefix
preg_match("/(.*)?(\d{2}):(\d{2}):(\d{2})(\.(\d+))/", $age, $matches); preg_match("/(.*)?(\d{2}):(\d{2}):(\d{2})(\.(\d+))/", $age, $matches);
$prefix = $matches[1] != '-' ? $matches[1] : ''; $prefix = $matches[1] != '-' ? $matches[1] : '';
@@ -1895,16 +2002,10 @@ class IO extends \CoreLibs\Basic
*/ */
public function dbArrayParse(string $text): array public function dbArrayParse(string $text): array
{ {
$output = array(); $output = [];
return $this->db_functions->__dbArrayParse($text, $output); return $this->db_functions->__dbArrayParse($text, $output);
} }
// METHOD: dbSqlEscape
// WAS : db_sql_escape
// PARAMS: value -> to escape data
// kbn -> escape trigger type
// RETURN: escaped value
// DESC : clear up any data for valid DB insert
/** /**
* clear up any data for valid DB insert * clear up any data for valid DB insert
* @param int|float|string $value to escape data * @param int|float|string $value to escape data
@@ -1915,23 +2016,203 @@ class IO extends \CoreLibs\Basic
{ {
switch ($kbn) { switch ($kbn) {
case 'i': case 'i':
$value = ($value === '') ? "NULL" : intval($value); $value = $value === '' ? "NULL" : intval($value);
break; break;
case 'f': case 'f':
$value = ($value === '') ? "NULL" : floatval($value); $value = $value === '' ? "NULL" : floatval($value);
break; break;
case 't': case 't':
$value = ($value === '') ? "NULL" : "'".$this->dbEscapeString($value)."'"; $value = $value === '' ? "NULL" : "'".$this->dbEscapeString($value)."'";
break; break;
case 'd': case 'd':
$value = ($value === '') ? "NULL" : "'".$this->dbEscapeString($value)."'"; $value = $value === '' ? "NULL" : "'".$this->dbEscapeString($value)."'";
break; break;
case 'i2': case 'i2':
$value = ($value === '') ? 0 : intval($value); $value = $value === '' ? 0 : intval($value);
break; break;
} }
return $value; return $value;
} }
// ***************************
// INTERNAL VARIABLES READ
// ***************************
/**
* return current set insert_id as is
* @return array|string|int|null Primary key value, most likely int
* Array for multiple return set
* Empty string for unset
* Null for error
*/
public function dbGetReturning()
{
return $this->insert_id;
}
/**
* alternative name, returns insert_id
* @return array|string|int|null Primary key value, most likely int
* Array for multiple return set
* Empty string for unset
* Null for error
*/
public function dbGetInsertPK()
{
return $this->dbGetReturning();
}
/**
* return the extended insert return string set
* Most likely Array
* @param string|null $key Optional key for insert_id_ext array
* if found will return only this element,
* else will return null
* @return array|string|null RETURNING values as array
* Empty string for unset
* Null for error
*/
public function dbGetReturningExt($key = null)
{
if ($key !== null) {
if (isset($this->insert_id_ext[$key])) {
return $this->insert_id_ext[$key];
} else {
return null;
}
}
return $this->insert_id_ext;
}
/**
* Always returns the returning block as an array
* @return array All returning data as array. even if one row only
*/
public function dbGetReturningArray(): array
{
return $this->insert_id_arr;
}
/**
* returns the full array for cursor ext
* @param string|null $q Query string, if not null convert to md5
* and return set cursor ext for only this
* if not found or null return null
* @return array|null Cursor Extended array
* Key is md5 string from query run
*/
public function dbGetCursorExt($q = null)
{
if ($q !== null) {
$q_md5 = md5($q);
if (isset($this->cursor_ext[$q_md5])) {
return $this->cursor_ext[$q_md5];
} else {
return null;
}
}
return $this->cursor_ext;
}
/**
* returns current number of rows that where
* affected by UPDATE/SELECT, etc
* null on empty
* @return int|null Number of rows
*/
public function dbGetNumRows()
{
return $this->num_rows ?? null;
}
/**
* Switches db debug flag on or off
* OR
* with the optional parameter fix sets debug
* returns current set stats
* @param bool|null $debug Flag to turn debug on off
* @return bool True for debug is on, False for off
*/
public function dbToggleDebug(?bool $debug = null)
{
if ($debug !== null) {
$this->db_debug = $debug;
} else {
$this->db_debug = $this->db_debug ? false : true;
}
return $this->db_debug;
}
// DEPEREACTED CALLS
/**
* old call for getInserReturnExt
* @param string|null $key See above
* @return array|string|null See above
* @deprecated use getReturningExt($key = null) instead
*/
public function getInsertReturn($key = null)
{
trigger_error('Method '.__METHOD__.' is deprecated, use getReturningExt($key = null)', E_USER_DEPRECATED);
return $this->dbGetReturningExt($key);
}
/**
* DEPRECATED: getReturning
* @return array|string|int|null [DEPRECATED]
* @deprecated use dbGetReturning() instead
*/
public function getReturning()
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetReturning()', E_USER_DEPRECATED);
return $this->dbGetReturning();
}
/**
* DEPRECATED: getInsertPK
* @return array|string|int|null [DEPRECATED]
* @deprecated use dbGetInsertPK() instead
*/
public function getInsertPK()
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetInsertPK()', E_USER_DEPRECATED);
return $this->dbGetReturning();
}
/**
* DEPRECATED: getReturningExt
* @param string|null $key [DEPRECATED]
* @return array|string|null [DEPRECATED]
* @deprecated use dbGetReturningExt($key = null) instead
*/
public function getReturningExt($key = null)
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetReturningExt($key = null)', E_USER_DEPRECATED);
return $this->dbGetReturningExt($key);
}
/**
* DEPRECATED: getCursorExt
* @param string|null $q [DEPRECATED]
* @return array|null [DEPRECATED]
* @deprecated use dbGetCursorExt($q = null) instead
*/
public function getCursorExt($q = null)
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetCursorExt($q = null)', E_USER_DEPRECATED);
return $this->dbGetCursorExt($q);
}
/**
* DEPRECATED: getNumRows
* @return int|null [DEPRECATED]
* @deprecated use dbGetNumRows() instead
*/
public function getNumRows()
{
trigger_error('Method '.__METHOD__.' is deprecated, use dbGetNumRows()', E_USER_DEPRECATED);
return $this->dbGetNumRows();
}
} // end if db class } // end if db class
// __END__ // __END__

View File

@@ -260,7 +260,7 @@ class PgSQL
// set pk_name to "id" // set pk_name to "id"
$pk_name = $table."_id"; $pk_name = $table."_id";
} }
$seq = (($schema) ? $schema.'.' : '').$table."_".$pk_name."_seq"; $seq = ($schema ? $schema.'.' : '').$table."_".$pk_name."_seq";
$q = "SELECT CURRVAL('$seq') AS insert_id"; $q = "SELECT CURRVAL('$seq') AS insert_id";
// I have to do manually or I overwrite the original insert internal vars ... // I have to do manually or I overwrite the original insert internal vars ...
if ($q = $this->__dbQuery($q)) { if ($q = $this->__dbQuery($q)) {
@@ -311,7 +311,7 @@ class PgSQL
$q .= "AND indisprimary"; $q .= "AND indisprimary";
$cursor = $this->__dbQuery($q); $cursor = $this->__dbQuery($q);
if ($cursor) { if ($cursor) {
return $this->__dbFetchArray($cursor)['column_name']; return $this->__dbFetchArray($cursor)['column_name'] ?? false;
} else { } else {
return false; return false;
} }

View File

@@ -37,13 +37,13 @@ class L10n extends \CoreLibs\Basic
/** /**
* class constructor call for language getstring * class constructor call for language getstring
* @param string $lang language name (optional), fallback is en * @param string $lang language name (optional), fallback is en
* @param string $path path, if empty fallback on default internal path * @param string $path path, if empty fallback on default internal path
* @param int|integer $set_control_flag control flags for Basic class set/get checks
*/ */
public function __construct(string $lang = '', string $path = '', int $set_control_flag = 0) public function __construct(string $lang = '', string $path = ''
)
{ {
parent::__construct($set_control_flag); parent::__construct();
if (!$lang) { if (!$lang) {
$this->lang = 'en'; $this->lang = 'en';
} else { } else {

View File

@@ -255,11 +255,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
/** /**
* construct form generator * construct form generator
* @param array $db_config db config array * @param array $db_config db config array
* @param int|integer $table_width table/div width (default 750) * @param int|integer $table_width table/div width (default 750)
* @param int|integer $set_control_flag basic class set/get variable error flags
*/ */
public function __construct(array $db_config, int $table_width = 750, int $set_control_flag = 0) public function __construct(array $db_config, int $table_width = 750)
{ {
$this->my_page_name = $this->getPageName(1); $this->my_page_name = $this->getPageName(1);
$this->setLangEncoding(); $this->setLangEncoding();
@@ -289,7 +288,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} }
// start the array_io class which will start db_io ... // start the array_io class which will start db_io ...
parent::__construct($db_config, $config_array['table_array'], $config_array['table_name'], $set_control_flag); parent::__construct($db_config, $config_array['table_array'], $config_array['table_name']);
// here should be a check if the config_array is correct ... // here should be a check if the config_array is correct ...
if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) { if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) {
$this->field_array = $config_array['show_fields']; $this->field_array = $config_array['show_fields'];
@@ -316,30 +315,40 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->table_width = $table_width; $this->table_width = $table_width;
// set button vars // set button vars
$this->archive = isset($_POST['archive']) ? $_POST['archive'] : ''; $this->archive = $_POST['archive'] ?? '';
$this->new = isset($_POST['new']) ? $_POST['new'] : ''; $this->new = $_POST['new'] ?? '';
$this->really_new = isset($_POST['really_new']) ? $_POST['really_new'] : ''; $this->really_new = $_POST['really_new'] ?? '';
$this->delete = isset($_POST['delete']) ? $_POST['delete'] : ''; $this->delete = $_POST['delete'] ?? '';
$this->really_delete = isset($_POST['really_delete']) ? $_POST['really_delete'] : ''; $this->really_delete = $_POST['really_delete'] ?? '';
$this->save = isset($_POST['save']) ? $_POST['save'] : ''; $this->save = $_POST['save'] ?? '';
$this->remove_button = isset($_POST['remove_button']) ? $_POST['remove_button'] : ''; $this->remove_button = $_POST['remove_button'] ?? '';
// security settings // security settings
$this->base_acl_level = isset($_SESSION['BASE_ACL_LEVEL']) ? $_SESSION['BASE_ACL_LEVEL'] : 0; $this->base_acl_level = $_SESSION['BASE_ACL_LEVEL'] ?? 0;
// security levels for buttons/actions // security levels for buttons/actions
// if array does not exists create basic // if array does not exists create basic
if (!isset($config_array['security_level']) || !is_array($config_array['security_level']) || if (!isset($config_array['security_level']) ||
(is_array($config_array['security_level']) && count($config_array['security_level']) < 4) (isset($config_array['security_level']) &&
(!is_array($config_array['security_level']) ||
(is_array($config_array['security_level']) && count($config_array['security_level']) < 4))
)
) { ) {
$config_array['security_level'] = array( $this->security_level = array(
'load' => 100, 'load' => 100,
'new' => 100, 'new' => 100,
'save' => 100, 'save' => 100,
'delete' => 100 'delete' => 100
); );
} else {
// write array to class var
$this->security_level = isset($config_array['security_level']) ?
$config_array['security_level'] :
array('load' => 100,
'new' => 100,
'save' => 100,
'delete' => 100
);
} }
// write array to class var
$this->security_level = $config_array['security_level'];
} }
/** /**
@@ -486,7 +495,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/ */
public function formProcedureLoad(string $archive_id): void public function formProcedureLoad(string $archive_id): void
{ {
if ($this->archive && $archive_id && $this->base_acl_level >= $this->security_level['load']) { if (isset($this->security_level['load']) &&
$this->archive &&
$archive_id &&
$this->base_acl_level >= $this->security_level['load']
) {
$this->formLoadTableArray($archive_id); $this->formLoadTableArray($archive_id);
$this->yes = 1; $this->yes = 1;
} }
@@ -498,7 +511,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/ */
public function formProcedureNew(): void public function formProcedureNew(): void
{ {
if ($this->new && $this->base_acl_level >= $this->security_level['new']) { if (isset($this->security_level['new']) &&
$this->new &&
$this->base_acl_level >= $this->security_level['new']
) {
if ($this->really_new == 'yes') { if ($this->really_new == 'yes') {
$this->formUnsetTablearray(); $this->formUnsetTablearray();
} else { } else {
@@ -515,7 +531,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/ */
public function formProcedureSave(): void public function formProcedureSave(): void
{ {
if ($this->save && $this->base_acl_level >= $this->security_level['save']) { if (isset($this->security_level['save']) &&
$this->save &&
$this->base_acl_level >= $this->security_level['save']
) {
$this->formErrorCheck(); $this->formErrorCheck();
if (!$this->error) { if (!$this->error) {
$this->formSaveTableArray(); $this->formSaveTableArray();
@@ -531,7 +550,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public function formProcedureDelete(): void public function formProcedureDelete(): void
{ {
// delete is also by 'protected' // delete is also by 'protected'
if ($this->delete && $this->base_acl_level >= $this->security_level['delete']) { if (isset($this->security_level['delete']) &&
$this->delete &&
$this->base_acl_level >= $this->security_level['delete']
) {
if (isset($this->table_array['protected']['value']) && $this->table_array['protected']['value']) { if (isset($this->table_array['protected']['value']) && $this->table_array['protected']['value']) {
$this->msg .= $this->l->__('Cannot delete this Dataset, because it is internaly protected!'); $this->msg .= $this->l->__('Cannot delete this Dataset, because it is internaly protected!');
$this->error = 2; $this->error = 2;
@@ -554,11 +576,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/ */
public function formProcedureDeleteFromElementList(array $element_list, array $remove_name): void public function formProcedureDeleteFromElementList(array $element_list, array $remove_name): void
{ {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$this->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: '.$this->base_acl_level.' >= '.$this->security_level['delete']); $this->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: '.$this->base_acl_level.' >= '.$this->security_level['delete']);
$this->debug('REMOVE ELEMENT', 'Protected Value set: '.(string)isset($this->table_array['protected']['value'])); $this->debug('REMOVE ELEMENT', 'Protected Value set: '.(string)isset($this->table_array['protected']['value']));
$this->debug('REMOVE ELEMENT', 'Error: '.$this->error); $this->debug('REMOVE ELEMENT', 'Error: '.$this->error);
// only do if the user is allowed to delete // only do if the user is allowed to delete
if ($this->base_acl_level >= $this->security_level['delete'] && if (isset($this->security_level['delete']) &&
$this->base_acl_level >= $this->security_level['delete'] &&
(!isset($this->table_array['protected']['value']) || (!isset($this->table_array['protected']['value']) ||
(isset($this->table_array['protected']['value']) && !$this->table_array['protected']['value'])) && (isset($this->table_array['protected']['value']) && !$this->table_array['protected']['value'])) &&
!$this->error !$this->error
@@ -641,7 +665,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$pk_names = array(); $pk_names = array();
$pk_ids = array(); $pk_ids = array();
// when security level is okay ... // when security level is okay ...
if ($this->base_acl_level >= $this->security_level['load']) { if (isset($this->security_level['load']) &&
$this->base_acl_level >= $this->security_level['load']
) {
$t_pk_name = $this->archive_pk_name; $t_pk_name = $this->archive_pk_name;
// load list data // load list data
@@ -654,17 +680,26 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$pk_selected = $res[$this->int_pk_name]; $pk_selected = $res[$this->int_pk_name];
} }
$t_string = ''; $t_string = '';
for ($i = 0, $i_max = count($this->field_array); $i < $i_max; $i ++) { foreach ($this->field_array as $i => $field_array) {
if ($t_string) { if ($t_string) {
$t_string .= ', '; $t_string .= ', ';
} }
if (isset($this->field_array[$i]['before_value'])) { if (isset($field_array['before_value'])) {
$t_string .= $this->field_array[$i]['before_value']; $t_string .= $field_array['before_value'];
} }
if (isset($this->field_array[$i]['binary'])) { // must have res element set
$t_string .= ($res[$this->field_array[$i]['name']]) ? $this->field_array[$i]['binary'][0] : $this->field_array[$i]['binary'][1]; if (isset($field_array['name']) &&
} else { isset($res[$field_array['name']])
$t_string .= $res[$this->field_array[$i]['name']]; ) {
if (isset($field_array['binary'])) {
if (isset($field_array['binary'][0])) {
$t_string .= $field_array['binary'][0];
} elseif (isset($field_array['binary'][1])) {
$t_string .= $field_array['binary'][1];
}
} else {
$t_string .= $res[$field_array['name']];
}
} }
} }
$pk_names[] = $t_string; $pk_names[] = $t_string;
@@ -688,7 +723,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$show_checkbox = 0; $show_checkbox = 0;
$new_name = ''; $new_name = '';
// when security level is okay // when security level is okay
if ($this->base_acl_level >= $this->security_level['new']) { if (isset($this->security_level['new']) &&
$this->base_acl_level >= $this->security_level['new']
) {
if ($this->yes && !$hide_new_checkbox) { if ($this->yes && !$hide_new_checkbox) {
$show_checkbox = 1; $show_checkbox = 1;
} }
@@ -719,7 +756,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$pk_value = ''; $pk_value = '';
$show_delete = 0; $show_delete = 0;
$old_school_hidden = 0; $old_school_hidden = 0;
if ($this->base_acl_level >= $this->security_level['save'] || $this->base_acl_level >= $this->security_level['delete']) { if ((isset($this->security_level['save']) &&
$this->base_acl_level >= $this->security_level['save']) ||
(isset($this->security_level['delete']) &&
$this->base_acl_level >= $this->security_level['delete'])
) {
$old_school_hidden = 0; $old_school_hidden = 0;
if ($this->base_acl_level >= $this->security_level['save']) { if ($this->base_acl_level >= $this->security_level['save']) {
$seclevel_okay = 1; $seclevel_okay = 1;
@@ -787,7 +828,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['checked'] = 0; $data['checked'] = 0;
for ($i = (count($this->table_array[$element_name]['element_list']) - 1); $i >= 0; $i --) { for ($i = (count($this->table_array[$element_name]['element_list']) - 1); $i >= 0; $i --) {
$data['value'][] = $i; $data['value'][] = $i;
$data['output'][] = $this->table_array[$element_name]['element_list'][$i]; $data['output'][] = $this->table_array[$element_name]['element_list'][$i] ?? null;
$data['name'] = $element_name; $data['name'] = $element_name;
if (isset($this->table_array[$element_name]['value']) && if (isset($this->table_array[$element_name]['value']) &&
(($i && $this->table_array[$element_name]['value']) || (($i && $this->table_array[$element_name]['value']) ||
@@ -810,16 +851,16 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// normal text element // normal text element
if ($this->table_array[$element_name]['type'] == 'text') { if ($this->table_array[$element_name]['type'] == 'text') {
$data['name'] = $element_name; $data['name'] = $element_name;
$data['value'] = isset($this->table_array[$element_name]['value']) ? $this->table_array[$element_name]['value'] : ''; $data['value'] = $this->table_array[$element_name]['value'] ?? '';
$data['size'] = isset($this->table_array[$element_name]['size']) ? $this->table_array[$element_name]['size'] : ''; $data['size'] = $this->table_array[$element_name]['size'] ?? '';
$data['length'] = isset($this->table_array[$element_name]['length']) ? $this->table_array[$element_name]['length'] : ''; $data['length'] = $this->table_array[$element_name]['length'] ?? '';
} }
// password element, does not write back the value // password element, does not write back the value
if ($this->table_array[$element_name]['type'] == 'password') { if ($this->table_array[$element_name]['type'] == 'password') {
$data['name'] = $element_name; $data['name'] = $element_name;
$data['HIDDEN_value'] = $this->table_array[$element_name]['HIDDEN_value']; $data['HIDDEN_value'] = $this->table_array[$element_name]['HIDDEN_value'];
$data['size'] = isset($this->table_array[$element_name]['size']) ? $this->table_array[$element_name]['size'] : ''; $data['size'] = $this->table_array[$element_name]['size'] ?? '';
$data['length'] = isset($this->table_array[$element_name]['length']) ? $this->table_array[$element_name]['length'] : ''; $data['length'] = $this->table_array[$element_name]['length'] ?? '';
} }
// date (YYYY-MM-DD) // date (YYYY-MM-DD)
if ($this->table_array[$element_name]['type'] == 'date') { if ($this->table_array[$element_name]['type'] == 'date') {
@@ -832,9 +873,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// textarea // textarea
if ($this->table_array[$element_name]['type'] == 'textarea') { if ($this->table_array[$element_name]['type'] == 'textarea') {
$data['name'] = $element_name; $data['name'] = $element_name;
$data['value'] = isset($this->table_array[$element_name]['value']) ? $this->table_array[$element_name]['value'] : ''; $data['value'] = $this->table_array[$element_name]['value'] ?? '';
$data['rows'] = isset($this->table_array[$element_name]['rows']) ? $this->table_array[$element_name]['rows'] : ''; $data['rows'] = $this->table_array[$element_name]['rows'] ?? '';
$data['cols'] = isset($this->table_array[$element_name]['cols']) ? $this->table_array[$element_name]['cols'] : ''; $data['cols'] = $this->table_array[$element_name]['cols'] ?? '';
} }
// for drop_down_* // for drop_down_*
if (preg_match("/^drop_down_/", $this->table_array[$element_name]['type'])) { if (preg_match("/^drop_down_/", $this->table_array[$element_name]['type'])) {
@@ -940,10 +981,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if ($this->table_array[$element_name]['type'] == 'order') { if ($this->table_array[$element_name]['type'] == 'order') {
$data['output_name'] = $this->table_array[$element_name]['output_name']; $data['output_name'] = $this->table_array[$element_name]['output_name'];
$data['name'] = $element_name; $data['name'] = $element_name;
$data['value'] = isset($this->table_array[$element_name]['value']) ? $this->table_array[$element_name]['value'] : 0; $data['value'] = $this->table_array[$element_name]['value'] ?? 0;
$data['col_name'] = $this->col_name; $data['col_name'] = $this->col_name;
$data['table_name'] = $this->table_name; $data['table_name'] = $this->table_name;
$data['query'] = urlencode($query); $data['query'] = $query !== null ? urlencode($query) : '';
} }
// file upload // file upload
if ($this->table_array[$element_name]['type'] == 'file') { if ($this->table_array[$element_name]['type'] == 'file') {
@@ -1143,7 +1184,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// get the leasy of keys from the elements array // get the leasy of keys from the elements array
$keys = array_keys($reference_array['elements']); $keys = array_keys($reference_array['elements']);
// prefix // prefix
$prfx = ($reference_array['prefix']) ? $reference_array['prefix'].'_' : ''; $prfx = $reference_array['prefix'] ? $reference_array['prefix'].'_' : '';
// get max elements // get max elements
$max = 0; $max = 0;
foreach ($keys as $key) { foreach ($keys as $key) {
@@ -1189,12 +1230,14 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
) { ) {
$mand_okay = 1; $mand_okay = 1;
$row_okay[$i] = 1; $row_okay[$i] = 1;
} elseif ($data_array['type'] == 'radio_group' && !isset($_POST[$prfx.$el_name])) { } elseif (!empty($data_array['type']) && $data_array['type'] == 'radio_group' &&
!isset($_POST[$prfx.$el_name])
) {
// radio group and set where one not active // radio group and set where one not active
// $this->debug('edit_error_chk', 'RADIO GROUP'); // $this->debug('edit_error_chk', 'RADIO GROUP');
$row_okay[$_POST[$prfx.$el_name][$i]] = 0; $row_okay[$_POST[$prfx.$el_name][$i] ?? 0] = 0;
$default_wrong[$_POST[$prfx.$el_name][$i]] = 1; $default_wrong[$_POST[$prfx.$el_name][$i] ?? 0] = 1;
$error[$_POST[$prfx.$el_name][$i]] = 1; $error[$_POST[$prfx.$el_name][$i] ?? 0] = 1;
} elseif (isset($_POST[$prfx.$el_name][$i]) && !isset($error[$i])) { } elseif (isset($_POST[$prfx.$el_name][$i]) && !isset($error[$i])) {
// $this->debug('edit_error_chk', '[$i]'); // $this->debug('edit_error_chk', '[$i]');
$element_set[$i] = 1; $element_set[$i] = 1;
@@ -1505,7 +1548,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// get the number of keys from the elements array // get the number of keys from the elements array
$keys = array_keys($reference_array['elements']); $keys = array_keys($reference_array['elements']);
// element prefix name // element prefix name
$prfx = ($reference_array['prefix']) ? $reference_array['prefix'].'_' : ''; $prfx = $reference_array['prefix'] ? $reference_array['prefix'].'_' : '';
// get max elements // get max elements
$max = 0; $max = 0;
foreach ($keys as $key) { foreach ($keys as $key) {
@@ -1548,7 +1591,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: WRITE: ".$no_write[$i]); $this->debug('REF ELEMENT', "[$i] [".$prfx.$el_name."]: WRITE: ".$no_write[$i]);
// flag if data is in the text field and we are in a reference data set // flag if data is in the text field and we are in a reference data set
if (isset($reference_array['type']) && $reference_array['type'] == 'reference_data') { if (isset($reference_array['type']) && $reference_array['type'] == 'reference_data') {
if ($data_array['type'] == 'text' && isset($_POST[$prfx.$el_name][$i])) { if (!empty($data_array['type']) && $data_array['type'] == 'text' &&
isset($_POST[$prfx.$el_name][$i])
) {
$block_write[$i] = 1; $block_write[$i] = 1;
} }
} else { } else {
@@ -1603,14 +1648,14 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q_names[$i] .= $el_name; $q_names[$i] .= $el_name;
// data part, read from where [POST] // data part, read from where [POST]
// radio group selections (only one can be active) // radio group selections (only one can be active)
if ($data_array['type'] == 'radio_group') { if (isset($data_array['type']) && $data_array['type'] == 'radio_group') {
if ($i == $_POST[$prfx.$el_name]) { if (isset($_POST[$prfx.$el_name]) && $i == $_POST[$prfx.$el_name]) {
$_value = $i + 1; $_value = $i + 1;
} else { } else {
$_value = 'NULL'; $_value = 'NULL';
} }
} else { } else {
$_value = isset($_POST[$prfx.$el_name][$i]) ? $_POST[$prfx.$el_name][$i] : ''; $_value = $_POST[$prfx.$el_name][$i] ?? '';
} }
// pre write data set. if int value, unset flagged need to be set null or 0 depending on settings // pre write data set. if int value, unset flagged need to be set null or 0 depending on settings
if (isset($data_array['int']) || isset($data_array['int_null'])) { if (isset($data_array['int']) || isset($data_array['int_null'])) {
@@ -1634,13 +1679,28 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$q = ''; $q = '';
// skip empty or not fully filled rows // skip empty or not fully filled rows
if (isset($no_write[$i]) && !$no_write[$i]) { if (isset($no_write[$i]) && !$no_write[$i]) {
if (!isset($q_begin[$i])) {
$q_begin[$i] = '';
}
if (!isset($q_end[$i])) {
$q_end[$i] = '';
}
// if tpye is update // if tpye is update
if ($type[$i] == 'update') { if (isset($type[$i]) && $type[$i] == 'update') {
$q = $q_begin[$i].$q_data[$i].$q_end[$i]; $q = $q_begin[$i].
($q_data[$i] ?? '').
$q_end[$i];
// or if we have block write, then it is insert (new) // or if we have block write, then it is insert (new)
} elseif (isset($block_write[$i]) && $block_write[$i]) { } elseif (isset($block_write[$i]) && $block_write[$i]) {
$q = $q_begin[$i].$q_names[$i].', '.$this->int_pk_name.$q_middle[$i].$q_values[$i].', '.$this->table_array[$this->int_pk_name]['value'].$q_end[$i]; $q = $q_begin[$i].
($q_names[$i] ?? '').', '.
$this->int_pk_name.
($q_middle[$i] ?? '').
($q_values[$i] ?? '').', '.
$this->table_array[$this->int_pk_name]['value'].
$q_end[$i];
} }
/** @phan-suppress-next-line PhanTypePossiblyInvalidDimOffset */
$this->debug('edit', 'Pos['.$i.'] => '.$type[$i].' Q: '.$q.'<br>'); $this->debug('edit', 'Pos['.$i.'] => '.$type[$i].' Q: '.$q.'<br>');
// write the dataset // write the dataset
if ($q) { if ($q) {
@@ -1715,7 +1775,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->table_array[$key]['type'] == 'hidden' $this->table_array[$key]['type'] == 'hidden'
) { ) {
if (array_key_exists($key, $this->table_array)) { if (array_key_exists($key, $this->table_array)) {
$hidden_array[$key] = isset($this->table_array[$key]['value']) ? $this->table_array[$key]['value'] : ''; $hidden_array[$key] = $this->table_array[$key]['value'] ?? '';
} else { } else {
$hidden_array[$key] = ''; $hidden_array[$key] = '';
} }
@@ -1750,7 +1810,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['value'][] = $res[0]; $data['value'][] = $res[0];
$data['output'][] = $res[1]; $data['output'][] = $res[1];
$data['selected'][] = ($this->checked( $data['selected'][] = ($this->checked(
isset($this->reference_array[$table_name]['selected']) ? $this->reference_array[$table_name]['selected'] : '', $this->reference_array[$table_name]['selected'] ?? '',
$res[0] $res[0]
)) ? $res[0] : ''; )) ? $res[0] : '';
} }
@@ -1768,7 +1828,23 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
*/ */
public function formCreateElementListTable(string $table_name): array public function formCreateElementListTable(string $table_name): array
{ {
$data = array(); // init data rray
$data = array(
'delete_name' => '',
'delete' => 0,
'enable_name' => '',
'prefix' => '',
'pk_name' => '',
'fk_name' => '',
'type' => array(),
'output_name' => array(),
'preset' => array(),
'element_list' => array(),
'output_data' => array(),
'content' => array(),
'pos' => array(),
'table_name' => $table_name // sub table name
);
// output name for the viewable left table td box, prefixed with * if mandatory // output name for the viewable left table td box, prefixed with * if mandatory
$output_name = $this->element_list[$table_name]['output_name']; $output_name = $this->element_list[$table_name]['output_name'];
if (isset($this->element_list[$table_name]['mandatory']) && if (isset($this->element_list[$table_name]['mandatory']) &&
@@ -1779,8 +1855,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// delete button name, if there is one set // delete button name, if there is one set
if (isset($this->element_list[$table_name]['delete_name'])) { if (isset($this->element_list[$table_name]['delete_name'])) {
$data['delete_name'] = $this->element_list[$table_name]['delete_name']; $data['delete_name'] = $this->element_list[$table_name]['delete_name'];
} else {
$data['delete_name'] = '';
} }
// set the enable checkbox for delete, if the delete flag is given if there is one // set the enable checkbox for delete, if the delete flag is given if there is one
if (isset($this->element_list[$table_name]['enable_name'])) { if (isset($this->element_list[$table_name]['enable_name'])) {
@@ -1788,17 +1862,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($this->element_list[$table_name]['delete'])) { if (isset($this->element_list[$table_name]['delete'])) {
$data['delete'] = 1; $data['delete'] = 1;
} }
} else {
$data['enable_name'] = '';
} }
// prefix for the elements, to not collide with names in the master set // prefix for the elements, to not collide with names in the master set
if (isset($this->element_list[$table_name]['prefix'])) { if (isset($this->element_list[$table_name]['prefix'])) {
$data['prefix'] = $this->element_list[$table_name]['prefix'].'_'; $data['prefix'] = $this->element_list[$table_name]['prefix'].'_';
} else {
$data['prefix'] = '';
} }
// the sub data table name
$data['table_name'] = $table_name;
// build the select part // build the select part
if (!isset($this->element_list[$table_name]['elements']) || !is_array($this->element_list[$table_name]['elements'])) { if (!isset($this->element_list[$table_name]['elements']) || !is_array($this->element_list[$table_name]['elements'])) {
@@ -1817,9 +1885,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// prefix the name for any further data parts // prefix the name for any further data parts
$el_name = $data['prefix'].$el_name; $el_name = $data['prefix'].$el_name;
// this are the output names (if given) // this are the output names (if given)
$data['output_name'][$el_name] = isset($data_array['output_name']) ? $data_array['output_name'] : ''; $data['output_name'][$el_name] = $data_array['output_name'] ?? '';
// this is the type of the field // this is the type of the field
$data['type'][$el_name] = isset($data_array['type']) ? $data_array['type'] : ''; $data['type'][$el_name] = $data_array['type'] ?? '';
// set the primary key name // set the primary key name
if (isset($data_array['pk_id'])) { if (isset($data_array['pk_id'])) {
$data['pk_name'] = $el_name; $data['pk_name'] = $el_name;
@@ -1832,10 +1900,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($data_array['type']) && $data_array['type'] == 'drop_down_db') { if (isset($data_array['type']) && $data_array['type'] == 'drop_down_db') {
$md_q = md5($data_array['query']); $md_q = md5($data_array['query']);
while ($res = $this->dbReturn($data_array['query'])) { while ($res = $this->dbReturn($data_array['query'])) {
$this->debug('edit', 'Q['.$md_q.'] pos: '.$this->cursor_ext[$md_q]['pos'].' | want: '.(isset($data_array['preset']) ? $data_array['preset'] : '-').' | set: '.(isset($data['preset'][$el_name]) ? $data['preset'][$el_name] : '-')); /** @phan-suppress-next-line PhanTypeInvalidDimOffset */
$this->debug('edit', 'Q['.$md_q.'] pos: '.$this->cursor_ext[$md_q]['pos'].' | want: '.($data_array['preset'] ?? '-').' | set: '.($data['preset'][$el_name] ?? '-'));
// first is default for this element // first is default for this element
if (isset($data_array['preset']) && if (isset($data_array['preset']) &&
(!isset($data['preset'][$el_name]) || (isset($data['preset'][$el_name]) && !$data['preset'][$el_name])) && (!isset($data['preset'][$el_name]) || empty($data['preset'][$el_name])) &&
($this->cursor_ext[$md_q]['pos'] == $data_array['preset']) ($this->cursor_ext[$md_q]['pos'] == $data_array['preset'])
) { ) {
$data['preset'][$el_name] = $res[0]; $data['preset'][$el_name] = $res[0];
@@ -1854,7 +1923,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if ($this->error) { if ($this->error) {
if (isset($_POST[$el_name]) && is_array($_POST[$el_name])) { if (isset($_POST[$el_name]) && is_array($_POST[$el_name])) {
// this is for the new line // this is for the new line
$proto[$el_name] = isset($_POST[$el_name][(count($_POST[$el_name]) - 1)]) ? $_POST[$el_name][(count($_POST[$el_name]) - 1)] : 0; $proto[$el_name] = $_POST[$el_name][(count($_POST[$el_name]) - 1)] ?? 0;
} else { } else {
$proto[$el_name] = 0; $proto[$el_name] = 0;
} }
@@ -1868,7 +1937,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// $this->debug('CFG SELECT', 'Proto: '.$this->printAr($q_select)); // $this->debug('CFG SELECT', 'Proto: '.$this->printAr($q_select));
// query for reading in the data // query for reading in the data
$this->debug('edit_error', 'ERR: '.$this->error); $this->debug('edit_error', 'ERR: '.$this->error);
// if we got a read data, build the read select for the read, and read out the 'selected' data // if we got a read data, build the read select for the read, and read out the 'selected'
/** @phan-assert array $this->element_list[$table_name]['read_data'] */
if (isset($this->element_list[$table_name]['read_data'])) { if (isset($this->element_list[$table_name]['read_data'])) {
// we need a second one for the query build only // we need a second one for the query build only
// prefix all elements with the $table name // prefix all elements with the $table name
@@ -1876,39 +1946,60 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
foreach ($q_select as $_pos => $element) { foreach ($q_select as $_pos => $element) {
$_q_select[$_pos] = $table_name.'.'.$element; $_q_select[$_pos] = $table_name.'.'.$element;
} }
// set if missing
if (!isset($this->element_list[$table_name]['read_data']['pk_id'])) {
$this->element_list[$table_name]['read_data']['pk_id'] = '';
}
if (!isset($this->element_list[$table_name]['read_data']['name'])) {
$this->element_list[$table_name]['read_data']['name'] = '';
}
if (!isset($this->element_list[$table_name]['read_data']['table_name'])) {
$this->element_list[$table_name]['read_data']['table_name'] = '';
}
// add the read names in here, prefix them with the table name // add the read names in here, prefix them with the table name
// earch to read part is split by | // earch to read part is split by |
if ($this->element_list[$table_name]['read_data']['name']) { if (!empty($this->element_list[$table_name]['read_data']['name'])) {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
foreach (explode('|', $this->element_list[$table_name]['read_data']['name']) as $read_name) { foreach (explode('|', $this->element_list[$table_name]['read_data']['name']) as $read_name) {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
array_unshift($_q_select, $this->element_list[$table_name]['read_data']['table_name'].'.'.$read_name); array_unshift($_q_select, $this->element_list[$table_name]['read_data']['table_name'].'.'.$read_name);
array_unshift($q_select, $read_name); array_unshift($q_select, $read_name);
} }
} }
// @phan HACK
$data['prefix'] = $data['prefix'] ?? '';
// set the rest of the data so we can print something out // set the rest of the data so we can print something out
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$data['type'][$data['prefix'].$this->element_list[$table_name]['read_data']['name']] = 'string'; $data['type'][$data['prefix'].$this->element_list[$table_name]['read_data']['name']] = 'string';
// build the read query // build the read query
$q = 'SELECT '; $q = 'SELECT ';
// if (!$this->table_array[$this->int_pk_name]['value']) // if (!$this->table_array[$this->int_pk_name]['value'])
// $q .= 'DISTINCT '; // $q .= 'DISTINCT ';
// prefix join key with table name, and implode the query select part // prefix join key with table name, and implode the query select part
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= str_replace($table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'], $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'], implode(', ', $_q_select)).' '; $q .= str_replace($table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'], $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'], implode(', ', $_q_select)).' ';
// if (!$this->table_array[$this->int_pk_name]['value'] && $this->element_list[$table_name]['read_data']['order']) // if (!$this->table_array[$this->int_pk_name]['value'] && $this->element_list[$table_name]['read_data']['order'])
// $q .= ', '.$this->element_list[$table_name]['read_data']['order'].' '; // $q .= ', '.$this->element_list[$table_name]['read_data']['order'].' ';
// read from the read table as main, and left join to the sub table to read the actual data // read from the read table as main, and left join to the sub table to read the actual data
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= 'FROM '.$this->element_list[$table_name]['read_data']['table_name'].' '; $q .= 'FROM '.$this->element_list[$table_name]['read_data']['table_name'].' ';
$q .= 'LEFT JOIN '.$table_name.' '; $q .= 'LEFT JOIN '.$table_name.' ';
$q .= 'ON ('; $q .= 'ON (';
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'].' = '.$table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'].' '; $q .= $this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['pk_id'].' = '.$table_name.'.'.$this->element_list[$table_name]['read_data']['pk_id'].' ';
// if ($this->table_array[$this->int_pk_name]['value']) // if ($this->table_array[$this->int_pk_name]['value'])
$q .= 'AND '.$table_name.'.'.$this->int_pk_name.' = '.(!empty($this->table_array[$this->int_pk_name]['value']) ? $this->table_array[$this->int_pk_name]['value'] : 'NULL').' '; $q .= 'AND '.$table_name.'.'.$this->int_pk_name.' = '.(!empty($this->table_array[$this->int_pk_name]['value']) ? $this->table_array[$this->int_pk_name]['value'] : 'NULL').' ';
$q .= ') '; $q .= ') ';
if (isset($this->element_list[$table_name]['read_data']['order'])) { if (isset($this->element_list[$table_name]['read_data']['order'])) {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$q .= ' ORDER BY '.$this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['order']; $q .= ' ORDER BY '.$this->element_list[$table_name]['read_data']['table_name'].'.'.$this->element_list[$table_name]['read_data']['order'];
} }
} else { } else {
// only create query if we have a primary key // only create query if we have a primary key
// reads directly from the reference table // reads directly from the reference table
if (isset($this->table_array[$this->int_pk_name]['value'])) { if (isset($this->table_array[$this->int_pk_name]['value']) &&
$this->table_array[$this->int_pk_name]['value']
) {
$q = 'SELECT '.implode(', ', $q_select).' FROM '.$table_name.' WHERE '.$this->int_pk_name.' = '.$this->table_array[$this->int_pk_name]['value']; $q = 'SELECT '.implode(', ', $q_select).' FROM '.$table_name.' WHERE '.$this->int_pk_name.' = '.$this->table_array[$this->int_pk_name]['value'];
} }
} }
@@ -1919,7 +2010,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// read out the list and add the selected data if needed // read out the list and add the selected data if needed
while ($res = $this->dbReturn($q)) { while ($res = $this->dbReturn($q)) {
$_data = array(); $_data = array();
$prfx = $data['prefix']; // short $prfx = $data['prefix'] ?? ''; // short
// go through each res // go through each res
for ($i = 0, $i_max = count($q_select); $i < $i_max; $i ++) { for ($i = 0, $i_max = count($q_select); $i < $i_max; $i ++) {
// query select part, set to the element name // query select part, set to the element name
@@ -1967,15 +2058,23 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$missing_empty_count = $this->element_list[$table_name]['max_empty'] - $element_count; $missing_empty_count = $this->element_list[$table_name]['max_empty'] - $element_count;
$this->debug('CFG MAX', 'Max empty: '.$this->element_list[$table_name]['max_empty'].', Missing: '.$missing_empty_count.', Has: '.$element_count); $this->debug('CFG MAX', 'Max empty: '.$this->element_list[$table_name]['max_empty'].', Missing: '.$missing_empty_count.', Has: '.$element_count);
// set if we need more open entries or if we do not have any entries yet // set if we need more open entries or if we do not have any entries yet
if (($missing_empty_count < $this->element_list[$table_name]['max_empty']) || $element_count == 0) { if (($missing_empty_count < $this->element_list[$table_name]['max_empty']) ||
$element_count == 0
) {
for ($pos = $element_count, $pos_max = $this->element_list[$table_name]['max_empty'] + $element_count; $pos <= $pos_max; $pos ++) { for ($pos = $element_count, $pos_max = $this->element_list[$table_name]['max_empty'] + $element_count; $pos <= $pos_max; $pos ++) {
$_data = array(); $_data = array();
// just in case
if (!isset($data['type'])) {
$data['type'] = array();
}
// the fields that need to be filled are in data->type array: // the fields that need to be filled are in data->type array:
// pk fields are unfilled // pk fields are unfilled
// fk fields are filled with the fk_id 'int_pk_name' value // fk fields are filled with the fk_id 'int_pk_name' value
foreach ($data['type'] as $el_name => $type) { foreach ($data['type'] as $el_name => $type) {
$_data[$el_name] = ''; $_data[$el_name] = '';
if ($el_name == $data['pk_name']) { if (isset($data['pk_name']) &&
$el_name == $data['pk_name']
) {
// do nothing for pk name // do nothing for pk name
} elseif (isset($data['fk_name']) && } elseif (isset($data['fk_name']) &&
$el_name == $data['fk_name'] && $el_name == $data['fk_name'] &&
@@ -1985,8 +2084,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} }
} }
$data['content'][] = $_data; $data['content'][] = $_data;
$data['pos'][] = array(0 => $pos); // this is for the checkboxes // this is for the checkboxes
// $this->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos'])); $data['pos'][] = array(
0 => $pos
);
$this->debug('CFG ELEMENT LIST FILL', 'Pos: '.$pos.'/'.$pos_max.', Content: '.count($data['content']).', Pos: '.count($data['pos']));
} }
} }
} }

View File

@@ -78,6 +78,9 @@ class ProgressBar
) )
*/ */
// output strings
public $prefix_message = '';
/** /**
* progress bar constructor * progress bar constructor
* @param integer $width progress bar width, default 0 * @param integer $width progress bar width, default 0
@@ -110,7 +113,8 @@ class ProgressBar
$clear_buffer_size = $this->clear_buffer_size; $clear_buffer_size = $this->clear_buffer_size;
} }
echo str_repeat(' ', $clear_buffer_size); echo str_repeat(' ', $clear_buffer_size);
ob_flush(); // a small hack to avoid warnings about no buffer to flush
@ob_flush();
flush(); flush();
} }
@@ -541,6 +545,7 @@ class ProgressBar
$html = ''; $html = '';
$js = ''; $js = '';
$html_button = ''; $html_button = '';
$html_percent = '';
$this->__setStep($this->step); $this->__setStep($this->step);
$this->position = $this->__calculatePosition($this->step); $this->position = $this->__calculatePosition($this->step);
@@ -636,7 +641,7 @@ class ProgressBar
case 'percent': case 'percent':
// only one inner percent // only one inner percent
// print "STYLE[$name]: ".$style_lbl."<br>"; // print "STYLE[$name]: ".$style_lbl."<br>";
if (!isset($html_percent)) { if (empty($html_percent)) {
$html_percent = '<div id="plbl'.$name.$this->code.'" style="'.$style_lbl.'width:'.$data['width'].'px;line-height:1;text-shadow: 0 0 .2em white, 0 0 .5em white;">'.$this->__calculatePercent($this->step).'%</div>'."\n"; $html_percent = '<div id="plbl'.$name.$this->code.'" style="'.$style_lbl.'width:'.$data['width'].'px;line-height:1;text-shadow: 0 0 .2em white, 0 0 .5em white;">'.$this->__calculatePercent($this->step).'%</div>'."\n";
} }
break; break;

View File

@@ -34,10 +34,10 @@ class SmartyExtend extends SmartyBC
public $page_name; public $page_name;
// array for data parsing // array for data parsing
public $HEADER = array(); public $HEADER = [];
public $DATA = array(); public $DATA = [];
public $DEBUG_DATA = array(); public $DEBUG_DATA = [];
private $CONTENT_DATA = array(); private $CONTENT_DATA = [];
// control vars // control vars
public $USE_PROTOTYPE = USE_PROTOTYPE; public $USE_PROTOTYPE = USE_PROTOTYPE;
public $USE_JQUERY = USE_JQUERY; public $USE_JQUERY = USE_JQUERY;
@@ -46,6 +46,7 @@ class SmartyExtend extends SmartyBC
public $USE_TINY_MCE = false; public $USE_TINY_MCE = false;
public $JS_DATEPICKR = false; public $JS_DATEPICKR = false;
public $JS_FLATPICKR = false; public $JS_FLATPICKR = false;
public $JS_FILE_UPLOADER = false;
public $DEBUG_TMPL = false; public $DEBUG_TMPL = false;
public $USE_INCLUDE_TEMPLATE = false; public $USE_INCLUDE_TEMPLATE = false;
// cache & compile // cache & compile
@@ -66,6 +67,11 @@ class SmartyExtend extends SmartyBC
public $JS_TEMPLATE_NAME; public $JS_TEMPLATE_NAME;
public $CSS_TEMPLATE_NAME; public $CSS_TEMPLATE_NAME;
public $TEMPLATE_TRANSLATE; public $TEMPLATE_TRANSLATE;
// core group
public $JS_CORE_TEMPLATE_NAME;
public $CSS_CORE_TEMPLATE_NAME;
public $JS_CORE_INCLUDE;
public $CSS_CORE_INCLUDE;
// local names // local names
public $JS_SPECIAL_TEMPLATE_NAME = ''; public $JS_SPECIAL_TEMPLATE_NAME = '';
public $CSS_SPECIAL_TEMPLATE_NAME = ''; public $CSS_SPECIAL_TEMPLATE_NAME = '';
@@ -81,6 +87,7 @@ class SmartyExtend extends SmartyBC
public $INCLUDES; public $INCLUDES;
public $JAVASCRIPT; public $JAVASCRIPT;
public $CSS; public $CSS;
public $FONT;
public $PICTURES; public $PICTURES;
public $CACHE_PICTURES; public $CACHE_PICTURES;
public $CACHE_PICTURES_ROOT; public $CACHE_PICTURES_ROOT;
@@ -145,6 +152,55 @@ class SmartyExtend extends SmartyBC
$this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH; $this->lang_dir = BASE.INCLUDES.LANG.CONTENT_PATH;
} }
/**
* @return void
*/
private function setSmartCoreIncludeCssJs(): void
{
// core CS
$this->CSS_CORE_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_CORE_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_CORE_TEMPLATE_NAME)
) {
$this->CSS_CORE_INCLUDE = $this->CSS.$this->CSS_CORE_TEMPLATE_NAME;
}
// core JS
$this->JS_CORE_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME)
) {
$this->JS_CORE_INCLUDE = $this->JAVASCRIPT.$this->JS_CORE_TEMPLATE_NAME;
}
// additional per page Javascript include
$this->JS_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
}
/** /**
* sets all internal paths and names that need to be passed on to the smarty template * sets all internal paths and names that need to be passed on to the smarty template
@@ -175,6 +231,7 @@ class SmartyExtend extends SmartyBC
$this->setTemplateDir($this->TEMPLATE_PATH); $this->setTemplateDir($this->TEMPLATE_PATH);
$this->JAVASCRIPT = LAYOUT.JS; $this->JAVASCRIPT = LAYOUT.JS;
$this->CSS = LAYOUT.CSS; $this->CSS = LAYOUT.CSS;
$this->FONT = LAYOUT.FONT;
$this->PICTURES = LAYOUT.IMAGES; $this->PICTURES = LAYOUT.IMAGES;
$this->CACHE_PICTURES = LAYOUT.CACHE; $this->CACHE_PICTURES = LAYOUT.CACHE;
$this->CACHE_PICTURES_ROOT = ROOT.$this->CACHE_PICTURES; $this->CACHE_PICTURES_ROOT = ROOT.$this->CACHE_PICTURES;
@@ -193,34 +250,8 @@ class SmartyExtend extends SmartyBC
$this->COMPILE_ID .= '_'.$this->TEMPLATE_NAME; $this->COMPILE_ID .= '_'.$this->TEMPLATE_NAME;
$this->CACHE_ID .= '_'.$this->TEMPLATE_NAME; $this->CACHE_ID .= '_'.$this->TEMPLATE_NAME;
} }
// additional per page Javascript include // set all the additional CSS/JS parths
$this->JS_INCLUDE = ''; $this->setSmartCoreIncludeCssJs();
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
// check if template names exist // check if template names exist
if (!$this->MASTER_TEMPLATE_NAME) { if (!$this->MASTER_TEMPLATE_NAME) {
exit('MASTER TEMPLATE is not set'); exit('MASTER TEMPLATE is not set');
@@ -291,36 +322,12 @@ class SmartyExtend extends SmartyBC
// jquery and prototype should not be used together // jquery and prototype should not be used together
$this->HEADER['USE_JQUERY'] = $this->USE_JQUERY; $this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
// additional per page Javascript include // set all the additional CSS/JS parths
$this->JS_INCLUDE = ''; $this->setSmartCoreIncludeCssJs();
if (file_exists($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_TEMPLATE_NAME)
) {
$this->JS_INCLUDE = $this->JAVASCRIPT.$this->JS_TEMPLATE_NAME;
}
// per page css file
$this->CSS_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_TEMPLATE_NAME)
) {
$this->CSS_INCLUDE = $this->CSS.$this->CSS_TEMPLATE_NAME;
}
// optional CSS file
$this->CSS_SPECIAL_INCLUDE = '';
if (file_exists($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME)
) {
$this->CSS_SPECIAL_INCLUDE = $this->CSS.$this->CSS_SPECIAL_TEMPLATE_NAME;
}
// optional JS file
$this->JS_SPECIAL_INCLUDE = '';
if (file_exists($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME) &&
is_file($this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME)
) {
$this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT.$this->JS_SPECIAL_TEMPLATE_NAME;
}
// the actual include files for javascript (per page) // the actual include files for javascript (per page)
$this->HEADER['JS_CORE_INCLUDE'] = $this->JS_CORE_INCLUDE;
$this->HEADER['CSS_CORE_INCLUDE'] = $this->CSS_CORE_INCLUDE;
$this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE; $this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
$this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE; $this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
$this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE; $this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;
@@ -334,6 +341,7 @@ class SmartyExtend extends SmartyBC
// default CMS settings // default CMS settings
// define all needed smarty stuff for the general HTML/page building // define all needed smarty stuff for the general HTML/page building
$this->HEADER['CSS'] = CSS; $this->HEADER['CSS'] = CSS;
$this->HEADER['FONT'] = FONT;
$this->HEADER['JS'] = JS; $this->HEADER['JS'] = JS;
$this->HEADER['ENCODING'] = $this->encoding; $this->HEADER['ENCODING'] = $this->encoding;
$this->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING; $this->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
@@ -341,7 +349,7 @@ class SmartyExtend extends SmartyBC
// special for admin // special for admin
if ($admin_call === true) { if ($admin_call === true) {
// set ACL extra show // set ACL extra show
$this->DATA['show_ea_extra'] = isset($cms->acl['show_ea_extra']) ? $cms->acl['show_ea_extra'] : false; $this->DATA['show_ea_extra'] = $cms->acl['show_ea_extra'] ?? false;
$this->DATA['ADMIN'] = !empty($cms->acl['admin']) ? $cms->acl['admin'] : 0; $this->DATA['ADMIN'] = !empty($cms->acl['admin']) ? $cms->acl['admin'] : 0;
// set style sheets // set style sheets
$this->HEADER['STYLESHEET'] = $this->ADMIN_STYLESHEET ? $this->ADMIN_STYLESHEET : ADMIN_STYLESHEET; $this->HEADER['STYLESHEET'] = $this->ADMIN_STYLESHEET ? $this->ADMIN_STYLESHEET : ADMIN_STYLESHEET;
@@ -350,10 +358,10 @@ class SmartyExtend extends SmartyBC
$this->DATA['nav_menu'] = $cms->adbTopMenu(); $this->DATA['nav_menu'] = $cms->adbTopMenu();
$this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0; $this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0;
// messages = array('msg' =>, 'class' => 'error/warning/...') // messages = array('msg' =>, 'class' => 'error/warning/...')
$this->DATA['messages'] = isset($cms->messages) ? $cms->messages : $cms->messages; $this->DATA['messages'] = $cms->messages ?? [];
// the page name // the page name
$this->DATA['page_name'] = $this->page_name; $this->DATA['page_name'] = $this->page_name;
$this->DATA['table_width'] = isset($this->PAGE_WIDTH) ? $this->PAGE_WIDTH : PAGE_WIDTH; $this->DATA['table_width'] = $this->PAGE_WIDTH ?? PAGE_WIDTH;
// for tinymce special // for tinymce special
$this->DATA['TINYMCE_LANG'] = $this->lang_short; $this->DATA['TINYMCE_LANG'] = $this->lang_short;
// include flags // include flags
@@ -380,12 +388,13 @@ class SmartyExtend extends SmartyBC
// include flags // include flags
$this->DATA['JS_DATEPICKR'] = $this->JS_DATEPICKR; $this->DATA['JS_DATEPICKR'] = $this->JS_DATEPICKR;
$this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR; $this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR;
$this->DATA['JS_FILE_UPLOADER'] = $this->JS_FILE_UPLOADER;
// user name // user name
$this->DATA['USER_NAME'] = !empty($_SESSION['USER_NAME']) ? $_SESSION['USER_NAME'] : ''; $this->DATA['USER_NAME'] = !empty($_SESSION['USER_NAME']) ? $_SESSION['USER_NAME'] : '';
// the template part to include into the body // the template part to include into the body
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME; $this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE; $this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
$this->DATA['TEMPLATE_TRANSLATE'] = isset($this->TEMPLATE_TRANSLATE) ? $this->TEMPLATE_TRANSLATE : null; $this->DATA['TEMPLATE_TRANSLATE'] = $this->TEMPLATE_TRANSLATE ?? null;
$this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name).'.tpl'; $this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name).'.tpl';
// render page // render page
$this->renderSmarty(); $this->renderSmarty();
@@ -400,7 +409,9 @@ class SmartyExtend extends SmartyBC
{ {
// array merge HEADER, DATA, DEBUG DATA // array merge HEADER, DATA, DEBUG DATA
foreach (array('HEADER', 'DATA', 'DEBUG_DATA') as $ext_smarty) { foreach (array('HEADER', 'DATA', 'DEBUG_DATA') as $ext_smarty) {
if (is_array($cms->{$ext_smarty})) { if (isset($cms->{$ext_smarty}) &&
is_array($cms->{$ext_smarty})
) {
$this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty}); $this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty});
} }
} }

View File

@@ -35,8 +35,8 @@ class qqUploadedFileXhr
} }
public function getSize() public function getSize()
{ {
if (isset($_SERVER["CONTENT_LENGTH"])) { if (isset($_SERVER['CONTENT_LENGTH'])) {
return (int)$_SERVER["CONTENT_LENGTH"]; return (int)$_SERVER['CONTENT_LENGTH'];
} else { } else {
throw new \Exception('Getting content length is not supported.'); throw new \Exception('Getting content length is not supported.');
} }

View File

@@ -2,7 +2,7 @@
namespace FileUpload; namespace FileUpload;
use \FileUpload\Core; // use \FileUpload\Core;
class qqFileUploader class qqFileUploader
{ {
@@ -84,7 +84,7 @@ class qqFileUploader
$pathinfo = pathinfo($this->file->getName()); $pathinfo = pathinfo($this->file->getName());
$filename = $pathinfo['filename']; $filename = $pathinfo['filename'];
//$filename = md5(uniqid()); //$filename = md5(uniqid());
$ext = $pathinfo['extension']; $ext = $pathinfo['extension'] ?? '';
if ($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)) { if ($this->allowedExtensions && !in_array(strtolower($ext), $this->allowedExtensions)) {
$these = implode(', ', $this->allowedExtensions); $these = implode(', ', $this->allowedExtensions);

Some files were not shown because too many files have changed in this diff Show More