#!/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{