#!/usr/bin/perl #################################################################################### # mysqlwdb Version 1.5.4 # # This is a CGI script written in Perl5, easy to configure and to install, # intended to manage MySQL database tables through a web interface. # Just edit and configure THIS UNIQUE file. # #################################################################################### #################################################################################### # # Copyright (C) 2000,2005 Andrea Maestrutti aka Dree Mistrut in friulian language # http://www.igsuite.org/cgi-bin/igwiki/mysqlwdb --- dree@igsuite.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # You may also find the license at http://www.gnu.org/copyleft/gpl.html # #################################################################################### #use strict; # to avoid scope variables errors: useful for developers $|=1; # to avoid output buffering close STDERR; # to avoid DBI error output on html with some web servers #================================================================================== # # VARIABLE CONFIGURATION SECTION # # PLEASE READ THE INSTALLATION DOCUMENT AND CHANGE UNDER THIS COMMENT THE # VARIABLES YOU NEED, TO REFLECT TO YOUR PURPOSES # #================================================================================== #========================================================= # Name of this CGI script #========================================================= my $thiscgi= 'mysqlwdb.pl'; #========================================================= # Database(s) & user(s) variables #========================================================= # # It is possible to manage more than 1 database. # If you put data for only 1 database, you will not prompt for databases choice. # If you put data for more than 1 database, a menu of choice will appear. # my $custom_configuration=0; # 1 means YES, 0 means NO my %DATABASES= ( 1 => { host => " ! PUT HOST HERE ! ", port => " ! PUT PORT HERE ! ", # 3306 is the standard MySQL port database => " ! PUT DATABASE NAME HERE ! ", user => " ! PUT USER HERE ! ", password => " ! PUT PASSWORD HERE ! ", db_description => " ! PUT DB_DESCRIPTION HERE ! " }, # # Example for Database2. # # If you need to manage a second database, please remove all # from 2 to }, # If you need to manage others databases, please copy & paste the example and change the order number # # # 2 => { # # host => "host for Database2", # port => "port for Database2, usually 3306", # database => "Database2", # user => "User for Database2", # password => "Password for Database2", # db_description => "Description for Database 2" # # }, ); #========================================================= # Login variables #========================================================= # It is possible to prompt user for login. # # If you WANT to manage user(s), please: # a) remove the # before user(s) id and password that you need # b) change the user(s) id and password according to your needs # c) set $login_prompt variable to 1 my %LOGIN=( # "user1" => "pwd1", # "user2" => "pwd2", ); my $login_prompt= 0; # 1 means YES, 0 means NO #========================================================= # DBI driver variable #========================================================= my $DBI_driver= 'mysql'; #========================================================= # DBD::mysql version variables #========================================================= # # 1 means YES, 0 means NO my $recent_DBD_is_pri_key= 1; # 'recent' means Msql-Mysql-modules version 1.21_07 or greater (1998-11-08) # the default value is 1 my $recent_DBD_dsn_syntax= 1; # 'recent' means Msql-Mysql-modules version 1.19_03 or greater (1998-02-06) # the default value is 1 my $obsolete_DBD_ListTables= 1; # 'obsolete' means Msql-Mysql-modules version prior to 1.21_07 (1998-11-08) # (it is set to 1 as a precaution due to a problem of $dbh->tables() # with empty databases in old drivers). # Set to 0 if you report problems (i.e. warnings) on your web server log # the default value is 1 my $ListDBs_data_sources= 1; # the way to obtain the databases list via the initial login form # 0 means that is used _ListDBs, 1 means that is used DBI->data_sources # change to 0 and try again if you encounter problems # the default value is 1 #========================================================= # MySQL specific variable #========================================================= my $mysql_specific= 1; # 1 means YES, 0 means NO #========================================================= # Delimiters #========================================================= my $delimiter= '@@'; my $pri_key_delimiter= '##'; #========================================================= # backup filename #========================================================= my $backup_filename= "backup.sql"; #========================================================= # backup filename #========================================================= my $csv_exp_filename= "export.csv"; #========================================================= # Configurable actions #========================================================= #=======DBMS actions # # 1 means YES, 0 means NO my $drop_enabled= 1; # to be able to drop table(s) my $drop_check= 1; # to be prompted before drop table(s) my $erase_enabled= 1; # to be able to erase table(s) data my $erase_check= 1; # to be prompted before erase table(s) data my $delete_enabled= 1; # to be able to delete field(s) my $db_backup_enabled= 1; # to be able to backup a whole database my $db_csv_exp_enabled= 1; # to be able to export to csv from a whole database my $table_backup_enabled= 1; # to be able to backup table(s) my $table_csv_exp_enabled= 1; # to be able to export to csv from table(s) my $prepare_create_enabled=1; # to be able to define a new table my $create_enabled= 1; # to be able to definitevely create a table my $create_check= 1; # to be prompted before definitevely create a table my $delete_check= 1; # to be prompted before delete field(s) my $select_enabled= 1; # to be able to select field(s) my $edititem_enabled= 1; # to be able to edit field(s) for update my $new_enabled= 1; # to be able to edit fields for create new record(s) my $prepare_enabled= 1; # to be able to prepare select on checked field(s) my $describe_enabled= 1; # to be able to describe table(s) my $showindex_enabled= 1; # to be able to show index from table(s) my $selectfields_enabled= 1; # to be able to select checked field(s) my $insertrecord_enabled= 1; # to be able to insert records(s) my $insertrecord_check= 1; # to be prompted before insert record(s) my $updaterecord_enabled= 1; # to be able to update field(s) my $updaterecord_check= 1; # to be prompted before update table(s) my $fquery_enabled= 1; # to be able to make free query my $fquery_check= 1; # to be prompted before make free query my $refresh_enabled= 1; # to be able to refresh table(s) list my $max_selected_rows= 500; # to provide an overall limit to the number of ALL selected records #=======Warnings '0 rows affected' happened # # 1 means YES, 0 means NO my $wrng_enabled_4_crate= 0; # to be warned if '0 rows affected' happened for create table action my $wrng_enabled_4_drop= 0; # to be warned if '0 rows affected' happened for drop table action my $wrng_enabled_4_erase= 0; # to be warned if '0 rows affected' happened for erase data table action my $wrng_enabled_4_delete= 1; # to be warned if '0 rows affected' happened for delete action my $wrng_enabled_4_update= 1; # to be warned if '0 rows affected' happened for update action my $wrng_enabled_4_insert= 1; # to be warned if '0 rows affected' happened for insert action #======Upper box # # 1 means YES, 0 means NO my $upper_box_enabled= 1; # 1 means that the upper box will appear #=======javascript check # # 1 means YES, 0 means NO my $javascript_enabled= 1; # 1 means that javascript code will (0 means NOT) appear to check whether # tables/records/fields have been correctly checked or not #=======mysqlwdb link # # 1 means YES, 0 means NO my $display_mysqlwdb_link= 1; # display mysqlwdb link at the bottom of the page #=======CSV separator # my $csv_separator_default= ','; # the default character used to divide fields #========================================================= # Create table specific #========================================================= # # NOTE: For configure types & specifiers please go to the end of this file # #=======create table specifiers order # # Specifiers order from left to right. Numbers are the positions. # It is possible to remove some specifiers (i.e. a line) but 'field_name' and 'field_type' are required. # Please do not change names, but only the numbers. See "create table specifiers messages" section to change names. my %SPECIFIERS_ORDER= ( "field_name" => "1", "field_type" => "2", "length" => "3", "decimals" => "4", "unsigned" => "5", "zerofill" => "6", "binary" => "7", "not_null" => "8", "default" => "9", "auto_increment"=> "10", "fulltext" => "11", "index" => "12", "unique" => "13", "primary_key" => "14" ); #=======characters not allowed for create table names # # _SOME_ characters not allowed for table and fields names # This is for names check purpose. Space is already included. my @characters_not_allowed=qw( " ' @ . & % ! ? / \ ); #========================================================= # Messages #========================================================= # # NOTE: if you want to add a " in a message, please write it as \" #=======buttons & interface_messages my $button_discard= "Discard"; my $button_proceed= "Proceed"; my $button_drop= "Drop table(s)"; my $button_erase= "Erase table(s) data"; my $button_prepare_create= "Create table"; my $button_create= "Create"; my $button_describe= "Describe table(s)"; my $button_showindex= "Show index"; my $button_refresh= "Refresh table(s) list"; my $button_db_backup= "Database backup"; my $button_db_csv_exp= "Database CSV export"; my $button_table_backup= "Table(s) backup"; my $button_table_csv_exp= "Table(s) CSV export"; my $lock_table_backup= "With Lock table(s) instructions"; my $drop_table_backup= "With Drop table(s) instructions"; my $button_edit= "Edit record(s)"; my $button_delete= "Delete record(s)"; my $button_update= "Update record(s)"; my $button_insert= "Insert record(s)"; my $button_new= "New record(s)"; my $button_prepare= "Prepare select"; my $button_select_all= "Select all fields"; my $button_select_chk= "Select checked field(s)"; my $button_js_check_tab= "Check all table(s)"; my $button_js_unchk_tab= "Uncheck all table(s)"; my $button_js_rvrse_tab= "Reverse checked table(s)"; my $button_js_check_fld= "Check all field(s)"; my $button_js_unchk_fld= "Uncheck all field(s)"; my $button_js_check_rec= "Check all record(s)"; my $button_js_unchk_rec= "Uncheck all record(s)"; my $button_db_choice= "Go to"; my $button_go_to_db_choice="Databases choice"; my $button_fquery= "Submit"; my $databases_choice= "Databases choice"; my $user_login= "User login"; my $user_login_failed= "User login failed"; my $user_login_fail_prompt="Please check your id or password"; my $button_user_login= "Submit"; my $button_user_logout= "Logout"; my $user_id= "Id:"; my $user_pwd= "Pwd:"; my $current_user_msg= ""; my $general_error= "Error"; my $server_login= "Server login"; my $button_server_login= "Submit"; my $server_login_fail_prompt= "Please check your login informations"; my $server_login_host= "Host:"; my $server_login_port= "Port:"; my $server_login_port_default="3306"; my $server_login_database= "Database:"; my $server_login_user= "User:"; my $server_login_pwd= "Pwd:"; my $number_of_fields= "number of field(s)"; my $query_limit= "limit"; my $query_offset= "offset"; my $query_where= "where"; my $query_and= "and"; my $query_from= "from"; my $query_order_by= "order by"; my $fquery_no_output= "No output from free query"; my $radio_db_backup_witht= "With table(s) structure"; my $radio_db_backup_withot="Without table(s) structure"; my $radio_db_backup_struct="Only table(s) structure"; #=======operations my $operation_on_user= "Current user"; my $operation_on_dbs= "Operation(s) on database(s)"; my $operation_on_tables= "Operation(s) on table(s)"; my $operation_on_fields= "Operation(s) on field(s)"; my $operation_on_records= "Operation(s) on record(s)"; my $operations_on_query= "Query(ies)"; my $fquery= "Free query"; #=======questions my $ask_drop_tables= "Do you really want to drop"; my $ask_erase_tables= "Do you really want to erase"; my $ask_create_table= "Do you really want to create table?"; my $ask_delete_records= "Do you really want to delete selected record(s)?"; my $ask_insert_records= "Do you really want to insert record(s)?"; my $ask_update_records= "Do you really want to update record(s)?"; my $ask_fquery= "Do you really want to submit the free query?"; my $ask_backup_type= "Choose backup type"; my $ask_table_backup= "Table(s)"; my $ask_csv_separator= "Choose CSV separator"; #=======javascript alerts my $js_no_checked_tables= "No checked table(s)"; my $js_no_checked_fields= "No checked field(s)"; my $js_tab_check_wo_exist= "Table(s) checked without existing record(s) or field(s)"; my $js_tab_check_wo_check= "Table(s) checked without checked record(s) or field(s)"; my $js_tab_no_check_with= "Table(s) no checked with checked record(s) or field(s)"; my $js_no_field_name= "No field name"; my $js_no_table_name= "No table name"; my $js_in_table_name= "in table name"; my $js_in_field_name= "in field name"; my $js_ai_must_be_pkey= "field must be a"; my $js_pk_must_be_nn= "must be"; my $js_space_character= "'space'"; my $js_for_type= "for type"; my $js_field= "field"; my $js_not_allowed= "is not allowed"; my $js_required= "is required"; my $js_with= "with"; my $js_same_name_fields= "Same name for fields"; my $js_name_not_number= "Name can not consist only of numbers"; #=======DBMS operations messages my $ok_insert= "Insert operation successfully completed"; my $ko_insert= "insert operation NOT completed"; my $ok_create= "Create operation successfully completed"; my $ko_create= "create operation NOT completed"; my $ok_update= "Update operation successfully completed"; my $ko_update= "update operation NOT completed"; my $ok_delete= "Delete record(s) operation successfully completed"; my $ko_delete= "delete record(s) operation NOT completed"; my $ok_drop= "Drop operation successfully completed"; my $ko_drop= "drop operation NOT completed"; my $ok_erase= "Erase operation successfully completed"; my $ko_erase= "erase operation NOT completed"; my $ok_fquery= "Free query successfully completed"; my $ko_fquery= "free query operation NOT completed"; #=======create table specifiers messages # # It is possible to remove some specifiers (i.e. a line) but 'field_name' and 'field_type' are required. # Please do not change names on the left, but only messages on the right. # See "create table specifiers messages" section to change names on the left. my %SPECIFIERS_MESSAGES= ( "table_name" => "Table name", "field_name" => "Field name", "field_type" => "Field type", "length" => "Length", "decimals" => "Decimals", "unsigned" => "Unsigned", "zerofill" => "Zerofill", "binary" => "Binary", "not_null" => "Not null", "default" => "Default", "auto_increment"=> "Auto increment", "fulltext" => "Fulltext", "index" => "Index", "unique" => "Unique", "primary_key" => "Primary key" ); #=======interface errors and warnings my $err_error_word= "ERROR"; my $err_warning_word= "WARNING"; my $err_details_word= "details"; my $err_connect_db= "Can not connect to the database"; my $err_db_empty= "Database empty"; my $err_no_dbs= "No database(s)"; my $err_not_present= "NOT PRESENT"; my $err_no_prikey= "PRIMARY KEY IS NOT PRESENT"; my $err_0_rows_happened= "'0 rows affected' happened"; my $err_0_new_records= "0 new records"; my $err_0_fields= "0 fields"; my $err_no_checked_tables= "No checked table(s)"; my $err_no_check_rec_tab= "No checked record(s) or table(s)"; my $err_tab_no_check_with= "table(s) no checked with checked record(s) or field(s)"; my $err_tab_check_wo_exist="table(s) checked without existing record(s) or field(s)"; my $err_tab_check_wo_check="table(s) checked without checked record(s) or field(s)"; my $err_no_table_name= "No table name"; my $err_no_field_name= "No field name"; my $err_name_not_number= "Name can not consist only of numbers"; my $err_no_checked_fields= "No checked field(s)"; my $err_same_name_fields= "Same name for fields"; my $err_in_table_name= "in table name"; my $err_in_field_name= "in field name"; my $err_required= "is required"; my $err_not_allowed= "is not allowed"; my $err_with= "with"; my $err_field= "field"; my $err_for_type= "for type"; my $err_space_character= "'space'"; #========================================================= # HTML layout #========================================================= #=======box % width my $upper_box_perc= "40%"; my $fquery_box_perc= "40%"; #=======font face my $font_face= 'Verdana, Arial, Helvetica, sans-serif'; # font for general text my $button_font_face= 'Verdana, Arial, Helvetica, sans-serif'; # font for buttons my $numb_table_checkb_ff= 'Verdana, Arial, Helvetica, sans-serif'; # font for numbers before the checkbox of tables my $numb_rec_checkb_ff= 'Verdana, Arial, Helvetica, sans-serif'; # font for numbers before the checkbox of records my $tablename_font_face= 'Verdana, Arial, Helvetica, sans-serif'; # font for tables names my $box_font_face= 'Verdana, Arial, Helvetica, sans-serif'; # font for text in upper box my $null_face= 'Verdana, Arial, Helvetica, sans-serif'; # font for NULL #=======font size my $font_size= '2'; # font size for general text my $button_font_size= '2'; # font size for buttons my $numb_table_checkb_fs= '2'; # font size for numbers before the checkbox of tables my $numb_rec_checkb_fs= '2'; # font size for numbers before the checkbox of records my $tablename_font_size= '2'; # font size for tables names my $box_font_size= '3'; # font size for text in upper box my $null_size= '2'; # font size for NULL #=======colors my $body_bgcolor= '#ffffff'; # color for page background my $font_color= '#000000'; # color font for general text my $font_color_log_fail= 'red'; # color font for user login fail text my $button_font_color= '#000000'; # color for buttons my $table_color= '#f0f0f0'; # color for tables background my $table_td_color= '#a0b8c8'; # color for tables columns my $tablename_font_color= '#000000'; # color font for tables names my $table_checkb_td_color= '#a0b8c8'; # color for columns with the checkbox of tables my $numb_table_checkb_col= '#000000'; # color font for numbers before the checkbox of tables my $numb_rec_checkb_col= '#000000'; # color font for numbers before the checkbox of records my $rec_checkb_td_color= '#a0b8c8'; # color for columns with the checkbox of records my $pri_key_color= '#ea6467'; # color for columns with primary key field my $field_color= '#00b8c8'; # color for columns with records fields my $label_color= '#ea6467'; # color for labels my $box_bg_color= '#f0f0f0'; # color for upper box background my $box_font_color= '#000000'; # color font for text in upper box my $null_color= '#00647f'; # color font for NULL #=======form my $input_text_size= 15; # text size of the input control for insert & update fields my $text_size_4_create= 15; # text size of the input control for table and field names my $maxlength_4_create= 64; # maxlength of the input control for table and field names (would be 64 characters in MySQL) my $text_size_4_specif= 5; # text size of the input control for type specifiers my $edit_textarea_auto= 1; # enabled: 1 means YES, 0 means NO # a textarea appears instead of the text input control # if the type of the field is text or blob (edit operation) my $edit_textarea_enabled= 0; # enabled: 1 means YES, 0 means NO # a textarea appears instead of the text input control (edit operation) [continue below] my $max_length4text= 40; # if the number of characters of the field is higher than $max_length4text my $cols_textarea= 35; # number of columns of the textarea my $rows_textarea= 4; # number of rows of the textarea my $cols_fquery_textarea= 45; # number of columns of the textarea for the free query my $rows_fquery_textarea= 4; # number of rows of the textarea for the free query my $cols_fquery_texta_out= 55; # number of columns of the textarea for the free query output my $rows_fquery_texta_out= 7; # number of rows of the textarea for the free query output my $new_textarea_auto= 1; # enabled: 1 means YES, 0 means NO # a textarea appears instead of the text input control # if the type of the field is text or blob (new operation) my $new_textarea_enabled= 0; # 1 means YES, 0 means NO # if 1 a textarea appears instead of the text input control (new operation) my $cols_new_textarea= 25; # number of columns of the textarea my $rows_new_textarea= 3; # number of rows of the textarea my $where_text_size= 10; # text size of input control for the SQL where my $and_text_size= 10; # text size of input control for the SQL and my $limit_values= q{ }; my $limit_offset_values= q{ }; my $select_params= q{ }; my $orderby_params= q{ }; my $new_values= q{ }; my $new_fields= q{ }; #================================================================================ # VARIABLE CONFIGURATION SECTION END #================================================================================ #================================================================================ # # PAY ATTENTION! # # PLEASE DO NOT EDIT ANYTHING UNDER THIS COMMENT # IF YOU ARE NOT SURE WHAT ARE YOU DOING # #================================================================================ use vars qw/ %CGI_INPUT %CHECKED_ITEMS %FIELD_VALUES %HASH_pri_keys @ARRAY_pri_keys %FIELD_NAMES %internal_SPECIFIERS_ORDER %SPECIFIERS_PROPERTIES $dbh %FIELDS_TYPES %NO_SYNC_INPUT_HASH1 %CHECKED_TABLES %NO_SYNC_INPUT_HASH2 %DUP_HASH %SELECT_PARAMS %PREPARE_NAMES @tables_names $global_err $server_state @javascript_objects $flag_ok $database_prompt $empty_db $descarray $fquery_output $relevant_js_obj $warning_flag $current_db $current_user $current_pwd $descarray_describe $elem_describe $elem_select $selected_rows/; my $VERSION='1.5.4'; my $mysqlwdb_link='http://www.igsuite.org/cgi-bin/igwiki/mysqlwdb'; #===============================================# # # # main # # # #===============================================# input_from_CGI(); if (($db_backup_enabled and $CGI_INPUT{db_backupok}) or ($table_backup_enabled and $CGI_INPUT{table_backupok}) or ($db_csv_exp_enabled and $CGI_INPUT{db_csv_expok}) or ($table_csv_exp_enabled and $CGI_INPUT{table_csv_expok}) ) { if (get_current_db()) { if (!DBI_initialization()) { put_HTTP_header(); if ($custom_configuration) { put_HTML_header('server_login_failed'); DBI_error(); } else { put_HTML_header('server_login_failed'); prompt_server_login(); } } elsif (($db_backup_enabled and $CGI_INPUT{db_backupok}) or ($table_backup_enabled and $CGI_INPUT{table_backupok}) ) { put_HTTP_header_nohtml($backup_filename); my ($database,$host,$port); if ($custom_configuration) { $host=$DATABASES{$current_db}{'host'}; $port=$DATABASES{$current_db}{'port'}; $database=$DATABASES{$current_db}{'database'}; } else { $host=$CGI_INPUT{'server_login_host'}; $port=$CGI_INPUT{'server_login_port'}; $database=$CGI_INPUT{'server_login_database'}; } qselect("SELECT version()"); print "-- dump by mysqlwdb $VERSION ($mysqlwdb_link)\n"; print "--\n"; print "-- Host: $host Database: $database\n"; print "---------------------------------------------------------\n"; print "-- Server version ".$elem_select->[0]->[0]."\n\n"; if ($CGI_INPUT{table_backupok}) { table_backup($CGI_INPUT{backup_type}); } elsif ($CGI_INPUT{db_backupok}) { db_backup($CGI_INPUT{backup_type}); } exit; } elsif (($db_csv_exp_enabled and $CGI_INPUT{db_csv_expok}) or ($table_csv_exp_enabled and $CGI_INPUT{table_csv_expok}) ) { put_HTTP_header_nohtml($csv_exp_filename); if ($CGI_INPUT{table_csv_expok}) { table_csv_exp($CGI_INPUT{csv_exp_separator}); } elsif ($CGI_INPUT{db_csv_expok}) { db_csv_exp($CGI_INPUT{csv_exp_separator}); } exit; } } else { put_HTTP_header(); put_HTML_header('general_error'); } put_HTML_footer(); exit; } else { put_HTTP_header(); } my $verify_state=verify_user(); if (!$custom_configuration) { %DATABASES=(); $server_state=0; } if ($verify_state == -1) { put_HTML_header('user_login_failed'); prompt_user_login('failed'); } elsif ($verify_state == 0) { put_HTML_header('user_login'); prompt_user_login('normal'); } else { if ($CGI_INPUT{'go_to_db_choice'}) { $database_prompt=1; if ($custom_configuration) { put_HTML_header('db_prompt'); prompt_db_choice(); } else { $server_state=1; put_HTML_header('server_login'); prompt_server_login(); } } elsif ($CGI_INPUT{'server_login'}) { if (db_list()) { put_HTML_header('db_prompt'); prompt_db_choice(); } else { put_HTML_header('server_login_failed'); DBI_error(); } } elsif (get_current_db()) { if (!DBI_initialization()) { if ($custom_configuration) { put_HTML_header('server_login_failed'); DBI_error(); } else { put_HTML_header('server_login_failed'); prompt_server_login(); } } else { put_HTML_header('normal'); get_action_info(); perform_action(); } } else { if ($custom_configuration) { put_HTML_header('db_prompt'); prompt_db_choice(); } else { $server_state=1; put_HTML_header('server_login'); prompt_server_login(); } } } put_HTML_footer(); exit; #===============================================# # # # subroutines # # # #===============================================# #=============================================== # HTTP , CGI , DBI , USER subroutines #=============================================== sub put_HTTP_header { print "Content-Type: text/html\n\n"; } sub put_HTTP_header_nohtml { print "Content-Type: octet-stream\n"; print "Content-Disposition: attachment; filename=\"$_[0]\"\n\n"; } sub put_HTML_footer { print qq{
mysqlwdb $VERSION
} if ($display_mysqlwdb_link); print q{}; } sub put_HTML_header { my $state=$_[0]; my $message; if ($state eq 'normal') { if ($custom_configuration) { $message=$DATABASES{$current_db}{'db_description'}; } else { $message=$DATABASES{'1'}{'db_description'}; } } elsif ($state eq 'server_login') { $message=$server_login; } elsif ($state eq 'server_login_failed') { $message=$server_login_fail_prompt; } elsif ($state eq 'db_prompt') { $message=$databases_choice; } elsif ($state eq 'user_login_failed') { $message=$user_login_failed; } elsif ($state eq 'general_error') { $message=$general_error; } else { $message=$user_login; } print qq{ $message }; if ($upper_box_enabled) { print qq{
$message

}; } } sub input_from_CGI { my ($name, $value, $elem, @pair, $request ); if ($ENV{REQUEST_METHOD} eq "GET") { $request=$ENV{QUERY_STRING}; } else { read(STDIN, $request, $ENV{CONTENT_LENGTH}); } @pair = split('&', $request); foreach $elem (@pair) { ($name, $value) = split('=',$elem); $value =~ tr/+/ /; $name =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c',hex($1))/ge; $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack('c',hex($1))/ge; $CGI_INPUT{$name} = $value; } } sub DBI_error { print qq{
}; if ($login_prompt) { print q{ }; } if ($custom_configuration && $database_prompt) { $refresh_enabled=0; print qq{ }; } print q{
}; my $err="$err_error_word: $err_connect_db
$err_details_word: $DBI::errstr"; write_labeled_message($err); print q{
}; put_user_related_buttons(); print q{
}; put_database_related_buttons(); print q{
}; } sub DBI_initialization { my ($host,$port,$database,$user,$password,$dsn); if ($custom_configuration) { $host=$DATABASES{$current_db}{'host'}; $port=$DATABASES{$current_db}{'port'}; $database=$DATABASES{$current_db}{'database'}; $user=$DATABASES{$current_db}{'user'}; $password=$DATABASES{$current_db}{'password'}; } else { $host=$CGI_INPUT{'server_login_host'}; $port=$CGI_INPUT{'server_login_port'}; $database=$CGI_INPUT{'server_login_database'}; $user=$CGI_INPUT{'server_login_user'}; $password=$CGI_INPUT{'server_login_pwd'}; } use DBI; if ($recent_DBD_dsn_syntax) { $dsn="DBI:$DBI_driver:database=$database;host=$host;port=$port"; } else { $dsn="DBI:$DBI_driver:$database:$host:$port"; } if (!($dbh=DBI->connect($dsn,$user,$password))) { return 0; } else { return 1; } } sub db_list { %DATABASES=(); return 0 if (!DBI_initialization()); my $drh=DBI->install_driver('mysql'); my @databases; if (!$ListDBs_data_sources) { @databases= $drh->func($CGI_INPUT{'server_login_host'},'_ListDBs'); } else { @databases = DBI->data_sources('mysql',{ host => $CGI_INPUT{'server_login_host'}, port => $CGI_INPUT{'server_login_port'}, user => $CGI_INPUT{'server_login_user'}, password => $CGI_INPUT{'server_login_pwd'} } ); } my $db_count; foreach my $database (@databases) { if ($database=~/:/) { $database=~/:([^:]+?)$/; $database=$1; } $db_count++; $DATABASES{"$db_count"}={ host=>$CGI_INPUT{'server_login_host'}, port=>$CGI_INPUT{'server_login_port'}, database=>$database, user=>$CGI_INPUT{'server_login_user'}, password=>$CGI_INPUT{'server_login_pwd'}, db_description=>$database } } return 1; } sub get_current_db { my ($db_position,$dbs,$last_db); $current_db=$CGI_INPUT{'current_db'}; if (!$custom_configuration) { if ($current_db eq '#') { $DATABASES{"1"}={ host=>$CGI_INPUT{'server_login_host'}, port=>$CGI_INPUT{'server_login_port'}, database=>$CGI_INPUT{'server_login_database'}, user=>$CGI_INPUT{'server_login_user'}, password=>$CGI_INPUT{'server_login_pwd'}, db_description=>$CGI_INPUT{'server_login_database'} }; $database_prompt=1; return 1; } else { return 0; } } foreach $db_position (sort numerically keys %DATABASES) { $last_db=$db_position; $dbs++; } if ($dbs > 1) { $database_prompt=1; if (!$current_db) { return 0; } else { return 1; } } else { $database_prompt=0; if (!$current_db) { $current_db=$last_db; } return 1; } } sub table_backup { my $type=$_[0]; get_checked_tables(); foreach my $table_name (sort keys %CHECKED_TABLES) { if ($type eq 'with') { backup_table_desc($table_name,$CGI_INPUT{'with_drop'}); print "\n"; backup_table_data($table_name,$CGI_INPUT{'with_drop'}); } elsif ($type eq 'without') { backup_table_data($table_name,$CGI_INPUT{'without_lock'}); } elsif ($type eq 'struct') { backup_table_desc($table_name,$CGI_INPUT{'struct_drop'}); } print "\n"; } } sub table_csv_exp { my $csv_separator=$_[0]; get_checked_tables(); foreach my $table_name (sort keys %CHECKED_TABLES) { csv_exp($table_name,$csv_separator); } } sub db_backup { my $type=$_[0]; list_tables(); foreach my $table_name (sort @tables_names) { if ($type eq 'with') { backup_table_desc($table_name,$CGI_INPUT{'with_drop'}); print "\n"; backup_table_data($table_name,$CGI_INPUT{'with_lock'}); } elsif ($type eq 'without') { backup_table_data($table_name,$CGI_INPUT{'without_lock'}); } elsif ($type eq 'struct') { backup_table_desc($table_name,$CGI_INPUT{'struct_drop'}); } print "\n"; } } sub db_csv_exp { my $csv_separator=$_[0]; list_tables(); foreach my $current_table (sort @tables_names) { csv_exp($current_table,$csv_separator); } } sub csv_exp { my $current_table=$_[0]; my $csv_separator=$_[1]; my $csv_separator_quote=quotemeta($csv_separator); qselect("SHOW COLUMNS FROM $current_table"); my $pri_key_string=get_pri_key($current_table); my $qstring="SELECT * FROM $current_table"; $qstring.=" ORDER BY $pri_key_string" if ($pri_key_string); qselect($qstring); foreach my $elem (@{$elem_select}) { my $type_array_index; my $data; foreach my $row_elem (@{$elem}) { $row_elem=~s/\r//g; $row_elem=~s/"/""/g; if ($row_elem=~/$csv_separator_quote/ or $row_elem=~/\n/ or $row_elem=~/"/) { $data.="\"$row_elem\"$csv_separator"; } else { $data.="$row_elem$csv_separator"; } } chop($data); print "$data\n"; } } sub backup_table_desc { my $current_table=$_[0]; my $drop_action=$_[1]; qselect("SHOW CREATE TABLE $current_table"); $elem_select->[0]->[1] =~ tr/`//d; print "--\n"; print "-- Table structure for table `$current_table`\n"; print "--\n"; print "\nDROP TABLE IF EXISTS $current_table;" if ($drop_action); print "\n".$elem_select->[0]->[1].";\n" if ($elem_select->[0]->[1] ne ''); return; } sub backup_table_data { my $current_table=$_[0]; my $lock_action=$_[1]; qselect("SHOW COLUMNS FROM $current_table"); my @type_array; foreach my $elem (@{$elem_select}) { push @type_array,$$elem[1]; } my $pri_key_string=get_pri_key($current_table); my $qstring="SELECT * FROM $current_table"; $qstring.=" ORDER BY $pri_key_string" if ($pri_key_string); qselect($qstring); print "--\n"; print "-- Dumping data for table `$current_table`\n"; print "--\n\n"; print "LOCK TABLES $current_table WRITE;\n" if ($lock_action); foreach my $elem (@{$elem_select}) { my $type_array_index; my $data="INSERT INTO $current_table VALUES ("; foreach my $row_elem (@{$elem}) { my $quoted_value=$row_elem; $quoted_value=$dbh->quote($row_elem,$type_array[$type_array_index++]); $quoted_value='NULL' if (!defined $row_elem); $data.="$quoted_value,"; } chop($data); print $data.");\n"; } print "UNLOCK TABLES;\n" if ($lock_action); } sub verify_user { if ($login_prompt) { if ((exists $CGI_INPUT{'current_user'}) and (exists $CGI_INPUT{'current_pwd'})) { my $salt=substr $CGI_INPUT{'current_pwd'},0,2; my $encrypted_pwd=crypt($LOGIN{$CGI_INPUT{'current_user'}},$salt); if ($encrypted_pwd eq $CGI_INPUT{'current_pwd'}) { $current_user=$CGI_INPUT{'current_user'}; $current_pwd=$CGI_INPUT{'current_pwd'}; return 1 } else { return -1 } } elsif ((exists $CGI_INPUT{'user_id'}) or (exists $CGI_INPUT{'user_pwd'})) { if (scalar(keys %LOGIN) and (exists $LOGIN{$CGI_INPUT{'user_id'}}) and ($LOGIN{$CGI_INPUT{'user_id'}} eq $CGI_INPUT{'user_pwd'})) { my @list_of_chars=(0..9,'a'..'z','A'..'Z'); my $first_salt=rand 64; srand; my $secont_salt=rand 64; my $salt=$list_of_chars[$first_salt].$list_of_chars[$secont_salt]; my $encrypted_pwd=crypt($LOGIN{$CGI_INPUT{'user_id'}},$salt); $current_user=$CGI_INPUT{'user_id'}; $current_pwd=$encrypted_pwd; return 1 } else { return -1 } } else { return 0 } } else { return 1; } } #=============================================== # Misc. subroutines #=============================================== sub write_labeled_message { print qq{
$_[0]

}; } sub numerically { $a <=> $b; } sub html2txt { my $html_input=$_[0]; my $param=$_[1]; $html_input =~ s/&/&/g; $html_input =~ s//>/g; $html_input =~ s/"/"/g; if ($param eq 'br') { $html_input =~ s/\n/
/g; $html_input =~ s/\x20/ /g; } return $html_input; } sub txt2html { my $html_input=$_[0]; my $param=$_[1]; if ($param eq 'br') { $html_input =~ s/
/\n/g; $html_input =~ s/&(nbsp|#160);/chr(32)/ge; } $html_input =~ s/"/"/g; $html_input =~ s/>/>/g; $html_input =~ s/</ $internal_SPECIFIERS_ORDER{$b} } keys %internal_SPECIFIERS_ORDER) { if (!$FIELD_NAMES{$specifier}{$checked}) {next;} ($appear,$order)=split /\+/ , $SPECIFIERS_PROPERTIES{$specifier}{'appear'}; if ($appear) { if ($specifier eq 'primary_key') { $pri_key_create_string.="$FIELD_NAMES{'field_name'}{$checked}"; $pri_key_create_string.="($FIELD_NAMES{'index'}{$checked})" if $FIELD_NAMES{'index'}{$checked}; $pri_key_create_string.=','; next; } elsif ($specifier eq 'index') { next if($FIELD_NAMES{'primary_key'}{$checked}); $FIELD_NAMES{$specifier}{$checked}=~/([^\(]+)\(([^\)]+)\)/; my $index_name=$1; my $index_length=$2; if ($index_length) { $index_create_string.="KEY $index_name ($FIELD_NAMES{'field_name'}{$checked}($index_length)),"; } else { $index_create_string.="KEY $FIELD_NAMES{$specifier}{$checked} ($FIELD_NAMES{'field_name'}{$checked}),"; } next; } elsif ($specifier eq 'unique') { $unique_create_string.="UNIQUE $FIELD_NAMES{$specifier}{$checked} ($FIELD_NAMES{'field_name'}{$checked}),"; next; } elsif ($specifier eq 'fulltext') { $fulltext_create_string.="$FIELD_NAMES{'field_name'}{$checked},"; next; } ($output_specifier=$specifier) =~ s/_/ /; if ($SPECIFIERS_PROPERTIES{$specifier}{'html'} eq 'text') { $create_string.=" $output_specifier $FIELD_NAMES{$specifier}{$checked} "; } else { $create_string.=" $output_specifier "; } } else { $checked_type=$FIELD_NAMES{'field_type'}{$checked}; ($property,$required_specifier)=split /\+/ , $FIELDS_TYPES{$checked_type}{$specifier}; if ($required_specifier) { if (!$pair_done) { if ($order eq '1') { $create_string.="($FIELD_NAMES{$specifier}{$checked},$FIELD_NAMES{$required_specifier}{$checked}) "; } else { $create_string.="($FIELD_NAMES{$required_specifier}{$checked},$FIELD_NAMES{$specifier}{$checked}) "; } $pair_done=1; } } else { $create_string.="($FIELD_NAMES{$specifier}{$checked}) "; } } } if (exists $FIELD_NAMES{'auto_increment'}{0}) { if ($FIELD_NAMES{'auto_increment'}{0} == $checked) { $create_string.=" auto_increment "; } } $create_string.=","; } chop $create_string; if ($pri_key_create_string) { chop $pri_key_create_string; $pri_key_create_string=',PRIMARY KEY ('.$pri_key_create_string.')'; $create_string.=$pri_key_create_string; } if ($index_create_string) { chop $index_create_string; $create_string.=','.$index_create_string; } if ($fulltext_create_string) { chop $fulltext_create_string; $create_string.=', FULLTEXT('.$fulltext_create_string.')'; } if ($unique_create_string) { chop $unique_create_string; $create_string.=','.$unique_create_string; } $create_string.=')'; my $sth = $dbh->do($create_string); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } elsif ($sth eq "0E0") { $warning_flag=1; } if ($wrng_enabled_4_crate and $warning_flag) { $err_message=qq{$err_warning_word: $err_0_rows_happened}; write_labeled_message($err_message); } return 1; } sub drop { my ($table_name, $warning_flag, $err_message ); foreach $table_name (keys %CHECKED_TABLES) { my $sth = $dbh->do("drop table $table_name"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } elsif ($sth eq "0E0") { $warning_flag=1; } } if ($wrng_enabled_4_drop and $warning_flag) { $err_message=qq{$err_warning_word: $err_0_rows_happened}; write_labeled_message($err_message); } return 1; } sub erase { my ($table_name, $warning_flag, $err_message ); foreach $table_name (keys %CHECKED_TABLES) { my $sth = $dbh->do("delete from $table_name"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } elsif ($sth eq "0E0") { $warning_flag=1; } } if ($wrng_enabled_4_erase and $warning_flag) { $err_message=qq{$err_warning_word: $err_0_rows_happened}; write_labeled_message($err_message); } return 1; } sub deleterec { my ($where_string, $table_name, $key_name, $delete_string, $number, $warning_flag, $err_message ); if (!lock_tables()) {return 0;} foreach $table_name (keys %CHECKED_ITEMS) { foreach $key_name (keys %{$CHECKED_ITEMS{$table_name}}) { foreach $number (keys %{$CHECKED_ITEMS{$table_name}{$key_name}}) { $where_string=''; my $tmp_pri_key_delimiter=quotemeta($pri_key_delimiter); my @pri_keys=split /$tmp_pri_key_delimiter/,$key_name; my @pri_keys_values=split /$tmp_pri_key_delimiter/,$CHECKED_ITEMS{$table_name}{$key_name}{$number}; foreach (0..$#pri_keys) { my $quoted_value=$pri_keys_values[$_]; if ($quoted_value eq '') { $quoted_value="''"; } else { $quoted_value=$dbh->quote($quoted_value); } $where_string.="($pri_keys[$_] = $quoted_value) and "; } substr($where_string,-5)=''; $where_string=' where ('.$where_string.')'; $delete_string=qq{delete from $table_name $where_string}; my $sth = $dbh->do("$delete_string"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } elsif ($sth eq "0E0") { $warning_flag=1; } } } } if (!unlock_tables()) { return 0; } else { if ($wrng_enabled_4_delete and $warning_flag) { $err_message=qq{$err_warning_word: $err_0_rows_happened}; write_labeled_message($err_message); } return 1; } } sub describe { my $table_name=$_[0]; my $command=$_[1]; my $sth = $dbh->prepare("$command $table_name"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } $sth->execute; $descarray_describe=$sth->{NAME}; $elem_describe=$sth->fetchall_arrayref; $sth->finish; return 1; } sub qselect { my $select_string; $select_string=$_[0]; my $sth = $dbh->prepare( "$select_string"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } $sth->execute; $descarray=$sth->{NAME}; $elem_select=$sth->fetchall_arrayref; $sth->finish; return 1; } sub get_pri_key { my ($table_name, $key_index, $refbool, $pri_key_string ); %HASH_pri_keys=(); @ARRAY_pri_keys=(); $table_name=$_[0]; if ($mysql_specific) { my $sth = $dbh->prepare("LISTFIELDS $table_name"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } $sth->execute; $descarray=$sth->{'NAME'}; if ($recent_DBD_is_pri_key) { $refbool=$sth->{'mysql_is_pri_key'}; } else { $refbool=$sth->{'is_pri_key'}; } $sth->finish; foreach $key_index (0..$#{$refbool}) { if ($refbool->[$key_index] eq 1) { $HASH_pri_keys{$descarray->[$key_index]}=$key_index; $ARRAY_pri_keys[++$#ARRAY_pri_keys]=$descarray->[$key_index]; $pri_key_string.=$descarray->[$key_index].$pri_key_delimiter; } } } else { #I don't know how to implement this feature } substr($pri_key_string,-length($pri_key_delimiter))='' if ($pri_key_string); return $pri_key_string; } sub prepare { my $table_name; $table_name=$_[0]; if ($mysql_specific) { my $sth = $dbh->prepare("LISTFIELDS $table_name"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } $sth->execute; $descarray=$sth->{'NAME'}; $sth->finish; } else { my $sth = $dbh->prepare("select * from $table_name"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } $sth->execute; $descarray=$sth->{NAME}; $sth->finish; } @{$PREPARE_NAMES{$table_name}}=@{$descarray}; return 1; } sub update_records { my ($set_string, $where_string, $update_string, $table_name, $key_name, $number, $field_name, $field_value, $warning_flag ); if (!lock_tables()) {return 0;} foreach $table_name (keys %CHECKED_ITEMS) { foreach $key_name (keys %{$CHECKED_ITEMS{$table_name}}) { foreach $number (keys %{$CHECKED_ITEMS{$table_name}{$key_name}}) { $where_string=''; my $tmp_pri_key_delimiter=quotemeta($pri_key_delimiter); my @pri_keys=split /$tmp_pri_key_delimiter/,$key_name; my @pri_keys_values=split /$tmp_pri_key_delimiter/,$CHECKED_ITEMS{$table_name}{$key_name}{$number}; foreach (0..$#pri_keys) { my $quoted_value=$pri_keys_values[$_]; if ($quoted_value eq '') { $quoted_value="''"; } else { $quoted_value=$dbh->quote($quoted_value); } $where_string.="($pri_keys[$_] = $quoted_value) and "; } substr($where_string,-5)=''; $where_string=' where ('.$where_string.')'; $set_string=''; foreach $field_name (keys %{$FIELD_VALUES{$table_name}{$number}}) { $field_value=$FIELD_VALUES{$table_name}{$number}{$field_name}; if ($updaterecord_check) { txt2html($field_value,'nobr'); } $field_value=$dbh->quote($field_value); $set_string.=$field_name.'='.$field_value.','; } chop($set_string); $update_string='update '.$table_name.' set '.$set_string.' '.$where_string; my $sth = $dbh->do("$update_string"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } elsif ($sth eq "0E0") { $warning_flag=1; } } } } if (!unlock_tables()) { return 0; } else { if ($wrng_enabled_4_update and $warning_flag) { my $err_message=qq{$err_warning_word: $err_0_rows_happened}; write_labeled_message($err_message); } return 1; } } sub insert_records { my ($table_name, $field_name, $field_value, $number, $names_string, $values_string, $insert_string, $warning_flag, $err_message ); if (!lock_tables()) {return 0;} foreach $table_name (keys %FIELD_VALUES) { foreach $number (sort numerically keys %{$FIELD_VALUES{$table_name}}) { $names_string=''; $values_string=''; foreach $field_name (keys %{$FIELD_VALUES{$table_name}{$number}}) { $field_value=$FIELD_VALUES{$table_name}{$number}{$field_name}; if ($insertrecord_check) { txt2html($field_value,'nobr'); } $field_value=$dbh->quote($field_value); $names_string.=$field_name.','; $values_string.=$field_value.','; } chop($names_string); chop($values_string); $insert_string='insert into '.$table_name.' ('.$names_string.') VALUES ('.$values_string.')'; my $sth = $dbh->do("$insert_string"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } elsif ($sth eq "0E0") { $warning_flag=1; } } } if (!unlock_tables()) { return 0; } else { if ($wrng_enabled_4_insert and $warning_flag) { $err_message=qq{$err_warning_word: $err_0_rows_happened}; write_labeled_message($err_message); } return 1; } } sub lock_tables { my ($table_name_list, $table_name, $lock_string ); $table_name_list=''; foreach $table_name (keys %CHECKED_TABLES) { $table_name_list.=$table_name.' WRITE ,'; } chop ($table_name_list); $lock_string='LOCK TABLES '.$table_name_list; if (!defined $dbh->do("$lock_string")) { $global_err="$DBI::errstr"; return 0; } else { return 1; } } sub unlock_tables { if (!defined $dbh->do("UNLOCK TABLES")) { $global_err="$DBI::errstr"; return 0; } else { return 1; } } sub list_tables { if ($mysql_specific) { if (!$obsolete_DBD_ListTables) { @tables_names = $dbh->tables(); } else { @tables_names = $dbh->func("_ListTables"); } #DBD::mysql 2.9x workaround tr/`//d foreach @tables_names; } else { @tables_names = $dbh->tables(); } return @tables_names+0; } sub perform_fquery { $CGI_INPUT{'fquery_textarea'}=~s/\n//g; $CGI_INPUT{'fquery_textarea'}=~s/\r//g; $CGI_INPUT{'fquery_textarea'}=txt2html($CGI_INPUT{'fquery_textarea'},'nobr'); my $sth = $dbh->prepare("$CGI_INPUT{'fquery_textarea'}"); if ( !defined $sth ) { $global_err="$DBI::errstr"; return 0; } my $rv=$sth->execute; if ( !defined $rv ) { $global_err="$DBI::errstr"; return 0; } else { #also with $rv eq "0E0" $fquery_output=''; $descarray_describe=$sth->{NAME}; $elem_describe=$sth->fetchall_arrayref; } $sth->finish; return 1; } #=============================================== # get_action_info subroutines #=============================================== sub get_action_info { $flag_ok=1; if ($create_enabled and $CGI_INPUT{create} and !$CGI_INPUT{'new_fields'}) { write_labeled_message("$err_error_word: $err_0_fields"); $CGI_INPUT{create}=0; $flag_ok=0; } if ($create_enabled and $CGI_INPUT{createok}) { if (verify_create_checks()) { if ($create_check) { print qq{
}; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } write_labeled_message("$ask_create_table"); put_hidden_values_4_create(); print qq{
}; $flag_ok=0; } else { $CGI_INPUT{createcheck}=1; $flag_ok=1; } } } if ($table_csv_exp_enabled and $CGI_INPUT{table_csv_exp}) { if (get_checked_tables()) { if (!$CGI_INPUT{table_csv_expok}) { print qq{
}; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } my $message="$ask_table_backup:"; foreach my $table_name (keys %CHECKED_TABLES) { $message.="
  • $table_name
  • "; my $tmp_name='checked_table'.$delimiter.$table_name; my $tmp_value=$table_name; print qq{\n}; } write_labeled_message($message); write_labeled_message($ask_csv_separator); print qq{
    }; print qq{
    }; print q{

    }; print qq{
    }; } else { $flag_ok=1; } } else { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } } if ($table_backup_enabled and $CGI_INPUT{table_backup}) { if (get_checked_tables()) { if (!$CGI_INPUT{table_backupok}) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } my $message="$ask_table_backup:"; foreach my $table_name (keys %CHECKED_TABLES) { $message.="
  • $table_name
  • "; my $tmp_name='checked_table'.$delimiter.$table_name; my $tmp_value=$table_name; print qq{\n}; } write_labeled_message($message); write_labeled_message($ask_backup_type); print qq{
    }; print qq{
    $radio_db_backup_witht
      $lock_table_backup
      $drop_table_backup
    $radio_db_backup_withot
      $lock_table_backup
    $radio_db_backup_struct
      $drop_table_backup
    }; print q{

    }; print qq{
    }; } else { $flag_ok=1; } } else { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } } if ($drop_enabled and $CGI_INPUT{drop}) { if (get_checked_tables()) { if ($drop_check) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } my $message="$ask_drop_tables:"; foreach my $table_name (keys %CHECKED_TABLES) { $message.="
  • $table_name
  • "; my $tmp_name='checked_table'.$delimiter.$table_name; my $tmp_value=$table_name; print qq{\n}; } write_labeled_message($message); print qq{
    }; } else { $CGI_INPUT{dropok}=1; $flag_ok=1; } } else { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } } if ($erase_enabled and $CGI_INPUT{erase}) { if (get_checked_tables()) { if ($erase_check) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } my $message="$ask_erase_tables:"; foreach my $table_name (keys %CHECKED_TABLES) { $message.="
  • $table_name
  • "; my $tmp_name='checked_table'.$delimiter.$table_name; my $tmp_value=$table_name; print qq{\n}; } write_labeled_message($message); print qq{
    }; } else { $CGI_INPUT{eraseok}=1; $flag_ok=1; } } else { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } } if ($delete_enabled and $CGI_INPUT{delete}) { if (verify_checks()) { if ($delete_check) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } write_labeled_message("$ask_delete_records"); put_hidden_values(); print qq{
    }; $flag_ok=0; } else { $CGI_INPUT{deleteok}=1; $flag_ok=1; } } } if (($describe_enabled and $CGI_INPUT{describe}) or ($showindex_enabled and $CGI_INPUT{showindex})) { if (!(get_checked_tables())) { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } } if ($select_enabled and $CGI_INPUT{select}) { get_field_names(); get_select_params(); if (!(get_checked_tables())) { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } if ($selectfields_enabled and $CGI_INPUT{withselectfields}) { if (!verify_checks_lite()) { $flag_ok=0; } } } if ($new_enabled and $CGI_INPUT{new}) { if (!$CGI_INPUT{'new_elem'}) { write_labeled_message("$err_error_word: $err_0_new_records"); $flag_ok=0; } if (!(get_checked_tables())) { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } } if ($prepare_enabled and $CGI_INPUT{prepare}) { if (!(get_checked_tables())) { write_labeled_message("$err_error_word: $err_no_checked_tables"); $flag_ok=0; } } if ($selectfields_enabled and $CGI_INPUT{selectfields}) { if (verify_checks()) { get_select_params(); } else { $flag_ok=0; } } if ($edititem_enabled and $CGI_INPUT{edititem}) { if (!verify_checks()) { $flag_ok=0; } } if ($insertrecord_enabled and $CGI_INPUT{insertrecord}) { if (verify_checks()) { get_field_values(); if ($insertrecord_check) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } write_labeled_message("$ask_insert_records"); put_hidden_values(); print qq{
    }; $flag_ok=0; } else { $CGI_INPUT{insertok}=1; $flag_ok=1; } } } if ($fquery_enabled and $CGI_INPUT{fquery}) { if ($fquery_check) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } $CGI_INPUT{'fquery_textarea'}=html2txt($CGI_INPUT{'fquery_textarea'},'nobr'); print qq{ }; write_labeled_message("$ask_fquery"); print qq{
    }; $flag_ok=0; } else { $CGI_INPUT{fqueryok}=1; $flag_ok=1; } } if ($updaterecord_enabled and $CGI_INPUT{updaterecord}) { if (verify_checks()) { get_field_values(); if ($updaterecord_check) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } write_labeled_message("$ask_update_records"); put_hidden_values(); print qq{
    }; $flag_ok=0; } else { $CGI_INPUT{updateok}=1; $flag_ok=1; } } } if ($db_csv_exp_enabled and $CGI_INPUT{db_csv_exp}) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } write_labeled_message($ask_csv_separator); print qq{
    }; print qq{
    }; print q{

    }; print qq{
    }; $flag_ok=1; } if ($db_backup_enabled and $CGI_INPUT{db_backup}) { print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } write_labeled_message("$ask_backup_type"); print qq{
    }; print qq{
    $radio_db_backup_witht
      $lock_table_backup
      $drop_table_backup
    $radio_db_backup_withot
      $lock_table_backup
    $radio_db_backup_struct
      $drop_table_backup
    }; print q{

    }; put_hidden_values(); print qq{
    }; $flag_ok=0; } } sub put_hidden_values { my ($table_name, $num, $prim_key, $tmp_name, $tmp_value, $field_name ); foreach $table_name (keys %CHECKED_ITEMS) { $tmp_name='checked_table'.$delimiter.$table_name; $tmp_value=$table_name; print qq{ }; foreach $prim_key (keys %{$CHECKED_ITEMS{$table_name}}) { foreach $num (sort numerically keys %{$CHECKED_ITEMS{$table_name}{$prim_key}}) { $tmp_value=$CHECKED_ITEMS{$table_name}{$prim_key}{$num}; $tmp_name='checked_item'.$delimiter.$table_name.$delimiter.$prim_key.$delimiter.$num; print qq{ }; foreach $field_name (keys %{$FIELD_VALUES{$table_name}{$num}}) { $tmp_value=$FIELD_VALUES{$table_name}{$num}{$field_name}; $tmp_value=html2txt($tmp_value,'nobr'); $tmp_value=~s/\r//g; $tmp_name='field_value'.$delimiter.$num.$delimiter.$table_name.$delimiter.$field_name; print qq{ }; } } } } } sub put_hidden_values_4_create { my ($tmp_name, $tmp_value, $type, $checked ); $tmp_name='table_name'; $tmp_value=$CGI_INPUT{'table_name'}; print qq{ }; foreach $type (keys %FIELD_NAMES) { foreach $checked (keys %{$FIELD_NAMES{$type}}) { $tmp_name='field_name'.$delimiter.$type.$delimiter.$checked; $tmp_value=$FIELD_NAMES{$type}{$checked}; print qq{ }; } } } sub verify_create_names { my $name=$_[0]; my ($err_string, $character, $metacharacter ); if ($name =~ / /) { $err_string="$err_space_character $err_not_allowed"; return $err_string; } foreach $character (@characters_not_allowed) { $metacharacter=quotemeta($character); if ($name =~ /$metacharacter/) { $err_string="$character $err_not_allowed"; return $err_string; } } if ($name !~ /[^\d]/) { $err_string="$err_name_not_number"; return $err_string; } return ''; } sub verify_create_checks { my ($flag_err, $err_string, $err_string_name, $extrn, $intrn, $message, $message_required_specifier, @create_checked_items, $checked, $property, $required_specifier ); $flag_err=0; get_field_names(); if (!$CGI_INPUT{'table_name'}) { $err_string.='
    '.$err_no_table_name; $flag_err=1; } if (!$flag_err) { $err_string_name=verify_create_names($CGI_INPUT{'table_name'}); if ($err_string_name) { $err_string.='
    '."$err_string_name $err_in_table_name"; $flag_err=1; } } get_fields_types(); foreach $checked (sort numerically keys %{$FIELD_NAMES{'checked_item'}}) { $create_checked_items[++$#create_checked_items]=$checked; if ($FIELD_NAMES{'field_name'}{$checked} eq '') { $err_string.='
    '."$err_no_field_name : $err_field $checked"; $flag_err=1; } else { $err_string_name=verify_create_names($FIELD_NAMES{'field_name'}{$checked}); if ($err_string_name) { $err_string.='
    '."$err_string_name $err_in_field_name : $err_field $checked"; $flag_err=1; } } my $type=$FIELD_NAMES{'field_type'}{$checked}; foreach my $specifier (keys %SPECIFIERS_ORDER) { if ($FIELD_NAMES{$specifier}{$checked} ne '') { ($property,$required_specifier)=split /\+/ , $FIELDS_TYPES{$type}{$specifier}; if ($required_specifier) { $message_required_specifier=$SPECIFIERS_MESSAGES{$required_specifier}; $message=$SPECIFIERS_MESSAGES{$specifier}; if ($FIELD_NAMES{$required_specifier}{$checked} eq '') { $err_string.='
    '."$message_required_specifier $err_required $err_with $message $err_for_type $type : $err_field $checked"; $flag_err=1; } } if ($FIELDS_TYPES{$type}{$specifier} eq '-1') { $message=$SPECIFIERS_MESSAGES{$specifier}; $err_string.='
    '."$message $err_not_allowed $err_for_type $type : $err_field $checked"; $flag_err=1; } } else { if ($FIELDS_TYPES{$type}{$specifier} eq '1') { $message=$SPECIFIERS_MESSAGES{$specifier}; $err_string.='
    '."$message $err_required $err_for_type $type : $err_field $checked"; $flag_err=1; } elsif ($FIELD_NAMES{$specifier}{0} eq $checked) { if ($FIELDS_TYPES{$type}{$specifier} eq '-1') { $message=$SPECIFIERS_MESSAGES{$specifier}; $err_string.='
    '."$message $err_not_allowed $err_for_type $type : $err_field $checked"; $flag_err=1; } } } } } if ($#create_checked_items == -1) { $err_string.='
    '.$err_no_checked_fields; $flag_err=1; } for ($extrn=1;$extrn<$#create_checked_items+1;$extrn++) { for ($intrn=$extrn+1;$intrn<=$#create_checked_items+1;$intrn++) { if ($FIELD_NAMES{'field_name'}{$create_checked_items[$extrn-1]} eq $FIELD_NAMES{'field_name'}{$create_checked_items[$intrn-1]}) { $err_string.='
    '."$err_same_name_fields $extrn , $intrn"; $flag_err=1; } } } if ((exists $FIELD_NAMES{'checked_item'}{$FIELD_NAMES{'auto_increment'}{0}}) and $FIELD_NAMES{'auto_increment'}{0}) { my $local_err=1; foreach my $key (keys %{$FIELD_NAMES{'primary_key'}}) { if ($key eq $FIELD_NAMES{'auto_increment'}{0}) { $local_err=0; last; } } if ($local_err) { $err_string.='
    '."$SPECIFIERS_MESSAGES{'auto_increment'} $js_ai_must_be_pkey $SPECIFIERS_MESSAGES{'primary_key'} : $FIELD_NAMES{'auto_increment'}{0}"; $flag_err=1; } } foreach my $key (keys %{$FIELD_NAMES{'primary_key'}}) { if ((exists $FIELD_NAMES{'checked_item'}{$key}) && (!exists $FIELD_NAMES{'checked_item'}{$FIELD_NAMES{'not_null'}{$key}})) { $err_string.='
    '."$SPECIFIERS_MESSAGES{'primary_key'} $js_pk_must_be_nn $SPECIFIERS_MESSAGES{'not_null'} : $err_field $key"; $flag_err=1; last; } } if ($flag_err) { $err_string="$err_error_word: ".$err_string; write_labeled_message($err_string); return 0; } else { return 1; } } sub verify_checks_lite { my ($flag_err, $dim_hash_tabs, $dim_hash_items, $tabcheck_but, $tabno_with_checked, $dim_hash1, $dim_hash2, $norec_exist, $norec_check, @recerr_noex, @recerr_nocheck, @taberr_no, $tab_string, $err_string ); $flag_err=0; ($dim_hash_tabs,$dim_hash_items,$norec_exist,$norec_check)=sync_checked_items(\%CHECKED_TABLES,\%FIELD_NAMES); if ($norec_exist) { @recerr_noex=keys %NO_SYNC_INPUT_HASH1; } if (@recerr_noex) { $tab_string="@recerr_noex"; $tab_string="
  • $tab_string
  • "; $tab_string =~ s/\x20/
  • /g; $tab_string =~ s/\x20/<\/li>/g; $err_string.="
    $err_error_word: $err_tab_check_wo_exist:
    $tab_string
    "; $flag_err=1; } if ($flag_err) { write_labeled_message($err_string); return 0; } else { return 1; } } sub verify_checks { my ($flag_err, $dim_hash_tabs, $dim_hash_items, $tabcheck_but, $tabno_with_checked, $dim_hash1, $dim_hash2, $norec_exist, $norec_check, @recerr_noex, @recerr_nocheck, @taberr_no, $tab_string, $err_string ); $flag_err=0; get_checked_tables(); get_checked_items(); ($dim_hash_tabs,$dim_hash_items,$tabcheck_but,$tabno_with_checked)=sync_checked_items(\%CHECKED_TABLES,\%CHECKED_ITEMS); get_field_names(); if ($tabno_with_checked) { @taberr_no=keys %NO_SYNC_INPUT_HASH2; $flag_err=1; } if ($tabcheck_but) { foreach my $key (%NO_SYNC_INPUT_HASH1) { $DUP_HASH{$key}=$NO_SYNC_INPUT_HASH1{$key}; } ($dim_hash1,$dim_hash2,$norec_exist,$norec_check)=sync_checked_items(\%DUP_HASH,\%FIELD_NAMES); if ($norec_exist) { @recerr_noex=keys %NO_SYNC_INPUT_HASH1; } @recerr_nocheck=keys %FIELD_NAMES; $flag_err=1; } if (@taberr_no) { $tab_string="@taberr_no"; $tab_string="
  • $tab_string
  • "; $tab_string=~ s/\x20/
  • /g; $tab_string=~ s/\x20/<\/li>/g; $err_string="
    $err_error_word: $err_tab_no_check_with:
    $tab_string
    "; } if (@recerr_noex) { $tab_string="@recerr_noex"; $tab_string="
  • $tab_string
  • "; $tab_string =~ s/\x20/
  • /g; $tab_string =~ s/\x20/<\/li>/g; $err_string.="
    $err_error_word: $err_tab_check_wo_exist:
    $tab_string
    "; } if (@recerr_nocheck) { $tab_string="@recerr_nocheck"; $tab_string="
  • $tab_string
  • "; $tab_string =~ s/\x20/
  • /g; $tab_string =~ s/\x20/<\/li>/g; $err_string.="
    $err_error_word: $err_tab_check_wo_check:
    $tab_string
    "; } if (!$flag_err and !$dim_hash_tabs) { $err_string.="$err_error_word: $err_no_check_rec_tab"; $flag_err=1; } if ($flag_err) { write_labeled_message($err_string); return 0; } else { return 1; } } sub get_checked_tables { my ($key, $checked_table, $table_name ); my $tmp_delimiter=quotemeta($delimiter); foreach $key (keys %CGI_INPUT) { ($checked_table,$table_name)=split /$tmp_delimiter/, $key; if ($checked_table eq 'checked_table') { $CHECKED_TABLES{$CGI_INPUT{$key}}=$table_name; delete $CGI_INPUT{$key}; } } return %CHECKED_TABLES+0; } sub get_checked_items { my ($num_of_items , $checked_item , $table_name , $relevant_name, $id_number , $key ); $num_of_items=0; my $tmp_delimiter=quotemeta($delimiter); foreach $key (keys %CGI_INPUT) { ($checked_item,$table_name,$relevant_name,$id_number)=split /$tmp_delimiter/, $key; if ($checked_item eq "checked_item") { $CHECKED_ITEMS{$table_name}{$relevant_name}{$id_number}=$CGI_INPUT{$key}; delete $CGI_INPUT{$key}; $num_of_items++; } } return $num_of_items; } sub get_field_names { my ($num_of_fields, $field_name , $table_name , $id_number , $key ); $num_of_fields=0; my $tmp_delimiter=quotemeta($delimiter); foreach $key (keys %CGI_INPUT) { ($field_name,$table_name,$id_number)=split /$tmp_delimiter/, $key; if ($field_name eq "field_name") { $FIELD_NAMES{$table_name}{$id_number}=$CGI_INPUT{$key}; delete $CGI_INPUT{$key}; $num_of_fields++; } } return $num_of_fields; } sub get_fields_types { my ($line, @properties, @specifiers, $property_index, $specifier, $html_form_tag, $js_property, $appear, $option ); $line=; @properties=split /,/,$line; foreach $property_index (1 .. $#properties) { ($specifier,$html_form_tag,$js_property,$appear)=split /\*/,$properties[$property_index]; $internal_SPECIFIERS_ORDER{$specifier}=$property_index; $SPECIFIERS_PROPERTIES{$specifier}{'html'}=$html_form_tag; $SPECIFIERS_PROPERTIES{$specifier}{'js'}=$js_property; $SPECIFIERS_PROPERTIES{$specifier}{'appear'}=$appear; } while ($line=) { @specifiers=split /,/ , $line; foreach $specifier (keys %internal_SPECIFIERS_ORDER) { $FIELDS_TYPES{$specifiers[0]}{$specifier}=$specifiers[$internal_SPECIFIERS_ORDER{$specifier}]; } $option.=qq{ }; } return $option; } sub get_select_params { my ($num_of_fields, $select_param , $table_name , $action_name , $key ); $num_of_fields=0; my $tmp_delimiter=quotemeta($delimiter); foreach $key (keys %CGI_INPUT) { ($select_param,$action_name,$table_name)=split /$tmp_delimiter/, $key; if ($select_param eq "select_param") { if ($table_name) { $SELECT_PARAMS{$action_name}{$table_name}=$CGI_INPUT{$key}; } else { $SELECT_PARAMS{$action_name}{'all_checked'}=$CGI_INPUT{$key}; } delete $CGI_INPUT{$key}; $num_of_fields++; } } return $num_of_fields; } sub get_field_values { my ($num_of_value_fields, $field_value , $table_name , $id_number , $field_name , $key_field , $key ); $num_of_value_fields=0; my $tmp_delimiter=quotemeta($delimiter); foreach $key (keys %CGI_INPUT) { ($field_value,$id_number,$table_name,$field_name)=split /$tmp_delimiter/, $key; if ($field_value eq 'field_value') { if (exists $CHECKED_ITEMS{$table_name}) { foreach $key_field (keys %{$CHECKED_ITEMS{$table_name}}) { if (exists $CHECKED_ITEMS{$table_name}{$key_field}{$id_number}) { $FIELD_VALUES{$table_name}{$id_number}{$field_name}=$CGI_INPUT{$key}; delete $CGI_INPUT{$key}; $num_of_value_fields++; } } } } } return $num_of_value_fields; } sub sync_checked_items { my ($input_hash_ref1 , $input_hash_ref2 , $keys_equals , $index_input_keys1 , $index_input_keys2 , $lower_limit , $not_synced_end , $index_synced , $key , @input_keys1 , @input_keys2 , @synced_items , ); $input_hash_ref1=$_[0]; $input_hash_ref2=$_[1]; @input_keys1 =sort keys %{$input_hash_ref1}; @input_keys2 =sort keys %{$input_hash_ref2}; @synced_items =(); $lower_limit=0; $keys_equals=0; foreach $index_input_keys1 (0 .. $#input_keys1) { if ($keys_equals) {$lower_limit++; $keys_equals=0;} foreach $index_input_keys2 ($lower_limit .. $#input_keys2) { if ($input_keys1[$index_input_keys1] eq $input_keys2[$index_input_keys2]) { $synced_items[++$#synced_items]=$input_keys1[$index_input_keys1]; $keys_equals=1; last; } } } undef %NO_SYNC_INPUT_HASH1; undef %NO_SYNC_INPUT_HASH2; $index_synced=0; $not_synced_end=1; foreach $key (sort keys %{$input_hash_ref1}) { if ($not_synced_end) { if ($synced_items[$index_synced] ne $key) { $NO_SYNC_INPUT_HASH1{$key}=$key; delete ${$input_hash_ref1}{$key}; } else { if ($index_synced == $#synced_items) {$not_synced_end=0;} else {$index_synced++;} } } else { $NO_SYNC_INPUT_HASH1{$key}=$key; delete ${$input_hash_ref1}{$key}; } } $index_synced=0; $not_synced_end=1; foreach $key (sort keys %{$input_hash_ref2}) { if ($not_synced_end) { if ($synced_items[$index_synced] ne $key) { $NO_SYNC_INPUT_HASH2{$key}=1; delete ${$input_hash_ref2}{$key}; } else { if ($index_synced == $#synced_items) {$not_synced_end=0;} else {$index_synced++;} } } else { $NO_SYNC_INPUT_HASH2{$key}=1; delete ${$input_hash_ref2}{$key}; } } return %{$input_hash_ref1}+0,%{$input_hash_ref2}+0,%NO_SYNC_INPUT_HASH1+0,%NO_SYNC_INPUT_HASH2+0; } sub get_current_select_params { my ($table_name, $limit, $offset_value, $where_field, $where_value, $where_method, $and_field, $and_value, $and_method, $orderby_field, $orderby_method ); $table_name=$_[0]; if (exists $SELECT_PARAMS{'where'}{$table_name}) { $where_field=$SELECT_PARAMS{'where_field'}{$table_name}; $where_value=$dbh->quote($SELECT_PARAMS{'where_value'}{$table_name}); $where_method=$SELECT_PARAMS{'where_method'}{$table_name}; } if (exists $SELECT_PARAMS{'and'}{$table_name}) { $and_field=$SELECT_PARAMS{'and_field'}{$table_name}; $and_value=$dbh->quote($SELECT_PARAMS{'and_value'}{$table_name}); $and_method=$SELECT_PARAMS{'and_method'}{$table_name}; } if (exists $SELECT_PARAMS{'orderby'}{$table_name}) { $orderby_field=$SELECT_PARAMS{'orderby_field'}{$table_name}; $orderby_method=$SELECT_PARAMS{'orderby_method'}{$table_name}; } if (exists $SELECT_PARAMS{'limit'}{$table_name}) { $limit=$SELECT_PARAMS{'limit'}{$table_name}; } else { $limit=$SELECT_PARAMS{'limit'}{'all_checked'}; } if (exists $SELECT_PARAMS{'offset'}{$table_name}) { $offset_value=$SELECT_PARAMS{'offset_value'}{$table_name}; } elsif (exists $SELECT_PARAMS{'offset'}{'all_checked'}) { $offset_value=$SELECT_PARAMS{'offset_value'}{'all_checked'}; } return $limit,$offset_value,$where_field,$where_value,$where_method,$and_field,$and_value,$and_method,$orderby_field,$orderby_method; } #=============================================== # perform_action subroutines #=============================================== sub perform_action { my ($message,$error_message); if ($create_enabled and $flag_ok and $CGI_INPUT{createcheck}) { get_fields_types(); get_field_names(); if (create()) { $message=$ok_create; write_labeled_message($message); } else { $error_message="$err_error_word: $ko_create
    $err_details_word: $global_err"; write_labeled_message($error_message); } $flag_ok=0; } if ($insertrecord_enabled and $flag_ok and $CGI_INPUT{insertok}) { get_checked_tables(); get_checked_items(); get_field_values(); if (insert_records()) { $message=$ok_insert; write_labeled_message($message); } else { $error_message="$err_error_word: $ko_insert
    $err_details_word: $global_err"; write_labeled_message($error_message); } $flag_ok=0; } if ($updaterecord_enabled and $flag_ok and $CGI_INPUT{updateok}) { get_checked_tables(); get_checked_items(); get_field_values(); if (update_records()) { $message=$ok_update; write_labeled_message($message); } else { $error_message="$err_error_word: $ko_update
    $err_details_word: $global_err"; write_labeled_message($error_message); } $flag_ok=0; } if ($delete_enabled and $flag_ok and $CGI_INPUT{deleteok}) { get_checked_tables(); get_checked_items(); if (deleterec()) { $message=$ok_delete; write_labeled_message($message); } else { $error_message="$err_error_word: $ko_delete
    $err_details_word: $global_err"; write_labeled_message($error_message); } $flag_ok=0; } if ($drop_enabled and $flag_ok and $CGI_INPUT{dropok}) { get_checked_tables(); if (drop()) { $message=$ok_drop; write_labeled_message($message); } else { $error_message="$err_error_word: $ko_drop
    $err_details_word: $global_err"; write_labeled_message($error_message); } $flag_ok=0; } if ($erase_enabled and $flag_ok and $CGI_INPUT{eraseok}) { get_checked_tables(); if (erase()) { $message=$ok_erase; write_labeled_message($message); } else { $error_message="$err_error_word: $ko_erase
    $err_details_word: $global_err"; write_labeled_message($error_message); } $flag_ok=0; } if ($fquery_enabled and $flag_ok and $CGI_INPUT{fqueryok}) { #get_fquery(); if (perform_fquery()) { main_fquery(); } else { $error_message="$err_error_word: $ko_fquery
    $err_details_word: $global_err"; write_labeled_message($error_message); } $flag_ok=0; } print qq{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } print qq{
    }; if (!$empty_db) { if ((( ($drop_enabled or $erase_enabled or $describe_enabled or $showindex_enabled or ($javascript_enabled and $new_enabled) or ($javascript_enabled and $select_enabled) or ($javascript_enabled and $prepare_enabled))) or ($new_enabled or ($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields}) ) and ($edititem_enabled or $delete_enabled) ) or ($flag_ok and ($edititem_enabled and $CGI_INPUT{edititem} and $updaterecord_enabled)) or ($flag_ok and ($new_enabled and $CGI_INPUT{new} and $insertrecord_enabled)) ) or ($select_enabled or ($selectfields_enabled and $CGI_INPUT{selectfields}) or $prepare_enabled) ) and (!$CGI_INPUT{create})) { print q{ }; } elsif ($CGI_INPUT{create} and $prepare_create_enabled) { put_create_related_buttons(); } } else { put_database_related_buttons(); if ($create_enabled) { put_create_button(); } if ($fquery_enabled) { put_fquery(); } } print q{
    }; my $current_table_number=1; if (!$custom_configuration) { $relevant_js_obj=8; } else { $relevant_js_obj=3; } if (!($prepare_create_enabled and $CGI_INPUT{create})) { if (!list_tables()) { $empty_db=1; print q{ }; } } else { main_create(); } foreach my $current_table (@tables_names) { print qq{ }; $javascript_objects[$current_table_number]->{'object_number'}=$relevant_js_obj; $javascript_objects[$current_table_number]->{'dim_array_obj_num'}=0; $relevant_js_obj++; if ($describe_enabled and $flag_ok and $CGI_INPUT{describe}) { if (exists $CHECKED_TABLES{$current_table}) { main_describe($current_table,'describe'); } } if ($showindex_enabled and $flag_ok and $CGI_INPUT{showindex}) { if (exists $CHECKED_TABLES{$current_table}) { main_describe($current_table,'show index from'); } } if ($select_enabled and $flag_ok and $CGI_INPUT{select}) { if (exists $CHECKED_TABLES{$current_table}) { main_select($current_table,$current_table_number); } } if ($prepare_enabled and $flag_ok and $CGI_INPUT{prepare}) { if (exists $CHECKED_TABLES{$current_table}) { main_prepare($current_table,$current_table_number); } } if ($new_enabled and $flag_ok and $CGI_INPUT{new}) { if (exists $CHECKED_TABLES{$current_table}) { main_new($current_table,$current_table_number); } } if ($selectfields_enabled and $flag_ok and $CGI_INPUT{selectfields}) { if (exists $CHECKED_TABLES{$current_table}) { main_selectfields($current_table,$current_table_number); } } if ($edititem_enabled and $flag_ok and $CGI_INPUT{edititem}) { if (exists $CHECKED_TABLES{$current_table}) { main_edititem($current_table,$current_table_number); } } $current_table_number++; } print q{
    }; write_labeled_message("$err_db_empty"); print q{
    $current_table_number }; if ($drop_enabled or $erase_enabled or $describe_enabled or $showindex_enabled or $new_enabled or $select_enabled or $prepare_enabled) { my $tmp_name='checked_table'.$delimiter.$current_table; if ($flag_ok and exists $CHECKED_TABLES{$current_table}) { print qq{ }; } else { print qq{ }; } } print qq{ $current_table
    }; put_buttons(); print q{
    }; if (!$empty_db and $javascript_enabled and !$CGI_INPUT{create}) {put_javascript();} if ($CGI_INPUT{create} and $prepare_create_enabled and $javascript_enabled) {put_javascript_for_create();} $dbh->disconnect; } sub put_create_button { print qq{ $operation_on_tables
      $number_of_fields  
    }; } sub put_fquery { print qq{ $fquery
    }; print qq{ }; print q{
    }; } sub prompt_db_choice { my $db_position; print qq{
    }; foreach $db_position (sort numerically keys %DATABASES) { print qq{ }; } write_labeled_message("$err_no_dbs") if (! scalar %DATABASES); if ($login_prompt or !$custom_configuration) { print q{ }; } print q{
    }; if (!$custom_configuration) { print qq{ }; } else { print qq{ }; } print qq{  $DATABASES{$db_position}{'db_description'}
    }; put_user_related_buttons(); print q{
    }; } sub prompt_user_login { my $state=$_[0]; print qq{
    }; if ($state eq 'failed') { print qq{ }; } print qq{ }; print q{
    $user_login_fail_prompt
    $user_id
    $user_pwd
    }; } sub prompt_server_login { my $state=$_[0]; print qq{
    }; if ($state eq 'failed') { print qq{ }; } print qq{ }; if ($login_prompt) { print q{ }; } print q{
    $server_login_fail_prompt
    $server_login_host $server_login_port
         
    $server_login_user
    $server_login_pwd
    }; put_user_related_buttons(); print q{
    }; } sub put_user_related_buttons { if ($login_prompt or !$custom_configuration) { print q{ }; if ($login_prompt) { print qq{ $operation_on_user }; } if (!$custom_configuration && !$server_state) { if (!$login_prompt) { print q{ }; } } if ($login_prompt) { print q{
    $current_user_msg $current_user $button_user_logout }; } if ($CGI_INPUT{'server_login'}) { print qq{ }; } print qq{ }; if ($CGI_INPUT{'server_login'}) { print q{ }; } if (!$login_prompt) { print q{
    }; print qq{ }; print q{
    }; } print q{ }; } } sub put_database_related_buttons { if ($database_prompt or $refresh_enabled or $db_backup_enabled or $db_csv_exp_enabled) { print qq{ $operation_on_dbs
    }; if ($database_prompt && $custom_configuration) { print qq{ }; } elsif ($database_prompt && !$custom_configuration) { print qq{ }; } if ($refresh_enabled) { print qq{ }; } if ($db_backup_enabled) { print qq{ }; } if ($db_csv_exp_enabled) { print qq{ }; } print q{
    }; } } sub put_create_related_buttons { put_user_related_buttons(); put_database_related_buttons(); if ($create_enabled) { print qq{ $operation_on_tables
    }; print qq{ }; } else { print q{>}; } if ($prepare_create_enabled) { print q{
    }; print qq{   $number_of_fields  }; } print q{
    }; } if ($javascript_enabled) { print qq{ $operation_on_fields
     
    }; } if ($fquery_enabled) { put_fquery(); } } sub put_buttons { my ( $tmp_name1, $tmp_name2, $tmp_name3 ); my $br_for_new_enabled=0; print qq{ }; put_user_related_buttons(); put_database_related_buttons(); if ($drop_enabled or $erase_enabled or $describe_enabled or $showindex_enabled or $table_backup_enabled or $table_csv_exp_enabled or $prepare_create_enabled or ($javascript_enabled and $new_enabled) or ($javascript_enabled and $select_enabled) or ($javascript_enabled and $prepare_enabled)) { print qq{ }; } if ($new_enabled or ($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields})) and ($edititem_enabled or $delete_enabled)) or ($flag_ok and ($edititem_enabled and $CGI_INPUT{edititem} and $updaterecord_enabled)) or ($flag_ok and ($new_enabled and $CGI_INPUT{new} and $insertrecord_enabled))) { print qq{ }; } if ($select_enabled or ($selectfields_enabled and $CGI_INPUT{selectfields}) or $prepare_enabled) { print qq{ }; } if ($fquery_enabled) { put_fquery(); } print q{
    $operation_on_tables
    }; if ($drop_enabled) { print qq{ }; } else { print q{>}; } } if ($erase_enabled) { print qq{ }; } else { print q{>}; } } if ($describe_enabled) { print qq{ }; } else { print q{>}; } } if ($showindex_enabled) { print qq{ }; } else { print q{>}; } } if ($table_backup_enabled) { if ($drop_enabled or $erase_enabled or $describe_enabled or $showindex_enabled) { print q{
    }; } print qq{ }; } else { print q{>}; } } if ($table_csv_exp_enabled) { if ($drop_enabled or $erase_enabled or $describe_enabled or $showindex_enabled) { print q{
    }; } print qq{ }; } else { print q{>}; } } if ($prepare_create_enabled) { if ($drop_enabled or $erase_enabled or $describe_enabled or $showindex_enabled) { print q{
    }; } print qq{   $number_of_fields  }; } if (!$empty_db and $javascript_enabled) { if ($drop_enabled or $erase_enabled or $describe_enabled or $showindex_enabled) { print qq{
    }; } print qq{

    }; } print q{
    $operation_on_records
    }; if ($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields}))) { if ($edititem_enabled) { $br_for_new_enabled=1; print qq{ }; } else { print q{>}; } } if ($delete_enabled) { $br_for_new_enabled=1; print qq{ }; } else { print q{>}; } } } if ($flag_ok and ($edititem_enabled and $CGI_INPUT{edititem} and $updaterecord_enabled)) { $br_for_new_enabled=1; print qq{ }; } else { print q{>}; } } if ($flag_ok and ($new_enabled and $CGI_INPUT{new} and $insertrecord_enabled)) { $br_for_new_enabled=1; print qq{ }; } else { print q{>}; } } if ($new_enabled) { if ($br_for_new_enabled) { print q{
    }; } print qq{ }; } else { print q{>}; } print qq{ }; } print q{
    $operations_on_query }; } elsif ($select_enabled) { print q{ }; $tmp_name1='select_param'.$delimiter.'limit'.$delimiter; $tmp_name2='select_param'.$delimiter.'offset'.$delimiter; $tmp_name3='select_param'.$delimiter.'offset_value'.$delimiter; print qq{   $query_limit  $query_offset }; } } print q{
    }; if ($prepare_enabled) { print qq{ }; } else { print q{>}; } print q{
    }; } if ($select_enabled) { if ($selectfields_enabled and ($prepare_enabled and $CGI_INPUT{prepare})) { print qq{ }; } else { print q{>}; } } else { print qq{ }; } else { print q{>}; } } } if ($flag_ok and $selectfields_enabled and ($prepare_enabled and $CGI_INPUT{prepare})) { print qq{
    }; } else { print q{>}; } } if ($select_enabled or $selectfields_enabled) { if ($flag_ok and ($prepare_enabled and $CGI_INPUT{prepare}) and $selectfields_enabled) { print q{
    }; foreach my $table_name (sort keys %PREPARE_NAMES) { print qq{ }; $tmp_name1='select_param'.$delimiter.'where'.$delimiter.$table_name; print qq{ }; $tmp_name1='select_param'.$delimiter.'where_method'.$delimiter.$table_name; $tmp_name2='select_param'.$delimiter.'where_value'.$delimiter.$table_name; print qq{ }; print qq{ }; $tmp_name1='select_param'.$delimiter.'and'.$delimiter.$table_name; print qq{ }; $tmp_name1='select_param'.$delimiter.'and_method'.$delimiter.$table_name; $tmp_name2='select_param'.$delimiter.'and_value'.$delimiter.$table_name; print qq{ }; $tmp_name1='select_param'.$delimiter.'orderby'.$delimiter.$table_name; $tmp_name2='select_param'.$delimiter.'orderby_field'.$delimiter.$table_name; $tmp_name3='select_param'.$delimiter.'orderby_method'.$delimiter.$table_name; print qq{ }; $tmp_name1='select_param'.$delimiter.'limit'.$delimiter.$table_name; $tmp_name2='select_param'.$delimiter.'offset'.$delimiter.$table_name; $tmp_name3='select_param'.$delimiter.'offset_value'.$delimiter.$table_name; print qq{ }; } print q{
    $query_from $table_name  $query_where }; $tmp_name1='select_param'.$delimiter.'where_field'.$delimiter.$table_name; print qq{
       $query_and }; $tmp_name1='select_param'.$delimiter.'and_field'.$delimiter.$table_name; print qq{
       $query_order_by
       $query_limit  $query_offset
    }; } sub main_create { my ($new_fields,$fields_types,$specifier,$check_name,$check_value,$message,$specifier_bgcolor); $check_name='table_name'; my $create_table_name_colspan=keys(%SPECIFIERS_ORDER)+1; print qq{ $SPECIFIERS_MESSAGES{'table_name'}   }; foreach $specifier (sort { $SPECIFIERS_ORDER{$a} <=> $SPECIFIERS_ORDER{$b} } keys %SPECIFIERS_ORDER) { $message=$SPECIFIERS_MESSAGES{$specifier}; if ($specifier eq 'primary_key') { $specifier_bgcolor=$pri_key_color; } else { $specifier_bgcolor=$field_color; } print qq{ $message }; } print q{ }; $fields_types=get_fields_types(); foreach my $new_field (1 .. $CGI_INPUT{new_fields}) { $check_name='field_name'.$delimiter.'checked_item'.$delimiter.$new_field; $check_value=''; print qq{ $new_field }; foreach $specifier (sort { $SPECIFIERS_ORDER{$a} <=> $SPECIFIERS_ORDER{$b} } keys %SPECIFIERS_ORDER) { if ($specifier eq 'field_name') { $check_name='field_name'.$delimiter.'field_name'.$delimiter.$new_field; print qq{ }; } elsif ($specifier eq 'field_type') { $check_name='field_name'.$delimiter.'field_type'.$delimiter.$new_field; print qq{ }; } else { if (($specifier eq 'auto_increment')) { $check_name='field_name'.$delimiter.$specifier.$delimiter.'0'; $check_value=$new_field; } else { $check_name='field_name'.$delimiter.$specifier.$delimiter.$new_field; $check_value=1; } print qq{ }; if ($SPECIFIERS_PROPERTIES{$specifier}{'html'} eq 'text') { print qq{ }; } else { print qq{ }; } print q{ }; } } print q{ }; } } sub main_prepare { my $current_table=$_[0]; my $current_table_number=$_[1]; my $current_bgcolor; print q{   }; get_pri_key($current_table); my $pri_key; foreach (@ARRAY_pri_keys) { $pri_key.=$_.$pri_key_delimiter } substr($pri_key,-length($pri_key_delimiter))=''; prepare($current_table); my $num=0; foreach my $elem (0..$#{$descarray}) { if (exists $HASH_pri_keys{${$descarray}[$elem]}) {$current_bgcolor=$pri_key_color;} else {$current_bgcolor=$field_color;} my $item_name='checked_item'.$delimiter.$current_table.$delimiter.$pri_key.$delimiter.$num; my $item_value=${$descarray}[$elem]; my $field_name='field_name'.$delimiter.$current_table.$delimiter.$num; my $field_value=${$descarray}[$elem]; if ($selectfields_enabled) { print qq{ }; $javascript_objects[$current_table_number]->{'array_obj_num'}[++$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}]=$relevant_js_obj+1; $num++; if ($selectfields_enabled) { $relevant_js_obj+=2; } } $javascript_objects[$current_table_number]->{'dim_array_obj_num'}=$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}+1; print q{ }; print q{
    }; } else { print qq{ }; } print ${$descarray}[$elem]; print q{
    }; } sub main_new { my $current_table=$_[0]; my $current_table_number=$_[1]; my $current_bgcolor; my $elem; my %hash_type; print q{   }; get_pri_key($current_table); prepare($current_table); describe($current_table,'describe'); foreach my $delem (@{$elem_describe}) { my $f_type=$delem->[1]; my $n_col=$delem->[0]; $hash_type{$n_col}=$f_type; } foreach $elem (0 .. $#{$descarray}) { if (exists $HASH_pri_keys{${$descarray}[$elem]}) {$current_bgcolor=$pri_key_color;} else {$current_bgcolor=$field_color;} my $field_name='field_name'.$delimiter.$current_table.$delimiter.$elem; my $field_value=${$descarray}[$elem]; print qq{ }; } $relevant_js_obj+=@{$descarray}; my $num=0; print q{ }; foreach my $new_elem (1 .. $CGI_INPUT{new_elem}) { print qq{ }; $javascript_objects[$current_table_number]->{'array_obj_num'}[++$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}]=$relevant_js_obj; foreach my $elem (@{$descarray}) { print qq{ }; } if ($flag_ok and ($new_enabled and $CGI_INPUT{new} and $insertrecord_enabled)) { $relevant_js_obj+=@{$descarray}+1; } else { $relevant_js_obj+=@{$descarray}; } $num++; print q{ }; } if ($javascript_enabled) { if ($flag_ok and ($new_enabled and $CGI_INPUT{new} and $insertrecord_enabled and $CGI_INPUT{new_elem})) { $num=$#{$descarray}+2; print qq{ }; $relevant_js_obj+=2; } } print q{
      }; if (${$descarray}[$elem] ne '') { print ${$descarray}[$elem]; } else { print q{   }; } print q{
    }; print $new_elem; my $pri_key; foreach (@ARRAY_pri_keys) { $pri_key.=$_.$pri_key_delimiter } substr($pri_key,-length($pri_key_delimiter))=''; my $check_name='checked_item'.$delimiter.$current_table.$delimiter.$pri_key.$delimiter.$num; my $check_value=${$descarray}[$elem]; if ($flag_ok and ($new_enabled and $CGI_INPUT{new} and $insertrecord_enabled)) { print qq{ }; } print q{ }; my $name='field_value'.$delimiter.$num.$delimiter.$current_table.$delimiter.$elem; if ($new_textarea_enabled) { print qq{\n}; } else { if ($new_textarea_auto) { if ((substr($hash_type{$elem},-4,4) eq 'text') or (substr($hash_type{$elem},-4,4) eq 'blob')) { print qq{\n}; } else { print qq{ }; } } else { print qq{ }; } } print q{
     
    }; $javascript_objects[$current_table_number]->{'dim_array_obj_num'}=$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}+1; } sub main_selectfields { my $current_table=$_[0]; my $current_table_number=$_[1]; my $num=0; my $items_string; my $current_bgcolor; my $name; my $value; print q{   }; my $pri_key_string=get_pri_key($current_table); foreach (@ARRAY_pri_keys) { $items_string.=$_.',' } foreach my $relevant_name (keys %{$CHECKED_ITEMS{$current_table}}) { foreach my $number (sort numerically keys %{$CHECKED_ITEMS{$current_table}{$relevant_name}}) { $items_string.=$CHECKED_ITEMS{$current_table}{$relevant_name}{$number}.','; } } chop($items_string); my $select_string='select '.$items_string.' from '.$current_table; my ($limit,$offset_value,$where_field,$where_value,$where_method,$and_field,$and_value,$and_method,$orderby_field,$orderby_method)=get_current_select_params($current_table); if ($where_field) { if ($and_field) { $select_string.=' where ('.$where_field.' '.$where_method.' '.$where_value.' and '.$and_field.' '.$and_method.' '.$and_value.')'; } else { $select_string.=' where ('.$where_field.' '.$where_method.' '.$where_value.')'; } } if ($orderby_field) { $select_string.=' order by '.$orderby_field.' '.$orderby_method; } if ($offset_value) { $select_string.=' limit '.$offset_value.','.$limit; } else { $select_string.=' limit '.$limit; } qselect($select_string); foreach my $elem ($#ARRAY_pri_keys+1..$#{$descarray}) { if (exists $HASH_pri_keys{${$descarray}[$elem]}) {$current_bgcolor=$pri_key_color;} else {$current_bgcolor=$field_color;} $name='field_name'.$delimiter.$current_table.$delimiter.$num; $value=${$descarray}[$elem]; print qq{ }; $num++; } print q{ }; $relevant_js_obj+=$#{$descarray}-$#ARRAY_pri_keys; $num=0; my $countrows=1; foreach my $elem (@{$elem_select}) { $name='checked_item'.$delimiter.$current_table.$delimiter.$pri_key_string.$delimiter.$num; my $pri_key; foreach (@ARRAY_pri_keys) { $pri_key.=${$elem}[$HASH_pri_keys{$_}].$pri_key_delimiter } substr($pri_key,-length($pri_key_delimiter))=''; $value=$pri_key; print qq{ }; $countrows++; foreach my $row_elem_index ($#ARRAY_pri_keys+1..$#{$elem}) { print qq{ }; } print q{ }; $javascript_objects[$current_table_number]->{'array_obj_num'}[++$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}]=$relevant_js_obj; $num++; if (($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields})) and ($edititem_enabled or $delete_enabled))) { $relevant_js_obj++; } } if ($#{$elem_select} == -1) { $num=$#{$descarray}; print qq{ }; } elsif ($javascript_enabled) { if (($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields})) and ($edititem_enabled or $delete_enabled))) { $num=$#{$descarray}+1; print qq{ }; $relevant_js_obj+=2; } } $javascript_objects[$current_table_number]->{'dim_array_obj_num'}=$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}+1; print q{
      ${$descarray}[$elem]
    }; print $countrows; if (($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields})) and ($edititem_enabled or $delete_enabled))) { print qq{ }; } print q{ }; if (${$elem}[$row_elem_index] ne '') { ${$elem}[$row_elem_index]=html2txt(${$elem}[$row_elem_index],'br'); print ${$elem}[$row_elem_index]; } else { print q{   }; } print q{
      $err_not_present
     
    }; } sub main_fquery { my $current_table=$_[0]; my $command=$_[1]; my $current_bgcolor; write_labeled_message($ok_fquery); if (!@{$elem_describe}) { write_labeled_message($fquery_no_output); return; } print qq{
    }; foreach my $elem (@{$descarray_describe}) { if (exists $HASH_pri_keys{$elem}) {$current_bgcolor=$pri_key_color;} else {$current_bgcolor=$field_color;} print qq{ }; } print q{ }; foreach my $elem (@{$elem_describe}) { print q{ }; foreach my $row_elem (@{$elem}) { print qq{ }; } print q{ }; } print q{
    $elem
    }; if ($row_elem ne '') { print qq{ }; print html2txt($row_elem); } elsif (!defined $row_elem) { print qq{ NULL }; } else { print qq{   }; } print q{
    }; } sub main_describe { my $current_table=$_[0]; my $command=$_[1]; my $current_bgcolor; get_pri_key($current_table); describe($current_table,$command); print q{   }; foreach my $elem (@{$descarray_describe}) { if (exists $HASH_pri_keys{$elem}) {$current_bgcolor=$pri_key_color;} else {$current_bgcolor=$field_color;} print qq{ }; } print q{ }; foreach my $elem (@{$elem_describe}) { print q{ }; foreach my $row_elem (@{$elem}) { print qq{ }; } print q{ }; } print q{
    $elem
    }; if ($row_elem ne '') { print qq{ $row_elem }; } elsif (!defined $row_elem) { print qq{ NULL }; } else { print qq{   }; } print q{
    }; } sub main_edititem { my $current_table=$_[0]; my $current_table_number=$_[1]; my $num=0; my $items_string=''; my $colspan_no_prikey=0; my $current_bgcolor; my $value; my $name; my $elem; my %hash_type; print q{   }; my $pri_key_string=get_pri_key($current_table); describe($current_table,'describe'); foreach my $delem (@{$elem_describe}) { my $f_type=$delem->[1]; my $n_col=$delem->[0]; $hash_type{$n_col}=$f_type; } foreach (@ARRAY_pri_keys) { $items_string.=$_.',' } foreach my $id_num (sort numerically keys %{$FIELD_NAMES{$current_table}}) { if (exists $HASH_pri_keys{$FIELD_NAMES{$current_table}{$id_num}}) {$current_bgcolor=$pri_key_color;} else {$current_bgcolor=$field_color;} my $field_name='field_name'.$delimiter.$current_table.$delimiter.$num; my $field_value=${$descarray}[$num]; print qq{ }; $num++; } $colspan_no_prikey=$num; chop($items_string); $relevant_js_obj+=$num; $num=0; my $countrows=1; foreach my $number (sort numerically keys %{$CHECKED_ITEMS{$current_table}{$pri_key_string}}) { if (!$pri_key_string) { print qq{ }; last; } my $where_string_pri_keys; my $tmp_pri_key_delimiter=quotemeta($pri_key_delimiter); my @pri_keys=split /$tmp_pri_key_delimiter/,$pri_key_string; my $pri_key=$CHECKED_ITEMS{$current_table}{$pri_key_string}{$number}; my @pri_keys_values=split /$tmp_pri_key_delimiter/,$pri_key; foreach (0..$#pri_keys) { my $quoted_value=$pri_keys_values[$_]; if ($quoted_value eq '') { $quoted_value="''"; } else { $quoted_value=$dbh->quote($quoted_value); } $where_string_pri_keys.="($pri_keys[$_] = $quoted_value) and "; } substr($where_string_pri_keys,-5)=''; my $select_string='select '.$items_string.' from '.$current_table." where ($where_string_pri_keys)"; if ($where_string_pri_keys) {qselect($select_string);} $elem=${$elem_select}[0]; $name='checked_item'.$delimiter.$current_table.$delimiter.$pri_key_string.$delimiter.$num; print qq{ }; $countrows++; foreach my $row_elem_index ($#ARRAY_pri_keys+1 .. $#{$elem}) { print qq{ }; } print q{ }; $javascript_objects[$current_table_number]->{'array_obj_num'}[++$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}]=$relevant_js_obj; $num++; if ($flag_ok and ($edititem_enabled and $CGI_INPUT{edititem} and $updaterecord_enabled)) { $relevant_js_obj=$relevant_js_obj+$#{$elem}-$#ARRAY_pri_keys+1; } else { $relevant_js_obj=$relevant_js_obj+$#{$elem}-$#ARRAY_pri_keys; } } if ($javascript_enabled) { if ($flag_ok and ($edititem_enabled and $CGI_INPUT{edititem} and $updaterecord_enabled) and $pri_key_string) { $num=$#{$elem}-$#ARRAY_pri_keys+1; print qq{ }; $relevant_js_obj+=2; } } $javascript_objects[$current_table_number]->{'dim_array_obj_num'}=$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}+1; print q{
      }; $items_string.=$FIELD_NAMES{$current_table}{$id_num}.','; print $FIELD_NAMES{$current_table}{$id_num}; print q{
      $err_no_prikey
    }; print $countrows; if ($flag_ok and ($edititem_enabled and $CGI_INPUT{edititem} and $updaterecord_enabled) and $pri_key_string) { print qq{ }; } print q{ }; my $fname=${$descarray}[$row_elem_index]; $name='field_value'.$delimiter.$num.$delimiter.$current_table.$delimiter.$fname; $value=${$elem}[$row_elem_index]; $value=html2txt($value,'nobr'); $value=~s/\r//g; if ($edit_textarea_auto) { if ((substr($hash_type{$fname},-4,4) eq 'text') or (substr($hash_type{$fname},-4,4) eq 'blob')) { print qq{\n}; } else { if ($edit_textarea_enabled and (length($value) >= $max_length4text)) { print qq{\n}; } else { print qq{ }; } } } else { if ($edit_textarea_enabled and (length($value) >= $max_length4text)) { print qq{\n}; } else { print qq{ }; } } print q{
     
    }; } sub main_select { my $current_table=$_[0]; my $current_table_number=$_[1]; my $num=0; my $current_bgcolor; my $name; my $value; my $field; print q{   }; my $pri_key_string=get_pri_key($current_table); foreach my $elem (@{$descarray}) { if (exists $HASH_pri_keys{$elem}) {$current_bgcolor=$pri_key_color;} else {$current_bgcolor=$field_color;} $name='field_name'.$delimiter.$current_table.$delimiter.$num; $value=$elem; print qq{ }; $num++; } print q{}; $relevant_js_obj+=($#{$descarray}+1); $num=0; my $select_string='select * from '.$current_table; my ($limit,$offset_value,$where_field,$where_value,$where_method,$and_field,$and_value,$and_method,$orderby_field,$orderby_method)=get_current_select_params($current_table); if ($where_field) { if ($and_field) { $select_string.=' where ('.$where_field.' '.$where_method.' '.$where_value.' and '.$and_field.' '.$and_method.' '.$and_value.')'; } else { $select_string.=' where ('.$where_field.' '.$where_method.' '.$where_value.')'; } } if ($orderby_field) { $select_string.=' order by '.$orderby_field.' '.$orderby_method; } if ($offset_value) { $select_string.=' limit '.$offset_value.','.$limit; } else { $select_string.=' limit '.$limit; } qselect($select_string); my $countrows=1; foreach my $elem (@{$elem_select}) { $selected_rows++; if ($selected_rows > $max_selected_rows) {last;} $name='checked_item'.$delimiter.$current_table.$delimiter.$pri_key_string.$delimiter.$num; my $pri_key; foreach (@ARRAY_pri_keys) { $pri_key.=${$elem}[$HASH_pri_keys{$_}].$pri_key_delimiter } substr($pri_key,-length($pri_key_delimiter))=''; $value=$pri_key; print qq{ }; $countrows++; foreach my $row_elem (@{$elem}) { print qq{ }; } print q{ }; $javascript_objects[$current_table_number]->{'array_obj_num'}[++$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}]=$relevant_js_obj; $num++; if (($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields})) and ($edititem_enabled or $delete_enabled))) { $relevant_js_obj++; } } if ($#{$elem_select} == -1) { $num=$#{$descarray}+1; print qq{ }; } elsif ($javascript_enabled) { if (($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields})) and ($edititem_enabled or $delete_enabled))) { $num=$#{$descarray}+2; print qq{ }; $relevant_js_obj+=2; } } $javascript_objects[$current_table_number]->{'dim_array_obj_num'}=$#{$javascript_objects[$current_table_number]->{'array_obj_num'}}+1; print q{
      $elem
    }; print $countrows; if (($flag_ok and (($select_enabled and $CGI_INPUT{select}) or ($selectfields_enabled and $CGI_INPUT{selectfields})) and ($edititem_enabled or $delete_enabled))) { print qq{ }; } print q{ }; if ($row_elem ne '') { print qq{ }; $row_elem=html2txt($row_elem,'br'); print $row_elem; } elsif (!defined $row_elem) { print qq{ NULL }; } else { print qq{   }; } print q{
      $err_not_present
     
    }; } sub put_javascript_for_create { my ($first_field,$type,$specifier,$message,$message_required_specifier,$maxspecifiers,$character); if (!$custom_configuration) { $first_field=9; } else { $first_field=4; } $maxspecifiers=(keys %SPECIFIERS_ORDER)+0; print qq[ ]; } sub put_javascript { print qq[ ]; } #================================================================================ # CODE SECTION END #================================================================================ #================================================================================ # CREATE TABLE TYPES & SPECIFIERS CONFIGURATION SECTION #=============================================================================== # specifiers line (1st line): # # specifier*HTML form tag*javascript property*appear (0 means NO, 1 means YES) +order (if required in a pair of specifiers) # # 'appear' means that the specifier has to appear in the create table syntax # # # fields types lines: # # type,length,decimals,unsigned,zerofill,binary,not_null,default,auto_increment,index,unique,primary_key # # 0 = optional 1 = required -1 = not allowed +specifier (if required in a pair of specifiers) __END__ type,length*text*value*0+1,decimals*text*value*0+2,unsigned*checkbox*checked*1,zerofill*checkbox*checked*1,binary*checkbox*checked*1,not_null*checkbox*checked*1,default*text*value*1,auto_increment*radio*checked*1,fulltext*checkbox*checked*1,index*text*value*1,unique*text*value*1,primary_key*checkbox*checked*1 TINYINT,0,-1,0,0,-1,0,0,0,-1,0,0,0 SMALLINT,0,-1,0,0,-1,0,0,0,-1,0,0,0 MEDIUMINT,0,-1,0,0,-1,0,0,0,-1,0,0,0 INT,0,-1,0,0,-1,0,0,0,-1,0,0,0 INTEGER,0,-1,0,0,-1,0,0,0,-1,0,0,0 BIGINT,0,-1,0,0,-1,0,0,0,-1,0,0,0 REAL,0+decimals,0+length,0,0,-1,0,0,-1,-1,0,0,0 DOUBLE,0+decimals,0+length,0,0,-1,0,0,-1,-1,0,0,0 FLOAT,0+decimals,0+length,0,0,-1,0,0,-1,-1,0,0,0 DECIMAL,1+decimals,1+length,0,0,-1,0,0,-1,-1,0,0,0 NUMERIC,1+decimals,1+length,0,0,-1,0,0,-1,-1,0,0,0 CHAR,1,-1,-1,-1,0,0,0,-1,-1,0,0,0 VARCHAR,1,-1,-1,-1,0,0,0,-1,0,0,0,0 DATE,-1,-1,-1,-1,-1,0,0,-1,-1,0,0,0 TIME,-1,-1,-1,-1,-1,0,0,-1,-1,0,0,0 YEAR,-1,-1,-1,-1,-1,0,0,-1,-1,0,0,0 TIMESTAMP,0,-1,-1,-1,-1,0,0,-1,-1,0,0,0 DATETIME,-1,-1,-1,-1,-1,0,0,-1,-1,0,0,0 TINYBLOB,-1,-1,-1,-1,-1,0,-1,-1,-1,0,-1,-1 BLOB,-1,-1,-1,-1,-1,0,-1,-1,-1,0,-1,-1 MEDIUMBLOB,-1,-1,-1,-1,-1,0,-1,-1,-1,0,-1,-1 LONGBLOB,-1,-1,-1,-1,-1,0,-1,-1,-1,0,-1,-1 TINYTEXT,-1,-1,-1,-1,-1,0,-1,-1,0,0,-1,-1 TEXT,-1,-1,-1,-1,-1,0,-1,-1,0,0,-1,-1 MEDIUMTEXT,-1,-1,-1,-1,-1,0,-1,-1,0,0,-1,-1 LONGTEXT,-1,-1,-1,-1,-1,0,-1,-1,0,0,-1,-1 ENUM,1,-1,-1,-1,-1,0,0,-1,-1,0,0,-1 SET,1,-1,-1,-1,-1,0,0,-1,-1,0,0,-1