home *** CD-ROM | disk | FTP | other *** search
/ Chip 2003 July / CMCD0703.ISO / Linux / mdm.tar.gz / mdm.tar / mdm.cgi < prev   
Text File  |  2003-06-10  |  367KB  |  10,430 lines

  1. #!/usr/bin/perl
  2. #!C:/Perl/bin/perl.exe
  3.  
  4. ######################################################################################
  5. # LICENSE No: #???????
  6. ######################################################################################
  7. #
  8. #
  9. #MySQL(TM) Data Manager v1.70
  10. #
  11. #Copyright ⌐ 2003 Ioannis Livassov
  12. #
  13. #Licence agreement and limited warranty
  14. #
  15. #MySQL Data Manager (Software) is protected by Copyright Law and
  16. #International Treaty.
  17. #
  18. #You should carefully read the terms and conditions of this agreement
  19. #before purchasing and installing the Software.  
  20. #
  21. #If you do not agree to any of the terms of this License, then do not
  22. #purchase, install, or use this Software.  
  23. #
  24. #One purchased copy of the Software may be only used or installed on
  25. #a single computer used by many people. This is not a concurrent use
  26. #license. If you need another copy of the Software to be installed
  27. #you must purchase another license.
  28. #
  29. #You may access this program through a network by a number of remote
  30. #computers.  
  31. #
  32. #This Software is distributed as it is and with no warranties of any
  33. #kind, whether expressed or implied. Experience dictates that any
  34. #program be thoroughly tested with non-critical data before relying on
  35. #it.  The user must assume the risk of using the program.  This
  36. #disclaimer of warranty constitutes an essential part of this License
  37. #Statement. 
  38. #
  39. #Any liability of the distributor will be limited exclusively to
  40. #refund of purchase price.  In no event shall the distributor, or its
  41. #officers, employees, affiliates, contractors, subsidiaries, or parent
  42. #organizations, be liable for any incidental, consequential, or punitive
  43. #damages whatsoever relating to the use of this Software.
  44. #
  45. #This Agreement is the complete statement of the Agreement between the
  46. #parties on the subject matter, and merges and supersedes all other or
  47. #prior understandings, purchase orders, agreements and arrangements.
  48. #
  49. #You may not sell, rent, lease or redistribute the Software in any form
  50. #without prior written consent. You may create derivative works using its
  51. #code partially providing an appropriate references, assuming the purpose
  52. #of the resulting product will be completely different from that of initial
  53. #program. You may of course modify or improve a reasonably small part of
  54. #the code of this Software in order to fit better to your needs provided
  55. #the Software logo,  its look and feel and the text of this license
  56. #agreement  remain intact.
  57. #
  58. #
  59. #MySQL is a trademark of TcX DataKonsultAB
  60. #
  61. ######################################################################################
  62.  
  63. use strict;
  64. use CGI::Carp qw(fatalsToBrowser carpout);
  65. use File::Copy();
  66. use CGI();
  67. use DBI();
  68. use vars qw($q $host $full_url $WIN32 $delim);
  69.  
  70. my $VERSION = '1.70';
  71.  
  72. $q = new CGI;
  73.  
  74.  
  75. $host            = $ENV{HTTP_HOST};
  76. $full_url         = $q->url();
  77. $WIN32             = 1 if ($^O =~ /win32/i);
  78. $delim            = $WIN32 ? "\\" : '/';
  79. my ($dbh_, $HOME,$SelectRows,$UpdateRows,$DEFAULTHOST,$SOCKET,$MYSQL,$configFile, $HELP,
  80.     $OTHER_MYSQL,$USER_DIR,$MAX_BACKUP_SIZE,$MAX_SCRIPT_SIZE, $MAX_ASCII_SIZE, $CONTACT_EMAIL,
  81.     $COMPRESS,$ALLOW_ZIP,$ALLOW_GZIP,$ZIP,$ZIPLOG,$ERRLOG,$ERROR_LOG, $PRINT_POP_UP,
  82.     $BGCOLOR1,$BGCOLOR2,$STATUSFONTCOLOR,$LOGO,$SLOGAN,$SLOGANCOLOR, $LOGOLINK, $LOGOTARGET, $CHARSET);
  83.     
  84. # NUMBER OF ROWS TO BE SHOWN INITIALLY IN "SELECT" AND "UPDATE" FUNCTIONS
  85.     $SelectRows            = '10';
  86.     $UpdateRows         = '10';
  87.  
  88. ######################################################################################
  89. # INSTALLATION (Refer to http://www.edatanew.com/about/)
  90. ######################################################################################
  91. #
  92. # Path to Configuration File:
  93. # It can be either full or relative path.
  94. # On Linux/Unix systems chmod mdmConfig directory to 777
  95. $configFile = './mdmConfig/mdmConfig.conf';
  96. # To disable interactive setup remark or delete the line above:
  97. # This variable must be unremarked and set if the links and buttons "do not work"
  98. # It must look like: $full_url = "http://www.myhostname.com/cgi-bin/mdm.cgi";
  99. #$full_url         = "";
  100. #####################################################################################
  101. my $register = "http://www.edatanew.com/order";
  102. my $demomsg = <<EOT
  103. Demo version can not execute this command.
  104. To register this program and download full version visit:
  105. $register
  106.  
  107. Try fully functional online demo:
  108. http://www.edatanew.com/demo
  109. EOT
  110. ;
  111. my $demomsg1 = <<EOT
  112. Demo version can not execute this command on a table with more
  113. than 4 columns.
  114. To register this program and download full version visit:
  115. $register
  116.  
  117. Try fully functional online demo:
  118. http://www.edatanew.com/demo
  119. EOT
  120. ;
  121.  
  122.  
  123.  
  124.  
  125. if ($configFile and -e $configFile){
  126.     open FH, $configFile or die $!;
  127.     flock (FH,2) unless $WIN32;
  128.     my @config;
  129.     while(<FH>){
  130.         push @config, $_;
  131.     }
  132.     flock (FH,8) unless $WIN32;
  133.     close FH;
  134.     my @default            = ();
  135.     my $config             = readconfig(\@config);
  136.     push @default, "host=$config->{defaultHost}" if $config->{defaultHost};
  137.     push @default, "port=$config->{defaultPort}" if $config->{defaultPort};
  138.     $DEFAULTHOST        = join (';', @default);
  139.     $HOME                = $config->{homeURL};
  140.     $SOCKET             = $config->{defaultSocket};
  141.     $MYSQL                = $config->{mysql};
  142.     $OTHER_MYSQL        = $config->{otherMysql};
  143.     $USER_DIR            = $config->{userDirectory};
  144.     $MAX_BACKUP_SIZE    = $config->{backupMax};
  145.     $MAX_SCRIPT_SIZE    = $config->{SQLMax};
  146.     $MAX_ASCII_SIZE        = $config->{asciiMax};
  147.     $CONTACT_EMAIL        = $config->{adminEmail};
  148.     $COMPRESS            = $config->{compressCommand};
  149.     $ALLOW_ZIP            = $config->{allowZIP};
  150.     $ALLOW_GZIP            = $config->{allowGZIP};
  151.     $ZIP                = $config->{zipSyntax};
  152.     $ZIPLOG                = $config->{zipLog};
  153.     $PRINT_POP_UP        = $config->{printPopUp};
  154.     $HELP                = $config->{helpURL};
  155.     $CHARSET            = $config->{charset};
  156.     $BGCOLOR1            = $config->{bgcolor1};        
  157.     $BGCOLOR2            = $config->{bgcolor2};
  158.     $STATUSFONTCOLOR    = $config->{statusfontcolor};
  159.     $LOGO                = $config->{logo};
  160.     $LOGOLINK            = $config->{logolink};
  161.     $LOGOTARGET            = $config->{logotarget};
  162.     $SLOGAN                = $config->{slogan};
  163.     $SLOGANCOLOR        = $config->{slogancolor};
  164.     
  165.     $BGCOLOR1            = $BGCOLOR1         ? '#' . $BGCOLOR1             : '#336699';
  166.     $BGCOLOR2            = $BGCOLOR2         ? '#' . $BGCOLOR2             : '#003366';
  167.     $STATUSFONTCOLOR    = $STATUSFONTCOLOR     ? '#' . $STATUSFONTCOLOR     : '#6699CC';
  168.     $SLOGANCOLOR        = $SLOGANCOLOR         ? '#' . $SLOGANCOLOR         : '#ffffff';
  169.     $SLOGAN                = "Mysql Data Manager" unless $SLOGAN;
  170.     $CHARSET            = 'ISO-8859-1'           unless ($CHARSET =~ /\S/); 
  171.     
  172.     
  173. }
  174. else {
  175.  
  176. #############################################################################################
  177. #                HARDCODED VALUES                                                            #
  178. # Settings of these values are optional. They are used if config file can not be created    # 
  179. #############################################################################################
  180.  
  181. # HOME PAGE FULL URL
  182.     $HOME                = "http://$host";
  183. #
  184. # COMMON CONNECTION PARAMETERS:
  185. #
  186. # PATH TO SOCKET FILE AND DEFAULT HOST. THE STRINGS ARE USED WHEN THE FIELD 'HOST' (LOGIN PAGE)IS BLANK.
  187. # (CORRECT THIS VALUE AS NEEDED. FOR EXAMPLE UNDER WINDOWS IT MAY BE SOMETHING
  188. # LIKE:     $DEFAULTHOST    = 'host=localhost:3306';
  189. #            $SOCKET = '';
  190. #
  191.     $DEFAULTHOST        = 'host=localhost:3306';
  192.     $SOCKET             = '/tmp/mysql.socket';
  193. #
  194. # OTHER PARAMETERS USED TO RUN mysql UTILITY ONLY
  195. #
  196. # PATH TO mysql CLIENT (CORRECT THIS VALUE AS NEEDED. FOR EXAMPLE UNDER WINDOWS 
  197. # IT WILL BE SOMETHING LIKE: 
  198. # $MYSQL = 'c:\mysql\bin\mysql.exe';
  199.     $MYSQL                 = '/usr/local/mysql/bin/mysql';
  200. #
  201. # (SUBSTITUTE THESE VALUES WITH CORRECT ONES):
  202. # FOR EXAMPLE: SET 'SILENT' AND 'COMPRESS': my $OTHER_MYSQL = '-s -C';
  203. # FOR MORE OPTIONS RUN 'mysql -?' IN COMMAND LINE.
  204.     $OTHER_MYSQL                 = '';
  205.  
  206.  
  207. # PATH TO USER DIRECTORY (CORRECT THIS VALUE AS NEEDED.)
  208. # CAUTION! If you created some backup files as user 'Username' connected to a location
  209. # 'Location1' and then connect different location 'Location2',
  210. # the program will treat you as different user (even if you use the same user name)
  211. # and created earlier files will be unreachable.
  212. # Each user 'username' connected the location 'locationname' will be provided with his
  213. # own subdirectories:
  214. #  /path/to/user_directory/usename.locationname/sql
  215. #  /path/to/user_directory/usename.locationname/backup  
  216. # or under Windows
  217. # D:\path\to\user_directory\usename.locationname\sql
  218. # D:\path\to\user_directory\usename.locationname\backup 
  219. # It also works if you put something like this (under Windows)
  220. # \path\to\usr - the program treats it as: 
  221. # C:\path\to\usr if the current disk drive is C: (D:\... if the current disk drive is D:, etc.)
  222. # the directories usename.locationname/sql and usename.locationname/backup will be created
  223. # by the program
  224.     $USER_DIR                     = '/home/myrootname/data/usr';
  225.  
  226. # MAXIMUM TOTAL SIZE OF BAKUP FILES PER USER/HOST (kilobytes). UNLIMITED IF EQUALS ZERO.
  227.     $MAX_BACKUP_SIZE             = 200;
  228.  
  229. # MAXIMUM TOTAL SIZE OF USER SCRIPTS
  230.     $MAX_SCRIPT_SIZE             = 50;
  231.  
  232. #  MAXIMUM SIZE OF ASCII DELIMITED FILE (FOR IMPORT - EXPORT)
  233.     $MAX_ASCII_SIZE                = 50;
  234.     
  235. # CONTACT EMAIL(TO BE USED IN SOME ERROR MESSAGES
  236.     $CONTACT_EMAIL                 = 'tech@edatanew.com';
  237.  
  238. # MANUAL COMPRESSING: zip OR gzip ?
  239.     $COMPRESS                     = 'gzip';
  240.  
  241. # SET ZERO IF ZIP UTILITY IS NOT INSTALLED (to be used for backup file compressing);
  242.     $ALLOW_ZIP                     = 1;
  243.  
  244. # SET THIS VARIABLE ZERO IF GZIP UTILITY IS NOT INSTALLED. (used for backup file compressing)
  245.     $ALLOW_GZIP                 = 1;
  246.  
  247. # "zip -qj" - ZIP UTILITY CALL UNDER UNIX/LINUX.
  248. # "Wzzip -Pr" OR "Wzzip" ZIP UTILITY CALL UNDER WINDOWS.
  249. # (WinZip COMMAND LINE UTILITY - SEE http://www.winzip.com).
  250. # USUALLY UNDER UNIX/LINUX THIS UTILITY IS ALREADY INSTALLED.
  251. # IF ANY OTHER ZIP UTILITY IS USED UNDER WINDOWS OR ANOTHER OPERATION SYSTEM,
  252. # CORRECT THE LINE BELOW ACCORDINGLY. (used for backup file compressing)
  253. # IF $ALLOW_ZIP =0 YOU CAN LEAVE IT BLANK: $ZIP = '';
  254.  
  255. #$ZIP = 'Wzzip -Pr'; 
  256. #$ZIPLOG = "1>NUL"}    #Win32
  257.     $ZIP                         = 'zip -qj';    #UNIX/LINUX 
  258.  
  259. # UNDER WINDOWS IT CAN LOOK LIKE:
  260. #     $ZIP = 'Wzzip'; # OR $ZIP = 'Wzzip -Pr'
  261. #     $ZIPLOG = "1>NUL";
  262. # THE VARIABLE $ZIPLOG IS USED TO REDIRECT THE OUTPUTOF THE UTILITY Wzzip.
  263.  
  264. # SET THIS VARIABLE EQUALS TO 0 IF YOUR WEB BROWSER DOES NOT SUPPORTS window.print() 
  265. # JAVASCRIPT FUNCTION.
  266.     $PRINT_POP_UP                 = 0 ;
  267.  
  268. #SET URL OF 'HELP' DIRECTORY:
  269.     $HELP                         = "../help";
  270. #DEFAULT CHARACTER SET:
  271.     $CHARSET            = 'ISO-8859-1'; 
  272. #COLORS:
  273.     $BGCOLOR1            = '#d79f00';    # HEXADECIMAL VALUE    WITH LEADING `#' CHARACTER
  274.     $BGCOLOR2            = '#a46c00';    # HEXADECIMAL VALUE    WITH LEADING `#' CHARACTER
  275.     $STATUSFONTCOLOR    = '#d79f00';    # HEXADECIMAL VALUE    WITH LEADING `#' CHARACTER
  276.     $LOGO                = '';          # URL LIKE http://www.yourdomain.com/images/logo.gif'
  277.     $LOGOLINK            = '';
  278.     $LOGOTARGET            = '';
  279.     $SLOGAN                = "Mysql Data Manager";
  280.     $SLOGANCOLOR        = '#a46c00';    # HEXADECIMAL VALUE    WITH LEADING `#' CHARACTER
  281.  
  282. #---------------------------------------------------------------------------------------
  283. # END OF MANUAL SETTING
  284. ########################################################################################
  285. }
  286. #########################################################################################
  287. #        DO NOT MODIFY ANYTHING BELOW THIS LINE                                            #
  288. #########################################################################################
  289.  
  290. my ($query, @ary);
  291. my @selectlike = (
  292.                     'select',
  293.                     'show',
  294.                     'explain',
  295.                     'describe',
  296.                     'desc'
  297. );
  298.  
  299. #++++++++++++++++++++++++++++++++++++++
  300.  
  301. my @typelist = (       'TINYINT',
  302.                     'SMALLINT',
  303.                     'INT',
  304.                     'MEDIUMINT',
  305.                     'BIGINT',
  306.                     'FLOAT',
  307.                     'DECIMAL',
  308.                     'DOUBLE',
  309.                     'CHAR',
  310.                     'VARCHAR',
  311.                     'ENUM',
  312.                     'SET',
  313.                     'TINYBLOB',
  314.                     'TINYTEXT',
  315.                     'BLOB',
  316.                     'TEXT',
  317.                     'MEDIUMBLOB',
  318.                     'MEDIUMTEXT',
  319.                     'LONGBLOB',
  320.                     'LONGTEXT',
  321.                     'DATE',
  322.                     'TIME',
  323.                     'TIMESTAMP',
  324.                     'DATETIME',
  325.                     'YEAR'
  326.   
  327.  
  328. );
  329.  
  330. my %auto_type = (
  331.                     TINYINT                =>1,
  332.                     SMALLINT          =>1,
  333.                        INT                      =>1,
  334.                     MEDIUMINT          =>1,
  335.                     BIGINT              =>1,
  336.                     FLOAT              =>1,
  337.                     NUMERIC              =>1,
  338.                     REAL              =>1,
  339.                     DOUBLE                =>1,
  340.                     DECIMAL              =>1,
  341.                     CHAR              =>1,
  342.                     VARCHAR              =>1,
  343. );
  344. my @textdata = (    'TINYBLOB',
  345.                     'BLOB',
  346.                     'MEDIUMBLOB',
  347.                     'LONGBLOB',
  348.                     'TINYTEXT',
  349.                     'TEXT',
  350.                     'MEDIUMTEXT',
  351.                     'LONGTEXT'
  352. );
  353.  
  354. unless (($CHARSET eq "ISO-8859-1") or ($CHARSET eq "iso-8859-1")){
  355.     local $SIG{__DIE__} = sub{
  356.     print $q->header;
  357.     print "Perl module CGI.pm must be updated"
  358.     };
  359.     $q->charset($CHARSET)
  360. }
  361. my $page     = $q->param('page');
  362. my $agent;
  363. if ($q->user_agent =~ /(MSIE)|(Opera)/i  ) {$agent = 0}
  364. elsif ($q->user_agent =~ /(\[\w\w\])|(Netscape)/i  ){$agent = 1}
  365.  
  366. if (($page eq 'logout') or !$page){
  367.     &logout();
  368.     &printparam();
  369.     exit;
  370. }
  371. elsif ($page eq 'setup') {
  372.     &setup();
  373.     &printparam();
  374.     exit;
  375. }
  376.  
  377. my $NO_HEADER = 1 if (  
  378.  
  379.             $q->param('downloadBackup') and ($q->param('func') =~ /backup/i) 
  380.             or $q->param('downloadFile') or ($q->param('action') =~ /download/i) 
  381.             
  382.             );
  383.  
  384. my ($user, $password, $MySQLhost, $usedefault, $database);
  385. $DEFAULTHOST = "mysql_socket=$SOCKET;".$DEFAULTHOST if $SOCKET;
  386. if ($q->param('login')) {
  387.     $user         = $q->param('user');
  388.     $password    = $q->param('password');
  389.     unless  ($q->param('host')) {
  390.         $MySQLhost            = $DEFAULTHOST;
  391.         $usedefault            = 1;
  392.     }
  393.     else {
  394.         $MySQLhost            = 'host='.$q->param('host');
  395.         $usedefault            = 0;
  396.     }
  397.     if ($q->param('host')    =~ /database=([a-zA-Z0-9_]*)/){$database=$1}
  398.     else {$database         = $q->param('dbname'); $database =~ s/\s//g;}
  399.  
  400.     my $cookies = $q->cookie(    
  401.                             -name=>'db_manager',
  402.                             -value=>[$user, $password, $MySQLhost, $usedefault],
  403.                             -secure=>0
  404.                             );
  405.     print     $q->header(-cookie=>$cookies, -expires=>0);
  406.     $page = 'select_db'    if ($database and ($page eq 'connect')); 
  407.           
  408. } #IF
  409. else {
  410.     ($user, $password, $MySQLhost, $usedefault) = $q->cookie('db_manager');
  411.     if (defined $q->param('change_password')){
  412.         $password     = $q->param('change_password');
  413.         my $cookies = $q->cookie(    
  414.                             -name=>'db_manager',
  415.                             -value=>[$user, $password, $MySQLhost, $usedefault],
  416.                             -secure=>0
  417.                             );
  418.                print     $q->header(-cookie=>[$cookies], -expires=>0);
  419.     }
  420.     else {
  421.         if ($q->param('targetconnect')){
  422.             my $targetuser            = $q->param('targetuser');
  423.             my $targetpassword        = $q->param('targetpassword');
  424.             my $targethost            = $q->param('targethost');
  425.             unless ($targethost){$targethost = $DEFAULTHOST}
  426.             my $cookies = $q->cookie(
  427.                         -name=>'target_db',
  428.                         -value=>[$targetuser, $targetpassword, $targethost],
  429.                         -secure=>0
  430.                         );
  431.             print     $q->header(-cookie=>[$cookies], -expires=>0);        
  432.         }
  433.         else {    
  434.             print $q->header(-expires=>0) unless $NO_HEADER;
  435.         }
  436.     }
  437.     $MySQLhost    = $DEFAULTHOST if ($usedefault);
  438.     $database                                     = $q->param('dbname');
  439. } #ELSE
  440. #++++++++++++++++++++++++++++++++++++++
  441.  
  442. {
  443.     my ($host_, $port_) = gethost($MySQLhost);
  444.     
  445.     sub myhost {
  446.         unless (defined $_[0]){
  447.             if (wantarray){return($host_, $port_)}
  448.             else {return($host_)}
  449.         }
  450.         else {
  451.             if (wantarray){
  452.                 my ($host_, $port_) = gethost($_[0]);
  453.                 return($host_, $port_)
  454.             }
  455.             else {
  456.                 my $host_ = gethost($_[0]);
  457.                 return($host_)
  458.             }
  459.         }
  460.     }
  461. }
  462.  
  463. my $print = "print" if ($q->param('print'));
  464. &startpage($user, $database) unless $NO_HEADER;
  465. my (%attr) =
  466. (
  467.                     PrintError => 0,
  468.                     RaiseError => 0,
  469.                     #AutoCommit => 0
  470. );
  471.  
  472. my $dsn                    = "DBI:mysql:$database;$MySQLhost";
  473. my $dsn_                 = $usedefault ? "DBI:mysql:$database:defaulthost" : $dsn;
  474. my $dbh                 = DBI->connect($dsn, $user, $password,\%attr)
  475.     or &bail_out("(DSN, user, password): $dsn, $user, $password");
  476. undef $dsn_; 
  477. if ($database){$dbh->do("USE $database") or bail_out("cannot USE this database: $database", {page => "connect"})}
  478.  
  479. {
  480.     my ($sth, $res)        = prepare_execute("SELECT VERSION()");
  481.     my $version         = $sth->fetchrow_array();
  482.     $sth->finish();
  483.     sub check_version {
  484.     #input: version number NN.NN.NNanythyng
  485.     #returns undef if current version is lower then required
  486.     #returns 1 if OK;
  487.         my (@v,@x);
  488.         if ($version =~ /^(\d*)\.(\d*)\.(\d*).*/)    {@v = ($1,$2,$3)}
  489.         if ($_[0] =~ /^(\d*)\.(\d*)\.?(\d*)/)    {@x = ($1,$2,$3)}
  490.         if ($v[0] < $x[0]){return undef} elsif ($v[0] > $x[0]){return 1}
  491.         if ($v[1] < $x[1]){return undef} elsif ($v[1] > $x[1]){return 1}
  492.         if ($v[2] < $x[2]){return undef} else {return 1} ;
  493.     }
  494.     sub get_version{$version}
  495.  
  496. }
  497.  
  498. if (check_version('3.23.00')){
  499.     push @selectlike, ('optimize','check','analyze','repair');
  500.     undef $auto_type{'VARCHAR'}; undef $auto_type{'CHAR'};
  501. }
  502. my $demomsg2 = "This was generated by unregistered version of MDM";
  503. if ($page eq 'admin'){
  504.     my $back                    = {page => "admin"};
  505.     $back->{dbname}                  = "$database" if $database;
  506.     $back->{selectdbname_}        = $q->param('selectdbname_') if $q->param('selectdbname_');
  507.     my $func = $q->param('func');
  508.     if        ($func =~ /flush/i)                {&execFlush($back);&loadAdmin()}
  509.     elsif    ($func =~ /analyze/i)            {&execCheckRepair($back, 'ANALYZE')}
  510.     elsif    ($func =~ /check/i)                {&execCheckRepair($back, 'CHECK')}
  511.     elsif    ($func =~ /repair/i)            {&execCheckRepair($back, 'REPAIR')}    
  512.     elsif    ($func =~ /optimize/i)            {&execCheckRepair($back, 'OPTIMIZE')}
  513.     elsif    ($func =~ /access/i)            {&loadAccessControl($back)}
  514.     else {&loadAdmin($back)}
  515. }
  516. elsif ($page eq 'select_db') {
  517.     my $func = $q->param('func');
  518.     if     ($q->param('tableops') =~ /execute/i) {execExecuteQuery({'page' => 'connect'})}
  519.     elsif ($q->param('cancel')){&loadSelectDB()}
  520.     elsif ($q->param('tableops') =~ /drop/i) {dropcreatedb('drop')}
  521.     elsif ($q->param('tableops') =~ /create/i) {dropcreatedb('create')}
  522.     elsif ($func =~ /backup/i){&loadBackup()}
  523.     elsif ($func =~ /restore/i){&loadRestore()}
  524.     else  {&loadSelectTables()}
  525. }
  526. elsif (!$database) {
  527.     if ($page eq 'ddl') {
  528.         $database    = $q->param('database');
  529.         execExecuteQuery({page => 'tables', dbname => "$database", script => 'back'})  if ($q->param('apply'));
  530.     }
  531.        else {&loadSelectDB()}
  532. }
  533. elsif ($page eq 'tables') {
  534.     my $func = $q->param('func');
  535.     if       ($func =~ /describe/i){&execDescribeTables()}
  536.     elsif ($func =~ /(alter)|(create)/i){&loadAlterTable()}
  537.     elsif ($func =~ /(insert)|(search)/i){&loadInsertForm()}
  538.     elsif ($func =~ /update/i){&loadUpdateForm()}
  539.     elsif ($func =~ /select/i){&execSelectFromTable()}
  540.     elsif ($func =~ /drop/i){&loadDropPreview()}
  541.     elsif ($func =~ /delete/i){&loadDeletePreview()}
  542.     elsif ($func =~ /ddl/i){&execGenerateDDL()}
  543.     elsif ($func =~ /(import)|(export)/i){&loadImportExportFile()}
  544.     elsif ($func =~ /script/i){&loadexecscript()}
  545.     elsif ($func =~ /backup/i){&loadBackup()}
  546.     elsif ($func =~ /restore/i){&loadRestore()}
  547.     else  {print "<P>Select something!"}
  548. }
  549. elsif ($page eq 'search') {
  550.     my $func = $q->param('func');
  551.     if ($func =~ /return/i){&loadInsertForm()}
  552.     else {&execSearch}
  553. }elsif ($page eq 'searchresult') {
  554.     my $func = $q->param('func');
  555.     if        (($func =~ /prev/i) or ($func =~ /next/i)){&searchresult()}
  556.     elsif    ($func =~ /back/i){&loadInsertForm()}
  557.     elsif    ($func =~ /edit/i){&loadInsertForm()}
  558.     elsif    ($func =~ /new/i){&loadInsertForm()}
  559.     elsif    ($func =~ /return/i){&searchresult()}
  560.     elsif    ($func =~ /insert/i){&execInsertData()}
  561.     elsif    ($func =~ /delete/i){&searchresult()}
  562.     elsif    ($print){&searchresult()}
  563.     else    {&execSearch}
  564. }
  565. elsif($page eq 'create'){&execAlterTable}
  566. elsif ($page eq 'insert') {&execInsertData}
  567. elsif ($page eq 'alter') {&execAlterTable}
  568. elsif ($page eq 'update') {&execUpdateData}
  569. elsif ($page eq 'updateAfterPreview') {&execUpdateAfterPreview}
  570. elsif ($page eq 'alterAfterPreview') {&execAlterAfterPreview}
  571. elsif ($page eq 'drop') {&execDropTable}
  572. elsif ($page eq 'delete') {&execDeleteFromTable}
  573. elsif ($page eq 'ddl') {
  574.     if ($q->param('apply')){&execExecuteQuery({page => 'tables', dbname => $database, script => 'back'})}
  575.     else {&loadSelectTables()}
  576. }
  577.  
  578. #++++++++++++++++++++++++++++++++++++++
  579.  
  580. else {print "<B>WRONG DATA</BR>"}
  581. print "\n\n<!-- END OF PROCEDURE BODY -->\n\n";
  582.  
  583. print "\n\n\t\t</TD>\n\t</TR>\n</TABLE><!-- END OF MARGIN TABLE -->\n\n\n\n" unless $print;
  584.  
  585.  
  586. print $q->end_html;
  587. $dbh->disconnect;
  588.  
  589. &printparam;
  590. printPopUp() if $print;
  591. exit;
  592. ####################################################
  593. #-----------------S U B R O U T I N S--------------#
  594. ####################################################
  595. sub quoteit {
  596.     my @output = @_;
  597.     for (my $i=0; $i<@output; $i++) {
  598.         $output[$i] =~ s{(.)}{
  599.             if    ($1 eq '<')        { '<'    }
  600.             elsif ($1 eq '>')        { '>'    }
  601.             elsif ($1 eq '&')        { '&'   }
  602.             elsif ($1 eq '"')        { '"'  }
  603. #            elsif ($1 eq "\x8b")    { '‹'  }
  604. #            elsif ($1 eq "\x9b")    { '›'  }
  605.             else                    { $1        }
  606.        }gsex;
  607.     }
  608.     if (wantarray) {return (@output)}
  609.     else {return $output[0];}
  610. }
  611.  
  612. sub printparam {
  613.     return;
  614.     my @x=$q->param();
  615.     my @values;
  616.     print "\n\n\n\n<!-- PARAMETERS -->\n\n";
  617.     print qq!<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=2 BGCOLOR="#CCCCCC">\n\t<TR VALIGN=TOP>!;
  618.     my $max=1;
  619.     for (my $i=0; $i<@x; $i++) {
  620.         my @y = $q->param($x[$i]);
  621.         $values[$i] = \@y;
  622.         $max = scalar (@y) if (@y>$max);
  623.         print qq!\n\t\t<TD BGCOLOR="#DDDDDD"> $x[$i]</TD>!;
  624.     }
  625.     print "</TR>\n";
  626.     for (my $j=0; $j<$max; $j++) {
  627.         print "\t<TR VALIGN=TOP>\n";
  628.         for (my $i=0; $i<@x; $i++) {
  629.             ${$values[$i]}[$j] =~ s/&/&/g;
  630.             ${$values[$i]}[$j] =~ s/</</g;
  631.             ${$values[$i]}[$j] =~ s/>/>/g;
  632.             print qq!\t\t<TD BGCOLOR="#DDDDDD"> !. ${$values[$i]}[$j] . qq!</TD>\n!;
  633.         }
  634.         print "\t</TR>\n";
  635.     }
  636.     print    "</TABLE>\n";
  637. }
  638.  
  639. sub gethost {
  640.     my $myhost = $_[0];
  641.     my ($host,$port);
  642.     if ($myhost =~ /host=(.*):(\d*)/){$host = $1; $port = $2}    #a ...;host=hostname:3306...
  643.     elsif ($myhost =~ /host=([^;]*);/){$host = $1;}                #b ...;host=hostname;...
  644.     elsif ($myhost =~ /^(.*):(\d*)/){$host = $1; $port = $2}    #c hostname:3306...
  645.     elsif ($myhost =~ /^(.*);/){$host = $1}                        #d hostname;...
  646.     elsif ($myhost =~ /host=(\S+)\s*$/){$host = $1;}            #b+ ...;host=hostname;...
  647.     elsif ($myhost =~ /=/){$host = ''}                            #e no hostname, but other params
  648.     else {$host = $myhost}                                        #f hostname only
  649.     if ($myhost =~ /port=(\d*)/){$port = $1}
  650. #    my ($sth,$res) = prepare_execute("SELECT USER()", {});
  651. #    my ($host) = $sth->fetchrow_array();
  652. #    $host = s/.*@(.*)/$1/;
  653. #    ($sth,$res) = prepare_execute("SELECT VARIABLES() LIKE 'PORT'");
  654. #    my $port = $sth->fetchrow_array();
  655.     if (wantarray){return($host, $port)}
  656.     else {return($host)}
  657. }
  658. sub myhost_ {
  659.     my $myhost;
  660.     unless (defined $_[0]){$myhost = $MySQLhost}
  661.     else {$myhost = $_[0]}
  662.     my ($host,$port);
  663.     if ($MySQLhost =~ /host=(.*):(\d*)/){$host = $1; $port = $2} #a ...;host=hostname:3306...
  664.     elsif ($MySQLhost =~ /host=([^;]*);/){$host = $1;}             #b ...;host=hostname;...
  665.     elsif ($MySQLhost =~ /^(.*):(\d*)/){$host = $1; $port = $2}     #c hostname:3306...
  666.     elsif ($MySQLhost =~ /^(.*);/){$host = $1}                     #d hostname;...
  667.     elsif ($MySQLhost =~ /host=(\S+)\s*$/){$host = $1;}             #b+ ...;host=hostname;...
  668.     elsif ($MySQLhost =~ /=/){$host = ''}                         #e no hostname, but other params
  669.     else {$host = $MySQLhost}                                     #f hostname only
  670.     if ($MySQLhost =~ /port=(\d*)/){$port = $1}
  671. #    my ($sth,$res) = prepare_execute("SELECT USER()", {});
  672. #    my ($host) = $sth->fetchrow_array();
  673. #    $host = s/.*@(.*)/$1/;
  674. #    ($sth,$res) = prepare_execute("SELECT VARIABLES() LIKE 'PORT'");
  675. #    my $port = $sth->fetchrow_array();
  676.     if (wantarray){return($host, $port)}
  677.     else {return($host)}
  678. }
  679. sub printPopUp {
  680.     print "<script language=\"JavaScript1.2\">window.print()</script>" if $PRINT_POP_UP;
  681. }
  682.  
  683. sub startpage {
  684.     my $user_                = "USER: $_[0]" if ($page and ($page ne 'logout' and $page ne 'setup'));
  685.     my $databasename        = $database || "<B>NOT SELECTED</B>";
  686.     my $dbname_             = 'DATABASE: '.$databasename if ($page and $page ne 'logout' and $page ne 'connect' and $page ne 'setup');
  687.     my ($hostname,$port)     = myhost();
  688.     $hostname                 .= ":$port" if $port;
  689.     my $demomarker; 
  690. #++++++++++++++++++++++++++++++++++++++
  691.  
  692.     my $host_ = "HOST: $hostname" if ($page and ($page ne 'logout' and $page ne 'setup'));
  693.     
  694.     my $title = $print ? quoteit($q->param('title')) : "MYSQL DATA MANAGER $VERSION";
  695.     $title = "Untitled" if ($title =~ /^\s*$/);
  696. print <<EndOfHead
  697. <HTML>
  698. <HEAD>
  699. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$CHARSET">
  700. <TITLE>$title</TITLE>
  701. </HEAD>
  702.  
  703. EndOfHead
  704. ;
  705. #
  706.     unless ($print){
  707.         print <<EndOfStyle
  708. <STYLE TYPE="text/css">
  709. <!--
  710. TD.header {height: 35px}
  711. P.headh5             {color: white; font-size: 16px; font-weight: bold; font-family: "Verdana", "Tahoma", "Arial", "Geneva"}
  712. A.button            {color: white; font-size: 10px; font-weight: bold; font-family: "Verdana", "Tahoma", "Arial", "Geneva"}
  713. A.button:hover        {color: white; text-decoration: none}
  714. A.button:visited    {color: white; text-decoration: none}
  715. p.shead                {font-size: 9px; font-weight: bold; font-family: "Verdana", "Tahoma", "Arial", "Geneva"}
  716. body        {background: #CCCCCC; font-size: 11px; font-family: "Verdana", "Tahoma", "Arial", "Geneva"}
  717. A            {color: #CC0000; font-weight: bold; text-decoration: none}
  718. A:hover        {color: #CC0000; font-weight: bold; text-decoration: none}
  719. A:visited    {color: #CC0000; font-weight: bold; text-decoration: none}
  720. select, textarea, input, TD,UL, TR, P,BR     {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: 11px}
  721. TH            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-weight: bold; font-size: 11px; color: #003466}
  722. CODE        {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-weight: bold; font-size: 12px}
  723. H5            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-weight: bold; font-size: 16px; color: $SLOGANCOLOR}
  724. H3            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-weight: bold; font-size: 12px; color: #003466}
  725. EM            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: 10px}
  726. -->
  727. </STYLE>
  728. EndOfStyle
  729. ;
  730. }
  731.     else {
  732.         print <<EndOfStyle
  733. <STYLE TYPE="text/css">
  734. <!--
  735. body        {background: #FFFFFF; font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: x-small}
  736. P,BR        {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: x-small}
  737. TD,UL       {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: x-small}
  738. TR            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: x-small}
  739. TH            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-weight: bold; ; font-size: x-small}
  740. CODE        {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: small}
  741. H5            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"; font-size: medium}
  742. H3            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"}
  743. EM            {font-family: "Verdana", "Tahoma", "Arial", "Geneva"}
  744. -->
  745. </STYLE>
  746. <BODY bgcolor="#FFFFFF">
  747. EndOfStyle
  748.  
  749. ;
  750.         return;
  751.     }
  752.     my $uprow;
  753.     if ($LOGO){$LOGO = qq!<img src="$LOGO" BORDER=0>!}
  754.     if ($LOGOLINK){
  755.         if ($LOGOTARGET){$LOGOTARGET = qq!target="$LOGOTARGET"!}
  756.         $LOGO = qq!<A HREF="$LOGOLINK" $LOGOTARGET>$LOGO</A>!;
  757.     }
  758.     else {$uprow = <<EOT
  759.     <TR BGCOLOR="$BGCOLOR1">
  760.         <TD WIDTH=20 HEIGHT=15 BGCOLOR="$BGCOLOR1"> </TD>
  761.         <TD BGCOLOR="$BGCOLOR1"> </TD>
  762.     </TR>
  763. EOT
  764. }
  765. #++++++++++++++++++++++++++++++++++++++
  766.     
  767.     my $links =     links();
  768.     print <<HeadTable
  769. <BODY bgcolor="#CCCCCC" link="#CC0000" vlink="#CC0000" alink="#CC0000" text="#000000" TOPMARGIN=0 LEFTMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0>
  770. <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
  771. $uprow
  772.     <TR>
  773.         <TD COLSPAN=2 BGCOLOR="$BGCOLOR1">
  774. <!-- LOGO TABLE -->
  775.     <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
  776.         <TR>
  777.             <TD WIDTH=20> </TD>
  778.             <TD  ALIGN=LEFT HEIGHT=35 WIDTH=600><P CLASS="headh5"><FONT COLOR="$SLOGANCOLOR"><B> $SLOGAN $demomarker </B></FONT></P></TD>
  779.             <TD WIDTH=100 ALIGN=RIGHT><P>$LOGO</TD>
  780.         </TR>
  781.     </TABLE>
  782.         </TD>
  783.     </TR>
  784.     <TR BGCOLOR="$BGCOLOR2">
  785.         <TD COLSPAN=2 BGCOLOR="$BGCOLOR2" HEIGHT=17>
  786. <!-- INFO TABLE -->
  787.     <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
  788.         <TR>
  789.             <TD WIDTH=20> </TD>
  790.             <TD><FONT COLOR="$STATUSFONTCOLOR"><NOBR> $user_    $host_    $dbname_ </NOBR></FONT></TD>
  791.             <TD ALIGN=RIGHT><FONT COLOR="$STATUSFONTCOLOR"><NOBR> </NOBR></FONT></TD>
  792.         </TR>
  793.     </TABLE>
  794.         </TD>
  795.     </TR>
  796.     <TR>
  797.         <TD WIDTH=20 HEIGHT=15> </TD>
  798.         <TD> </TD>
  799.     </TR>
  800.     <TR>
  801.         <TD COLSPAN=2>
  802. HeadTable
  803. ;
  804.     print links();
  805.     print <<EOT
  806.         </TD>
  807.     </TR>
  808.     <TR>
  809.         <TD WIDTH=20> </TD>
  810.         <TD><BR>
  811. <!-- PROCEDURE BODY STARTS HERE -->
  812. EOT
  813. ;
  814.  
  815.  
  816. #++++++++++++++++++++++++++++++++++++++
  817. }#startpage
  818.  
  819. sub links {
  820.     my ($url1, $url2, $url3, $url4, $url5, $url6);
  821.     my $func = $q->param('func');
  822.     if ($page and ($page ne 'logout') and $page ne 'setup'){
  823.         if ($database) {
  824.             $url2 = qq!<nobr><A HREF="$full_url?page=select_db&dbname=$database">MAIN PAGE</A></nobr>\n!;
  825.         }
  826.         else {
  827.             $url2 = qq!<nobr><FONT COLOR="#999999">MAIN PAGE</FONT></nobr>\n!;
  828.         }
  829.         my $selectdbname_ = "&selectdbname_=".$q->param('selectdbname_') if $q->param('selectdbname_');
  830.         $url1 = qq!<nobr><A HREF="$full_url?page=connect">SELECT DATABASE</A></nobr>\n!;
  831.         $url3 = qq!<A HREF="$full_url?page=logout">LOG OUT</A>\n!;
  832.         $url5 = qq!<A HREF="$full_url?page=admin&dbname=$database$selectdbname_">ADMINISTRATION</A>\n!;
  833.         $url4 = qq!<A HREF="$HOME">HOME</A>\n! if $HOME;
  834.         $url6 = qq!<A HREF="$HELP" TARGET="_blank">HELP</A>\n! if $HELP;
  835.     }
  836.     elsif($configFile) {
  837.         $url1 = qq!<A HREF="$HOME">HOME</A>\n! if $HOME;
  838.         $url6 = qq!<A HREF="$HELP" TARGET="_blank">HELP</A>\n! if $HELP;
  839.         $url2 = qq!<A HREF="$full_url?page=setup">SETUP</A>\n!;
  840.         $url5 = qq!<A HREF="$full_url?page=logout">EXIT SETUP</A>\n! if ($page eq 'setup');
  841.     }
  842.     else {
  843.         $url1 = qq!<A HREF="$HOME">HOME</A>\n! if $HOME;
  844.         $url2 = qq!<A HREF="$HELP" TARGET="_blank">HELP</A>\n! if $HELP;
  845.     }
  846. return <<EOT
  847.  
  848. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  849.     <TR>
  850.         <TD WIDTH="20"> </TD>
  851.         <TD WIDTH="140">$url1</TD>
  852.         <TD WIDTH="90">$url2</TD>
  853.         <TD WIDTH="150">$url5</TD>
  854.         <TD WIDTH="100">$url3</TD>
  855.         <TD WIDTH="100">$url4</TD>
  856.         <TD WIDTH="130" ALIGN=RIGHT>$url6</TD>
  857.     </TR>
  858. </TABLE>
  859.  
  860. EOT
  861. ;
  862. }
  863.  
  864. sub dropcreatedb{
  865.     my $back = {page => "connect"};
  866.     if ($_[0] eq 'drop') {
  867.         if ($q->param('confirm')) {
  868.             bail_out("Database is not selected",$back) unless $q->param('dbdrop');
  869. #++++++++++++++++++++++++++++++++++++++
  870.             my $query = "DROP DATABASE ".$q->param('dbdrop');
  871.             bail_out("Cannot do query:\n$query", $back) unless ($dbh->do($query));
  872.             &loadSelectDB();     
  873.         }
  874.         else {
  875.             bail_out("Database is not selected",$back) unless $database;
  876.             print "<BR><BR><B>Database $database will be dropped.</B><BR>\n";
  877.               print qq?<BR><B><FONT COLOR="#FF0000"><U>CAUTION!</U> SELECTED DATABASE IS NOT EMPTY</FONT></B><BR>\n? 
  878.                 if (@{getTablelist($database)});
  879.             print <<EndOfDrop
  880.         <FORM METHOD=POST ACTION="$full_url">
  881.         <INPUT TYPE=SUBMIT NAME="confirm"     VALUE="CONFIRM">
  882.         <INPUT TYPE=SUBMIT NAME="cancel"     VALUE="CANCEL">
  883.         <INPUT TYPE=HIDDEN NAME="page"         VALUE="select_db">
  884.         <INPUT TYPE=HIDDEN NAME="dbdrop"     VALUE="$database">
  885.         <INPUT TYPE=HIDDEN NAME="tableops"     VALUE="drop">
  886.         
  887.         </FORM>
  888. EndOfDrop
  889. ;
  890.           
  891.           }
  892.      
  893.      }
  894.      elsif($_[0] eq 'create'){
  895.          my $newdb = $q->param('newDB');
  896.         
  897.          if (($newdb eq '') or ($newdb eq 'NEW DATABASE NAME')){bail_out("Please type new database name in the text field", $back)}
  898.         my $query = "CREATE DATABASE $newdb";
  899.         bail_out("Cannot do query:\n$query", $back) unless ($dbh->do($query));
  900.         &loadSelectDB();     
  901.      }
  902. }
  903.  
  904. sub getuserlist{
  905.     my $query        = "SELECT host, user FROM mysql.user ORDER BY user";
  906.     my $back         = {page => 'connect'};
  907.     $back             = {page => 'select_db', dbname => $database} if $database;
  908.     my $sth         = $dbh->prepare($query) || bail_out ("Cannot prepare query:\n$query", $back);
  909.     my $res         = $sth->execute();
  910.     my @userlist    = ();
  911.     my $labelhash    = ();
  912.     if ($DBI::err){push @userlist, '1'; $labelhash->{'1'} = 'ACCESS DENIED'}
  913. #    elsif (???) {    bail_out ("Cannot execute:\n$query", $back)    }
  914.     else {
  915.         while (my $usersref        = $sth->fetchrow_arrayref) {
  916.             my $label = $usersref->[1].'@'.$usersref->[0];
  917.             $usersref->[0]    = $dbh->quote($usersref->[0]);
  918.             $usersref->[1]    = $dbh->quote($usersref->[1]);
  919.             my $value = $usersref->[1].'@'.$usersref->[0];
  920.             push @userlist, $value;
  921.             $labelhash->{$value} = $label;
  922.         }
  923.     }
  924.     $sth->finish;
  925.     if (@userlist == 0){$userlist[0] = '0'; $labelhash->{'0'} = "User List is empty"}
  926.     if (wantarray){return \@userlist, $labelhash}
  927.     else {return \@userlist}
  928. }
  929. sub getdblist {
  930.     my $dbh                    = shift;
  931.     my $back                = {page => 'select_db', dbname => $q->param('dbname')} if $q->param('dbname');
  932.     my $driversref            = $dbh->selectcol_arrayref("SHOW DATABASES");
  933.     if ($DBI::err){
  934.         if ($DBI::errstr =~ /access/i){$driversref->[0]    = $database if $database}
  935.         else {bail_out("Cannot select Databases", $back)}
  936.     }
  937.     
  938.     #unless ($driversref->[0]) {$driversref->[0]    = ''};
  939.     return $driversref
  940. }
  941. sub getTablelist {
  942.     my $query                 = "SHOW TABLES";
  943.     $query                     .= " FROM $_[0]" if ($_[0]);
  944.     my $back;
  945.     unless ($back = $_[1]){$back = {page => 'connect'}}
  946.     return  $dbh->selectcol_arrayref($query) || bail_out("Failed to execute:\n$query", $back);
  947. }
  948.  
  949. sub getlimit {
  950.     #input: $tabs - number of selected tables
  951.     #output (for each table):
  952.     # limit x,y  - arrayref
  953.     # offset x - arrayref
  954.     # rows y - arrayref
  955.     my $tabs = shift;
  956.     my (@limit, @offset, @rows);
  957.     unless (defined $q->param('limit')) {
  958.         @offset        = $q->param('offset');
  959.         @rows         = $q->param('rows');
  960.         for(my $i=0; $i<$tabs; $i++) {
  961.             $rows[$i]        = $rows[0] unless defined $rows[$i];
  962.             $offset[$i]        = $offset[0] unless defined $offset[$i];
  963.             $limit[$i]        = "$rows[$i]" if (($rows[$i] ne '') and ($offset[$i] eq ''));
  964.             $limit[$i]        ="$offset[$i], $rows[$i]" if (($rows[$i] ne '') and ($offset[$i] ne ''));
  965.         }
  966.     }
  967.     else {
  968.         @limit = $q->param('limit');
  969.         for(my $i=0; $i<$tabs; $i++) {
  970.             $limit[$i] = $limit[0] unless defined $limit[$i];
  971.             if ($limit[$i] =~ /^(.+),(.+)$/){
  972.                $offset[$i] = $1;
  973.                $rows[$i] = $2;
  974.             }
  975.             elsif ($limit[$i] !~ /,/) {
  976.                $offset[$i] = '';
  977.                $rows[$i] = $limit[$i];
  978.             }
  979.         }    
  980.     }
  981.     return (\@limit, \@offset, \@rows)
  982. }
  983.  
  984. sub bail_out {
  985. # $_[0] - error message
  986. # $_[1] - link back if $_[2] is not defined or zero or HIDDEN INPUTs leading back if $_[2]
  987. # $_[2] - if zero $_[1] is interpreted as part of URL, if set $_[1] is HIDDEN INPUTs
  988.     if ($NO_HEADER){
  989.         print $q->header(-expire=>0);
  990.         &startpage($user, $database);    
  991.     }
  992.     my $message = quoteit($_[0]);
  993.     $message =~ s/$/<BR>/mg;
  994.     print "\n\n<!--   ------BAIL_OUT------   -->";
  995.     print "\n\n<P><B>$message</B><BR>";
  996.     if ($DBI::err){
  997.         my $message_ = quoteit($DBI::errstr);
  998.         $message_      =~ s/^/<BR>/mg;
  999.         print "Error  $DBI::err ($message_)\n</P>\n" ;
  1000.     }
  1001.     if ($_[2] eq 2){
  1002.         print qq!</FORM><FORM METHOD=POST ACTION=$full_url>\n!;
  1003.     }
  1004.     elsif (!$_[2]){
  1005.         print qq!<FORM METHOD=POST ACTION=$full_url>\n!;
  1006.     }
  1007.     my $input = $_[1];
  1008.     print qq!<INPUT TYPE=SUBMIT VALUE="Back">\n! unless ($_[2] == 3);
  1009.     foreach (keys %$input){
  1010.         print $q->hidden(-name=>$_, -value=>$_[1]->{$_}, -override=>1),"\n";
  1011.     }
  1012.     print "\n\t\t</FORM></TD>\n\t</TR>\n</TABLE>\n\n\n\n" unless $print;
  1013.     print $q->end_html;
  1014. #---errlog---
  1015. #++++++++++++++++++++++++++++++++++++++
  1016.     
  1017.  
  1018.     $dbh->disconnect() if defined $dbh;
  1019.     $dbh_->disconnect() if defined $dbh_;
  1020.     &printparam();
  1021.     exit 0;
  1022. }
  1023.  
  1024. sub ErrMessage {
  1025.     print $_[0];
  1026.     print qq!<BR><B><FONT COLOR="#FF0000">Error $DBI::err (!, quoteit($DBI::errstr),")</FONT></B><P>" if ($DBI::err);
  1027.     print "\n</FORM>" if $_[1];
  1028.     print "\n</TD></TR></TABLE>" if ($_[1] == 2);
  1029.     
  1030. #++++++++++++++++++++++++++++++++++++++
  1031.  
  1032. }
  1033.  
  1034. sub printresult {
  1035. #input:
  1036. # $_[0] - \$sth
  1037. # $_[1] - offset (running number)
  1038. # $_[2] - if set - mark primary keys
  1039.     my $sthref        = $_[0];
  1040.     my $sth         = $$sthref;
  1041.     my $offset         = ($_[1] + 0);
  1042.     my $array        = [];
  1043.     $array->[0][0]    = qq!<TD BGCOLOR="#CCCCCC">No</TD>\n! if (defined $_[1] and !$print);
  1044.     my $pri            = get_mysql_pri($sth);
  1045.     unless (defined $pri) {$pri = []}
  1046.     my ($bgcolorH, $bgcolor, $bgcolorL, $bordercolor, $cellspacing, $rowheight, $headerheight);
  1047.     my ($border, $bordercolorlight, $bordercolordark, $printtitle);
  1048.     if ($print){
  1049.         $bgcolor=$bgcolorH=$bgcolorL='#FFFFFF';
  1050.         $bordercolor                ='#000000';
  1051.         $cellspacing                 = 0;
  1052.         $rowheight                    = $q->param('rowheight');
  1053.         $headerheight                = $q->param('headerheight');
  1054.         $bordercolorlight             = qq!bordercolorlight="#000000"!;
  1055.         $bordercolordark              = qq!bordercolordark="#000000"!;
  1056.         $border                        = '1';
  1057.         my $title                    = quoteit($q->param('title'));
  1058.         if ($title){
  1059.             my $align                = $q->param('align');
  1060.             my @style                = $q->param('style');
  1061.             
  1062.             foreach(@style){
  1063.                 $title = "<$_>$title</$_>"
  1064.             }                    
  1065.             $printtitle                = "<DIV ALIGN=$align><CODE>$title</CODE></DIV><P>"
  1066.         }
  1067.         $printtitle .= "\n$demomsg2";
  1068.     }
  1069.     else {
  1070.         $bgcolor                      = '#EEEEEE';
  1071.         $bgcolorH                     = '#EEEEEE';
  1072.         $bgcolorL                     = '#CCCCCC';
  1073.         $bordercolor                 = '#CCCCCC';
  1074.         $cellspacing                 = 2;
  1075.         $border                        = '0';
  1076.         $bordercolorlight             = "";
  1077.         $bordercolordark              = "";
  1078.  
  1079.     }
  1080.     for(my $i=0; $i < $sth->{NUM_OF_FIELDS}; $i++) {
  1081.         if ($_[2] and $pri->[$i] and !$print){
  1082.             $array->[0][$i+1] = qq!<TH BGCOLOR="$bgcolorH"><FONT COLOR="#FF0000">$sth->{NAME}[$i]</FONT></TH>!;
  1083.         }
  1084.         else{
  1085.             $array->[0][$i+1] = qq!<TH BGCOLOR="$bgcolorH"><FONT COLOR="#000000">$sth->{NAME}[$i]</FONT></TH>!;
  1086.         }
  1087.     }
  1088.     my $j=1;
  1089.     while (@ary = $sth->fetchrow_array ())    {
  1090.         @ary            = quoteit(@ary);
  1091.         $array->[$j][0] = qq!<TD BGCOLOR="$bgcolorL">!.$offset++ .qq!</TD>! if (defined $_[1] and !$print);
  1092.         for (my $i = 0; $i < @ary; $i++) {
  1093.             $ary[$i] = ' ' if ($ary[$i] eq '' or !defined $ary[$i]);
  1094.             $ary[$i] =~ s/(\r\n)|\n/<BR>/mg;
  1095.             $array->[$j][$i+1] = qq!<TD BGCOLOR="$bgcolor">$ary[$i]</TD>!;
  1096.         }
  1097.         $j++;
  1098.     }
  1099.     unless (defined $array->[0]){$array = [[],[]]}
  1100.     my $result =  "\n<!-- printresult subroutine -->\n";
  1101.     $result    .=  "$printtitle\n";
  1102.     $result    .=  qq!\n\<TABLE BORDER=0  BGCOLOR="$bordercolor" CELLSPACING=0 CELLPADDING=0><TR BGCOLOR="$bordercolor"><TD BGCOLOR="$bordercolor">!;
  1103.     $result       .=  qq!<TABLE BORDER=$border $bordercolorlight $bordercolordark CELLSPACING=$cellspacing CELLPADDING=1>\n!;
  1104.     $result    .= qq!<TR $headerheight>@{$array->[0]}</TR>\n!;
  1105.     for (my $i = 1; $i < @$array; $i++)
  1106.     {$result .=  qq!\t<TR $rowheight>@{$array->[$i]}</TR>\n!;}
  1107.     $result    .= qq!</TABLE></TD>\n!;
  1108.     $result       .= qq!</TR></TABLE>\n!;
  1109.     $result    .= "\n<!-- end of printresult subroutine -->\n";
  1110.     return ($result);
  1111. }
  1112.                         
  1113. sub loadSelectDB {
  1114.     my $databasesref    = getdblist($dbh);
  1115.     my $DBlist;
  1116.     my ($textsize, $textareasize) = $agent ? (16, 35 ) : (25, 50 );
  1117.  
  1118.     if ((not defined $databasesref) and $DBI::err){
  1119.         $DBlist         = $q->scrolling_list(
  1120.                         -labels        => {'' => 'ACCESS DENIED'},
  1121.                         -name        =>'dbname',
  1122.                         -values        =>[''],
  1123.                         -default    =>'',
  1124.                         -size        =>15,
  1125.                         -title        =>'Select database'
  1126.                     );
  1127.     }
  1128.     else {
  1129.         if (@$databasesref == 0){
  1130.             $DBlist     = $q->scrolling_list(
  1131.                         -labels        => {'' => 'List is emplty'},
  1132.                         -name        =>'dbname',
  1133.                         -values        =>[''],
  1134.                         -size        =>15,
  1135.                         -title        =>'Select database'
  1136.                     );
  1137.         }
  1138.         else {
  1139.             $DBlist     = $q->scrolling_list(
  1140.                         -name        =>'dbname',
  1141.                         -values        =>['',@$databasesref],
  1142.                         -default    =>'',
  1143.                         -size        =>15,
  1144.                         -title        =>'Select database'
  1145.                     );
  1146.         }
  1147.     }
  1148.     my $headtab = {
  1149.         name    => 'SELECT DATABASE'
  1150.     };
  1151.     my $SQL = quoteit($q->param('SQL'));
  1152.     print "<FORM METHOD=POST ACTION=\"$full_url\">";
  1153.     printHeaderTable($headtab);            
  1154. print <<EndSelectDB        
  1155.          <INPUT TYPE=HIDDEN NAME="page" VALUE="select_db">
  1156.          <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=1>
  1157.              <TR VALIGN=TOP ALIGN=LEFT>
  1158.                  <TD>
  1159.     <!-- internal BIG table -->
  1160.     <TABLE BORDER=0 BGCOLOR="#AAAAAA" CELLPADDING=1 CELLSPACING=0><TR><TD>    
  1161.     <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  1162.          <TR HEIGHT=220>
  1163.                <TD VALIGN=TOP HEIGHT=220>
  1164. <!-- database list  -->
  1165. $DBlist
  1166.             </TD>             
  1167.                <TD VALIGN=TOP HEIGHT=220>
  1168.          <!-- control table -->
  1169.         <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%">
  1170.             <TR VALIGN=TOP>
  1171.                 <TD VALIGN=TOP><INPUT TYPE=SUBMIT NAME="tableops" VALUE="  CONNECT  " style="Width: 160px" TITLE="Show tables in selected database"><BR><HR SIZE=1></TD>
  1172.             </TR>
  1173.             <TR>
  1174.                 <TD VALIGN=TOP><A><INPUT TYPE=SUBMIT NAME="tableops" VALUE="   Drop Database    " style="width: 160px; color=#CC0000" TITLE="DROP SELECTED DATABASE"></A><BR><HR SIZE=1></TD>
  1175.               </TR>
  1176.             <TR>
  1177.                 <TD VALIGN=TOP><INPUT TYPE=SUBMIT NAME="tableops" VALUE="  Create Database  " style="width: 160px" TITLE="Create new database"></TD>
  1178.             </TR>
  1179.             <TR>
  1180.                 <TD VALIGN=TOP><INPUT TYPE=TEXT SIZE=$textsize NAME="newDB" TITLE="Type the name of the new database to create"  style="width: 160px" 
  1181.                  onFocus="if(this.value=='NEW DATABASE NAME')this.value='';" onBlur="if(this.value=='')this.value='NEW DATABASE NAME';" VALUE="NEW DATABASE NAME"></TD>
  1182.             </TR>
  1183.             <TR>
  1184.                 <TD VALIGN=TOP> </TD>
  1185.             </TR>
  1186.             <TR>
  1187.                 <TD VALIGN=TOP> </TD>
  1188.             </TR>
  1189.             <TR>
  1190.                 <TD VALIGN=TOP><INPUT TYPE=SUBMIT NAME="func" VALUE="  Create Backup  " style="width: 160px" TITLE="Create new database"><BR><HR SIZE=1></TD>
  1191.             </TR>
  1192.             <TR>
  1193.                 <TD VALIGN=TOP><INPUT TYPE=SUBMIT NAME="func" VALUE="     Restore     " style="width: 160px" TITLE="Create new database"></TD>
  1194.             </TR>
  1195.             <TR>
  1196.                 <TD HEIGHT=4></TD>
  1197.             </TR>
  1198.         </TABLE>
  1199. <!-- end of control table -->
  1200.             </TD>
  1201.         </TR>
  1202.       </TABLE>
  1203.     </TD></TR></TABLE>
  1204.     
  1205.                  </TD>
  1206.                  <TD>
  1207. <!-- query table -->
  1208.     <TABLE BORDER=0 BGCOLOR="#AAAAAA" CELLPADDING=1 CELLSPACING=0><TR><TD>    
  1209.     <TABLE BORDER=0 BGCOLOR="#CCCCCC" CELLPADDING=1 CELLSPACING=0>
  1210.         <TR HEIGHT=220 VALIGN=TOP><TD HEIGHT=220 VALIGN=TOP>    
  1211.              
  1212.             <TABLE BORDER=0>
  1213.             <TR>
  1214.                   <TD><INPUT TYPE=SUBMIT NAME="tableops" VALUE="    Execute Query    " style="width: 150px;" TITLE="Execute SQL Statement"></TD>
  1215.             </TR>
  1216.             <TR><TD><TEXTAREA WRAP=PHYSICAL NAME="SQL" ROWS=8 COLS=$textareasize TITLE="Type SQL Statement to execute">$SQL</TEXTAREA></TD>
  1217.               </TR>
  1218.             </TABLE>
  1219.                 
  1220.             
  1221.     </TD></TR></TABLE>
  1222.     </TD></TR></TABLE>
  1223.  
  1224. <!-- end of query table -->                 
  1225.                  </TD>
  1226.              </TR>
  1227.         </TABLE>
  1228. </FORM>
  1229. EndSelectDB
  1230. ;        
  1231. }
  1232.  
  1233. sub belongsb {
  1234. #    syntax: &belong($ref_array, value)    
  1235.     foreach (@{$_[0]}){if ($_[1] eq $_){return 1}}
  1236.     return 0;
  1237. }
  1238. sub belongs {
  1239. #    syntax: &belong($ref_array, value)    
  1240.     foreach (@{$_[0]}){if ($_[1] =~ /^$_$/i){return 1}}
  1241.     return 0;
  1242. }
  1243.  
  1244. sub prepare_execute {
  1245.     my $query     = $_[0];
  1246.     my $sth        = $dbh->prepare($query) || bail_out ("Cannot prepare query:\n$query", $_[1], $_[2]);
  1247.     my $res        = $sth->execute()         || bail_out ("Can not execute query:\n$query", $_[1], $_[2]);
  1248. return ($sth, $res)
  1249. }
  1250.  
  1251. sub count_rows {
  1252. #input: $table = @_[0];
  1253.     my $query    = "SELECT COUNT(*) FROM $_[0]";
  1254.     my $count    = $dbh->selectrow_array($query, \%attr);
  1255.     my $msg     = "WRONG PARAMETERS.";
  1256.     $msg         .= " CHECK YOUR INPUTS!\n\n" if $page =~ /[(insert)|(search)]/;
  1257.     if ($DBI::errstr){
  1258.         my $back;
  1259.         if ($_[1]){bail_out($msg, $_[1],$_[2])}
  1260.         elsif($database) {bail_out($msg, {page => 'select_db', dbname => "$database"})}
  1261.         else {bail_out($msg, {page => 'connect'})}
  1262.     }
  1263.     
  1264.     return ($count)
  1265. }
  1266.  
  1267. sub loadSelectTables {
  1268.     unless ($database or $q->param('dbname')){bail_out("Database is not selected", {page => "connect"})}
  1269.     $query                        = "SHOW TABLES" ;
  1270.     my ($sth, $res)                = &prepare_execute($query, {page => "connect"});
  1271.     my $table;
  1272.     my $i=0;
  1273.     while (my ($y) = $sth->fetchrow_array ())    {
  1274.         $table .= qq!<OPTION VALUE=$y>$y\n!;
  1275.         $i++;
  1276.     }
  1277.     $sth->finish();
  1278.  
  1279.     if ($i == 0){$table .= qq!<OPTION VALUE="">Table list is empty\n!;}
  1280.  
  1281.     my ($wheresize1, $wheresize2, $limitsize) = $agent ?
  1282.         (18, 18, 5) :
  1283.         (31, 31, 8) ;
  1284.     my $buttonwidth     = '123px';
  1285.     my $buttonwidth2    = $buttonwidth * 2;
  1286.  
  1287.  
  1288. print <<EOT
  1289. <FORM METHOD=POST ACTION=$full_url>
  1290. <INPUT TYPE=HIDDEN NAME="page" VALUE="tables">
  1291. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  1292.  
  1293.  
  1294. <TABLE BORDER=0><!-- main table -->
  1295.     <TR>
  1296.         <TD VALIGN=TOP>
  1297.         <TABLE BORDER=0 WIDTH="100%"><!-- left table -->
  1298.             <TR>
  1299.                 <TH ALIGN=LEFT> TABLES IN "$database"</TH>
  1300.             </TR>
  1301.             <TR>
  1302.                 <TD>
  1303. <SELECT NAME="tables" SIZE=13 MULTIPLE>
  1304. $table
  1305. </SELECT></TD>
  1306.             </TR>        
  1307.         </TABLE>
  1308. <!-- EXTENDER --><TABLE BORDER=0 WIDTH=210 CELLPADDING=0 CELLSPACING=0><TR><TD> </TD></TR></TABLE>
  1309.         </TD>
  1310.         <TD  VALIGN=TOP>
  1311. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><!-- right table-->
  1312.     <TR>
  1313.         <TD>
  1314.         
  1315. <!-- SEARCH-MODIFY -->
  1316.  
  1317.          <!-- BORDER START -->
  1318.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  1319.             <TR>
  1320.                 <TD width="100%"><TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD>
  1321.  
  1322.  
  1323.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  1324.                 <TR>
  1325.                     <TD><INPUT TYPE=SUBMIT NAME="func" VALUE="Search/Modify"     style="width: $buttonwidth" TITLE="Search/Modify records in selected table"></TD>
  1326.                     <TD><INPUT TYPE=SUBMIT NAME="func" VALUE="       DDL      "    style="width: $buttonwidth" TITLE="Generate CREATE TABLE statements for selected tables"></TD>
  1327.                     <TD><INPUT TYPE=SUBMIT NAME="func" VALUE="    IMPORT    "    style="width: $buttonwidth" TITLE="Import data into table from ASCII file"></TD>
  1328.                     <TD><INPUT TYPE=SUBMIT NAME="func" VALUE="    EXPORT   "    style="width: $buttonwidth" TITLE="Export data from table into ASCII file"></TD>
  1329.                 </TR>
  1330.             </TABLE>
  1331.             <!-- BORDER END --></TD></TR></TABLE></TD></TR></TABLE>
  1332.             
  1333. <!-- END OF SEARCH-MODIFY -->
  1334.         
  1335.         </TD>
  1336.     </TR>
  1337.     <TR>
  1338.         <TD HEIGHT=2></TD>
  1339.     </TR>
  1340.     <TR>        
  1341.         <TD>
  1342.         
  1343.         
  1344. <!-- DESCRIBE, INSERT, ALTER, CREATE -->
  1345.         <!-- BORDER START -->
  1346.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  1347.             <TR>
  1348.                 <TD WIDTH="100%"><TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD>
  1349.  
  1350.             
  1351.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>        
  1352.                 <TR><TD><INPUT TYPE=SUBMIT NAME="func" VALUE="DESCRIBE"  style="width: $buttonwidth" TITLE="List columns for selected tables"></TD>
  1353.                     <TD><INPUT TYPE=SUBMIT NAME="func" VALUE="  INSERT  " style="width: $buttonwidth" TITLE="Insert new record into selected table"></TD>
  1354.                     <TD><INPUT TYPE=SUBMIT NAME="func" VALUE="   ALTER  "  style="width: $buttonwidth" TITLE="Alter selected table"></TD>
  1355.                     <TD><INPUT TYPE=SUBMIT NAME="func" VALUE="  CREATE  "  style="width: $buttonwidth" TITLE="Create new table"></TD>
  1356.                 </TR>
  1357.             </TABLE>
  1358.             <!-- BORDER END --></TD></TR></TABLE></TD></TR></TABLE>
  1359.             
  1360. <!-- END OF DESCRIBE, INSERT, ALTER, CREATE -->            
  1361.         </TD>
  1362.     </TR>
  1363.     <TR>
  1364.         <TD HEIGHT=2></TD>
  1365.     </TR>
  1366.     <TR>        
  1367.         <TD>
  1368. <!-- UPDATE -->
  1369.  
  1370.         <!-- BORDER START -->
  1371.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  1372.             <TR>
  1373.                 <TD WIDTH="100%"><TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD>
  1374.  
  1375.  
  1376.             <TABLE BORDER=0  CELLPADDING=0 CELLSPACING=0>
  1377.                 <TR><TD WIDTH=100><INPUT TYPE=SUBMIT NAME="func" VALUE="  UPDATE "  style="width: $buttonwidth"  TITLE="Edit records in selected table"></TD>
  1378.                     <TD> where <INPUT TYPE=TEXT NAME="updateWhere" VALUE="" SIZE=$wheresize1 TITLE="Define which records to display for editing"></TD>
  1379.                     <TD> limit <INPUT TYPE=TEXT NAME="updateLimit" VALUE="0,$UpdateRows" SIZE=$limitsize TITLE="Define start record and number of records to be displayed"></TD>
  1380.                 </TR>
  1381.             </TABLE>
  1382.             <TABLE BORDER=0  CELLPADDING=0 CELLSPACING=0 WIDTH="100%">
  1383.                 <TR><TD HEIGHT=2 COLSPAN=3></TD>
  1384.                 </TR> 
  1385.  
  1386.             <!--    <TR><TD WIDTH=10> </TD>
  1387.                     <TD> order by <INPUT TYPE=TEXT NAME="updateOrder" VALUE="" SIZE=10> </TD>
  1388.                     <TD> offset <INPUT TYPE="TEXT" NAME="updateStart" VALUE="0" SIZE=5> rows <INPUT TYPE=TEXT NAME="updateRows" VALUE="$UpdateRows" SIZE=5 MAXLENGTH=3></TD>
  1389.                 </TR> -->
  1390.             </TABLE>
  1391.             
  1392.              <!-- BORDER END --></TD></TR></TABLE></TD></TR></TABLE>
  1393.             
  1394. <!-- END OF UPDATE -->
  1395.         </TD>
  1396.     </TR>
  1397.     <TR>
  1398.         <TD HEIGHT=2></TD>
  1399.     </TR>
  1400.     <TR>
  1401.         <TD>
  1402. <!-- SELECT -->    
  1403.          <!-- BORDER START -->
  1404.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  1405.             <TR>
  1406.                 <TD width="100%"><TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD>
  1407.         
  1408.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 BGCOLOR="#CCCCCC">
  1409.                 <TR>
  1410.                     <TD WIDTH=100><INPUT TYPE=SUBMIT NAME="func" VALUE="SELECT all" style="width: $buttonwidth"  TITLE="Show records in selected tables"></TD>
  1411.                     <TD> where <INPUT TYPE=TEXT NAME="where" VALUE="" SIZE=$wheresize1 TITLE="Define which records to be displayed"></TD>
  1412.                     <TD> limit <INPUT TYPE=TEXT NAME="limit" VALUE="0,$SelectRows" SIZE=$limitsize TITLE="Define start record and number of records to be displayed"></TD>
  1413.                 </TR>
  1414.             </TABLE>
  1415.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%" BGCOLOR="#CCCCCC">
  1416.                 <TR><TD HEIGHT=2 COLSPAN=5></TD>
  1417.                 </TR> 
  1418.             <!--    <TR><TD WIDTH=10> </TD>
  1419.                     <TD ALIGN=RIGHT>group by </TD>
  1420.                     <TD><INPUT TYPE=TEXT NAME="groupby" SIZE=11  TITLE="Define the columns to group selected records by"> </TD>
  1421.                     <TD ALIGN=RIGHT>order by </TD>
  1422.                     <TD><INPUT TYPE=TEXT NAME="orderby" SIZE=11 TITLE="Define the columns to order selected records by"> </TD>
  1423.                     <TD>limit </TD>
  1424.                     <TD> </TD>
  1425.                 </TR>    -->
  1426.             </TABLE> <!-- BORDER END --></TD></TR></TABLE></TD></TR></TABLE>
  1427. <!-- END OF SELECT -->
  1428.         </TD>
  1429.     </TR>                
  1430.     <TR><TD HEIGHT=2></TD>
  1431.     </TR>
  1432.     <TR>
  1433.         <TD>
  1434. <!-- DELETE -->
  1435.  
  1436.          <!-- BORDER START -->
  1437.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  1438.             <TR>
  1439.                 <TD width="100%"><TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD>
  1440.  
  1441.  
  1442.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%">
  1443.                 <TR>
  1444.                     <TD WIDTH=100><INPUT TYPE=SUBMIT NAME="func" VALUE="  DELETE  " style="width: $buttonwidth; color: #CC0000"  TITLE="DELETE RECORDS FROM SELECTED TABLE"></TD>
  1445.                     <TD> where <INPUT TYPE=TEXT NAME="wheredelete" VALUE="" TITLE="Define which record to delete from selected table.\nIF THIS FIELD IS BLANK, ALL RECORDS WILL BE DELETED" SIZE=$wheresize2></TD>
  1446.                 </TR>
  1447.             </TABLE>
  1448.             <!-- BORDER END --></TD></TR></TABLE></TD></TR></TABLE>
  1449. <!-- END OF DELETE -->
  1450.         </TD>
  1451.     </TR>
  1452.     <TR><TD HEIGHT=2></TD>
  1453.     </TR>
  1454.     <TR>
  1455.         <TD>
  1456. <!-- DROP -->
  1457.  
  1458.          <!-- BORDER START -->
  1459.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  1460.             <TR>
  1461.                 <TD width="100%"><TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD>
  1462.  
  1463.  
  1464.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%">
  1465.                 <TR>
  1466.                     <TD WIDTH=100><INPUT TYPE=SUBMIT NAME="func" VALUE="   DROP   "  style="width: $buttonwidth; color: #CC0000" TITLE="DROP SELECTED TABLES"></TD>
  1467.                 </TR>
  1468.             </TABLE>
  1469.             <!-- BORDER END --></TD></TR></TABLE></TD></TR></TABLE>
  1470. <!-- END OF DROP -->
  1471.         </TD>
  1472.     </TR>
  1473.     <TR><TD HEIGHT=2></TD>
  1474.     <TR>            
  1475.         <TD>
  1476. <!-- EXECUTE SCRIPT CONTROL -->
  1477.  
  1478.          <!-- BORDER START -->
  1479.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  1480.             <TR>
  1481.                 <TD width="100%"><TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD>
  1482.  
  1483.  
  1484.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%">
  1485.                 <TR>
  1486.                     <TD WIDTH="25%"><INPUT TYPE=SUBMIT NAME="func" VALUE="SQL SCRIPTS" style="width: $buttonwidth" TITLE="CREATE, RUN AND SAVE SQL SCRIPTS"></TD>
  1487.                     <TD WIDTH="25%"><INPUT TYPE=SUBMIT NAME="func" VALUE=" BACKUP DB " style="width: $buttonwidth" TITLE="CREATE DUMP FILES"></TD>
  1488.                     <TD WIDTH="25%"><INPUT TYPE=SUBMIT NAME="func" VALUE="RESTORE DB " style="width: $buttonwidth" TITLE="RESTORE FROM DUMP FILES"></TD>
  1489.                     <TD WIDTH="25%"></TD>
  1490.                 </TR>
  1491.             </TABLE>
  1492.             <!-- BORDER END --></TD></TR></TABLE></TD></TR></TABLE>
  1493. <!-- END EXECUTE SCRIPT CONTROL -->        
  1494.         
  1495.         
  1496.         </TD>
  1497.     </TR>
  1498. </TABLE> <!-- END OF RIGHT INNER TABLE -->
  1499.  
  1500.         </TD>
  1501.     </TR>
  1502. </TABLE><!-- END OF MAIN TABLE -->
  1503. </FORM>
  1504. EOT
  1505. ;
  1506.  
  1507.     return
  1508. }
  1509.  
  1510. sub execDescribeTables {
  1511.     print "\n<!-- Describe procedure starts here -->\n";
  1512.     my $headtab = {name    => 'DESCRIBE'};
  1513.     printHeaderTable({name => 'DESCRIBE'});
  1514.     my @tabs = $q->param('tables');
  1515.     if (@tabs == 0 or !$tabs[0]){
  1516.         bail_out ("Table is not specified.", {page => 'select_db', dbname => "$database"});
  1517.     }
  1518.     
  1519. AA:    foreach my $table (@tabs) {
  1520.         print qq!<CODE TITLE="Colums and keys info on table "$table"">TABLE:  $table</CODE><BR>!;
  1521.         my @query = ("DESCRIBE $table", "SHOW INDEX FROM $table");
  1522.         foreach (@query) {
  1523.             my $sth = $dbh->prepare($_);
  1524.             my $res = $sth->execute();
  1525.             if ($DBI::err) {
  1526.                 print "<BR><B>Error $DBI::err (", quoteit($DBI::errstr),")</B><P>";
  1527.                 $sth->finish;
  1528.                 next AA;
  1529.             }
  1530.             print &printresult(\$sth);
  1531.             if ($DBI::err) {ErrMessage ("(Table $table)Print Result Error. $DBI::err $DBI::errstr")}
  1532.             print "<BR>";
  1533.             $sth->finish;
  1534.         }
  1535.         print "\n<HR SIZE=1 LENGTH=700><P>\n"    
  1536.     }
  1537.     print "\n<!-- Describe procedure ends here -->\n";
  1538.     return;
  1539. }
  1540.     
  1541. sub    loadInsertForm {
  1542. # INSERT / SEARCH / EDIT DATA FORM
  1543.     print "<!-- Insert/Search/Modify procedure starts here -->" unless $q->param('update');
  1544.     my @tabs = $q->param('tables');
  1545.     my $array;
  1546.     my $back = {dbname => "$database", page => "select_db"};
  1547.  
  1548.     if ((@tabs == 0) or !$tabs[0]){
  1549.         bail_out("Table is not specified.", $back);
  1550.     }
  1551.     elsif  (@tabs >=2) {
  1552.         bail_out("Too many tables were selected.", $back);
  1553.     }
  1554.     $back->{tables}    = "$tabs[0]";
  1555.     $back->{page}    = '';
  1556.     $back->{func}    = 'return';
  1557.     
  1558.     my $ProcName;
  1559.     my $func = $q->param('func');
  1560.     my $editdata;
  1561.     my $goback;
  1562.     my ($hiddeninput, $hiddeninput1);
  1563.     my $msg         = $_[0];
  1564.     my $rowhint;
  1565.     
  1566.     if ($page eq 'searchresult')  {
  1567.         my @fields         = $q->param('fields');
  1568.         my $where         = $q->param('where');
  1569.         my $order         = $q->param('order');
  1570.         my $start         = $q->param('start');
  1571.         my $rows          = $q->param('rows');
  1572.         my $where_        = quoteit($where);
  1573.         my $count        = $q->param('count');
  1574.         $hiddeninput = $q->hidden(-name=>'fields', -value=>\@fields, -override=>1);
  1575.         $hiddeninput .= <<EndOfInsHidden
  1576. <INPUT TYPE=HIDDEN NAME="order" VALUE="$order">
  1577. <INPUT TYPE=HIDDEN NAME="where" VALUE="$where_">
  1578. <INPUT TYPE=HIDDEN NAME="start" VALUE="$start">
  1579. <INPUT TYPE=HIDDEN NAME="rows" VALUE="$rows">
  1580. <INPUT TYPE=HIDDEN NAME="count" VALUE="$count">
  1581. EndOfInsHidden
  1582. ;
  1583.          $hiddeninput1 = $hiddeninput unless ($func =~ /back/i);
  1584.  
  1585.         $back->{page}    = 'searchresult';
  1586.         $back->{start}    = "$start";
  1587.         $back->{rows}     = "$rows";
  1588.         $back->{fields}    = \@fields;
  1589.         $back->{where}    = "$where";
  1590.         $back->{order}    = "$order";
  1591.  
  1592.         $goback = <<EndGoBack
  1593. <FORM ACTION="$full_url" METHOD=POST>
  1594. <INPUT TYPE=SUBMIT VALUE="Back to search result" TITLE="Go back to Search Result page" style="width: 190px">
  1595. <INPUT TYPE=HIDDEN NAME="tables" VALUE="$tabs[0]">
  1596. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  1597. <INPUT TYPE=HIDDEN NAME="func" VALUE="return">
  1598. <INPUT TYPE=HIDDEN NAME="page" VALUE="searchresult">
  1599. $hiddeninput
  1600. </FORM>
  1601. EndGoBack
  1602. ;
  1603.         if ($func =~ /^\s*edit/i){
  1604.             $rowhint = 'Edit this value';
  1605.             my $query;
  1606.             my @updatewhere;
  1607.             my @selectrow        = $q->param('SelectRow');
  1608.             if (@selectrow and !$msg){
  1609.                 $msg = "<CODE>ROW No $selectrow[0]</CODE>"
  1610.             } 
  1611.             if ($q->param('update')){
  1612.                 @updatewhere = $q->param('updatewhere');
  1613.                 $where = shift @updatewhere; #process curent row
  1614.                 execSearchupdate($back, $where);
  1615.                 unless (@updatewhere) {searchresult(); return}
  1616.             }
  1617.             else {
  1618.  
  1619.                 bail_out('Please select a row(s)', $back) unless (@selectrow);
  1620.                 $query         = "SELECT *  FROM $tabs[0]";
  1621.                 $query         .= " $where" if $where;
  1622.                 $query         .= " $order";
  1623.                 my $callgetwhere = {
  1624.                     count => "$count", 
  1625.                     table => "$tabs[0]", 
  1626.                     start => "$start", 
  1627.                     rows => "$rows", 
  1628.                     query => "$query", 
  1629.                     back => $back, 
  1630.                     returnarray => 1
  1631.                 };
  1632.                 my $updatewhere     = getwhere($callgetwhere);
  1633.                 @updatewhere        = @$updatewhere;
  1634.             }
  1635.             my $selectedrow = $selectrow[0] + 1;
  1636.             $hiddeninput1 .= qq!<INPUT TYPE=HIDDEN NAME="SelectRow" VALUE="$selectedrow">\n!; 
  1637.             $where = $updatewhere[0];  #show next row
  1638.             $query    = "SELECT * FROM $tabs[0] WHERE $where";
  1639.             $ProcName         = 'EDIT RECORD';
  1640.             $func               = 'edit';
  1641. #            print "QUERY = $query<BR>";
  1642.             my($sth,$res)    = prepare_execute($query, {page=>'select_db', dbname=>"$database"});
  1643.             bail_out("Too many results. Please report this event to tech\@edatanew.com", $back ) if ($res > 1);
  1644.             bail_out("Record was not found. Please report this event to tech\@edatanew.com", $back) if ($res == 0);
  1645.             $editdata = $sth->fetchrow_hashref();
  1646.             $sth->finish;
  1647.             foreach (@updatewhere){$hiddeninput1 .= qq!<INPUT TYPE=HIDDEN NAME="updatewhere" VALUE="$_">\n!;}
  1648.             $hiddeninput1 .= qq!<INPUT TYPE=HIDDEN NAME="update" VALUE="1">!; 
  1649.         }
  1650.         elsif ($func =~ /new/i){$func = 'insert'}
  1651.         elsif ($func =~ /back/i){$func = 'search'; $page= 'search';}
  1652.     }
  1653.     elsif ($page eq 'tables'){
  1654.         if($func =~ /insert/i){$func= 'insert'; $page= 'insert';}
  1655.         if($func =~ /search/i){$func= 'search'; $page= 'search';}
  1656.     }
  1657.     if($func eq 'insert'){
  1658.         $ProcName = 'INSERT DATA';
  1659.         $rowhint  = 'Type new value to insert'; 
  1660.     }
  1661.     elsif ($func =~ /^\s*search/i or $page eq 'search'){
  1662.         $ProcName = 'SEARCH RECORDS';$func= 'search';
  1663.         $rowhint  = 'Type search pattern or values (delimited by comma, if applicable)';
  1664.     }
  1665.     
  1666.     my $query         = "DESCRIBE $tabs[0]";
  1667.     my $sth            = $dbh->prepare($query) || bail_out("Cannot prepare query:\n$query",{page => 'select_db', dbname => "$database"});
  1668.     my $res            = $sth->execute         || bail_out("Cannot execute query:\n$query",{page => 'select_db', dbname => "$database"});
  1669.     my $count        = count_rows($tabs[0],{page => 'select_db', dbname => "$database"});
  1670.     my $textsize;
  1671.     my $textareasize;
  1672.     my $namelist;
  1673.     my $insertOptions;
  1674.     my $showfields;
  1675.     my $delayed        = qq!<I>Delayed</I><INPUT TYPE=RADIO NAME="insert_option1" VALUE="DELAYED" TITLE="Delayed Insertion">!    if $func eq 'insert';
  1676.     
  1677.     $array->[0][0]    = qq!<TH ALIGN=LEFT> $sth->{NAME}->[0]</TH>!;
  1678.  
  1679.     # CORRECT THIS LINE TO USE UNQUOTED DATA FOR SEARCHING (DELETE unless CONDITION).
  1680.     $array->[0][1]    = qq!<TH> Unquoted <BR>Data<BR>(funcion)</TH>!             unless ($func eq 'search');
  1681.  
  1682.     $array->[0][2]    = qq!<TH> Upload </TH>!                                     unless ($func eq 'search');
  1683.     $array->[0][3]    = qq!<TH ALIGN=CENTER>I n s e r t  D a t a</TH>!             if $func eq 'insert';
  1684.     $array->[0][3]    = qq!<TH ALIGN=CENTER>S e a r c h  P a t t e r n</TH>!     if $func eq 'search';
  1685.     $array->[0][3]    = qq!<TH ALIGN=CENTER>M o d i f y  D a t a</TH>!             if $func eq 'edit';
  1686.     
  1687.     my $i;
  1688.     if ($func eq 'search'){
  1689.         $array->[0][5]    = qq!<TH ALIGN=CENTER COLSPAN=2 ALIGN=TOP>Advanced search</TH>!;
  1690.         $textsize        = $agent ? 18 : 31;
  1691.         $textareasize    = $agent ? 17 : 30;
  1692.         $namelist        = qq!<SELECT NAME="sort" TITLE="Select column to sort by">\n<OPTION VALUE="">\n!;
  1693.     }
  1694.     else {
  1695.         for ($i=1; $i<($sth->{NUM_OF_FIELDS}-1); $i++) {
  1696.             $array->[0][$i+3] = qq!<TH ALIGN=CENTER> $sth->{NAME}->[$i] </TH>\n!;
  1697.         }
  1698.         $textsize        = $agent ? 36 : 60;
  1699.         $textareasize    = $agent ? 35 : 59;
  1700.     }
  1701.     my $textflag;
  1702.     my $bottomMessage;
  1703.     my $j = 1;
  1704.     while (@ary = $sth->fetchrow_array ())    {
  1705.         my $k=$j-1;
  1706.         ($ary[1],$ary[4],$editdata->{$ary[0]}) = quoteit($ary[1],$ary[4],$editdata->{$ary[0]});
  1707.         my $value = $editdata->{$ary[0]};
  1708.         $array->[$j][0]= qq!<TD> <B>$ary[0] </B></TD>!;
  1709.         if ($ary[1] =~ /^\s*enum/ or $ary[1] =~ /^\s*set/){
  1710.            $array->[$j][1]= qq!<TD ALIGN=CENTER> - </TD>!;
  1711.         }
  1712.         else {
  1713.  
  1714.             $array->[$j][1]= qq!<TD ALIGN=CENTER> <INPUT TYPE=CHECKBOX NAME="unquote" VALUE="$ary[0]" TITLE="Check to insert Functions"> </TD>!;
  1715.         }
  1716.         my $ary1 = $ary[1];
  1717.         $ary1 =~ s/^\s*//;
  1718.         $ary1 =~ s/\W.*//g;
  1719.         my $type = $ary[1];
  1720.         if (belongs(\@textdata, $ary1)){
  1721.             if ($func eq 'search'){
  1722.                 $array->[$j][3]= qq!<TD> <TEXTAREA NAME="$ary[0]_data" COLS=$textareasize ROWS=1 WRAP=OFF TITLE="$rowhint"></TEXTAREA> </TD>\n!;
  1723.             }
  1724.             else {
  1725.                 $array->[$j][2]    = qq!<TD ALIGN=CENTER> <INPUT TYPE = CHECKBOX \t NAME = "upload"\tVALUE = "$ary[0]" TITLE="Check to upload file"> </TD>!;
  1726.                 $array->[$j][3]    = qq!<TD><TEXTAREA NAME="$ary[0]_data" COLS=$textareasize ROWS=5 WRAP=OFF TITLE="$rowhint">$editdata->{$ary[0]}</TEXTAREA> <BR>\n!;
  1727.                 $array->[$j][3] .= qq! <INPUT TYPE=FILE \t\t NAME="$ary[0]_data_upload" \tVALUE="" TITLE="Select file to upload"> </TD>!;
  1728.                 $textflag = 1;
  1729.             }
  1730.         } 
  1731.         elsif($ary[1] =~ /^\s*enum\s*\((.*)\)/){
  1732.             $type = 'enum';
  1733.             $array->[$j][2]        = qq!<TD ALIGN=CENTER> - </TD>!;
  1734.             $array->[$j][3]        = qq!<TD> <SELECT NAME="$ary[0]_data" TITLE="Select value">\n!;
  1735.             $array->[$j][3]     .= qq!\t<OPTION VALUE="">\n!;
  1736.             my @enumval = split ',',$1;
  1737.             foreach (@enumval){
  1738.                 s/^'(.*)'$/$1/;
  1739.                 s/''/'/g;
  1740.                 my $selected    = 'SELECTED' if (($_ eq $editdata->{$ary[0]}) and ($func eq 'edit'));
  1741.                 $array->[$j][3]    .= qq!\t<OPTION VALUE="$_" $selected>$_\n!;
  1742.             }
  1743.             $array->[$j][3]        .= qq!</SELECT> </TD>!;
  1744.         }
  1745.         else {
  1746.              $array->[$j][2]    = qq!<TD ALIGN=CENTER> - </TD>!;
  1747.              $array->[$j][3]    = qq!<TD><INPUT TYPE=TEXT \t\t NAME="$ary[0]_data"\tVALUE="$editdata->{$ary[0]}" SIZE=$textsize TITLE="$rowhint"></TD>!;
  1748.         }
  1749.         if ($func eq 'search'){
  1750.             
  1751.             #DELETE THIS LINE IF YOU NEED TO SEARCH BY UNQUOTED DATA
  1752.             $array->[$j][1] = ''; 
  1753.             
  1754.             #THE REMARKED 'OPTIONS' ARE SUPPORTED BY THE PROGRAM. UNREMARK THEM IF NEEDED.
  1755.             
  1756.             $array->[$j][6]        = qq!<TD ALIGN=LEFT> <EM>$type</EM> </TD>!;
  1757.             my $typename        = $ary[1];
  1758.             $typename            =~ s/^\s*([a-zA-z])\s*\W.*//i;
  1759.             $namelist            .= qq!<OPTION VALUE="$ary[0]">$ary[0]\n!;
  1760.             $showfields            .= qq!<OPTION VALUE="$ary[0]" SELECTED>$ary[0]\n!;
  1761.             my $oper_options    = qq!<OPTION VALUE="">\n!;
  1762.             $oper_options         .= qq!<OPTION VALUE="start">Starts with\n!    unless ($type eq 'enum');
  1763.             $oper_options         .= qq!<OPTION VALUE="end">Ends with\n!        unless ($type eq 'enum');
  1764.             $oper_options         .= qq!<OPTION VALUE="AND">AND (ALL)\n!        unless ($type eq 'enum');
  1765.             $oper_options         .= qq!<OPTION VALUE="OR">OR (ANY)\n!        unless ($type eq 'enum');
  1766.             $oper_options         .= qq!<OPTION VALUE=">">>\n!;
  1767. #            $oper_options         .= qq!<OPTION VALUE=">=">>=\n!;
  1768.             $oper_options         .= qq!<OPTION VALUE="<"><\n!;
  1769. #            $oper_options         .= qq!<OPTION VALUE="<="><=\n!;
  1770.             $oper_options         .= qq!<OPTION VALUE="=">=\n!;
  1771.             $oper_options         .= qq!<OPTION VALUE="BETWEEN">BETWEEN\n!    unless (($type eq 'enum') or (!check_version("3.21.2")));
  1772.             $oper_options         .= qq!<OPTION VALUE="IN">IN\n!                unless ($type eq 'enum');
  1773. #            $oper_options         .= qq!<OPTION VALUE="REGEXP">REGEXP\n!        unless ($type eq 'enum');
  1774. #            $oper_options         .= qq!<OPTION VALUE="LIKE">LIKE\n!;
  1775.             $oper_options         .= qq!<OPTION VALUE="NULL">NULL\n!;
  1776. #            $oper_options         .= qq!<OPTION VALUE="FUNCTION">FUNCTION\n!;
  1777.  
  1778.             $array->[$j][$i+4] =
  1779.             qq!<TD> <SELECT NAME="operator_$ary[0]" TITLE="Select search criterion">$oper_options</SELECT> </TD>!;
  1780.         
  1781.                 my $matchcase        = qq!<INPUT TYPE=CHECKBOX NAME="case_$ary[0]" TITLE="Case sensitive searching">match case ! if check_version("3.23.00");
  1782.             $array->[$j][$i+5]    = qq!<TD><nobr><INPUT TYPE=CHECKBOX NAME="not_$ary[0]" TITLE="Inverse search criterion">not $matchcase</nobr></TD>!;
  1783.         }        
  1784.         else {
  1785.             my $i;
  1786.             $array->[$j][4]        = qq!<TD ALIGN=LEFT> <EM>$type</EM> </TD>!;
  1787.             for (my $i=2; $i<(@ary - 1); $i++){
  1788.                 my $color1;
  1789.                 my $color2        = "</FONT>";
  1790.                 my $font1        = '<EM>';
  1791.                 my $font2        = '</EM>';
  1792.                 if (($i==3 and ($ary[3] =~ /PRI/)) or ($i == 5 and ($ary[5] =~ /auto/i))){
  1793.                     $color1        = qq!<FONT COLOR = '#CC0000'>!;
  1794.                     $font1        = '';
  1795.                     $font2        = '';
  1796.                 }
  1797.                 $array->[$j][$i+3] = qq!<TD> $font1$color1$ary[$i]$color2$font2 </TD>!;
  1798.             }
  1799.         }
  1800.         
  1801.         $j++;
  1802.     } #WHILE
  1803.     $sth->finish();
  1804.     if ($func eq 'search'){
  1805.         my $rowspan             = $j + 1;
  1806.         my $size                 = $j - 1;
  1807.         $namelist                 .= qq!</SELECT> \n!;
  1808.         $showfields             = qq!<SELECT MULTIPLE NAME="fields" SIZE=$size TITLE="Select columns to be displayed in the result">\n!.$showfields;
  1809.         $showfields             .= qq!</SELECT> \n!;
  1810.         $bottomMessage             = "<LI>The Arguments are <U>comma separated</U>.";
  1811.         my $criterion             = <<EndOfCriterion
  1812. <TABLE BORDER=0 CELLPADDIND=2 CELLSPACING=1>
  1813.     <TR>
  1814.         <TD> 
  1815.         </TD>
  1816.     </TR>
  1817.     <TR>
  1818.         <TD ALIGN=RIGHT>Sort by <BR>$namelist</TD>
  1819.     </TR>
  1820.     <TR>
  1821.         <TD ALIGN=RIGHT>Sort Order <BR><SELECT NAME="sortorder" TITLE="Select between ascending and descending ordering">
  1822. <OPTION VALUE="ASC">Ascending
  1823. <OPTION VALUE="DESC">Descending
  1824. </SELECT> </TD>
  1825.     </TR>
  1826.     <TR>
  1827.         <TD ALIGN=RIGHT HEIGHT=6></TD>
  1828.     </TR>
  1829.     <TR>
  1830.         <TD ALIGN=RIGHT>Start <INPUT TYPE=TEXT SIZE=4 NAME="start" VALUE=0 TITLE="Define record search result displaing will start from"> </TD>
  1831.     </TR>
  1832.     <TR>
  1833.         <TD ALIGN=RIGHT>Hits <INPUT TYPE=TEXT SIZE=4 NAME="rows" VALUE=10 TITLE="Define number of records per page to be displayed"> </TD>
  1834.     </TR>
  1835.     <TR>
  1836.         <TD ALIGN=RIGHT TITLE="Select logical operator OR or AND">logical <SELECT NAME="andor" TITLE="Select logical operator OR or AND">
  1837. <OPTION VALUE="OR" SELECTED>OR
  1838. <OPTION VALUE="AND">AND
  1839. </SELECT> </TD>
  1840.     </TR>
  1841.     <TR>
  1842.         <TD ALIGN=RIGHT>Show columns <BR>in search result <BR>$showfields</TD>
  1843.     </TR>
  1844.  
  1845. </TABLE>
  1846. EndOfCriterion
  1847. ;
  1848.         push @{$array->[0]},"<TD ROWSPAN=$rowspan VALIGN=TOP>$criterion </TD>";
  1849.         push @{$array->[0]},"<TH ALIGN=CENTER> $sth->{NAME}->[1] </TH>\n";
  1850.  
  1851.     }
  1852.     else {
  1853.         my $word = 'UPDATE';
  1854.          
  1855.         if ($func eq 'insert'){
  1856.             my @insmethod = (
  1857.                     $q->radio_group(
  1858.                         -name=>'insmethod', 
  1859.                         -values=>['INSERT'], 
  1860.                         -default=>'INSERT', 
  1861.                         -labels=>{INSERT => ''}
  1862.                         ),
  1863.                     $q->radio_group(
  1864.                         -name=>'insmethod', 
  1865.                         -values=>['REPLACE'], 
  1866.                         -default=>'-', 
  1867.                         -labels=>{REPLACE => ''}
  1868.                         )
  1869.             );
  1870.             
  1871.             $word =  qq![INSERT $insmethod[0] | REPLACE $insmethod[1]]!;
  1872.         }
  1873.         my $ignore = qq![<I> Ignore</I><INPUT TYPE=CHECKBOX NAME="insert_option2" VALUE = "IGNORE" TITLE="Ignore rows that duplicate values for unique keys">]! if (($func eq 'insert') or check_version('3.23.16'));
  1874.         $insertOptions = <<EOT
  1875.             $word [<I> Low_Priority</I><INPUT TYPE=RADIO NAME="insert_option1" VALUE = "LOW_PRIORITY" TITLE="Defer the statement until no clients are reading from the table">
  1876.             $delayed ]
  1877.             $ignore
  1878. EOT
  1879. ;
  1880.         $bottomMessage = <<EOT
  1881.         
  1882. <LI>To import data into<B> Text </B>and <B>Blob</B> fields from local file, select the checkbox "Upload".<BR>
  1883. Otherwise use textatrea to insert data (any information in the file field will be ignored).
  1884. <LI>Check "Unquoted Data" to use SQL functions or numeric values. <BR><U>NEVER USE IT IF YOU ARE NOT SURE WHAT IT DOES</U><BR> 
  1885.  
  1886. EOT
  1887. ;
  1888.     
  1889.     }
  1890.     my $headtab = {
  1891.         name    => "$ProcName",
  1892.         table    => "TABLE \"$tabs[0]\"",
  1893.         rows    => "Total rows: $count",
  1894.         msg        => "$msg"
  1895.     };
  1896.     printHeaderTable($headtab);
  1897.     print <<InsertHead
  1898.     
  1899.  
  1900. <FORM ACTION="$full_url" METHOD="POST"  ENCTYPE="multipart/form-data">
  1901.  
  1902. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 BGCOLOR="#AAAAAA">
  1903.             <TR>
  1904.                 <TD WIDTH="100%">
  1905.                 
  1906. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=1 BGCOLOR="#AAAAAA" WIDTH="100%"><!-- Insert Form Table -->
  1907.  
  1908. InsertHead
  1909. ;
  1910.  
  1911.     foreach (@$array) {
  1912.         ${$_}[2] = '' unless $textflag;
  1913.         print qq!\t<TR BGCOLOR="#CCCCCC" HEIGHT=22>@{$_}</TR>\n!;
  1914.  
  1915.     }
  1916.     print <<InsertBottom
  1917.  
  1918. </TABLE>
  1919. </TD></TR></TABLE>
  1920. <P>
  1921. <INPUT TYPE = HIDDEN NAME="tables" VALUE="$tabs[0]">
  1922. <INPUT TYPE = HIDDEN NAME="page" VALUE="$page">
  1923. <INPUT TYPE = HIDDEN NAME="func" VALUE="$func">
  1924. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  1925. $hiddeninput1
  1926.  
  1927. <!-- Option Table -->
  1928.  
  1929. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  1930.     <TR>
  1931.         <TD><INPUT TYPE = SUBMIT NAME="submit" VALUE="Submit" TITLE="Submit" style="width: 190px"> </TD>
  1932.         <TD><INPUT TYPE=RESET TITLE="Reset form"> </TD>
  1933.         <TD>$insertOptions</TD>
  1934.     </TR>
  1935. </TABLE>
  1936. <!--End of Option Table -->
  1937. </FORM><P>
  1938. $goback
  1939. <UL>
  1940. $bottomMessage
  1941. <!-- loadInsertForm procedure ends here -->
  1942. </UL>
  1943. InsertBottom
  1944. ;
  1945.     return;
  1946. }
  1947.  
  1948. sub loadZoom {
  1949.     my ($table)            = $q->param('tables');
  1950.     my @fields             = $q->param($table.'_fields');
  1951.     my $dbname             = $q->param('dbname');
  1952.     my $updateWhere     = $q->param('updateWhere');
  1953.     my $updateOrder     = $q->param('updateOrder');
  1954.     $updateWhere         = '' unless ($updateWhere =~ /\S/);
  1955.     $updateOrder         = '' unless ($updateOrder =~ /\S/);
  1956.     my $updateRows         = $q->param('updateRows');
  1957.     my $updateStart     = $q->param('updateStart');
  1958.     my $zoomselect         = $q->param('zoomselect');
  1959.     my $where             = $q->param('where');
  1960.     my $order             = $q->param('order');
  1961.     my $start             = $q->param('SelectRow') + 0;
  1962.     my $rows             = 1;
  1963.     $updateRows         = '' if ($updateRows =~ /ALL/i);
  1964.  
  1965.     my $back = {
  1966.         dbname            => "$database",
  1967.         tables            => $table,
  1968.         page            => "tables",
  1969.         func            => "update",
  1970.         updateStart        => $q->param('start'),
  1971.         updateRows        => $q->param('rows'),
  1972.         updateWhere        => "$where",
  1973.         updateOrder        => "$order",
  1974.     };
  1975.     my @hidfields         = $q->param('fields');
  1976.     $back->{"$table\_fields"} = \@hidfields;
  1977.     
  1978.     my $query             = "SELECT $zoomselect FROM $table";
  1979.     $query                 .= " WHERE $where" if $where;
  1980.     $query                 .= " ORDER BY $order" if $order;
  1981.     $query                 .= " LIMIT $start, $rows ";
  1982.     my ($sth,$res)         = prepare_execute($query,$back);
  1983.     my ($array)         = $sth->fetchrow_array() or bail_out ("(zoom) Retrieve Error", $back);
  1984.     $sth->finish();
  1985.     ($array,$updateOrder,$updateWhere,$order,$where) = quoteit($array,$updateOrder,$updateWhere,$order,$where);
  1986.  
  1987.     print qq?\n\n<!-- loadZoom Procedure starts here -->\n\n?;
  1988.     print qq?<FORM METHOD=POST METHOD="$full_url">?;
  1989.     my $headtab = {
  1990.         name    => "UPDATE (Zoom)",
  1991.         table    => "TABLE: $table",
  1992.         rows    => 'row# = '."$start",
  1993.         title2    => "This is column $zoomselect, row number $start"
  1994.     };
  1995.     printHeaderTable($headtab);
  1996.     my $textareasize    = $agent ? 60 : 90;
  1997.     print <<ZoomContinue
  1998. <!-- Update Table -->
  1999. <TABLE BORDER=0>
  2000.     <TR BGCOLOR="#cccccc">
  2001.         <TH BGCOLOR="#EEEEEE">$zoomselect</TH>
  2002.     </TR>
  2003.     <TR VALIGN=TOP>
  2004.         <TD><TEXTAREA ROWS=15 COLS=$textareasize NAME="n0_0" WRAP=OFF TITLE="Edit this value">$array</TEXTAREA></TD>
  2005.     </TR>
  2006. </TABLE>
  2007.  
  2008. <!-- Submit Buttons Table -->
  2009.     <TABLE BORDER=0>
  2010.         <TR>
  2011.             <TD><INPUT TYPE=SUBMIT NAME="update" VALUE="Update"  TITLE="Save changes"></TD>
  2012.             <TD><INPUT TYPE=SUBMIT NAME="reload" VALUE="Zoom Out" TITLE="Go back to Update Page"></TD>
  2013.             <TD><INPUT TYPE=RESET TITLE="Reset form"></TD>
  2014.             <TD WIDTH=15></TD>
  2015.             <TD>UPDATE [ low priority<INPUT TYPE=CHECKBOX NAME="update_option1" VALUE="LOW_PRIORITY" TITLE="Defer the statement until no clients are reading from the table"> ] [
  2016.                               ignore <INPUT TYPE=CHECKBOX NAME="update_option2" VALUE="IGNORE"  TITLE="Ignore rows that duplicate values for unique keys"> ]</TD>
  2017.         </TR>
  2018.     </TABLE>
  2019.  
  2020. <INPUT TYPE=HIDDEN NAME="page" VALUE="update">
  2021. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$dbname">
  2022. <INPUT TYPE=HIDDEN NAME="tables" VALUE="$table">
  2023. <INPUT TYPE=HIDDEN NAME="updateStart" VALUE="$updateStart">
  2024. <INPUT TYPE=HIDDEN NAME="updateRows" VALUE="$updateRows">
  2025. <INPUT TYPE=HIDDEN NAME="updateWhere" VALUE="$updateWhere">
  2026. <INPUT TYPE=HIDDEN NAME="updateOrder" VALUE="$updateOrder">
  2027. <INPUT TYPE=HIDDEN NAME="where" VALUE="$where">
  2028. <INPUT TYPE=HIDDEN NAME="order" VALUE="$order">
  2029. <INPUT TYPE=HIDDEN NAME="start" VALUE="$start">
  2030. <INPUT TYPE=HIDDEN NAME="rows" VALUE="$rows">
  2031. <INPUT TYPE=HIDDEN NAME="fields" VALUE="$zoomselect">
  2032. ZoomContinue
  2033. ;
  2034.     print $q->hidden(    -name=>"$table\_fields",
  2035.                           -default=>[@fields],
  2036.                         -override=>1);
  2037.  
  2038.     print "\n\n</FORM>\n\n<!-- loadZoom Procedure ends here -->\n\n";
  2039.     return
  2040. }
  2041. sub loadUpdateForm {
  2042.     print "<!-- loadUpdateForm Procedure starts here -->\n\n";
  2043.     my @tabs = $q->param('tables');
  2044.     my $back = {dbname => "$database", page => 'select_db'};
  2045.     if  (@tabs >=2) {
  2046.         bail_out("Too many tables were selected!", $back)
  2047.     }
  2048.     if ((@tabs == 0) or !$tabs[0]){
  2049.         bail_out("Table was not specified.", $back);
  2050.     }
  2051.     if ($page eq 'tables') {$back = {page => 'select_db', dbname => "$database"}}
  2052.     elsif ($page eq 'update'){
  2053.         $back->{tables}                = "$tabs[0]";
  2054.         $back->{page}                = "update";
  2055.         $back->{reload}                = "Reload";
  2056.         $back->{updateStart}        = $q->param('start');
  2057.         $back->{updateRows}            = $q->param('rows');
  2058.         $back->{updateWhere}        = $q->param('where');
  2059.         $back->{updateOrder}        = $q->param('order');
  2060.         my @hidfields                 = $q->param('fields');
  2061.         $back->{"$tabs[0]\_fields"}    = \@hidfields;
  2062.     }
  2063.     
  2064.     my $order = $q->param('updateOrder');
  2065.     $order = '' unless ($order =~ /\S/);
  2066.     my $where = $q->param('updateWhere');
  2067.     $where = '' unless ($where =~ /\S/);
  2068.     my $rows; my $start;
  2069.     if (defined $q->param('updateLimit')) {
  2070.         ($start, $rows) = split ',',$q->param('updateLimit')
  2071.     }
  2072.     else {
  2073.         $rows = $q->param('updateRows');
  2074.         $start = $q->param('updateStart');
  2075.     }
  2076.  
  2077.     my $count = count_rows($tabs[0]);
  2078.     $rows = '' if ($rows =~ /ALL/i);
  2079.         
  2080.     my @fields = $q->param("$tabs[0]\_fields");
  2081.     @fields = $q->param("fields") if $q->param('error');
  2082.     my $fields = join (', ', @fields);
  2083.     my $query = "DESCRIBE $tabs[0]";
  2084.     my ($sth,$res) = prepare_execute($query, $back);
  2085.  
  2086.     my @descrlist;
  2087.     my @printType;
  2088.     my @names;
  2089.     my @types;
  2090.     my $enums;
  2091.     my @fullname;
  2092.     my $primary_flag;
  2093.     while (@descrlist = $sth->fetchrow_array()) {
  2094.         $primary_flag = '1' if ($descrlist[3] =~ /pri/i ) ;
  2095.         if (belongs(\@fields,$descrlist[0]) or @fields == 0) {
  2096.             push @printType,$descrlist[1];
  2097.             if (($descrlist[1] =~ /^\s*\w*blob/i) or ($descrlist[1] =~ /^\s*\w*text/i)){push @types, "-1"}
  2098.             elsif($descrlist[1] =~ /^\s*enum\s*\((.*)\)/){
  2099.                 push @types,'enum';
  2100.                 my @enumval = ('',split ',',$1);
  2101.                 @enumval = quoteit(@enumval);
  2102.                 for (my $i = 0; $i < @enumval; $i++){
  2103.                     $enumval[$i] =~ s/^'(.*)'$/$1/;
  2104.                     $enumval[$i] =~ s/''/'/g;
  2105.                     $enums->{$descrlist[0]}[$i] = $enumval[$i];
  2106.                 }
  2107.             }
  2108.             else {push @types, 0}
  2109.             push @names,$descrlist[0];
  2110.         }
  2111.         push @fullname,$descrlist[0];
  2112.     }
  2113.     $sth->finish();
  2114.     
  2115.     my $types = \@types;
  2116.     my $size = scalar @fullname;
  2117.     if (!$fields or ($size == scalar @fields)){$fields = '*'; @fields = @fullname}
  2118.  
  2119.     my ($where_, $order_) = quoteit($where, $order);
  2120.     print $q->start_multipart_form(-method=>"POST",
  2121.                                      -action=>$full_url);
  2122.  
  2123.     my $headtab = {
  2124.         name    => 'UPDATE',
  2125.         table    => "TABLE: $tabs[0]",
  2126.         rows    => "Total rows: $count",
  2127.         msg        => "$_[0]"
  2128.         
  2129.     };
  2130.     my ($wheresize, $textsize, $textareasize) = $agent ? (20, 15, 20 ) : (30, 20, 30 );
  2131.     printHeaderTable($headtab);
  2132.     print qq?
  2133. <TABLE BORDER=0><TR><TD>
  2134.  
  2135.  
  2136.     <!-- Parameter Table -->
  2137.     <TABLE BORDER=0 CELLPADDING=2 WIDTH="100%">
  2138.         <TR>
  2139.             <TD> where <INPUT TYPE=TEXT NAME="updateWhere" VALUE="$where_" SIZE=$wheresize TITLE="Specify records to display"></TD>
  2140.             <TD> order by <INPUT TYPE=TEXT NAME="updateOrder" VALUE="$order_" SIZE=15 TITLE="Specify column to order the records by"></TD>
  2141.             
  2142.             <TD> offset <INPUT TYPE=TEXT NAME="updateStart" VALUE="$start" SIZE=5 TITLE="Specify start record"></TD>
  2143.             <TD> rows <INPUT TYPE=TEXT NAME="updateRows" VALUE="$rows" SIZE=3 MAXLENGTH=3 TITLE="Specify number of records to be displayed"></TD>
  2144.             <TD> <INPUT TYPE=SUBMIT NAME="reload" VALUE="Reload" TITLE="Reload the page applying new display options only."></TD>
  2145.         </TR>
  2146.         <TR>
  2147.             <TD COLSPAN=5 ALIGN=LEFT HEIGHT=6></TD>
  2148.         </TR>
  2149.     </TABLE>
  2150. </TD></TR></TABLE>
  2151. ?;
  2152.  
  2153. print qq?        
  2154. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  2155. <INPUT TYPE=HIDDEN NAME="tables" VALUE="$tabs[0]">
  2156. <INPUT TYPE=HIDDEN NAME="page" VALUE="update">
  2157. <INPUT TYPE=HIDDEN NAME="start" VALUE="$start">
  2158. <INPUT TYPE=HIDDEN NAME="rows" VALUE="$rows">
  2159. <INPUT TYPE=HIDDEN NAME="where" VALUE="$where_">
  2160. <INPUT TYPE=HIDDEN NAME="order" VALUE="$order_">
  2161. ?;
  2162.     foreach (@fields){
  2163.         last if ($fields eq '*');
  2164.         print "<INPUT TYPE=HIDDEN NAME=\"fields\" VALUE=\"$_\">\n";
  2165.     }
  2166.     my $priref;
  2167.     if (($start =~ /[\D]/) or ($rows =~ /[\D]/)) {
  2168.         ErrMessage("<P><B>The values OFFSET and ROWS must be numeric!</B><P>");
  2169.         print $q->hidden(-name=>'error', -value=>'1');
  2170.     }
  2171.     else {
  2172.  
  2173.  
  2174.         $query  = "SELECT $fields FROM $tabs[0]";
  2175.         $query .= " WHERE $where" if $where;
  2176.         $query .= " ORDER BY $order" if $order;
  2177.         $query .= " LIMIT $start, $rows"            if ($start and ($rows or ($rows eq '0')));
  2178.         $query .= " LIMIT $rows"                     if (!$start and ($rows or ($rows eq '0')));
  2179.         $query .= " LIMIT $start, ".($count-$start)    if ($start and (!$rows and ($rows ne '0')));
  2180.  
  2181.         $sth = $dbh->prepare($query) || do {print $q->hidden(-name=>'error', -value=>'1'); ErrMessage("Something wrong")};
  2182.         $res = $sth->execute         || do {print $q->hidden(-name=>'error', -value=>'1'); ErrMessage("Wrong parameters")};
  2183.  
  2184.  
  2185.         $priref = get_mysql_pri($sth);
  2186.         unless (defined $priref){$priref = []}
  2187.         print "<P><B>The Table contains no Data!</B><BR>\n\n" if ($count == 0);
  2188.     }
  2189.     print "<!-- Update Table -->\n\n";
  2190.     print "<TABLE BORDER=0>\n";
  2191.     print "\t<TR BGCOLOR=\"#cccccc\">\n\t\t<TD>  </TD>\n\t\t<TD>    </TD>\n";
  2192.     my $i = 0;
  2193.     my $zoom_ok = '';
  2194.     foreach (@fields) {
  2195.         my $color = '#000000';
  2196.         $color = '#ff0000' if $priref->[$i];
  2197.         my $zoomselect = '';
  2198.         if ($types[$i] == -1) {
  2199.            $zoomselect = qq!<INPUT TYPE=RADIO NAME="zoomselect" VALUE="$_" TITLE="Select column to zoom">! ;
  2200.            $zoom_ok = 1;
  2201.         }
  2202.         print     qq!\t\t<TH BGCOLOR="#EEEEEE"><FONT COLOR="$color"> $zoomselect $_</TH>\n!;
  2203.         $i++;
  2204.     }
  2205.     print "\t</TR>\n";
  2206.  
  2207.     $i = 0;
  2208.     my $j;
  2209.     while (@ary = $sth->fetchrow_array()) {
  2210.         print "\t<TR VALIGN=TOP>\n\t\t<TD>".($i+$start)."</TD>\n";
  2211.         print qq!\t\t<TD><INPUT TYPE="CHECKBOX" NAME="SelectRow" VALUE="!.($i+$start).qq!" TITLE="Select row (to zoom or delete)"></TD>\n!;
  2212.         my $jj=0;
  2213.         for ($j=0; $j<@ary; $j++) {
  2214.             $ary[$j] = quoteit($ary[$j]);
  2215.             if ($types[$jj] == -1){
  2216.                 print "\t\t<TD ALIGN=CENTER>";
  2217.                 print "<TEXTAREA ROWS=2 COLS=$textareasize NAME=\"n".$i."_".$jj."\" WRAP=OFF TITLE=\"Edit this value\">$ary[$j]</TEXTAREA></TD>\n";
  2218.             }
  2219.             elsif ($types[$jj] eq 'enum'){
  2220.                 print "\t\t<TD ALIGN=CENTER><SELECT NAME=\"n".$i."_".$jj."\" TITLE=\"Select another value\">\n";
  2221.                 foreach (@{$enums->{$names[$j]}}) {
  2222.                     my $selected = 'SELECTED' if ($_ eq "$ary[$j]");
  2223.                     print qq!<OPTION VALUE="$_" $selected>$_\n!;
  2224.                 }
  2225.                 print "</SELECT></TD>\n";
  2226.             }
  2227.             else {
  2228.                 print "\t\t<TD ALIGN=CENTER><INPUT TYPE=TEXT NAME=\"n".$i."_".$jj."\" VALUE = \"$ary[$j]\" TITLE=\"Edit this value\" SIZE=$textsize></TD>\n";
  2229.             }
  2230.             $jj++    
  2231.         }#for
  2232.         print "\t</TR>\n";
  2233.         $i++;
  2234.     }#while
  2235.     $sth->finish();
  2236.     my $DBIerr                 = $DBI::err;
  2237.     $DBIerr                 += 0;
  2238.     $DBIerr == 0 or bail_out ("Retrieve Error");
  2239.         
  2240.     print "\t<TR>\n\t\t<TD COLSPAN=\"". (scalar (@$types)+2) ."\"><HR SIZE=\"1\"></TD>\n\t</TR>\n";
  2241.     print "\t<TR>\n\t\t<TD COLSPAN=\"". (scalar (@$types)+2) ."\">Insert new row:</TD>\n\t</TR>\n";
  2242.     print "\t<TR>\n\t\t<TD> </TD>\n\t\t<TD> </TD>\n";
  2243.     @printType = quoteit(@printType);
  2244.     foreach (@printType) {
  2245.         s/^\s*enum.*/enum/i;
  2246.         print "\t\t<TD ALIGN=CENTER>$_</TD>\n";        
  2247.     }
  2248.     print "\t</TR>\n";
  2249.         
  2250.     print "\t<TR>\n\t\t<TD>$count</TD>\n\t\t<TD> </TD>\n";
  2251.     $i = 0;    
  2252.     foreach (@types) {
  2253.         if ($_ == -1){
  2254.            print qq!\t\t<TD ALIGN=CENTER><TEXTAREA WRAP=OFF ROWS=2 COLS =$textareasize NAME="$fields[$i]\_data" TITLE="Insert value"></TEXTAREA></TD>\n!;
  2255.         }
  2256.         elsif ($_ eq 'enum'){
  2257.             print qq!\t\t<TD ALIGN=CENTER><SELECT NAME="$fields[$i]\_data">\n!;
  2258.             foreach (@{$enums->{$names[$i]}}) {
  2259.                 print qq!<OPTION VALUE="$_">$_\n!;
  2260.             }
  2261.                 print "</SELECT></TD>\n";
  2262.         }
  2263.         else {
  2264.             print qq!\t\t<TD ALIGN=CENTER><INPUT TYPE=TEXT NAME="$fields[$i]\_data" TITLE="Insert value" SIZE=$textsize></TD>\n!;
  2265.         }    
  2266.         $i++;
  2267.     }#foreach
  2268.     my $zoombutton = '<INPUT TYPE=SUBMIT NAME="zoom" VALUE="Zoom" TITLE="Zoom selected value">' if $zoom_ok;
  2269.  
  2270.             my @insmethod = (
  2271.                     $q->radio_group(
  2272.                         -name=>'insmethod', 
  2273.                         -values=>['INSERT'], 
  2274.                         -default=>'INSERT', 
  2275.                         -labels=>{INSERT => ''}
  2276.                         ),
  2277.                     $q->radio_group(
  2278.                         -name=>'insmethod', 
  2279.                         -values=>['REPLACE'], 
  2280.                         -default=>'-', 
  2281.                         -labels=>{REPLACE => ''}
  2282.                         )
  2283.             );
  2284.             my $word =  qq![INSERT $insmethod[0] | REPLACE $insmethod[1]]!;
  2285.     print <<EndSubmit
  2286.     </TR>
  2287.          </TABLE>
  2288. <!-- Footer Table Starts Here -->
  2289.  
  2290. <TABLE BORDER=0>
  2291.     <TR>
  2292.         <TD ALIGN=LEFT VALIGN=TOP>
  2293. <!-- PREVIEW -->    
  2294.     <TABLE BORDER=0>
  2295.         <TR>
  2296.             <TD><P><INPUT TYPE=CHECKBOX NAME="preview" TITLE="Check to preview generated command"></TD>
  2297.             <TD VALIGN=MIDDLE TITLE="Check to preview generated command">Preview SQL query.</TD>
  2298.         </TR>
  2299.     </TABLE><BR>        
  2300.         
  2301. <!-- Submit Buttons -->    
  2302.     <TABLE BORDER=0>
  2303.         <TR>
  2304.               <TD><INPUT TYPE=SUBMIT NAME="update" VALUE="Update" TITLE="Update the table"></TD>
  2305.            <TD><INPUT TYPE=SUBMIT NAME="insert" VALUE="Insert" TITLE="Insert new row"></TD>
  2306.            <TD>$zoombutton</TD>
  2307.            <TD><INPUT TYPE=SUBMIT NAME="delete" VALUE="Delete" style="color: #CC0000" TITLE="Delete selected rows"></TD>
  2308.            <TD><INPUT TYPE=RESET TITLE="Reset changes"></TD>
  2309.         </TR>
  2310.     </TABLE>
  2311.  
  2312.     <TABLE BORDER=0>
  2313.         <TR>
  2314.             <TD>UPDATE [ low priority<INPUT TYPE=CHECKBOX NAME="update_option1" VALUE="LOW_PRIORITY" TITLE="Defer the statement until no clients are reading from the table"> ] [
  2315.                               ignore <INPUT TYPE=CHECKBOX NAME="update_option2" VALUE="IGNORE"  TITLE="Ignore rows that duplicate values for unique keys"> ]</TD>
  2316.         </TR>
  2317.         <TR>
  2318.             <TD>$word [ low priority<INPUT TYPE=RADIO NAME="insert_option1" VALUE="low_priority" TITLE="Defer the statement until no clients are reading from the table">/
  2319.                               delayed <INPUT TYPE=RADIO NAME="insert_option1" VALUE="DELAYED" TITLE="Delayed Insertion"> ] [
  2320.                            ignore <INPUT TYPE=CHECKBOX NAME="insert_option2" VALUE="IGNORE"  TITLE="Ignore rows that duplicate values for unique keys"> ]</TD>
  2321.         </TR>
  2322.         <TR>
  2323.             <TD>DELETE [ low priority<INPUT TYPE=CHECKBOX NAME="delete_option1" VALUE="LOW_PRIORITY" TITLE="Defer the statement until no clients are reading from the table"> ]</TD>
  2324.         </TR>
  2325.  
  2326.     </TABLE>
  2327.     </TD><TD VALIGN=TOP>
  2328. <!-- Select columns Table -->
  2329.      <TABLE><TR><TD TITLE="Select columns to display"><B>Select columns</B><BR>
  2330.      
  2331. EndSubmit
  2332. ;    
  2333.     print "<SELECT SIZE=$size NAME=$tabs[0]\_fields MULTIPLE>\n";
  2334.     foreach (@fullname){
  2335.         my $selected = 'SELECTED' if (belongs(\@fields, $_) or !@fields);
  2336.         print qq!<OPTION VALUE="$_" $selected>$_ \n!;
  2337.     }
  2338.     print "\t\t</SELECT></TD>\n\t\t</TR>\n\t</TABLE>\n\n";
  2339.     print "\t\t</TD>\n\t</TR>\n</TABLE><!-- Footer Table Ends Here -->\n\n";
  2340.     print $q->end_form;
  2341.     print "\n\n<!-- loadUpdateForm Procedure ends here -->\n\n";    
  2342.     
  2343. }
  2344. sub execSelectFromTable {
  2345.     my @tabs = $q->param('tables');
  2346.     my $back         = {page => 'select_db', dbname => "$database"};
  2347.     if ((@tabs == 0) or !$tabs[0]){
  2348.         bail_out("Table is not specified.", $back);
  2349.     }
  2350.     print "\n\n<!-- Select from Table procedure starts here -->\n\n";
  2351.     my $dbname        = $q->param ('dbname');
  2352.     my @where         = $q->param ('where');
  2353.     for (my $i=0; $i<@where; $i++){
  2354.         $where[$i] = '' unless ($where[$i] =~ /\S/);
  2355.     }
  2356.  
  2357.     my @groupby     = $q->param ('groupby');
  2358.     my @orderby     = $q->param('orderby');
  2359.     my @select         = $q->param('select');
  2360.     my @limitref     = getlimit(scalar @tabs);
  2361.     
  2362.     my @limit         = @{$limitref[0]};
  2363.     my @offset         = @{$limitref[1]};
  2364.     my @rows         = @{$limitref[2]};
  2365.     my @exclude = $q->param('exclude');
  2366.     if ((@tabs - @exclude) > 1){
  2367.         print <<EOT
  2368. <FORM METHOD=POST ACTION="$full_url">
  2369. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$dbname">
  2370. <INPUT TYPE=HIDDEN NAME="page" VALUE="tables">
  2371. <INPUT TYPE=HIDDEN NAME="func" VALUE="select">
  2372. EOT
  2373. ;
  2374.     }
  2375.     my $i = -1;
  2376.     foreach (@tabs) {
  2377.         $i++;
  2378.         unless (defined $where[$i]) {$where[$i] = $where[0]}
  2379.         
  2380.         my $exclude = qq!    <INPUT TYPE=CHECKBOX NAME="exclude" VALUE="$_" TITLE="Exclude this table next time the page is reloaded"> Exclude! if ((@tabs - @exclude) > 1);
  2381.         next if (belongs (\@exclude, $_));
  2382.         
  2383.         my (
  2384.         $orderby_,
  2385.         $groupby_,
  2386.         $limit_,
  2387.         $select_,
  2388.         $tabs_,
  2389.         $where_,
  2390.         ) = quoteit(
  2391.                                  $orderby[$i],
  2392.                              $groupby[$i],
  2393.                              $limit[$i],
  2394.                              $select[$i],
  2395.                              $tabs[$i],
  2396.                              $where[$i],
  2397.                              );
  2398.         
  2399.  
  2400.         my $tableform =  <<EOT
  2401. <TABLE>
  2402.     <TR>
  2403.         <TD><INPUT TYPE="SUBMIT" VALUE="Go" TITLE="Reload page"></TD>
  2404.         <TD>SELECT</TD>
  2405.         <TD><INPUT TYPE="TEXT" SIZE="10" NAME="select"     VALUE="$select_" TITLE="List of columns and aliases"></TD>
  2406.         <TD>FROM</TD>
  2407.         <TD><INPUT TYPE="TEXT" SIZE="10" NAME="tables"    VALUE="$tabs_" TITLE="List of tables and aliases"></TD>
  2408.         <TD>WHERE</TD>
  2409.         <TD><INPUT TYPE="TEXT" SIZE="10" NAME="where"    VALUE="$where_" TITLE="Specify conditions of WHERE clause"></TD>
  2410.         <TD>GROUP BY</TD>
  2411.         <TD><INPUT TYPE="TEXT" SIZE="10" NAME="groupby"    VALUE="$groupby_" TITLE="Specify columns to group by"></TD>
  2412.         <TD>ORDER BY</TD>
  2413.         <TD><INPUT TYPE="TEXT" SIZE="10" NAME="orderby"    VALUE="$orderby_" TITLE="Specify columns to order by"></TD>
  2414.         <TD>LIMIT</TD>
  2415.         <TD><INPUT TYPE="TEXT" SIZE="10" NAME="limit"    VALUE="$limit_" TITLE="Limit the output"></TD>
  2416.     </TR>
  2417. </TABLE>
  2418. EOT
  2419. ;
  2420.  
  2421.         my @total;
  2422.         my $tabs;
  2423.         my $query         = "SELECT * FROM $_ WHERE 1=0";
  2424.         my $sth        = $dbh->prepare($query);
  2425.         my $res        = $sth->execute();
  2426.         if ($DBI::err){
  2427.             unless ((@tabs - @exclude) > 1){
  2428.                  print <<EOT
  2429. <FORM METHOD=POST ACTION="$full_url">
  2430. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$dbname">
  2431. <INPUT TYPE=HIDDEN NAME="page" VALUE="tables">
  2432. <INPUT TYPE=HIDDEN NAME="func" VALUE="select">
  2433. EOT
  2434. ;
  2435.             }
  2436.             print $tableform;
  2437.             print qq!<code>TABLE: $tabs_</code> $exclude<p>\n!;
  2438.             print qq!<font color="#cc0000"><b>Cannot select from this table</b></font><BR>$DBI::errstr<BR>\n!;
  2439.             print "<hr size=1><BR>\n";
  2440.             unless ((@tabs - @exclude) > 1){
  2441.                 print "\n</FORM>";
  2442.             }
  2443.             next
  2444.         }
  2445.  
  2446.         my $fieldsref         = $sth->{NAME};
  2447.         my $size        = $sth->{NUM_OF_FIELDS};
  2448.         if ($tabs[$i] =~ /\W/){ 
  2449.             my $tables;
  2450.             if ((eval {local $SIG{__DIE__};  $tables = $sth->{mysql_table}}) or (eval {local $SIG{__DIE__};  $tables = $sth->{table}})) {
  2451.                 my @unitabs;
  2452.                 for (my $j=0; $j<$size; $j++){
  2453.                     $fieldsref->[$j] = "$tables->[$j]\.$fieldsref->[$j]" ;
  2454.                     unless (belongs(\@unitabs,$tables->[$j])) {
  2455.                         push @unitabs, $tables->[$j];
  2456.                         push @total, count_rows($tables->[$j]);
  2457.                     }
  2458.                 }
  2459.                 $tabs = join(', ', @unitabs);
  2460.             }
  2461.             else {
  2462.                 unless ((@tabs - @exclude) > 1){
  2463.                      print <<EOT
  2464. <FORM METHOD=POST ACTION="$full_url">
  2465. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$dbname">
  2466. <INPUT TYPE=HIDDEN NAME="page" VALUE="tables">
  2467. <INPUT TYPE=HIDDEN NAME="func" VALUE="select">
  2468. EOT
  2469. ;
  2470.                  }
  2471.                 print $tableform;
  2472.                 print qq!<code>TABLE: $tabs_</code> $exclude<p>\n!;
  2473.                 print qq!<font color="#cc0000"><b>Perl module DBD::mysql must be updated in order to use multiple table names</b></font><BR>\n!;
  2474.                 print "<hr size=1><BR>\n";
  2475.                 unless ((@tabs - @exclude) > 1){
  2476.                     print "\n</FORM>";
  2477.                 }
  2478.  
  2479.                 next
  2480.             }
  2481.         }
  2482.         else {push @total, count_rows($tabs[$i]); $tabs = $tabs[$i]}
  2483.         $sth->finish();
  2484.         my $total        = join(', ',@total);        
  2485.         my @fields         = $q->param("fields_$tabs[$i]");
  2486.         my $fields         = join (', ', @fields);
  2487.         $fields = '*' if (!$fields or ($size == scalar @fields));
  2488.         if ($select[$i]) {$query = "SELECT $select[$i] FROM $tabs[$i] "}
  2489.         else {$query = "SELECT $fields FROM ".$tabs[$i]}
  2490. #        unless (defined $where[$i]) {$where[$i] = $where[0]}
  2491.         $query .= " WHERE $where[$i]"          if ($where[$i]);
  2492.         unless (defined $groupby[$i]) {$groupby[$i] = $groupby[0]}
  2493.         $query .= " GROUP BY $groupby[$i]"       if ($groupby[$i]);
  2494.         unless (defined $orderby[$i]) {$orderby[$i] = $orderby[0]}
  2495.         $query .= " ORDER BY $orderby[$i]"       if ($orderby[$i]);
  2496.  
  2497.         $query .= " LIMIT $limit[$i]" if  ($limit[$i] ne '');
  2498.         my $query_ = quoteit($query);
  2499.         unless ((@tabs - @exclude) > 1){
  2500.             printform({query => $query_});
  2501.             
  2502.              print <<EOT
  2503. <FORM METHOD=POST ACTION="$full_url">
  2504. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$dbname">
  2505. <INPUT TYPE=HIDDEN NAME="page" VALUE="tables">
  2506. <INPUT TYPE=HIDDEN NAME="func" VALUE="select">
  2507. <INPUT TYPE=HIDDEN NAME="query" VALUE="$query_">
  2508. EOT
  2509. ;
  2510.         }
  2511.         print qq!<P TITLE="Executed query">$query_</P>\n!;
  2512.         print $tableform;
  2513.  
  2514.         $sth = $dbh->prepare($query) || ErrMessage; 
  2515.         $res = $sth->execute         || ErrMessage;
  2516.         print <<EOT
  2517. <TABLE BORDER=0>
  2518.     <TR>
  2519.         <TD COLSPAN=2>
  2520.             <TABLE WIDTH=700 BORDER=0>
  2521.                 <TR>
  2522.                     <TD><CODE>TABLE:  $tabs</CODE>$exclude</TD>    
  2523.                     <TD WIDTH=30 ALIGN=RIGHT> </TD>
  2524.                     <TD WIDTH=270><CODE>Total Rows:  $total</CODE></TD>
  2525.                 </TR>
  2526.             </TABLE>
  2527.         </TD>
  2528.     </TR>
  2529.     <TR VALIGN=TOP>
  2530.         <TD VALIGN=TOP><!-- printresult -->
  2531. EOT
  2532. ;
  2533.         print &printresult(\$sth, $offset[$i], 1) unless $DBI::err;
  2534.         
  2535.         $sth->finish();
  2536.         
  2537.         print <<EOT
  2538.         
  2539. <!-- /endprintresult -->
  2540.         </TD>
  2541.         <TD VALIGN=TOP>
  2542.         
  2543. <TABLE>
  2544.     <TR>
  2545.         <TD TITLE="List of selected columns.
  2546. The columns can alternatively be selected from this list"><P><B>SHOW COLUMNS</B></TD>
  2547.     </TR>
  2548.     <TR>
  2549.         <TD>
  2550. <SELECT MULTIPLE NAME="fields_$tabs[$i]" SIZE=$size>
  2551. EOT
  2552. ;
  2553.         for (my $j=0; $j<$size; $j++){
  2554.             my $selected = "SELECTED" if (belongs(\@fields, $fieldsref->[$j]) or !@fields);
  2555.             print qq!<OPTION VALUE="$fieldsref->[$j]" $selected>$fieldsref->[$j] \n!;
  2556.         }
  2557.         print <<EOT
  2558. </SELECT></TD></TR></TABLE>
  2559.         </TD>
  2560.     </TR>
  2561. </TABLE>
  2562. <BR><HR SIZE=1><BR>
  2563. EOT
  2564. ;
  2565.         unless ((@tabs - @exclude) > 1){
  2566.             print "\n</FORM>";
  2567.         }
  2568.     }
  2569.     print "\n</FORM>" if ((@tabs - @exclude) > 1);
  2570.     print "\n\n<!-- Select from Table procedure endss here -->\n\n";
  2571. return
  2572. }
  2573.  
  2574. sub execExecuteQuery {
  2575.  
  2576.     my $back = shift;
  2577.     
  2578.     my $queries                = $back->{SQL} || $q->param('SQL');
  2579.     my $selectedscript        = $back->{selectedscript} || $q->param('selectscript');
  2580.     unless ($print){
  2581.         print "\n<!-- EXECUTE QUERY starts here -->\n";
  2582.     }    
  2583.     bail_out ("Query was emptY!", $back) unless ($queries =~ /\S/);
  2584.     
  2585.     $queries                 =~ s/\/\*.*\*\///sg;
  2586.     $queries                =~ s/^\s*#.*$//mg;
  2587.     my $newline                ="\n";
  2588.     $queries                 .= "\n";
  2589.     my @queryarray            = ();
  2590.     my $jj                     = 0;
  2591.     $_                         = $queries;
  2592.     my $newquery             = 1;
  2593.     while (
  2594.         m/
  2595.         (.*?)                # $1
  2596.         (                    # $2
  2597.             (?<!\\)(["'])    # $3
  2598.             (.*?)            # $4
  2599.             (?<!\\)(\3)        # $5
  2600.             |;|\Z            # 
  2601.         )
  2602.         (;?)                # $6
  2603.         /gxs
  2604.     )
  2605.     {
  2606.         if ($newquery){
  2607.             push @queryarray, "$1";
  2608.             if ($2 ne ';'){
  2609.                 $queryarray[-1] .= $2;
  2610.                 if ($6 ne ';'){$newquery = 0}
  2611.             }
  2612.         }
  2613.         else {
  2614.             $queryarray[-1] .= $1;
  2615.             if ($2 ne ';'){$queryarray[-1] .= $2}
  2616.             else {$newquery = 1}
  2617.             if ($6 eq ';'){$newquery = 1}
  2618.         }
  2619.         $jj++;
  2620.         last if ($jj > 50000);
  2621.     }
  2622.  
  2623.     bail_out ("Query was empty!", $back, '1')if (@queryarray == 0);
  2624.     unless ($print){
  2625.         print "Script Name: ", quoteit($q->param('selectscript')) if ($q->param('script') =~ /run/i);
  2626.     }
  2627.     for (my $i = 0; $i < @queryarray; $i++){
  2628.         $query = $queryarray[$i];
  2629.         next unless ($query =~ /\w./);
  2630.            my $keyword = '';
  2631.            $query =~ /^\s*(\w*)\s.*/; $keyword = $1;
  2632. #++++++++++++++++++++++++++++++++++++++
  2633.         my $sth = $dbh->prepare ($query);
  2634.         my $res = $sth->execute;
  2635.         if ($DBI::err){
  2636.             bail_out ("Cannot execute query $query", $back) if $q->param('abortsql');
  2637.             ErrMessage ("Cannot execute query");
  2638.         }
  2639.         else {
  2640.             $query = quoteit($query);
  2641.         
  2642.                if (belongs(\@selectlike,$keyword) and $query !~ /^\s*SELECT\s+.+\s+INTO\s+OUTFILE\s+/i) {
  2643.                 printform({query => $query, SQL =>$queries, selectedscript => $selectedscript}) unless ($print or ($page eq 'select_db'));
  2644.  
  2645.  
  2646.                  print &printresult(\$sth,undef,1);
  2647.                 ErrMessage("Print Result Error $DBI::errstr") if $DBI::err;
  2648.             }        
  2649.         }
  2650.         if ($page eq 'select_db'){
  2651.                 my $sql_ = quoteit($q->param('SQL'));
  2652.                 print <<EOT
  2653. <FORM ACTION="$full_url" METHOD=POST>
  2654. <INPUT TYPE=SUBMIT VALUE="BACK">
  2655. <INPUT TYPE=HIDDEN NAME="page" VALUE="connect">
  2656. <INPUT TYPE=HIDDEN NAME="SQL" VALUE="$sql_">
  2657. </FORM>
  2658. EOT
  2659. ;
  2660.         }
  2661.             $query =~ s/^\s*$//mg;
  2662.             $query =~ s/^/<BR>/mg;
  2663.             $query =~ s/\t/    /g;
  2664.             print <<EOT
  2665. <P>Executed Query:<b>$query</b><BR>
  2666. Result: $res <P>
  2667. <HR SIZE=1 LENGTH="100%"><BR>
  2668.  
  2669. EOT
  2670. unless $print;
  2671.     }
  2672.     print "<!-- End of EXECUTE QUERY -->\n\n" ;
  2673.     return;
  2674. }# END EXECUTE
  2675.  
  2676. sub loadDropPreview {
  2677.     print "\n\n<!-- loadDropPreview Procedure starts here -->\n\n";
  2678.     my @tabs = $q->param('tables');
  2679.     bail_out("Table is not specified.", {dbname => "$database", page => 'select_db'}) unless @tabs;
  2680.     print qq!<FORM METHOD=POST ACTION="$full_url">!;
  2681.     printHeaderTable({name => "DROP"});
  2682.     print qq!<TABLE BORDER=0>\n!;
  2683.     foreach (@tabs){
  2684.         print qq!<TR><TD><B>DROP TABLE $_</B></TD>!;
  2685.         print qq!<TD><INPUT TYPE=CHECKBOX NAME="tables" VALUE="$_" CHECKED></TD></TR>\n!;
  2686.     }
  2687.     print qq!</TABLE><P>!;
  2688.     print qq!<INPUT TYPE=SUBMIT NAME="drop" VALUE="Submit">\n !;
  2689.     print qq!<INPUT TYPE=HIDDEN NAME="dbname" VALUE="!.$q->param('dbname').qq!">\n!;
  2690.     print qq!<INPUT TYPE=SUBMIT NAME="return" VALUE="Return">\n!;
  2691.        print qq!<INPUT TYPE=HIDDEN NAME="page" VALUE="drop">\n!;
  2692.     print qq?\n\n<!-- loadDropPreview Procedure ends here -->\n\n?;
  2693.     print qq!</FORM>!;
  2694.     return;
  2695. }
  2696.  
  2697.  
  2698. sub execDropTable {
  2699.     if ($q->param('drop')){ 
  2700.         my @tabs = $q->param('tables');
  2701.            bail_out("Table is not specified.", {dbname => "$database", page => 'select_db'}) unless @tabs;
  2702.         foreach (@tabs){
  2703.             my $query = "DROP TABLE $_";
  2704.             $dbh ->do($query) || bail_out("Cannot drop table", {page=>'select_db', dbname=>"$database"});
  2705.         }
  2706.     }
  2707.     &loadSelectTables();
  2708.     return;
  2709. }
  2710. sub loadDeletePreview {
  2711.     print "\n\n<!-- loadDeletePreview Procedure starts here -->\n\n";
  2712.     print qq!<FORM METHOD=POST ACTION="$full_url">!;
  2713.     printHeaderTable({name => "DELETE"});
  2714.     my @tabs = $q->param('tables');
  2715.     my $back = {dbname => "$database", page => 'select_db'};
  2716.  
  2717.     bail_out("Table is not specified.", $back) unless @tabs;
  2718.     bail_out("Too Many Tables were selected.", $back) if (@tabs >= 2);
  2719.  
  2720.     my $where = quoteit($q->param('wheredelete'));
  2721.     my $query;
  2722.     if ($where) {$query = "DELETE FROM $tabs[0] WHERE $where"}
  2723.     else {$query = "DELETE FROM $tabs[0] WHERE 1=1"}
  2724.  
  2725.     print "<BR>QUERY:<B> $query</B><P>\n";
  2726.     print "<INPUT TYPE=\"SUBMIT\" NAME=\"delete\" VALUE=\"Submit\">\n";
  2727.     print "<INPUT TYPE=\"SUBMIT\" NAME=\"return\" VALUE=\"Return\">";
  2728.     print "<INPUT TYPE=\"HIDDEN\" NAME=\"tables\" VALUE=\"$tabs[0]\">\n";
  2729.     print "<INPUT TYPE=\"HIDDEN\" NAME=\"wheredelete\" VALUE=\"$where\">\n";
  2730.     print "\n<INPUT TYPE=\"HIDDEN\" NAME=\"dbname\" VALUE=\"".$q->param('dbname')."\">\n";
  2731.        print "<INPUT TYPE=\"HIDDEN\" NAME=\"page\" VALUE=\"delete\">\n";
  2732.     print "</FORM>";
  2733.     print "<!-- loadDeletePreview Procedure endss here -->";
  2734.  
  2735.     return;
  2736. }
  2737. sub loadAlterTable {
  2738.     my $input        = shift;
  2739.     my $back         = $input->{back} || {page => 'select_db', dbname => "$database"};
  2740.     if (($q->param('action')=~/import/i) or ($q->param('action')=~/export/i)){
  2741.         $back = {page => 'tables', dbname => "$database", func => $q->param('action')}
  2742.     }
  2743.     my (@tabs, $del, $hr, $newcolumn, $sth, $res);
  2744.     if ($page eq 'alterAfterPreview'){
  2745.         if ($q->param('back')){@tabs = $q->param('tables')}
  2746.         else{@tabs = $q->param('newtablename')}
  2747.         unless ($tabs[0]){@tabs = ()}
  2748.         $page = 'alter';
  2749.     }
  2750.     elsif     ((($q->param('func')=~/create/i) or     ($q->param('action')=~/create/i) or     $page eq 'create') and ($q->param('alter') !~ 'SAVE')){
  2751.         @tabs=();
  2752.         $page = 'create';
  2753.     }
  2754.     else {
  2755.         unless (@tabs = $q->param('newtablename') and ($q->param('alter') or $q->param('saveas'))) {@tabs = $q->param('tables')};
  2756.         if (@tabs >=2) {
  2757.             bail_out("Too many tables!", $back);
  2758.         }
  2759.         elsif (!$tabs[0]){
  2760.             bail_out("Table is not selected.", $back) if (($q->param('func')=~/ALTER/i) or (($q->param('action')=~/ALTER/i)));
  2761.             @tabs=();
  2762.         }
  2763.         $page = 'alter';
  2764.     }
  2765.  
  2766.     print "<!-- Alter procedure starts here -->\n";
  2767.     my $proof = qq!<NOSCRIPT><INPUT TYPE=SUBMIT VALUE="<"></NOSCRIPT>!;
  2768.     my $proof_ = qq!<INPUT TYPE=SUBMIT VALUE="<">!;
  2769.     my $autoincr;
  2770.     my $tabletype;
  2771.     my $comment;
  2772.     
  2773.     my $min_rows;
  2774.     my $max_rows;
  2775.     my $avgrowlength;
  2776.     my $reload            = 1 if ($q->param('alter') or $q->param('saveas') or $q->param('reload') or ($q->param('page') eq 'tables'));
  2777.     if (@tabs > 0){
  2778.         ($sth, $res) = prepare_execute("DESCRIBE $tabs[0]", $back);
  2779.         $autoincr = '<p CLASS="shead">Auto<BR>Column</p>';
  2780.         $del = "Del.";
  2781.         $newcolumn = "ADD NEW COLUMN:";
  2782.         $hr = "<HR SIZE=1>";
  2783.     }
  2784.     my @option;
  2785.     my %option_;
  2786.     if (check_version("3.23.0")){
  2787.         my $par = {};
  2788.         my @selected;
  2789.         my @types = ("MyISAM", "ISAM", "HEAP", "BDB", "InnoDB", "MERGE");
  2790.         if ($tabs[0]){
  2791.             my ($sth, $res)        = prepare_execute("SHOW TABLE STATUS LIKE '$tabs[0]'", $back);
  2792.             $par                = $sth->fetchrow_hashref();
  2793.             $sth->finish();
  2794. #this doesn't work with older DBI modules
  2795. #            $par                = $dbh->selectrow_hashref("SHOW TABLE STATUS LIKE '$tabs[0]'");
  2796.         }
  2797.         my $type = $reload ? $par->{Type} : $q->param('tabletype');
  2798.         if ($type =~ /myisam/i){$selected[1] = 'SELECTED';                 $type    = 'myisam'}
  2799.         elsif ($type =~ /isam/i){$selected[2] = 'SELECTED';             $type    = 'isam'}
  2800.         elsif ($type =~ /heap/i){$selected[3] = 'SELECTED';                $type    = 'heap'}
  2801.         elsif ($type =~ /inno/i){$selected[5] = 'SELECTED';                $type    = 'innodb'}
  2802.         elsif ($type =~ /(?:db|berkeley)/i){$selected[4] = 'SELECTED';    $type    = 'bdb'}
  2803.         elsif ($type =~ /(?:merge|mrg)/i){$selected[6] = 'SELECTED';    $type    = 'merge'}
  2804.         else  {$selected[0] = 'SELECTED'}
  2805.         my $value_            = $par->{Comment};
  2806.         {$value_            =~ s/^(.*?)(?:;\s*InnoDB free: \d+ \wB;?.*)$/$1/i if $type eq 'innodb';}
  2807.         my $value             = $reload ? $value_ : $q->param('comment');
  2808.         ($value, $value_)    = quoteit($value, $value_);
  2809.         my $comentlength     = $agent ? 30 : 50;
  2810.         $option_{COMMENT_}    = "$value_";
  2811.         $comment            = qq!<INPUT NAME="comment" TYPE=TEXT VALUE="$value" MAXLENGTH=60 size=$comentlength>!;
  2812.             
  2813.  
  2814.         $tabletype        = <<EOT
  2815. <B>TYPE:</B> <SELECT NAME="tabletype" ID="tabtype" onChange="this.form.submit()">
  2816. <OPTION VALUE="" $selected[0]>
  2817. <OPTION VALUE="MyISAM" $selected[1]>MyISAM
  2818. <OPTION VALUE="ISAM" $selected[2]>ISAM
  2819. <OPTION VALUE="HEAP" $selected[3]>HEAP
  2820. EOT
  2821. ;
  2822.         $tabletype        .= qq!<OPTION VALUE="BDB" $selected[4]>BDB\n! if check_version("3.23.17");
  2823.         $tabletype        .= qq!<OPTION VALUE="InnoDB" $selected[5]>InnoDB\n! if check_version("3.23.29");
  2824.         $tabletype        .= qq!<OPTION VALUE="MERGE" $selected[6]>MERGE\n! if (check_version("3.23.25") and $tabs[0] and $selected[6]);
  2825.         $tabletype        .= qq!</SELECT>$proof\n!;
  2826.         $tabletype        .= qq!<INPUT TYPE=HIDDEN NAME="tabletype_" VALUE="$par->{Type}">\n!;
  2827. #        my ($minrows, $maxrows, $avgrow, $autoincr, $rowformat, $packkeys, $delaykey, $checksum);
  2828.         my $create_options;
  2829.         my $create_options_ = $par->{Create_options};
  2830.         my $auto_increment;
  2831.         if ($reload){
  2832.             $create_options    = $create_options_;
  2833.             my $Type     = $q->param('tabletype');
  2834.             my $Type_    = $par->{Type};
  2835.             $auto_increment    = $par->{Auto_increment} if ($par->{Type} =~ /MyISAM/i) or (check_version("4.1.0") and $par->{Type} =~/HEAP/i); 
  2836.         }
  2837.         else {
  2838.             my $MIN_ROWS        = $q->param('MIN_ROWS');
  2839.             my $PACK_KEYS        = $q->param('PACK_KEYS');
  2840.             my $MAX_ROWS        = $q->param('MAX_ROWS');
  2841.             my $CHECKSUM        = $q->param('CHECKSUM');
  2842.             my $AVG_ROW_LENGTH    = $q->param('AVG_ROW_LENGTH');
  2843.             my $DELAY_KEY_WRITE = $q->param('DELAY_KEY_WRITE');
  2844.             my $ROW_FORMAT         = $q->param('ROW_FORMAT');
  2845.  
  2846.             $create_options    .= "MIN_ROWS=$MIN_ROWS " if $MIN_ROWS ne '';
  2847.             $create_options    .= "PACK_KEYS=$PACK_KEYS " if $PACK_KEYS ne '';
  2848.             $create_options    .= "MAX_ROWS=$MAX_ROWS " if $MAX_ROWS ne '';
  2849.             $create_options    .= "CHECKSUM=$CHECKSUM " if $CHECKSUM ne '';
  2850.             $create_options    .= "AVG_ROW_LENGTH=$AVG_ROW_LENGTH " if $AVG_ROW_LENGTH ne '';
  2851.             $create_options    .= "DELAY_KEY_WRITE=$DELAY_KEY_WRITE " if $DELAY_KEY_WRITE ne '';
  2852.             $create_options    .= "ROW_FORMAT=$ROW_FORMAT " if $ROW_FORMAT ne '';
  2853.             $auto_increment    =  deletespace($q->param('auto_increment'));
  2854.         }
  2855.         {
  2856.             if ($create_options_ =~ /MIN_ROWS=(\w+)\s?/i){$option_{MIN_ROWS_} = "$1"}
  2857.         }
  2858.         {
  2859.             if ($create_options_    =~ /PACK_KEYS=(\w+)\s?/i){$option_{PACK_KEYS_} = "$1"}
  2860.         }
  2861.         {
  2862.             if($create_options_ =~ /MAX_ROWS=(\w+)\s?/i){$option_{MAX_ROWS_} = "$1"}
  2863.         }
  2864.         {
  2865.             if($create_options_ =~ /CHECKSUM=(\w+)\s?/i){$option_{CHECKSUM_} = "$1"}
  2866.         }
  2867.         {
  2868.             if($create_options_ =~ /AVG_ROW_LENGTH=(\w+)\s?/i){$option_{AVG_ROW_LENGTH_} = "$1"}
  2869.         }
  2870.         {
  2871.             if($create_options_ =~ /DELAY_KEY_WRITE=(\w+)\s?/i){$option_{DELAY_KEY_WRITE_} = "$1"}
  2872.         }
  2873.         $option_{AUTO_INCREMENT_} = "$par->{Auto_increment}";
  2874.         {
  2875.             if($create_options_ =~ /ROW_FORMAT=(\w+)\s?/i){$option_{ROW_FORMAT_} = "$1"}
  2876.         }
  2877.  
  2878.         
  2879.         my $selected;
  2880.         {
  2881.             $create_options =~ /MIN_ROWS=(\w+)\s?/i;
  2882.             $option[0] = qq!MIN_ROWS</TD><TD><INPUT TYPE=TEXT NAME="MIN_ROWS" VALUE="$1" TITLE="The minimum number of rows you plan to store in the table.">!;
  2883.         }
  2884.         {
  2885.             $create_options    =~ /PACK_KEYS=(\w+)\s?/i;
  2886.             $option[1]        = qq!PACK_KEYS</TD><TD TITLE="Index compression for MyISAM and ISAM tables. A value of 1 specifies compression for string values and (MyISAM) Numeric index values. A value of 0 specifies no index compression"><SELECT NAME="PACK_KEYS">\n!;
  2887.             if (check_version('4.0.0')){
  2888.                 $selected        = $1 eq '' ? 'SELECTED' : '';
  2889.                 $option[1]        .= qq!<OPTION VALUE="DEFAULT" $selected>DEFAULT\n! ;
  2890.             }
  2891.             elsif($1 eq ''){
  2892.                 $option[1]        .= qq!<OPTION VALUE="" SELECTED>\n!;
  2893.             }
  2894.             $selected        = $1 eq '0'         ? 'SELECTED' : '';
  2895.             $option[1]        .= qq!<OPTION VALUE="0" $selected>0\n!;
  2896.             $selected        = $1 eq '1'         ? 'SELECTED' : '';
  2897.             $option[1]        .= qq!<OPTION VALUE="1" $selected>1\n!;
  2898.             $option[1]        .= qq!</SELECT>\n!;
  2899.         }
  2900.         {
  2901.             $create_options =~ /MAX_ROWS=(\w+)\s?/i;
  2902.             $option[2] = qq!MAX_ROWS</TD><TD><INPUT TYPE=TEXT NAME="MAX_ROWS" VALUE="$1" TITLE="The maximum number of rows you plan to store in the table. (MyISAM tables) See the description of AVG_ROW_LENGTH in MySQL manual.">!;
  2903.         }
  2904.         {
  2905.             $create_options    =~ /CHECKSUM=(\w+)\s?/i;
  2906.             $option[3]        = qq!CHECKSUM</TD><TD TITLE="If set to 1, MySQL maintains a checksum for each table row. (MyISAM tables)"><SELECT NAME="CHECKSUM">\n!;
  2907.             $selected        = $1 eq '' ? 'SELECTED' : '';
  2908.             $option[3]        .= qq!<OPTION VALUE="" $selected>\n!;
  2909.             $selected        = $1 eq '0' ? 'SELECTED' : '';
  2910.             $option[3]        .= qq!<OPTION VALUE="0" $selected>0\n!;
  2911.             $selected        = $1 eq '1' ? 'SELECTED' : '';
  2912.             $option[3]        .= qq!<OPTION VALUE="1" $selected>1\n!;
  2913.             $option[3]        .= qq!</SELECT>\n!;
  2914.         }
  2915.         {
  2916.             $create_options =~ /AVG_ROW_LENGTH=(\w+)\s?/i;
  2917.             $option[4] = qq!AVG_ROW_LENGTH</TD><TD><INPUT TYPE=TEXT NAME="AVG_ROW_LENGTH" VALUE="$1" TITLE="The approximate average row length of your table. (MyISAM tables) Together with MAX_ROWS it determines the maximum datafile size. See MySQL manual for more info">!;
  2918.         }
  2919.         if (check_version('3.23.3')){
  2920.             $create_options    =~ /DELAY_KEY_WRITE=(\w+)\s?/i;
  2921.             $option[5]        = qq!DELAY_KEY_WRITE</TD><TD TITLE="If this is set to 1, the index cache is flushed only occasionally for the table, rather then after each INSERT operation. (MyISAM tables)"><SELECT NAME="DELAY_KEY_WRITE">\n!;
  2922.             $selected        = $1 eq '' ? 'SELECTED' : '';
  2923.             $option[5]        .= qq!<OPTION VALUE="" $selected>\n!;
  2924.             $selected        = $1 eq '0' ? 'SELECTED' : '';
  2925.             $option[5]        .= qq!<OPTION VALUE="0" $selected>0\n!;
  2926.             $selected        = $1 ? 'SELECTED' : '' ;
  2927.             $option[5]        .= qq!<OPTION VALUE="1" $selected>1\n!;
  2928.             $option[5]        .= qq!</SELECT>\n!;
  2929.         }
  2930.         $option[6]        = qq!AUTO_INCREMENT</TD><TD><INPUT TYPE=TEXT NAME="auto_increment" VALUE="$auto_increment" TITLE="The next AUTO_INCREMENT value to be generated. MyISAM tables and HEAP tables as of MySQL 4.1.">!;
  2931.         
  2932.         if (check_version('3.23.6')){
  2933.             $create_options    =~ /ROW_FORMAT=(\w+)\s?/i;
  2934.             $option[7]        = qq!ROW_FORMAT</TD><TD TITLE="This option specifies the row storage type. (MyISAM tables)"><SELECT NAME="ROW_FORMAT">\n!;
  2935.             $selected        = $1 eq '' ? 'SELECTED' : '';
  2936.             $option[7]        .= qq!<OPTION VALUE="DEFAULT" $selected>DEFAULT\n!;
  2937.             $selected        = $1 eq 'FIXED' ? 'SELECTED' : '';
  2938.             $option[7]        .= qq!<OPTION VALUE="FIXED" $selected>FIXED\n!;
  2939.             $selected        = $1 eq 'DYNAMIC' ? 'SELECTED' : '';
  2940.             $option[7]        .= qq!<OPTION VALUE="DYNAMIC" $selected>DYNAMIC\n!;
  2941.             $selected        = $1 eq 'COMPRESSED' ? 'SELECTED' : '';
  2942.             $option[7]        .= qq!<OPTION VALUE="COMPRESSED" $selected>COMPRESSED\n!;
  2943.             $option[7]        .= qq!</SELECT>\n!;
  2944.         }
  2945.     }
  2946.     my $typeoptionlistref = sub  {
  2947.         my @optionlist;
  2948.         my $type = shift;
  2949.         $type =~ s/^\s*(\w*)(\(.*\))?(.*)/$1/;
  2950.         my $symbols = $2; 
  2951.         my $therest = $3;
  2952.         $symbols =~ s/^\((.*)\)/$1/ if $symbols;
  2953.         
  2954.         my $unsigned = '';
  2955.         my $zerofill = '';
  2956.         my $binary = '';
  2957.         $symbols = quoteit($symbols);
  2958.         $unsigned = 'CHECKED' if ($therest =~ /unsign/i);
  2959.         $zerofill = 'CHECKED' if ($therest =~ /zerofill/i);
  2960.         $binary = 'CHECKED' if ($therest =~ /binary/i);
  2961.         for (my $i=0; $i<@typelist; $i++) {
  2962.             my $selected = 'SELECTED' if ($typelist[$i] =~ /^($type)$/i);
  2963.             push @optionlist, qq!<OPTION VALUE="$typelist[$i]" $selected>$typelist[$i] \n!;
  2964.         }
  2965.  
  2966. return (\@optionlist, $type, $symbols, $unsigned, $zerofill, $binary) if wantarray;
  2967. return (\@optionlist) if defined wantarray;
  2968. };
  2969.     my ($newtablength, $textsize, $textsize1, $lengthsize, $textareasize) = $agent ? (23, 13, 10, 10, 30 ) : (30, 20, 15, 16, 40 );
  2970.  
  2971.     print qq!<FORM METHOD=POST ACTION="$full_url" ID="form1">!;
  2972.     my ($procname, $tabtitle, $colnametitle, $saveastitle, $saveas1, $ignore);
  2973.     my $ignoreselected = 'CHECKED' if ($q->param('ignore') and !$reload);
  2974.     if (@tabs) {
  2975.         $procname         = qq!ALTER TABLE!;
  2976.         $tabtitle         = qq!Edit table name.\nAlphanumeric characters and underscore only!;
  2977.         $colnametitle     = qq!Edit column name.\nAlphanumeric characters and underscore only!;
  2978.         $saveastitle     = qq!Type the name of a new table.\nAlphanumeric characters and underscore only!;
  2979.         $saveas1        = qq!<INPUT TYPE=SUBMIT NAME="saveas" VALUE="Save as"  style="width: 80" TITLE="Create new table with the same structure. All changes will be applied to new table">!;
  2980.         $ignore            = qq?   <INPUT TYPE=CHECKBOX NAME="ignore" VALUE="1" $ignoreselected TITLE="The rows that duplicate values for unique key values will be deleted!"><FONT COLOR="#CC0000" TITLE="The rows that duplicate values for unique key values will be deleted!">IGNORE</FONT>?;
  2981.     }
  2982.     else {
  2983.         $procname         = "CREATE NEW TABLE";
  2984.         $tabtitle         = "Type the name of new table.\nAlphanumeric characters and underscore only";
  2985.         $colnametitle     = "Type column name in this field.\nAlphanumeric characters and underscore only";
  2986.     }
  2987.     my $newtabvalue = $reload ?  $tabs[0] : quoteit($q->param('newtablename'));
  2988.     
  2989.     print <<EOT
  2990. <!-- Header Table -->
  2991. <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2>
  2992.     <TR><TD ALIGN=LEFT COLSPAN=2><FONT COLOR="#003466"><B>$procname</B></FONT>$ignore</TD><TD COLSPAN=3> $input->{msg}</TD><TR>
  2993.     <TR VALIGN=MIDDLE>
  2994.         <TD COLSPAN=2 ><nobr><CODE>TABLE NAME: </CODE><INPUT TYPE=TEXT NAME="newtablename" VALUE="$newtabvalue" SIZE=$newtablength TITLE="$tabtitle"> </nobr></TD>
  2995.         <TD><NOBR>$tabletype</NOBR></TD><TD ALIGN=RIGHT>COMMENT</TD><TD>$comment</TD>
  2996.     </TR>
  2997. <!-- <TR><TH COLSPAN=5 ALIGN=LEFT HEIGHT=0></TH><TR> -->
  2998. <!-- End of Header Table -->
  2999. EOT
  3000. ;
  3001. if (@option){
  3002.     my $tr;
  3003.     my $j;
  3004.     for (my $i=0; $i < 8; $i++){
  3005.         if (my $option = shift @option){
  3006.             unless ($tr){print "<TR><TD ALIGN=RIGHT>$option</TD>"; $tr = 1}
  3007.             else {print "<TD ALIGN=RIGHT COLSPAN=2>$option</TD></TR>\n"; $tr = 0}
  3008.         }
  3009.         elsif ($j){$j=0}
  3010.         else {$j++}
  3011.     }
  3012.     for (1..$j){
  3013.         if($tr){print "<TD COLSPAN=2> </TD><TD> </TD></TR>"; $tr=0}
  3014.         else{print "<TR><TD> </TD><TD> </TD><TD> </TD>"; $tr=1}
  3015.     }
  3016. }
  3017.     print "</TABLE>";
  3018.  
  3019.  
  3020.  
  3021.     print <<EOT
  3022. <TABLE ID="MAIN" BORDER=0 CELLPADDING=2 CELLSPACING=2>    
  3023.     <TR>
  3024.         <TD><p CLASS="shead">$del</p></TD>
  3025.         <TD TITLE="$colnametitle"><p CLASS="shead">COLUMN NAME</p></TD>
  3026.         <TD TITLE="Select column type"><p CLASS="shead">Type</p></TD>
  3027.         <TD TITLE="Type column length or values of ENUM or SET types (quoted and comma separated)"><p CLASS="shead">Length or<BR>enum/set elements</p></TD>
  3028.         <TD TITLE="This attribute disallows negative values.\n(Numerics only)"><p CLASS="shead">Unsigned</p></TD>
  3029.         <TD TITLE="This attribute causes the displayed value to be padded with leading zeros to the display width.\n(Nimerics only)"><p CLASS="shead">Zerofill</p></TD>
  3030.         <TD TITLE="This attribute causes column value to be treated as binary string and case sensitive in comparation and sorting operations.\n(String types only)"><p CLASS="shead">Binary</p></TD>
  3031.         <TD TITLE="This attribute specifies whethere or not the column may contain NULL values. If not specified, NULL is the default."><p CLASS="shead">Not Null</p></TD>
  3032.         <TD TITLE="Specifies the default value for the column. This can not be used for BLOB or TEXT types."><p CLASS="shead">Default</p></TD>
  3033.         <TD TITLE="Selected column will be turned into Autocolumn.\nOnly one column can be Autocolumn">$autoincr</TD>
  3034.     </TR>
  3035. EOT
  3036. ;
  3037. #    my @columns;
  3038.     my @colname            = $q->param('colname');
  3039.     my $pri_flag;
  3040.     my $firstafteroption;
  3041.  
  3042.     if (@tabs > 0){
  3043.         my @type            = $q->param('type');
  3044.         my @length            = $q->param('length');
  3045.         my @unsigned        = $q->param('unsigned');
  3046.         my @notnull            = $q->param('notnull');
  3047.         my @zerofill        = $q->param('zerofill');
  3048.         my @default            = $q->param('default');
  3049.         my @binary            = $q->param('binary');
  3050.         my $autoincrement    = $q->param('autoincrement');
  3051.         my $i                 = 0;
  3052.         while (my @row = $sth->fetchrow_array()) {
  3053.             my ($checkdrop, $colname, $coltype, $default, $type,
  3054.             $symbols, $notnull_selected, $unsigned_selected, $zerofill_selected,
  3055.             $binary_selected, $autoincrement_selected, $drop, $firstafter_selected);
  3056.             my $typeoptionref = [];
  3057.             $drop                = $q->param("drop_column_$row[0]");
  3058.             if ($reload){
  3059.                 $colname[$i]            = $row[0];
  3060.                 $coltype                 = $row[1];
  3061.                 ($typeoptionref, $type, $symbols, $unsigned_selected, $zerofill_selected, $binary_selected, $autoincrement_selected) = &$typeoptionlistref($coltype);
  3062.                 $autoincrement_selected    = 'CHECKED' if ($row[5] =~ /^.*auto.*increment.*$/i);
  3063.                 $default                 = quoteit($row[4]); # defaults
  3064.                 $colname                 = $row[0];
  3065.                 $notnull_selected        = 'CHECKED' unless ($row[2] =~ /yes/i);
  3066.             }
  3067.             else{
  3068.                 $type                     = $type[$i];
  3069.                 $symbols                = quoteit($length[$i]);
  3070.                 $unsigned_selected        = 'CHECKED' if (belongs(\@unsigned, $row[0]));
  3071.                 $zerofill_selected        = 'CHECKED' if (belongs(\@zerofill, $row[0]));
  3072.                 $notnull_selected        = 'CHECKED' if (belongs(\@notnull, $row[0]));
  3073.                 $binary_selected        = 'CHECKED' if (belongs(\@binary, $row[0]));
  3074.                 $autoincrement_selected    = 'CHECKED' if ($autoincrement eq $row[0]);
  3075.                 $default                = quoteit($default[$i]);
  3076.                 $typeoptionref            = &$typeoptionlistref($type[$i]);
  3077.                 $firstafter_selected    = 'SELECTED' if ($q->param('firstafterwhat') eq $colname[$i]);
  3078.                 $colname[$i]            = quoteit($colname[$i]);
  3079.             }
  3080.             $firstafteroption .= qq!<OPTION VALUE="$colname[$i]" $firstafter_selected>$colname[$i]\n! if (!$q->param("drop_column_$row[0]") xor $q->param("release_column_$row[0]"));
  3081.         
  3082.  
  3083.             my $auto = '';
  3084.             if ($row[3] =~ /PRI/i){
  3085.                 if ($auto_type{uc $type}){$auto = qq!<INPUT TYPE=CHECKBOX NAME="autoincrement" VALUE="$row[0]" $autoincrement_selected TITLE="AUTO_INCREMENT columns">!}
  3086.                 else {$auto = qq!<INPUT TYPE=CHECKBOX TITLE="Selected column type doesn't support AUTO_INCREMENT columns" DISABLED>!}
  3087.                 $pri_flag = 1;
  3088.             }
  3089.             else {$auto = qq!<INPUT TYPE=CHECKBOX TITLE="AUTO_INCREMENT column must be defined as PRIMARY KEY" DISABLED>!}
  3090.             
  3091.             if ($drop and !$q->param("release_column_$row[0]")){
  3092.                 $type                 = $row[1];
  3093.                 $type                 =~ s/^\s*(\w*)(\(.*\))?(.*)/$1/;
  3094.                 $type                = uc $type;
  3095.                 $symbols            = $2; 
  3096.                 my $therest            = $3;
  3097.                 $symbols            =~ s/^\((.*)\)/$1/ if $symbols;
  3098.                 $symbols            = quoteit($symbols);
  3099.                 my $unsigned        = $row[0] if ($therest =~ /unsign/i);
  3100.                 my $zerofill        = $row[0] if ($therest =~ /zerofill/i);
  3101.                 my $binary            = $row[0] if ($therest =~ /binary/i);
  3102.                 my $notnull            = $row[0] unless ($row[2] =~ /yes/i);
  3103.                 $default             = quoteit($row[4]); # defaults
  3104.                 $autoincrement        = ($row[5] =~ /^.*auto.*increment.*$/i) ? $row[0] : '';
  3105.                 print <<EOT
  3106.     <TR>
  3107.         <TD><INPUT TYPE=SUBMIT NAME="release_column_$row[0]" VALUE="O" TITLE="CLICL TO KEEP THIS COLUMN" style="width: 20" notab  tabindex=0 taborder=0></TD>
  3108.         <TD  COLSPAN=3>
  3109.         $row[0]
  3110.         <INPUT TYPE=HIDDEN NAME="colname"                 VALUE="$row[0]">
  3111.         <INPUT TYPE=HIDDEN NAME="type"                     VALUE="$type">
  3112.         <INPUT TYPE=HIDDEN NAME="length"                 VALUE="$symbols">
  3113.         <INPUT TYPE=HIDDEN NAME="unsigned"                 VALUE="$unsigned">
  3114.         <INPUT TYPE=HIDDEN NAME="zerofill"                 VALUE="$zerofill">
  3115.         <INPUT TYPE=HIDDEN NAME="binary"                 VALUE="$binary">
  3116.         <INPUT TYPE=HIDDEN NAME="notnull"                VALUE="$notnull">
  3117.         <INPUT TYPE=HIDDEN NAME="default"                 VALUE="$default">
  3118.         <INPUT TYPE=HIDDEN NAME="autoincrement"            VALUE="$autoincrement">
  3119.         <INPUT TYPE=HIDDEN NAME="drop_column_$row[0]"    VALUE="X">
  3120.         </TD>
  3121.         <TD COLSPAN=6>THIS COLUMN WILL BE DROPPED</TD>
  3122.     <TR>
  3123. EOT
  3124. ;
  3125.             }
  3126.             else{
  3127.                 my $DisabledTitle1 = 'This column type can not have Default Values';
  3128.                 my $DisabledTitle2 = 'This column type does not allow such values';
  3129.                 my ($unsigned, $zerofill, $binary);
  3130.                 if ($type =~ /int|decimal/i or (check_version('4.0.2') and $type =~/double|float/i)){
  3131.                     $unsigned = qq!<INPUT TYPE=CHECKBOX NAME="unsigned" VALUE="$row[0]" $unsigned_selected TITLE="This attribute disallows negative values.\n(Numerics only)">! 
  3132.                 }
  3133.                 else {
  3134.                     $unsigned = qq!<INPUT TYPE=CHECKBOX TITLE="This column type does not allow this option" DISABLED>!;
  3135.                     $unsigned .= qq!<INPUT TYPE=HIDDEN NAME="unsigned" VALUE="$row[0]">! if $unsigned_selected
  3136.                 } 
  3137.  
  3138.                 
  3139.                 if ($type =~ /int|decimal|double|float/i){
  3140.                     $zerofill    = qq!<INPUT TYPE=CHECKBOX NAME="zerofill" VALUE="$row[0]" $zerofill_selected TITLE="This attribute causes the displayed value to be padded with leading zeros to the display width.\n(Nimerics only)">!
  3141.                 }
  3142.                 else {
  3143.                     $zerofill    = qq!<INPUT TYPE=CHECKBOX TITLE="This column type does not allow this option" DISABLED>!;
  3144.                     $zerofill    .= qq!<INPUT TYPE=HIDDEN NAME="zerofill" VALUE="$row[0]">! if $zerofill_selected
  3145.                 }
  3146.                 
  3147.                 
  3148.                 if ($type =~ /char/i) {
  3149.                     $binary    = qq!<INPUT TYPE=CHECKBOX NAME="binary" VALUE="$row[0]" $binary_selected TITLE="This attribute causes column value to be treated as binary string and case sensitive in comparation and sorting operations.\n(String types only)">!
  3150.                 }
  3151.                 else{
  3152.                     $binary    = qq!<INPUT TYPE=CHECKBOX TITLE="This column type does not allow this option" DISABLED>!;
  3153.                     $binary    .= qq!<INPUT TYPE=HIDDEN NAME="binary" VALUE="$row[0]">! if $binary_selected
  3154.                 }
  3155.                 
  3156.                 my $notnull    = qq!<INPUT TYPE=CHECKBOX NAME="notnull" VALUE="$row[0]" $notnull_selected TITLE="This attribute specifies whethere or not the column may contain NULL values. If not specified, NULL is the default.">!;
  3157.                 my $defaultvalue = 
  3158.                 ($type !~ /text|blob/i) ? 
  3159.                 qq!<INPUT TYPE=TEXT NAME="default" VALUE="$default" SIZE=$textsize1 TITLE="Specifies the default value for the column. This can not be used for BLOB or TEXT types.">!
  3160.                 : qq!<INPUT TYPE=TEXT VALUE="" DISABLED SIZE=$textsize1 TITLE="$DisabledTitle1" style="background color: #CCCCCC"><INPUT TYPE=HIDDEN NAME="default" VALUE="$default">!;
  3161.                 my $length        = 
  3162.                 ($type =~ /int|decimal|double|float|char|enum|set|year|timestamp/i) ? 
  3163.                 qq!<INPUT TYPE=TEXT NAME="length" SIZE=$lengthsize VALUE="$symbols"  TITLE="Type column length or values of ENUM or SET types (quoted and comma separated)">! 
  3164.                 : qq!<INPUT TYPE=TEXT SIZE=$lengthsize VALUE="" DISABLED SIZE=$lengthsize TITLE="$DisabledTitle2" style="background color: #CCCCCC"><INPUT TYPE=HIDDEN NAME="length" VALUE="$symbols" >!;
  3165.                 print <<EOT
  3166.     <TR>
  3167.         <TD><INPUT TYPE=SUBMIT NAME="drop_column_$row[0]" VALUE="X" TITLE="Click to drop this column" style="width: 20" notab tabindex=0 taborder=0></TD>
  3168.         <TD><INPUT TYPE=TEXT NAME="colname" VALUE="$colname[$i]" TITLE="Edit column name" SIZE=$textsize></TD>
  3169.         <TD TITLE="Select column type"><SELECT NAME="type" TITLE="Select column type"  onChange="this.form.submit()">
  3170. @$typeoptionref
  3171.             </SELECT></TD>
  3172.         <TD><NOBR>$proof $length</NOBR></TD>    
  3173.         <TD>$unsigned</TD>
  3174.         <TD>$zerofill</TD>
  3175.         <TD>$binary</TD>
  3176.         <TD>$notnull</TD>
  3177.         <TD>$defaultvalue</TD>
  3178.         <TD>$auto</TD>        
  3179.     <TR>
  3180. EOT
  3181. ;
  3182.             }
  3183.             $i++;
  3184.         }#WHILE
  3185.         $sth->finish();
  3186.     }#if tabs>0
  3187.     print "\t<TR><TD COLSPAN=10>$hr</TD></TR>\n";
  3188.     print "\t<TR><TD COLSPAN=10><B>$newcolumn</B></TD></TR>\n";
  3189.     my ($newcoltyperef, $newcolname, $newcollength, $newcoldefault, $unsigned_new, $zerofill_new, $binary_new, $notnull_new);
  3190.     if ($reload){
  3191.         $newcoltyperef    = &$typeoptionlistref();
  3192.         $newcollength    = qq!<INPUT TYPE=TEXT style="background color: #CCCCCC" DISABLED SIZE=$lengthsize TITLE="Please select column type">!;
  3193.         $newcoldefault    = qq!<INPUT TYPE=TEXT style="background color: #CCCCCC" DISABLED SIZE=$textsize1 TITLE="Please select column type">!;
  3194.         $unsigned_new    = $zerofill_new = $binary_new = $notnull_new = qq!<INPUT TYPE=CHECKBOX TITLE="Please select column type" DISABLED>!
  3195.     }
  3196.     else{
  3197.         my $type        = $q->param('newcoltype');
  3198.         $newcolname        = quoteit($q->param('newcolname'));
  3199.         $newcollength    = quoteit($q->param('newcollength'));
  3200.         $newcoldefault    = quoteit($q->param('newcoldefault'));
  3201.         $unsigned_new    = 'CHECKED' if $q->param('unsigned_new');
  3202.         $zerofill_new    = 'CHECKED' if $q->param('zerofill_new');
  3203.         $binary_new        = 'CHECKED' if $q->param('binary_new');
  3204.         $notnull_new    = 'CHECKED' if $q->param('notnull_new');
  3205.         $newcoltyperef    = &$typeoptionlistref($type);
  3206.         
  3207.         if ($type =~ /(int)|(decimal)|(double)|(float)|(char)|(enum)|(set)|(year)|(timestamp)/i){
  3208.             $newcollength = qq!<INPUT TYPE=TEXT NAME="newcollength" SIZE=$lengthsize VALUE="$newcollength" TITLE="Type column length or values of ENUM or SET types (quoted and comma separated)">!;
  3209.         }
  3210.         else {
  3211.             $newcollength = qq!<INPUT TYPE=TEXT style="background color: #CCCCCC" DISABLED SIZE=$lengthsize TITLE="This column type does not allow such values">!;
  3212.         }
  3213.         if ($type and $type !~ /(text)|(blob)/i){
  3214.             $newcoldefault = qq!<INPUT TYPE=TEXT NAME="newcoldefault" VALUE="$newcoldefault" size=$textsize1 TITLE="Specifies the default value for the column. This can not be used for BLOB or TEXT types.">!;
  3215.         }
  3216.         else {
  3217.             $newcoldefault = qq!<INPUT TYPE=TEXT style="background color: #CCCCCC" DISABLED size=$textsize1 TITLE="This column type can not have Default Values">!
  3218.         }
  3219.         if ($type =~ /(int)|(decimal)/i or (check_version('4.0.2') and $type =~/(double)|(float)/i)){
  3220.             $unsigned_new = qq!<INPUT TYPE=CHECKBOX NAME="unsigned_new" $unsigned_new TITLE="This attribute disallows negative values \n(Numerics only)">!
  3221.         }
  3222.         else{
  3223.             $unsigned_new = qq!<INPUT TYPE=CHECKBOX TITLE="This column type does not allow this option" DISABLED>!
  3224.         }
  3225.         if ($type =~ /(int)|(decimal)|(double)|(float)/i){
  3226.             $zerofill_new = qq!<INPUT TYPE=CHECKBOX NAME="zerofill_new" $zerofill_new TITLE="This attribute causes the displayed value to be padded with leading zeros to the display width.\n(Nimerics only)">!
  3227.         }
  3228.         else{
  3229.             $zerofill_new = qq!<INPUT TYPE=CHECKBOX TITLE="This column type does not allow this option" DISABLED>!
  3230.         }
  3231.         if ($type =~ /char/i){
  3232.             $binary_new = qq!<INPUT TYPE=CHECKBOX NAME="binary_new" $binary_new TITLE="This attribute causes column value to be treated as binary string and case sensitive in comparation and sorting operations.\n(String types only)">!
  3233.         }
  3234.         else{
  3235.             $binary_new = qq!<INPUT TYPE=CHECKBOX TITLE="This column type does not allow this option" DISABLED>!
  3236.         }
  3237.         if($type){
  3238.             $notnull_new = qq!<INPUT TYPE=CHECKBOX NAME="notnull_new" $notnull_new TITLE="This attribute specifies whethere or not the column may contain NULL values. If not specified, NULL is the default.">!
  3239.         }
  3240.         else{
  3241.             $notnull_new = qq!<INPUT TYPE=CHECKBOX TITLE="This column type does not allow this option" DISABLED>!
  3242.         }
  3243.     }
  3244.  
  3245.     print <<EOT
  3246.     <TR>
  3247.         <TD> </TD>
  3248.         <TD><INPUT TYPE=TEXT NAME="newcolname" VALUE="$newcolname" SIZE=$textsize TITLE="Type new column name. The name must be unique and consist of alphanumeric and underscore characters only."></TD>
  3249.         <TD TITLE="Select column type"><SELECT SIZE=1 NAME="newcoltype" TITLE="Select column type" onChange="this.form.submit()">
  3250.         <OPTION VALUE="" SELECTED> 
  3251. @$newcoltyperef
  3252.         </SELECT></TD>
  3253.         <TD><NOBR>$proof $newcollength</NOBR></TD>
  3254.         <TD>$unsigned_new</TD>
  3255.         <TD>$zerofill_new</TD>
  3256.         <TD>$binary_new</TD>
  3257.         <TD>$notnull_new</TD>
  3258.         <TD>$newcoldefault</TD>
  3259.         <TD> </TD>        
  3260.     </TR>
  3261. EOT
  3262. ;    
  3263. # first / after
  3264.     if (@tabs > 0){
  3265.         my ($selected_f, $selected_a, $enkeysselected, $diskeysselected, $orderby, $enkeys, $orderbyvalye, $ascchecked, $desccheched);
  3266.         unless($reload){
  3267.             my $firstafter        = $q->param('firstafter');
  3268.             $selected_f            = 'SELECTED'    if $firstafter eq 'FIRST';
  3269.             $selected_a            = 'SELECTED'    if $firstafter eq 'AFTER';
  3270.             $enkeysselected     = 'CHECKED'        if $q->param('enkeys') eq 'ENABLE';
  3271.             $diskeysselected    = 'CHECKED'        if $q->param('enkeys') eq 'DISABLE';
  3272.             $ascchecked            = 'CHECKED'    if $q->param('order') eq 'ASC';
  3273.             $desccheched        = 'CHECKED'    if $q->param('order') eq 'DESC';
  3274.             
  3275.             $orderbyvalye        = quoteit(deletespace($q->param('orderby')));
  3276.         }
  3277.         if (check_version("4.0.0")){
  3278.             $enkeys = <<EOT
  3279.         <TD><INPUT TYPE=RADIO NAME="enkeys" VALUE="ENABLE" $enkeysselected></TD>
  3280.         <TD>ENABLE KEYS</TD>
  3281.         <TD><INPUT TYPE=RADIO NAME="enkeys" VALUE="DISABLE" $diskeysselected></TD>
  3282.         <TD>DISABLE KEYS</TD>
  3283. EOT
  3284. ;
  3285.         }
  3286.         if (check_version("3.23.28")){
  3287.             my $size = $agent ? 40 : 55;
  3288.             $orderby = <<EOT
  3289.         <TD>ORDER BY</TD>
  3290.         <TD><INPUT TYPE=TEXT NAME="orderby" SIZE=$size TITLE="Column names separated by comma" VALUE="$orderbyvalye"></TD>
  3291.         <TD><INPUT TYPE=RADIO NAME="order" VALUE="ASC" $ascchecked></TD>
  3292.         <TD>ASC</TD>
  3293.         <TD><INPUT TYPE=RADIO NAME="order" VALUE="DESC" $desccheched></TD>
  3294.         <TD>DESC</TD>
  3295. EOT
  3296. ;
  3297.         }
  3298.          
  3299.         print <<EOT
  3300.     <TR>
  3301.         <TD> </TD>
  3302.         <TD ALIGN=RIGHT><SELECT NAME="firstafter" SIZE=1>
  3303. <OPTION VALUE="" SELECTED>
  3304. <OPTION VALUE="FIRST" $selected_f>FIRST
  3305. <OPTION VALUE="AFTER" $selected_a>AFTER
  3306. </SELECT></TD>
  3307.         <TD COLSPAN=8 TITLE="Define where to place new column">
  3308. <SELECT NAME="firstafterwhat" SIZE=1 TITLE="Define where to place new column">
  3309. <OPTION VALUE="">SELECT COLUMN
  3310. <OPTION VALUE="">-------------
  3311. $firstafteroption
  3312. </SELECT></TD>
  3313.     </TR>
  3314. </TABLE>
  3315. <HR SIZE="1" LENGTH="700">
  3316. EOT
  3317. ;
  3318. if ($orderby or $enkeys){
  3319.     print <<EOT
  3320. <TABLE>
  3321.     <TR>
  3322. $enkeys
  3323.         <TD> </TD>
  3324. $orderby
  3325.     </TR>
  3326. </TABLE>
  3327. <HR SIZE="1" LENGTH="700">
  3328. EOT
  3329. ;
  3330. }
  3331. # KEYS
  3332.  
  3333.         $query            = "SHOW INDEX FROM $tabs[0]";
  3334.         ($sth, $res)    = prepare_execute($query, $back,'2');
  3335.         if ($res > 0){
  3336.             print <<EOT
  3337. <BR><CODE>Drop the Key:</CODE><BR>
  3338. <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2>
  3339.     <TR>
  3340.         <TD><B>Select</B></TD>
  3341.         <TD><B>KEY NAME</B></TD>
  3342.         <TD><B>KEY</B></TD>
  3343.         <TD><B>COLUMN NAME (SUB PART)</B></TD>
  3344.     </TR>
  3345. EOT
  3346. ;
  3347.             my $matrix_ref    = $sth->fetchall_arrayref();
  3348.             my ($rows)        = (!defined($matrix_ref)? 0: scalar(@{$matrix_ref}));
  3349.             my ($cols)        = 10;
  3350.             my @matrix        = @{$matrix_ref};
  3351.             my $k            = 0;
  3352.             $sth->finish();
  3353.             my $ref;
  3354.             while (scalar  @matrix){
  3355.                 my %hashmatrix    = ();
  3356.                 my $thekey        = $matrix[0][2];
  3357.                 for (my $j = 0; $j < @matrix; $j++){
  3358.                     if ($matrix[$j][2] eq $thekey) {
  3359.                         $hashmatrix{$matrix[$j][3]}    = $matrix[$j];
  3360.                         $ref                         = splice (@matrix, $j, 1);
  3361.                         $j--;
  3362.                     }#IF 
  3363.                 }#FOR
  3364.                 if ((keys %hashmatrix) > 0) {
  3365.                     my @row =  @{$hashmatrix{1}};
  3366.                     my $keytype;
  3367.                     if ($row[1] == 0){
  3368.                         if ($row[2]     =~ /^\s*primary\s*$/i){$keytype = 'PRIMARY KEY'}
  3369.                         else {$keytype    = 'UNIQUE'}
  3370.                     }
  3371.                     else {
  3372.                         if (($row[9] =~ /^\s*FULLTEXT\s*$/i) or ($row[10] =~ /^\s*FULLTEXT\s*$/i)){$keytype = 'FULLTEXT';}
  3373.                         else {$keytype = 'INDEX' }
  3374.                     }
  3375.                 
  3376.                     my $options;
  3377.                     foreach (sort {$a <=> $b}(keys %hashmatrix)) {
  3378.                         my @row = @{$hashmatrix{$_}};
  3379.                         my $subpart = "($row[7])" if ($row[7]);
  3380.                         $options .= qq!<OPTION VALUE="">$row[4]$subpart\n!;
  3381.                     }#FOREACH
  3382.                     my $checked = '';
  3383.                     unless ($reload){
  3384.                         my @drop_key    = $q->param('drop_key');
  3385.                         $checked        = 'CHECKED' if (belongs(\@drop_key, $row[2]));
  3386.                     }
  3387.                     print qq!
  3388.     <TR><TD><INPUT TYPE=CHECKBOX NAME="drop_key" VALUE="$row[2]" TITLE="Select key to drop" $checked></TD>
  3389.         <TD BGCOLOR="#EEEEEE">$row[2]</TD>
  3390.         <TD BGCOLOR="#EEEEEE">$keytype</TD>
  3391.         <TD BGCOLOR="#EEEEEE"><SELECT SIZE=1 style="color: #a0a0a0">$options</SELECT></TD>
  3392.     </TR>\n!;
  3393.                 }#IF
  3394.  
  3395.                 bail_out("Counter Overflow. Sorry!") if ($k++ > 100000);
  3396.             }#WHILE
  3397.         print "</TABLE>\n<HR SIZE=1 LENGTH=700><BR>";
  3398.         }#if res > 0
  3399.         my $keyname        = '';
  3400.         my @keytype        = ();
  3401.         my $indcolname    = '';
  3402.         unless ($reload){
  3403.             $keyname    = quoteit($q->param('keyname'));
  3404.             my $i        = 0;
  3405.             foreach ('PRIMARY KEY', 'UNIQUE', 'INDEX', 'FULLTEXT'){
  3406.                 $keytype[$i] = 'SELECTED' if ($q->param('keytype') eq $_);
  3407.                 $i++;
  3408.             }
  3409.             $indcolname = quoteit($q->param('indcolname'));
  3410.         }
  3411.         my $fulltext    = qq!<OPTION VALUE="FULLTEXT" $keytype[3]>FULLTEXT! if (check_version('3.23.23'));
  3412.         print <<EndNewIndex
  3413. <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2>
  3414.     <TR>
  3415.         <TD COLSPAN=3><CODE>Add New Key:</CODE></TD>
  3416.     <TR>
  3417.         <TD><B>KEY NAME</B></TD>
  3418.         <TD><B>KEY</B></TD>
  3419.         <TD><B>COLUMN NAMES</B><i> comma separated</i></TD>
  3420.     </TR>
  3421.     <TR>
  3422.         <TD><I>optionally</I><br><INPUT TYPE=TEXT NAME="keyname" VALUE="$keyname" SIZE=12 TITLE="Type key name. Alphanumeric and underscore characters only"></TD>
  3423.         <TD TITLE="Select the key type"> <BR><SELECT SIZE=1 NAME="keytype" TITLE="Select the key type">
  3424.             <OPTION VALUE="">
  3425.             <OPTION VALUE="PRIMARY KEY" $keytype[0]>PRIMARY
  3426.             <OPTION VALUE="UNIQUE" $keytype[1]>UNIQUE
  3427.             <OPTION VALUE="INDEX" $keytype[2]>INDEX
  3428.             $fulltext
  3429.             </SELECT></TD>
  3430.         <TD><TEXTAREA ROWS=3 COLS=$textareasize NAME="indcolname" TITLE="Type the column names comprising the key.\nComma separated">$indcolname</TEXTAREA></TD>
  3431.     </TR>
  3432. </TABLE>
  3433. <HR SIZE=1 LENGTH=700>
  3434. EndNewIndex
  3435. ;
  3436.     
  3437.     }#if @tabs>0 (for keys)
  3438.     else {print "</TABLE><P>";}
  3439.     my $action = '';
  3440.     if (($q->param('func') =~ /import/i) or ($q->param('func') =~ /export/i)){
  3441.         $action = $q->param('func');
  3442.     }
  3443.     elsif (($q->param('action') =~ /import/i) or ($q->param('action') =~ /export/i)){
  3444.         $action = $q->param('action');
  3445.     }
  3446.     if ($action){print qq!\n<INPUT TYPE=HIDDEN NAME="action" VALUE="$action">\n!;}
  3447.     my $sqlchecked = 'CHECKED' if $q->param('preview');
  3448.     foreach (keys %option_){print qq!<INPUT TYPE=HIDDEN NAME="$_" VALUE="$option_{$_}">\n!}
  3449.  
  3450.     print <<EOT
  3451. <INPUT TYPE=HIDDEN NAME="tables" VALUE="$tabs[0]">
  3452. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  3453. <INPUT TYPE=HIDDEN NAME="page" VALUE="$page">
  3454. <TABLE BORDER=0 CELLPADDIND=0 CELLSPACING=0>
  3455.     <TR>
  3456.         <TD COLSPAN=5 TITLE="Check to preview generated command">
  3457.         <INPUT TYPE=CHECKBOX NAME="preview" TITLE="Check to preview generated command" $sqlchecked> Preview SQL query.</TD>
  3458.     </TR>
  3459.     <TR>
  3460.         <TD><INPUT TYPE=SUBMIT VALUE="   SAVE   " NAME="alter" TITLE="Apply changes" onLoad="focus=on" tabindex=1 taborder=1 style="width: 80; color: #cc0000"> </TD>
  3461.         <TD>$saveas1</TD>
  3462.         <TD><INPUT TYPE=SUBMIT NAME="reload" VALUE="RELOAD" TITLE="READ ORIGINAL VALUES. ALL CHANGE WILL BE LOST" style="width: 80"></TD>
  3463.         <TD><INPUT TYPE=SUBMIT VALUE="PROOF" TITLE="READ ORIGINAL VALUES. ALL CHANGE WILL BE LOST" style="width: 120"></TD>
  3464.         <TD><INPUT TYPE=RESET TITLE="Reset form" style="width: 80"></TD>
  3465.     </TR>
  3466. </TABLE>
  3467. </FORM>
  3468.  
  3469.  
  3470. EOT
  3471. ;
  3472.     print "<FORM ACTION=$full_url METHOD=POST>\n";
  3473.     print qq!<INPUT TYPE=SUBMIT NAME="back" VALUE="Back">\n!;
  3474.     foreach (keys %$back){print qq!<INPUT TYPE=HIDDEN NAME="$_" VALUE="$back->{$_}">\n!}
  3475.     print "</FORM>\n\n";
  3476.     print "<!-- Alter procedure ends here -->\n\n";
  3477.  
  3478.     return;
  3479.  
  3480. }
  3481.  
  3482. sub execAlterTable {
  3483.     unless ($q->param('alter') or $q->param('saveas')){&loadAlterTable(); return}
  3484.     my $table             = deletespace($q->param('tables'));
  3485.     my $scl;
  3486.     my $newtablename     = deletespace($q->param('newtablename'));
  3487.     my $back            = {};
  3488.     $back->{page}         = 'tables';
  3489.     $back->{dbname}        = $database;
  3490.     $back->{func}        = $table ? 'alter' : 'create';
  3491.     $back->{tables}     = "$table" if $table;
  3492.     if (my $action = $q->param('action')){$back->{action} = $action}
  3493.  
  3494.     my $saveas;
  3495.     my @drop_key        = ();
  3496.     my $rename;
  3497.     my @drop_column        = ();
  3498.     my @change_column    = ();
  3499.     my $add_column        = ();
  3500.     my $add_ind;
  3501.     my $options;
  3502.     my $order    = '';
  3503.     my $enkeys    = '';
  3504.     if ($table) {
  3505.     
  3506. #1) DROP KEYS
  3507.         my @dropind                 = $q->param('drop_key');
  3508.         foreach (@dropind){
  3509.              push @drop_key,((/^\s*primary\s*/i)? "\nDROP PRIMARY KEY" : "\nDROP INDEX $_");
  3510.         }
  3511.  
  3512. #2) RENAME OR SAVE AS
  3513.         if ($newtablename ne $table) {
  3514.             if ($q->param('saveas')){
  3515.                 my $include        = $q->param('savewhat');
  3516.                 $include        = 'both' if ($include eq 'data');
  3517.                 my $hashref     = {
  3518.                     newtablelist    => [$newtablename],
  3519.                     tablelist         => [$table],
  3520.                     include            => 'structure',
  3521.                     dropifexists    => '0',
  3522.                     back            => '$back',
  3523.                     comments        => '0',
  3524.                     lock            => '0'
  3525.                 };
  3526.                 $saveas            = getdatanstructure($hashref);
  3527.                 $saveas            =~ s/^(.*)\s*;$/$1/m;
  3528.                 
  3529.             }
  3530.             else{
  3531.                 $rename = "\nRENAME $newtablename";
  3532.             }
  3533.         }
  3534.         my @colname         = $q->param('colname');
  3535.         my @type             = $q->param('type');
  3536.         my @length             = $q->param('length');
  3537.         my @unsigned         = $q->param('unsigned');
  3538.         my @zerofill         = $q->param('zerofill');
  3539.         my @binary             = $q->param('binary');
  3540.         my @notnull         = $q->param('notnull');
  3541.         my @default         = $q->param('default');
  3542.         my @autoincrement     = $q->param('autoincrement');
  3543.     
  3544.         my $query             = "DESCRIBE $table";
  3545.         my ($sth, $res)     = prepare_execute($query,$back);
  3546.     $scl                = scalar @colname;
  3547.     if ($newtablename ne $table) {if ($scl > 4){bail_out ($demomsg1, $back)}}
  3548.         my $typeref         = sub  {
  3549.             my $type             = shift;
  3550.             $type                 =~ s/^\s*(\w*)(\(.*\))?(.*)/$1/;
  3551.             my $symbols         = $2; 
  3552.             my $therest         = $3;
  3553.             $symbols             =~ s/^\((.*)\)/$1/ if ($symbols);
  3554.             my $unsigned         = '';
  3555.             my $zerofill         = '';
  3556.             my $binary             = '';
  3557.             $symbols             = quoteit($symbols);
  3558.             $unsigned             = '1' if ($therest =~ /unsign/i);
  3559.             $zerofill             = '1' if ($therest =~ /zerofill/i);
  3560.             $binary             = '1' if ($therest =~ /binary/i);
  3561.             return ($type, $symbols, $unsigned, $zerofill, $binary);
  3562.         };
  3563.         my $i                 = 0;
  3564.         while (my @row = $sth->fetchrow_array()) {
  3565.             if ($q->param("drop_column_$row[0]")){
  3566.                 push @drop_column, "\nDROP COLUMN $row[0]";
  3567.             }
  3568.             else {
  3569.                 my ($type, $length, $unsigned, $zerofill, $binary) = &$typeref($row[1]);
  3570.                 my $autoincrement     = '1' if ($row[5] =~ /^.*auto.*increment.*$/i);
  3571.                    my $notnull         = '';
  3572.                 $notnull             = 1 unless ($row[2] =~ /yes/i);
  3573.                 my $default         = $row[4];
  3574.                 my $unsigned_         = (belongs(\@unsigned,$row[0]) and ($type[$i] =~ /int|decimal/i or (check_version('4.0.2') and $type[$i] =~/double|float/i)));
  3575.                 my $zerofill_         = (belongs(\@zerofill,$row[0]) and ($type[$i] =~ /int|decimal|double|float/i));
  3576.                 my $binary_         = (belongs(\@binary,$row[0]) and ($type[$i] =~ /char/i));
  3577.                 my $notnull_         = belongs(\@notnull,$row[0]);
  3578.                 my $autoincrement_     = belongs(\@autoincrement,$row[0]);
  3579.                 if ($type[$i] =~ /int|decimal|double|float|char|enum|set|year|timestamp/i){$length[$i] = deletespace($length[$i])}
  3580.                 else {$length[$i] = ''}
  3581.                 if ($type[$i] =~ /text|blob/i){$default[$i] = ''}
  3582.                 if (
  3583.                            ($colname[$i] ne $row[0]) 
  3584.                     or    ($type[$i] !~ /^($type)$/i)
  3585.                     or    ($length[$i]        ne $length)
  3586.                     or    ($default[$i]        ne $default)
  3587.                     or    ($unsigned_            xor $unsigned)
  3588.                     or    ($zerofill_            xor $zerofill)
  3589.                     or    ($binary_            xor $binary)
  3590.                     or    ($notnull_            xor $notnull)
  3591.                     or    ($autoincrement_     xor $autoincrement)
  3592.                     )
  3593.                 {
  3594.                     if ($unsigned_) {$unsigned_             = ' UNSIGNED'} else {$unsigned_ = ''}
  3595.                     if ($zerofill_) {$zerofill_             = ' ZEROFILL'} else {$zerofill_ = ''}
  3596.                     if ($binary_)   {$binary_                 = ' BINARY'}     else {$binary_ = ''}
  3597.                     if ($notnull_)  {$notnull_                 = ' NOT NULL'}    else {$notnull_ = ''}
  3598.                     if ($autoincrement_) {$autoincrement_     = ' AUTO_INCREMENT'} else {$autoincrement_ = ''}
  3599.                     if ($default[$i]) {$default = " DEFAULT ".$dbh->quote($default[$i])} else {$default = ''}; 
  3600.                     $length[$i] = '('.$length[$i].')' if ($length[$i] ne '');
  3601.                     push @change_column, "\nCHANGE COLUMN $row[0] $colname[$i] $type[$i]$length[$i]"."$unsigned_"."$zerofill_"."$binary_"."$notnull_"."$default"."$autoincrement_";
  3602.                 }        
  3603.                         
  3604.             }#unless
  3605.             $i++;
  3606.         }
  3607.         $sth->finish();
  3608. #ORDER BY
  3609.         if ($order = $q->param('orderby')){
  3610.             my $asc        = $q->param('order');
  3611.             $order        = "ORDER BY $order $asc";
  3612.         }
  3613. #ENABLE / DISABLE KEYS
  3614.         if ($enkeys = $q->param('enkeys')){
  3615.             $enkeys .= ' KEYS' 
  3616.         }
  3617.     } #if table
  3618. #OPTIONS
  3619.         if (check_version("3.23.00")){
  3620.             my $errmsg = '';
  3621.             my $tabletype    = $q->param('tabletype');
  3622.             my $tabletype_    = $q->param('tabletype_');
  3623.             if ($tabletype){
  3624.                 if ($tabletype_ !~ /^$tabletype$/i){$options = "TYPE=$tabletype "}
  3625.             }
  3626.             my $MIN_ROWS        = deletespace($q->param('MIN_ROWS'));
  3627.             my $MIN_ROWS_        = $q->param('MIN_ROWS_');
  3628.             if ($MIN_ROWS =~ /\D/){$errmsg .= "Parameter MIN_ROWS must contain integer values only\n"}
  3629.             elsif ($MIN_ROWS ne $MIN_ROWS_){
  3630.                 unless ($MIN_ROWS){$options .= "MIN_ROWS=0 "}
  3631.                 else{$options .= "MIN_ROWS=$MIN_ROWS "}
  3632.             }
  3633.             my $MAX_ROWS        = deletespace($q->param('MAX_ROWS'));
  3634.             my $MAX_ROWS_        = $q->param('MAX_ROWS_');
  3635.             if ($MAX_ROWS =~ /\D/){$errmsg .= "Parameter MAX_ROWS must contain integer values only\n"}
  3636.             elsif ($MAX_ROWS ne $MAX_ROWS_){
  3637.                 unless ($MAX_ROWS){$options .= "MAX_ROWS=0 "}
  3638.                 else{$options .= "MAX_ROWS=$MAX_ROWS "}
  3639.             }
  3640.             my $AVG_ROW_LENGTH        = deletespace($q->param('AVG_ROW_LENGTH'));
  3641.             my $AVG_ROW_LENGTH_        = $q->param('AVG_ROW_LENGTH_');
  3642.             if ($AVG_ROW_LENGTH =~ /\D/){$errmsg .= "Parameter AVG_ROW_LENGTH must contain integer values only\n"}
  3643.             elsif ($AVG_ROW_LENGTH ne $AVG_ROW_LENGTH_){
  3644.                 unless ($AVG_ROW_LENGTH){$options .= "AVG_ROW_LENGTH=0 "}
  3645.                 else{$options .= "AVG_ROW_LENGTH=$AVG_ROW_LENGTH "}
  3646.             }
  3647.             if (    ($tabletype =~ /MyISAM/i)
  3648.                  or (!$tabletype and $tabletype_ =~ /MyISAM/i) 
  3649.                  or (
  3650.                      check_version("4.1.0") and 
  3651.                         ($tabletype =~ /HEAP/i 
  3652.                     or    (!$tabletype and $tabletype_ =~ /HEAP/i))
  3653.                     )
  3654.                 ){
  3655.                 my $AUTO_INCREMENT        = deletespace($q->param('auto_increment'));
  3656.                 my $AUTO_INCREMENT_        = $q->param('AUTO_INCREMENT_');
  3657.                 if ($AUTO_INCREMENT =~ /\D/){$errmsg .= "Parameter AUTO_INCREMENT must contain integer values only\n"}
  3658.                 elsif (($AUTO_INCREMENT ne $AUTO_INCREMENT_) and ($AUTO_INCREMENT ne '')){
  3659.                     $options .= "AUTO_INCREMENT=$AUTO_INCREMENT "
  3660.                 }
  3661.             }
  3662.             if ($errmsg){bail_out($errmsg, $back)}
  3663.  
  3664.             my $ROW_FORMAT        = $q->param('ROW_FORMAT');
  3665.             my $ROW_FORMAT_        = $q->param('ROW_FORMAT_');
  3666.             if ((!$ROW_FORMAT_ and $ROW_FORMAT ne 'DEFAULT') or ($ROW_FORMAT_ and $ROW_FORMAT ne $ROW_FORMAT_)){
  3667.                 $options .= "ROW_FORMAT=$ROW_FORMAT "
  3668.             }
  3669.  
  3670.             my $PACK_KEYS        = $q->param('PACK_KEYS');
  3671.             my $PACK_KEYS_        = $q->param('PACK_KEYS_');
  3672.             if (($PACK_KEYS_ eq '' and $PACK_KEYS ne 'DEFAULT' and $PACK_KEYS ne '') or ($PACK_KEYS_ ne '' and $PACK_KEYS ne $PACK_KEYS_)){
  3673.                 $options .= "PACK_KEYS=$PACK_KEYS "
  3674.             }
  3675.             
  3676.             my $CHECKSUM        = $q->param('CHECKSUM');
  3677.             my $CHECKSUM_        = $q->param('CHECKSUM_');
  3678.             if (($CHECKSUM or $CHECKSUM_) and ($CHECKSUM ne $CHECKSUM_)){
  3679.                 unless ($CHECKSUM){$options .= "CHECKSUM=0 "}
  3680.                 else{$options .= "CHECKSUM=$CHECKSUM "}
  3681.             }
  3682.             my $DELAY_KEY_WRITE        = $q->param('DELAY_KEY_WRITE');
  3683.             my $DELAY_KEY_WRITE_        = $q->param('DELAY_KEY_WRITE_');
  3684.             if (($DELAY_KEY_WRITE or $DELAY_KEY_WRITE_) and ($DELAY_KEY_WRITE ne $DELAY_KEY_WRITE_)){
  3685.                 unless ($DELAY_KEY_WRITE){$options .= "DELAY_KEY_WRITE=0 "}
  3686.                 else{$options .= "DELAY_KEY_WRITE=$DELAY_KEY_WRITE "}
  3687.             }
  3688.             my $comment        = deletespace($q->param('comment'));
  3689.             my $COMMENT_    = $q->param('COMMENT_');
  3690.             if (($comment or $COMMENT_) and ($comment ne $COMMENT_)){
  3691.                 $comment = $dbh->quote($comment);
  3692.                 $options .= "COMMENT=$comment";
  3693.             }
  3694.         }
  3695.         
  3696. # NEW COLUMN
  3697.     if (my $newcolname         = $q->param('newcolname')) {
  3698.         my $newcoltype             = $q->param('newcoltype');
  3699.         my $newcollength         = $q->param('newcollength');
  3700.         $newcollength             = '('.$newcollength.')' if $newcollength;
  3701.         
  3702.         my $unsigned_new         = ' UNSIGNED' if ($q->param('unsigned_new'));
  3703.         my $zerofill_new         = ' ZEROFILL' if ($q->param('zerofill_new'));
  3704.         my $binary_new             = ' BINARY'     if ($q->param('binary_new'));
  3705.         my $notnull_new         = ' NOT NULL'  if ($q->param('notnull_new'));
  3706.         my $newcoldefault         = ' DEFAULT '.$dbh->quote($q->param('newcoldefault')) if ($q->param('newcoldefault'));
  3707.  
  3708.  
  3709.         my $addwhere             = $q->param('firstafter');
  3710.         if ($table) {
  3711.                 if ($addwhere eq 'AFTER') {
  3712.                     $addwhere             .= " ".$q->param('firstafterwhat');
  3713.                 }
  3714.                 if ($scl < 5){
  3715.                     $add_column = "\nADD COLUMN $newcolname $newcoltype$newcollength$unsigned_new$zerofill_new $binary_new$notnull_new$newcoldefault $addwhere";
  3716.             }
  3717.             else {bail_out ($demomsg1, $back)}
  3718.         }
  3719.         else {$add_column = " ($newcolname $newcoltype$newcollength$unsigned_new$zerofill_new $binary_new$notnull_new$newcoldefault) "}
  3720.     }
  3721.     
  3722. # ADD NEW INDEX:
  3723.     my $keyname                 = $q->param('keyname');
  3724.     my $keytype                 = $q->param('keytype');
  3725.     my $indcolname                 = $q->param('indcolname');
  3726.     if ($keytype){
  3727.         if ($scl > 4){bail_out ($demomsg1, $back)}
  3728.         if ($keytype =~ /^primary$/i) {
  3729.             $add_ind            .= "\nADD PRIMARY KEY "
  3730.         }
  3731.         else {
  3732.             $add_ind            .= "\nADD $keytype $keyname ";
  3733.         }
  3734. #        $query                     .= "UNIQUE $keyname " if ($keytype =~ /^unique$/i);
  3735. #        $query                     .= "INDEX $keyname " if ($keytype =~ /^index$/i);
  3736.         
  3737.         $add_ind                .= "($indcolname)";
  3738.     }
  3739.     
  3740. #ASSEMBLE THE QUERY
  3741.     my @queries                 = ();
  3742.     if ($table) {
  3743.         if ($saveas){
  3744.             if ($scl > 4){bail_out ($demomsg1, $back)}
  3745.             push @queries, $saveas ;
  3746.             $table = $newtablename;
  3747.         }
  3748. #    my $rename;
  3749.         my @alter = ();
  3750.         push @alter, @drop_key        if @drop_key;
  3751.         push @alter, @drop_column    if @drop_column;
  3752.         push @alter, $enkeys        if $enkeys;
  3753.         push @alter, @change_column    if @change_column;
  3754.         push @alter, $add_column    if $add_column;
  3755.         push @alter, $add_ind        if $add_ind;
  3756.         push @alter, "\n$options"    if $options;
  3757.         push @alter, $rename        if $rename;
  3758.         push @alter, $order            if $order;
  3759.         
  3760.         if (@alter){
  3761.             my $ignore = ' IGNORE' if $q->param('ignore');
  3762.             $query    = "ALTER$ignore TABLE $table ";
  3763.             $query    .= join ', ', @alter;
  3764.             push @queries, $query;
  3765.         }
  3766.  
  3767.     }
  3768.     else {
  3769.         $query     = "CREATE TABLE $newtablename $add_column";
  3770.         $query    .= "\n$options\n";
  3771.         
  3772.         push @queries, $query;
  3773.     }
  3774.     
  3775.     
  3776.     if ($q->param('preview') and @queries) {
  3777.         my $func    = ($page eq 'create') ? 'create' : $q->param('func');
  3778.         my $back = {
  3779.             page            => "alterAfterPreview",
  3780.             func            => "$func",
  3781.             newtablename    => "" . $q->param('newtablename'),
  3782.             alter            => 1,
  3783.             preview            => "" . $q->param('preview')
  3784.         };
  3785.         printpreview(\@queries, $back);
  3786.         return;
  3787.     }
  3788.     else {
  3789.         foreach (@queries) {
  3790.             $dbh->do($_) or bail_out("ALTER FAIL\nQUERY: $_", $back);
  3791.            }
  3792.     }
  3793.     my $msg;
  3794.     unless (@queries){$msg = qq?<FONT COLOR="#FF0000">No Changes!</FONT>?}
  3795.     &loadAlterTable({msg => $msg})
  3796. }
  3797. sub execDeleteFromTable {
  3798.     print "<!-- DeleteFromTable Procedure starts here -->";
  3799.     my $back = {
  3800.         page        => 'select_db',
  3801.         dbname        => "$database",
  3802.     };
  3803.     if ($q->param('delete')) {
  3804.         my @tabs = $q->param('tables');
  3805.         if (@tabs == 0){print "<p><b>DELETE ERROR:</B> Table is not specified.<P>\n"}
  3806.         elsif  (@tabs >= 2) {print "<p><b>DELETE ERROR:</B> TOO MANY TABLES.<P>\n"}
  3807.         else {
  3808.             my $where = $q->param('wheredelete');
  3809.             my $query;
  3810.             if ($where) {$query = "DELETE FROM $tabs[0] WHERE $where"}
  3811.             else {$query = "DELETE FROM $tabs[0] WHERE 1=1"}
  3812.             my $res = $dbh -> do($query) or bail_out ("ERROR: CAN NOT DELETE FROM $_ \nQUERY: $query", $back);
  3813.         }
  3814.     }
  3815.     &loadSelectTables();
  3816.     print "<!-- DeleteFromTable Procedure ends here -->";
  3817.     return;
  3818. }
  3819. sub getCreateTableSQL {
  3820.     my $text;
  3821.     my $hash            = shift;
  3822.     my $tabsref         = $hash->{tabsref};
  3823.     my $dropifexists     = $hash->{dropifexists};
  3824.     my $back            = $hash->{back};
  3825.     my @newtabs         = @{$hash->{newtabs}} if defined $hash->{newtabs};
  3826.     my @tabs             = @$tabsref;
  3827.     my $newtabind        = 0;
  3828.     if (check_version('3.23.20')){
  3829.         foreach my $table (@tabs) {
  3830.             $text                     .= "DROP TABLE IF EXISTS $table; \n" if  $dropifexists;
  3831.             my $query                 = "SHOW CREATE TABLE $table";
  3832.             my ($sth, $res)         = prepare_execute($query, $back);
  3833.             my @opt                   = $sth->fetchrow_array();
  3834.             $sth->finish();
  3835.             if ($newtabs[$newtabind]){
  3836.                 if ($opt[1] =~ /^CREATE TABLE (\S?)(\w+)\1(.*)$/si){$opt[1] = "CREATE TABLE $1$newtabs[$newtabind]$1 $3"}
  3837.             }
  3838.             $text                    .= "$opt[1];\n\n";
  3839.             $newtabind++;
  3840.         }
  3841.         return $text;
  3842.     }
  3843.     foreach my $table (@tabs) {
  3844.         $text                     .= "DROP TABLE IF EXISTS $table; \n" if  $dropifexists;
  3845.         my $col_declaration     = '';
  3846.         my @col_declaration     = ();        
  3847.         
  3848.         my $query                 = "DESCRIBE $table";
  3849.         my ($sth, $res)         = prepare_execute($query, $back);
  3850.         my $i = 0;
  3851.         while (my @column = $sth->fetchrow_array()) {
  3852.               
  3853.               $col_declaration[$i] .= "\t$column[0] $column[1]";
  3854.               $col_declaration[$i] .= " NOT NULL" unless ($column[2] eq 'YES');
  3855.               $col_declaration[$i] .= " DEFAULT ".$dbh->quote($column[4]) unless  ($column[4] eq '');
  3856.               $col_declaration[$i] .= " AUTO_INCREMENT" if  ($column[5] =~ /AUTO_INCREMENT/i);
  3857.               $i++;
  3858.         }
  3859.         $sth->finish or ErrMessage("Cannot finish STH (DDL-describe)");
  3860.         $col_declaration = join (",\n", @col_declaration);
  3861.         $query = "SHOW INDEX FROM $table";
  3862.         ($sth, $res) = prepare_execute($query, $back);
  3863.         
  3864.         my $index;
  3865.         my $fulltext; 
  3866.         my %primary;
  3867.         my $unique;
  3868.         
  3869.         while (my @opt = $sth->fetchrow_array) {
  3870.  
  3871.             if ($opt[1] eq '0'){
  3872.                   if ($opt[2] =~ /^PRIMARY$/i){
  3873.                       $primary{$opt[3]} = $opt[4];
  3874.                     $primary{$opt[3]} .= "($opt[7])" if ($opt[7]);
  3875.                 }
  3876.                 else{
  3877.                     my $colname = $opt[4];
  3878.                     $colname .= "($opt[7])" if ($opt[7]);
  3879.                       $unique->{$opt[2]}{$opt[3]}=$colname;
  3880.                 }
  3881.             }
  3882.             else {
  3883.                 my $colname = $opt[4];
  3884.                 $colname .= "($opt[7])" if ($opt[7]);
  3885.                 if ($opt[9] =~ /FULLTEXT/i){$fulltext->{$opt[2]}{$opt[3]}=$colname;}
  3886.                 else {$index->{$opt[2]}{$opt[3]}=$colname;}
  3887.             }
  3888.         }
  3889.         $sth->finish or ErrMessage("Cannot finish STH (DDL-show index)");
  3890.  
  3891.         my @primary_key;
  3892.         my @unique;
  3893.         my @index;
  3894.         my @fulltext; 
  3895.         
  3896.         foreach (sort keys (%primary)){
  3897.             push @primary_key, $primary{$_};
  3898.         }
  3899.         my $unique_key;
  3900.         foreach (keys %$unique) {
  3901.             my $hash = $unique->{$_};
  3902.             $unique_key .= ",\n\tUNIQUE $_ ";
  3903.             
  3904.             foreach (sort keys %$hash){
  3905.                  push @unique, $hash->{$_};
  3906.             } 
  3907.             $unique_key .= "(".join(', ', @unique).")";
  3908.             @unique = ();
  3909.         }
  3910.         my $index_key;
  3911.         foreach (keys %$index) {
  3912.             my $hash = $index->{$_};
  3913.             $index_key .= ",\n\tINDEX $_ ";
  3914.             
  3915.             foreach ( sort keys %$hash){
  3916.                 push @index, $hash->{$_};
  3917.             } 
  3918.             $index_key .= "(".join(', ', @index).")";
  3919.             @index = ();
  3920.         }
  3921.         my $fulltext_key;
  3922.         foreach (keys %$fulltext) {
  3923.             my $hash = $fulltext->{$_};
  3924.             $fulltext_key .= ",\n\tFULLTEXT $_ ";
  3925.             
  3926.             foreach ( sort keys %$hash){
  3927.                 push @fulltext, $hash->{$_};
  3928.             } 
  3929.             $fulltext_key .= "(".join(', ', @fulltext).")";
  3930.             @fulltext = ();
  3931.         }
  3932.         
  3933.         my $primary_key = ",\n\n\tPRIMARY KEY (".join(', ',@primary_key).")" if (scalar(%primary));
  3934.         my $create_definition = 
  3935.             $col_declaration.
  3936.             $primary_key.
  3937.             $index_key.
  3938.             $fulltext_key.
  3939.             $unique_key
  3940.             ;
  3941.  
  3942.        my $table_options = "";
  3943.          if (check_version('3.23.00')) {
  3944.    
  3945.             $query = "SHOW TABLE STATUS";
  3946.             ($sth, $res) = prepare_execute($query, $back);
  3947. LABLE1:    while (my @row = $sth->fetchrow_array()) {
  3948.                 if ($table eq $row[0]){
  3949.                    if ($row[1]) {$table_options .= "\tTYPE=$row[1]\n" unless ($row[1] =~ /myisam/i)}
  3950.                    my $opt = $row[-2];
  3951.                    my $i = 0;
  3952.                    while ($opt =~ /^\s*(\S*=\S*)\s*(.*)$/){
  3953.                          my $first = $1;
  3954.                          my $second = $2;
  3955.                          if ($first =~ /^\s*format\s*=/) {$first = "ROW_$first"}
  3956.                          $table_options .= "\t$first\n";
  3957.                          $opt = $second;
  3958.                          if ($i++ > 100) {
  3959.                              $table_options = '';
  3960.                             print "Table_options fail! ($i)<br>";
  3961.                             last LABLE1;
  3962.                          }
  3963.                    }#while
  3964.                    if ($row[-1]) {$table_options .= "\tCOMMENT=\"$row[-1]\"\n";}
  3965.                 }#if        
  3966.             }#while
  3967.             $sth->finish();
  3968.         } #if version = 3.23#
  3969.         $table = $newtabs[$newtabind] if $newtabs[$newtabind];
  3970.         $text .= <<EOT
  3971. CREATE TABLE $table 
  3972. (
  3973.  $create_definition
  3974. )
  3975.  $table_options
  3976. ;
  3977.  
  3978. EOT
  3979. ;
  3980.     $newtabind++;
  3981.     }
  3982.     return $text;
  3983. }
  3984. sub execGenerateDDL {
  3985.  
  3986.     print "<!-- GenerateDDL procedure starts here -->";
  3987.     my @tabs = $q->param('tables');
  3988.     my $back = {page => 'select_db', dbname => "$database"};
  3989.     bail_out ("Table is not specified.", $back) unless @tabs;
  3990.     my $dropifexists = $q->param('dropifexists');
  3991.     my @text;
  3992.     foreach(@tabs){
  3993.         my $fk = 0;
  3994.         my $text = getCreateTableSQL({tabsref =>[$_], dropifexists => "$dropifexists", back => $back});
  3995.         if ($text =~ /FOREIGN KEY/si){push @text, $text} else {unshift @text, $text}
  3996.     }
  3997.     
  3998.     ($user, $password, $MySQLhost, $usedefault) = $q->cookie('db_manager');
  3999.     my $textsize        = $agent ? 17 : 25;
  4000.     my $textareasize    = $agent ? 45 : 70;
  4001.     my $dbname = $database;
  4002.     print <<DDLTable
  4003. <FORM METHOD=POST ACTION="$full_url">
  4004. <TABLE BORDER=1 CELLPADDING=4>
  4005.        <TR>
  4006.               <TD><TEXTAREA WRAP=OFF ROWS=22 COLS=$textareasize NAME="SQL">@text</TEXTAREA></TD>
  4007.            <TD VALIGN=TOP><P><CODE>APPLY TO:</CODE><P>
  4008.         <!--     User name:<BR>
  4009.          <INPUT TYPE=TEXT SIZE=$textsize NAME="user" VALUE="$user"><BR>
  4010.            Password:<BR>
  4011.            <INPUT TYPE=PASSWORD SIZE=$textsize NAME="password" VALUE="$password"><BR> -->
  4012.            Database Name:<BR>
  4013.            <INPUT TYPE=TEXT SIZE=$textsize NAME="dbname" VALUE="$database"><BR>
  4014.           <!--   host [localhost]<BR>
  4015.            <INPUT TYPE=TEXT SIZE=$textsize NAME="host" VALUE=""> --><P>
  4016.            <INPUT TYPE=SUBMIT SIZE=$textsize NAME="apply" VALUE="Apply">
  4017.            <INPUT TYPE=RESET><BR>
  4018.            <INPUT TYPE=CHECKBOX NAME="abortsql" TITLW="Abort execution if error occurs">Abort on error
  4019.            </TD>
  4020.         </TR>
  4021. </TABLE>
  4022. <INPUT TYPE=HIDDEN NAME="page" VALUE="ddl">   
  4023. <INPUT TYPE=HIDDEN NAME="database" VALUE="$database">   
  4024. <!-- <INPUT TYPE=HIDDEN NAME="login" VALUE="1">   -->
  4025. </FORM>
  4026. DDLTable
  4027. ;
  4028.     print "\n\n<!-- GenerateDDL procedure ends here -->\n\n";
  4029.  
  4030. return;
  4031. }
  4032. sub execInsertData  {
  4033.     my $table = $q->param('tables');
  4034.     my $back = {dbname => $database, tables => $table};
  4035.  
  4036.     if ($page =~ /insert/i){
  4037.         $back->{func} = "INSERT";
  4038.         $back->{page} = "tables";
  4039.     }
  4040.     elsif ($page =~ /update/i) {
  4041.         $back->{page} = "tables";
  4042.         $back->{func} = "UPDATE";
  4043.         $back->{updateStart} = $q->param('start');
  4044.         $back->{updateRows} = $q->param('rows');
  4045.         $back->{updateWhere} = $q->param('where');
  4046.         $back->{updateOrder} = $q->param('order');
  4047.  
  4048.       }
  4049.     elsif ($page eq 'searchresult'){
  4050.         my @fields = $q->param('fields');
  4051.         $back->{page} = "searchresult";
  4052.         $back->{func} = "new";
  4053.         $back->{where} = $q->param('where').'';
  4054.         $back->{start} = $q->param('start').'';
  4055.         $back->{rows} = $q->param('rows').'';
  4056.         $back->{order} = $q->param('order').'';
  4057.         $back->{count} = $q->param('count').'';
  4058.         $back->{fields} = \@fields;
  4059.     }
  4060.  
  4061.     my $count1 = count_rows($table, $back);
  4062.     
  4063.     my $query = "SELECT * FROM $table LIMIT 0";
  4064.     my($sth, $res)= prepare_execute ($query, $back);
  4065.  
  4066.     my (@insert_list, @insert_data, $set, $data); #test it
  4067.     my @names = @{$sth->{NAME}};
  4068.     
  4069. #++++++++++++++++++++++++++++++++++++++
  4070.     
  4071.     $sth->finish();
  4072.  
  4073.     foreach (@names) {
  4074.         my @up_list = $q->param('upload');
  4075.         if (belongs(\@up_list,$_)){
  4076.             $data = $q->param($_.'_data_upload');
  4077.             my $buf;
  4078.             binmode $data;
  4079.             my $line = '';
  4080.             while (read ($data, $buf, 1024)) {$line .= $buf}
  4081.             close $data or bail_out("$!", $back);
  4082.             $data = $line;
  4083.         }
  4084.         else {$data = $q->param($_.'_data')};
  4085.         if ($data ne ''){
  4086.             push @insert_list, $_;        
  4087.  
  4088. #++++++++++++++++++++++++++++++++++++++
  4089.  
  4090.             my @unquote = $q->param('unquote');
  4091.             $data = $dbh->quote($data) unless belongsb(\@unquote, $_);
  4092.             push @insert_data, $data;
  4093.         }#if ($data...
  4094.  
  4095. #++++++++++++++++++++++++++++++++++++++
  4096.         
  4097.     }#foreach...
  4098.     
  4099. #++++++++++++++++++++++++++++++++++++++
  4100.     if (@insert_list == 0){
  4101.         my @datum;
  4102.         foreach (@names) {push @datum, "''"}    
  4103.         $query = $q->param('insmethod')." ".$q->param('insert_option1')." ".$q->param('insert_option2').
  4104.                " INTO $table \n (".join (', ', @names).") \n VALUES (".join (', ', @datum).")";
  4105.     }#End   -  empty @insert_list
  4106.     
  4107.     else {
  4108.         $set = "\n".$insert_list[0].'='.$insert_data[0];
  4109.         for (my $i=1; $i<@insert_list; $i++){
  4110.             $set = $set.",\n".$insert_list[$i].'='.$insert_data[$i]
  4111.         }
  4112.         $query = $q->param('insmethod')." ".$q->param('insert_option1')." ".$q->param('insert_option2')." INTO $table \n SET $set";
  4113.     }
  4114.  
  4115.     if ($q->param('preview')) {printpreview([$query]); return }
  4116.     else {bail_out($demomsg, $back)} 
  4117. #++++++++++++++++++++++++++++++++++++++
  4118.     return()
  4119. }
  4120. sub getwhere {
  4121.     my ($pri, @queryArray, @pri, @priNum);
  4122.     my $input        = shift;
  4123.     my $count        = $input->{count};
  4124.     my $table        = $input->{table};
  4125.     my $start        = $input->{start};
  4126.     my $rows        = $input->{rows};
  4127.     my $query        = $input->{query};
  4128.     my $back        = $input->{back};
  4129.     my $returnarray    = $input->{returnarray}; # 1 => return WHERE conditions as an array reference
  4130.     $query .= ' LIMIT '.$start.', '.$rows            if ($start and $rows);
  4131.     $query .= ' LIMIT '.$rows                         if (!$start and $rows);
  4132.     $query .= ' LIMIT '.$start.', '.($count-$start)    if ($start and !$rows);
  4133.     my ($sth,$res) = prepare_execute($query, $back);
  4134.     my $primary = get_mysql_pri($sth);
  4135.     unless (defined $primary){$primary = []}
  4136.     for (my $i=0; $i<@$primary; $i++){
  4137.         if ($primary->[$i]){push @priNum,$i; push @pri, $sth->{NAME}[$i]}
  4138.     }
  4139.     if (@pri == 0){
  4140.         @pri = @{$sth->{NAME}};
  4141.         @priNum = (0..(scalar(@pri)-1));
  4142.     }
  4143.     my $i = $start;
  4144.     my @selectrows = $q->param('SelectRow');
  4145.     my @where;
  4146.     while (my @ary = $sth->fetchrow_array ()) {
  4147.         my $where;
  4148.         if (&belongs(\@selectrows, $i)) {
  4149.             my @where_;
  4150.             my $data = $dbh->quote($ary[$priNum[0]]);
  4151.                for (my $jj = 0; $jj < @pri; $jj++) {
  4152.                 my $data = $dbh->quote($ary[$priNum[$jj]]);
  4153.                 if (uc($data) eq 'NULL'){push @where_, "$pri[$jj] IS NULL"}
  4154.                 else {push @where_, "$pri[$jj] = $data"}
  4155.             }
  4156.             $where = join ") AND (", @where_;
  4157.             $where = "($where)" if @where_ > 1;
  4158.             push @where, $where;
  4159.         }
  4160.         $i++
  4161.     }
  4162.     $sth->finish();
  4163.     if ($returnarray){
  4164.         return \@where
  4165.     }
  4166.     else{
  4167.         my $where = join ") OR (", @where;
  4168.         $where = "($where)" if @where > 1;
  4169.         return $where;
  4170.     }
  4171. 1;
  4172. } # end of getwhere
  4173.  
  4174. sub execUpdateData {
  4175.     my $rows = $q->param('rows');
  4176.     my $start = $q->param('start')+0;
  4177.     my $where = $q->param('where');
  4178.     my $order = $q->param('order');
  4179.     my $count = &count_rows($q->param('tables'));
  4180.     my $table = $q->param('tables');
  4181.     my $back = {
  4182.             dbname            => "$database",
  4183.             tables            => "$table",
  4184.             page            => "tables",
  4185.             func            => "UPDATE",
  4186.             updateStart        => "$start",
  4187.             updateRows        => "$rows",
  4188.             updateWhere        => "$where",
  4189.             updateOrder        => "$order"
  4190.     };
  4191.     my @hidfields         = $q->param('fields');
  4192. #    if ($q->param('update') eq 'Update'){
  4193. #        @hidfields                 = $q->param('$table\_fields');
  4194. #        $back->{updateStart}     = $q->param('updateStart');
  4195. #        $back->{updateRows}     = $q->param('updateRows');
  4196. #    }
  4197.  
  4198.     $back->{"$table\_fields"}    = \@hidfields;
  4199.     my $wrongparam = qq?<FONT COLOR="#FF0000"><B>WRONG PARAMETERS!</B></FONT>?;
  4200.  
  4201.     if ($q->param('insert')) {
  4202.         my $insert_result;
  4203.         unless ($q->param('error')) {
  4204.             $insert_result = execInsertData();
  4205.             return if $q->param('preview');
  4206.         }
  4207.         else {$insert_result = $wrongparam}
  4208.         &loadUpdateForm($insert_result);
  4209.         return;    
  4210.     }
  4211.     if ($q->param('reload')) {
  4212.         &loadUpdateForm;
  4213.         return;    
  4214.     }
  4215.     if ($q->param('zoom')){
  4216.  
  4217.         if ($q->param('error')){&loadUpdateForm($wrongparam); return}
  4218.  
  4219.         unless ($q->param('zoomselect') and defined $q->param('SelectRow')) { # if nothing was selected to zoom
  4220.             my $msg = qq!<FONT COLOR="#FF0000"><B>PLEASE SELECT ONE ROW AND ONE COLUMN TO ZOOM</B></FONT>!;
  4221.             &loadUpdateForm($msg)
  4222.         }
  4223.         else {&loadZoom()}
  4224.        return;
  4225.     }
  4226.  
  4227.     my ($pri, @queryArray, @pri, @priNum);
  4228.  
  4229.     if ($q->param('delete')) {
  4230.         if ($q->param('error')){&loadUpdateForm($wrongparam); return}
  4231.         unless (defined $q->param('SelectRow')) {
  4232.                  my $msg = qq!<FONT COLOR="#FF0000"><B>Nothing was selected</B></FONT>!;
  4233.                  &loadUpdateForm($msg);
  4234.               return;
  4235.         }
  4236.  
  4237.         my $query = "SELECT * FROM $table";        
  4238.         my $where =$q->param('where');
  4239.         $query .= " WHERE $where" if $where;
  4240.         $query .= " ORDER BY $order" if $order;
  4241.         my $calldelete = {
  4242.             count => "$count", table => "$table", start => "$start", rows => "$rows", query => "$query", back => $back
  4243.         };
  4244.         $query = "DELETE ".$q->param('delete_option1')." FROM  $table WHERE ";
  4245.         $query .= getwhere($calldelete);
  4246.  
  4247.         if ($q->param('preview')) {
  4248.            printpreview([$query]);
  4249.         }
  4250.  
  4251.          else {    
  4252.             $dbh->do($query) or &bail_out("$query", $back);    
  4253.             &loadUpdateForm;
  4254.         }
  4255.         return;    
  4256.     
  4257.     }
  4258.  
  4259. #update
  4260.     if ($q->param('error')){&loadUpdateForm($wrongparam); return}
  4261.  
  4262.     my @fields = $q->param('fields');
  4263.     my $fields = join (', ', @fields);
  4264.     if (@fields == 0) {$fields = '*'}
  4265.     my $query = '';
  4266.     $query = "SELECT * FROM $table";        
  4267.     $query .= " WHERE $where" if $where;
  4268.     $query .= " ORDER BY $order" if $order;
  4269.     $query .= " LIMIT $start, $rows"            if ($start and $rows);
  4270.     $query .= " LIMIT $rows"                     if (!$start and $rows);
  4271.     $query .= " LIMIT $start, ".($count-$start)    if ($start and !$rows);
  4272.  
  4273.     my ($sth, $res) = prepare_execute($query, $back);
  4274.     
  4275.     my $primary = get_mysql_pri($sth);
  4276.     unless (defined $primary){$primary = []}
  4277.     for (my $i=0; $i<@$primary; $i++){
  4278.         if ($primary->[$i]){push @priNum, $i; push @pri, $sth->{NAME}[$i]}
  4279.     }
  4280. #---selected---------
  4281.     my $i = 0;        #Rows
  4282.     my $j;            #Columns
  4283.     my $k = 0;
  4284.     my @queries; 
  4285.       if (@pri == 0){
  4286.        @pri = @{$sth->{NAME}};
  4287.        @priNum = (0..(scalar(@pri)-1));
  4288.     }
  4289.     
  4290.  
  4291. #++++++++++++++++++++++++++++++++++++++
  4292.     while (@ary = $sth->fetchrow_array ()) {
  4293.         $query = "UPDATE ".$q->param('update_option1')." ".$q->param('update_option2')." $table SET ";
  4294.         my $ii = 0;
  4295.         for ($j=0; $j<@ary; $j++) {
  4296.             next unless(belongs(\@fields,${$sth->{NAME}}[$j]) or $fields eq '*');
  4297.             my $value = $q->param('n'.$i.'_'.$ii);
  4298.             $ii++;
  4299. #++++++++++++++++++++++++++++++++++++++
  4300.             if ($ary[$j] ne $value) {
  4301.                 push @queryArray, ${$sth->{NAME}}[$j]." = ".$dbh->quote($value);
  4302.                 $k=1;
  4303.             }
  4304.         }#for
  4305.         if ($queryArray[0]){
  4306.             my $data = $dbh->quote($ary[$priNum[0]]);
  4307.             my $where;
  4308.             if (uc($data) eq 'NULL'){$where = " WHERE $pri[0] IS NULL"}
  4309.             else {$where = " WHERE $pri[0] = $data"}
  4310.             my $jj;
  4311.             for ($jj = 1; $jj < @pri; $jj++) {
  4312.                 my $data = $dbh->quote($ary[$priNum[$jj]]);
  4313.                 if (uc($data) eq 'NULL'){$where .= " AND $pri[$jj] IS NULL"}
  4314.                 else {$where .= " AND $pri[$jj] = $data"}
  4315.             }
  4316.             $query .= join(", ",@queryArray)." $where";
  4317.             push @queries, $query;
  4318.         }#if($query...
  4319.         else {$query = ''}
  4320.         $i++;
  4321.         @queryArray = ();
  4322.     }#while
  4323.     $sth->finish ();
  4324.     if ($k==0) {
  4325.         my $nochanges = "<FONT COLOR=\"#FF0000\"><b>Nothing was changed</b></FONT>";
  4326.         &loadUpdateForm($nochanges);    
  4327.     }
  4328.     #UPDATE
  4329.     elsif ($q->param('update')) {
  4330. #++++++++++++++++++++++++++++++++++++++
  4331.     
  4332.     if ($q->param('preview')) {
  4333.            printpreview(\@queries);
  4334.         }# end preview
  4335.     else {bail_out($demomsg, $back)}      }
  4336.     return;
  4337.  
  4338. } # END UPDATE
  4339.  
  4340. #++++++++++++++++++++++++++++++++++++++
  4341.  
  4342. sub execUpdateAfterPreview {
  4343.     if ($q->param('back')){&loadUpdateForm(qq!<font color="#cc0000"><b>Changes were lost</b></font>!); return}
  4344.     my $res;
  4345.     my $msg;
  4346.     my @queries = $q->param('queries');
  4347.     my $i = 0;
  4348.     my $table = $q->param('tables');
  4349.     my $back = {
  4350.             dbname            => "$database",
  4351.             tables            => "$table",
  4352.             page            => "tables",
  4353.             func            => "UPDATE",
  4354.             updateStart        => $q->param('updateStart')."",
  4355.             updateRows        => $q->param('updateRows')."",
  4356.             updateWhere        => $q->param('updateWhere')."",
  4357.             updateOrder        => $q->param('updateOrder')."",
  4358.     };
  4359.     bail_out($demomsg, $back);
  4360.     return;
  4361. }
  4362. sub execAlterAfterPreview {
  4363.     if ($q->param('back')){&loadAlterTable({msg => qq!<font color="#cc0000">Changes were lost!}); return}
  4364.     my $table    = $q->param('tables');
  4365.     my $dbname    = $q->param('dbname');
  4366.     my $func    = $q->param('func');
  4367.     unless ($func eq 'create'){$func = 'alter'}
  4368.     my $back     = {
  4369.         page     => 'tables',
  4370.         func     => "$func",
  4371.         dbname     => "$dbname",
  4372.         tables     => "$table"
  4373.     };
  4374.     my $msg;
  4375.     my @queries = $q->param('queries');
  4376. #++++++++++++++++++++++++++++++++++++++
  4377.  
  4378.     foreach $query (@queries) {
  4379.         next unless ($query =~ /\w/);
  4380.         $dbh->do($query) or bail_out("ALTER FAIL.\nQUERY:\n$query", $back);
  4381.     }
  4382.     if (@queries==0) {
  4383.             $msg = qq?<B><FONT COLOR="#FF0000">No query was selected</FONT></B>? ;
  4384.     }
  4385.  
  4386.            &loadAlterTable({msg => $msg});    
  4387.     return;
  4388. }
  4389.  
  4390. sub logout {
  4391.     my @value = ('','','','');
  4392.     my $cookies = $q->cookie(-name=>'db_manager',
  4393.                              -value=>\@value,
  4394.                              -secure=>0);
  4395.     print     $q->header(-cookie=>$cookies);
  4396.     &startpage();
  4397.     print <<IndexBody
  4398. <BR>
  4399.  
  4400. <FORM METHOD=POST ACTION="$full_url">
  4401. <INPUT TYPE=HIDDEN NAME="page" VALUE="connect">
  4402. <INPUT TYPE=HIDDEN NAME="login" VALUE="1">
  4403. <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
  4404.     <TR HEIGHT=100>
  4405.      <TD WIDTH=20 HEIGHT=100> </TD>
  4406.      <TD WIDTH=150 HEIGHT=100> </TD>
  4407.         <TD WIDTH=120 HEIGHT=100> </TD>
  4408.         <TD WIDTH=201 HEIGHT=100> </TD>
  4409.     </TR>
  4410.  
  4411.     <TR>
  4412.      <TD WIDTH=20> </TD>
  4413.      <TD WIDTH=150> </TD>
  4414.         <TD WIDTH=120>USER</TD>
  4415.         <TD WIDTH=201>
  4416.             <INPUT  TYPE=TEXT NAME="user" VALUE="" SIZE=23 MAXLENGTH=23 TITLE="User name" style="width: 160px"> </TD>
  4417.     </TR>
  4418.     <TR>
  4419.      <TD WIDTH=20> </TD>
  4420.      <TD WIDTH=150> </TD>
  4421.         <TD WIDTH=120>PASSWORD</TD>
  4422.         <TD WIDTH=201><INPUT TYPE=PASSWORD NAME="password" VALUE="" SIZE=23 MAXLENGTH=23 TITLE="Password" style="width: 160px"> </TD>
  4423.     </TR>
  4424.     <TR>
  4425.      <TD WIDTH=20> </TD>
  4426.      <TD WIDTH=150> </TD>
  4427.         <TD WIDTH=120>DATABASE</TD>
  4428.         <TD WIDTH=201><INPUT TYPE=TEXT NAME="dbname" VALUE="" SIZE=23 TITLE="Database name" style="width: 160px"> </TD>
  4429.     </TR>
  4430.     <TR>
  4431.      <TD WIDTH=20> </TD>
  4432.      <TD WIDTH=150> </TD>
  4433.         <TD WIDTH=120>HOST:PORT</TD>
  4434.         <TD WIDTH=201><INPUT TYPE=TEXT NAME="host" VALUE="" SIZE=23 TITLE="Host name:Port number" style="width: 160px"> </TD>
  4435.     </TR>
  4436.  
  4437.     <TR>
  4438.      <TD WIDTH=20> </TD>
  4439.      <TD WIDTH=150> </TD>
  4440.         <TD WIDTH=120> </TD>
  4441.         <TD WIDTH=201> </TD>
  4442.     </TR>
  4443.     <TR>
  4444.      <TD WIDTH=20> </TD>
  4445.      <TD WIDTH=150> </TD>
  4446.         <TD WIDTH=120> </TD>
  4447.         <TD WIDTH=201><INPUT TYPE=SUBMIT VALUE=SUBMIT TITLE="Log in"  style="width: 160px"></TD>
  4448.     </TR>                                                
  4449.     
  4450. </TABLE>
  4451. </FORM>
  4452.  
  4453. </TD></TR></TABLE>
  4454.  
  4455. </BODY>
  4456. </HTML>    
  4457. IndexBody
  4458. ;
  4459.     
  4460.  
  4461. return;
  4462.  
  4463. }
  4464.  
  4465.  
  4466. sub printpreview {
  4467. # QUERIES_ref = $_[0];
  4468. # WAY BACK = $_[1];
  4469.     print $q->start_multipart_form(-action=>$full_url, -method=>"POST");
  4470.     print <<EndPreviewHeader
  4471. <TABLE WIDTH="100%" BORDER=0 CELLSPACING=0 CELLPADDING=0>
  4472.        <TR><TH COLSPAN=2 ALIGN=LEFT>PREVIEW</TH></TR>
  4473.        <TR><TD COLSPAN=2 HEIGHT=8></TD></TR>
  4474. EndPreviewHeader
  4475. ;
  4476.      my $queriesref = $_[0];
  4477.     foreach (@$queriesref) {
  4478.         my $count;
  4479.         while(/\n/g){$count++; last if $count > 8}
  4480.         my $rows = $count+1;
  4481.         if ($rows < 3){$rows = 3}
  4482.         my $cols = $agent ? 65 : 90;
  4483.         $_ = quoteit($_);
  4484.         print <<EndPreviewHere
  4485.           <TR>
  4486.                 <TD VALIGN=BOTTOM><B>Statement: </B><BR>
  4487.         <TEXTAREA NAME="queries" COLS=$cols ROWS=$rows WRAP=ON>$_</TEXTAREA></TD>
  4488.             <TD VALIGN=BOTTOM>  <!--  <INPUT TYPE=CHECKBOX NAME="ok" VALUE="ok">Ok? --> </TD>
  4489.            </TR>
  4490.            <TR>
  4491.                <TD COLSPAN=2 HEIGHT=8></TD>
  4492.           </TR>
  4493. EndPreviewHere
  4494. ;
  4495.     }
  4496.  
  4497.  
  4498.     print qq!
  4499.            <TR>
  4500.                   <TD HEIGHT=35 VALIGN=BOTTOM><INPUT TYPE=SUBMIT VALUE="Submit"><INPUT TYPE=SUBMIT NAME="back" VALUE="CANCEL"></TD>
  4501.                <TD HEIGHT=35 VALIGN=BOTTOM></TD>
  4502.            </TR>
  4503. </TABLE>
  4504.  
  4505. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="!, $q->param('dbname'), qq!">
  4506. <INPUT TYPE=HIDDEN NAME="tables" VALUE="!, $q->param('tables'), qq!">
  4507. !;
  4508.     unless ($_[1]){
  4509.         my $updateWhere = quoteit($q->param('where'));
  4510.         my $updateOrder = quoteit($q->param('order'));
  4511.         print qq!
  4512. <INPUT TYPE=HIDDEN NAME="page" VALUE="updateAfterPreview">
  4513. <INPUT TYPE=HIDDEN NAME="updateStart" VALUE="!, $q->param('start'), qq!">
  4514. <INPUT TYPE=HIDDEN NAME="updateRows" VALUE="!, $q->param('rows'), qq!">    
  4515. <INPUT TYPE=HIDDEN NAME="updateWhere" VALUE="$updateWhere">    
  4516. <INPUT TYPE=HIDDEN NAME="updateOrder" VALUE="$updateOrder">    
  4517.     !;}
  4518.     else {
  4519.         foreach (keys(%{$_[1]})){
  4520.             print $q->hidden(-name=>$_, -value=>$_[1]->{$_}, -override=>1),"\n";
  4521.         }
  4522.     }
  4523.     my $table = $q->param('tables');
  4524.     my @fields = $q->param('fields');
  4525.     foreach (@fields){
  4526.         print "<INPUT TYPE=HIDDEN NAME=\"fields\" VALUE=\"$_\">";
  4527.     }
  4528.     @fields = $q->param($table.'_fields');
  4529.     foreach (@fields){
  4530.         print "<INPUT TYPE=HIDDEN NAME=\"$table\_fields\" VALUE=\"$_\">";
  4531.     }
  4532.     print "\n</FORM>\n"
  4533. }
  4534.  
  4535. sub loadRestore {
  4536.     if ($q->param('gotobackup')){loadBackup(); return}
  4537.     my ($hostname,$port)     = myhost();
  4538.     my $userhost             = $hostname;
  4539.     $hostname                 .= ":$port" if $port;
  4540.     my ($targethost, $targetuser, $dberr);
  4541.     my $succeed;
  4542.     my $selectdbname_       = $q->param('selectdbname_');
  4543.     $selectdbname_          = $database unless $selectdbname_;
  4544.     
  4545.     #my $userhost = myhost();
  4546.     my $back                 = {page => "$page"};
  4547.     $back->{dbname}         = "$database" if $database;
  4548.     $back->{selectdbname_}    = "$selectdbname_" if $selectdbname_;
  4549.     if (my $errmsg = checkuserdir('backup')){bail_out("$errmsg\n$!", $back)}
  4550.     my $userdir                = "$USER_DIR$delim$user.$userhost$delim" . "backup";
  4551.     $back ->{func}             = 'restore';
  4552.     $back ->{userhost}         = "$userhost";
  4553.     
  4554.     if ($q->param('disconnect')){
  4555.         $dbh_ = $dbh;
  4556.         $selectdbname_  = $database
  4557.     }
  4558.     elsif ($q->param('targetconnect')){
  4559.         $targethost            = $q->param('targethost');
  4560.         $targetuser            = $q->param('targetuser');
  4561.         my $targetpassword     = $q->param('targetpassword');
  4562.         $selectdbname_        = $q->param('targetdb');
  4563.         unless ($targethost) {$targethost = $DEFAULTHOST}
  4564.         my $dsn                = "DBI:mysql:$selectdbname_;$targethost";
  4565.         $dbh_                 = DBI->connect($dsn, $targetuser, $targetpassword,\%attr)
  4566.             or bail_out("Cannot connect",$back);
  4567.         $succeed            = 1;
  4568.         $back->{target}        = 1;
  4569.     }
  4570.     elsif ($q->param('target')){
  4571.         ($targetuser, my $targetpassword, $targethost) = $q->cookie('target_db');
  4572.         my $dsn                = "DBI:mysql:$selectdbname_;$targethost";
  4573.         $dbh_                 = DBI->connect($dsn, $targetuser, $targetpassword,\%attr);
  4574.         if ($DBI::err){
  4575.             if ($DBI::errstr =~ /access denied/i){
  4576.                 $dsn        = "DBI:mysql:;$targethost";
  4577.                 $dbh_         = DBI->connect($dsn, $targetuser, $targetpassword,\%attr);
  4578.                 if ($DBI::err){
  4579.                     if ($DBI::errstr =~ /access denied/i){$dberr = 1}
  4580.                     else {bail_out("Cannot connect",$back) }
  4581.                 }
  4582.             }
  4583.             else {bail_out("Cannot connect",$back)}
  4584.         }
  4585.         $succeed            = 1;
  4586.         $back->{target}        = 1;
  4587.     }
  4588.     else {
  4589.         $dbh_ = $dbh
  4590.     }
  4591.  
  4592.     my @databases;
  4593.     unless ($dberr){
  4594.         my $databasesref    = getdblist($dbh_);
  4595.         if ($DBI::err and (not defined $databasesref)){$dberr = 1}
  4596.         else {@databases = @$databasesref} 
  4597.     } 
  4598.     my @files = $q->param('selectfilelist');
  4599.     if ((@files == 1)and !$files[0]){@files = ()}
  4600.     my $pageHead =  sub {
  4601.     print qq!
  4602. <FORM METHOD=POST ENCTYPE="multipart/form-data" ACTION="$full_url">
  4603. <TABLE BORDER=0 WIDTH=700 ID="BIG_TABLE">
  4604.     <TR><TH ALIGN=LEFT>RESTORE DB AND TABLES FROM DUMP FILES</TH>
  4605.     </TR>
  4606.     <TR><TD>
  4607. !;
  4608.     return undef;
  4609.     };
  4610.     
  4611.     my $pageBottom = <<EndOfBottom
  4612.         </TD>
  4613.     </TR>
  4614. </TABLE><!-- END OF BIG TABLE -->
  4615. <INPUT TYPE=HIDDEN NAME="func" VALUE="restore">
  4616. <INPUT TYPE=HIDDEN NAME="page" VALUE="$page">
  4617. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  4618. <INPUT TYPE=HIDDEN NAME="target" VALUE="$succeed">
  4619. </FORM>
  4620. EndOfBottom
  4621. ;
  4622.  
  4623.     if ($q->param('delete') and !$q->param('cancel')){
  4624.         bail_out("File(s) not selected", $back) unless @files;
  4625.         my @filestodelete;
  4626.         foreach (@files){
  4627.             s/^(.*)\s\/\d*\/\s.*/$1/;
  4628.             push @filestodelete, $_;            
  4629.         }
  4630.         unless ($q->param('deleteconfirm')) {
  4631.             &$pageHead(' -> DELETE FILE(S)');
  4632.             print qq!<BR><P TITLE="List of files to be deleted"><B>THESE FILES WILL BE DELETED:</B></P>\n!;
  4633.             foreach (@filestodelete){
  4634.                 $_ = quoteit($_);
  4635.                 print qq!<INPUT TYPE=CHECKBOX NAME="selectfilelist" VALUE="$_" CHECKED TITLE="Uncheck to keep this file"> $_ <BR>\n!;
  4636.             }
  4637.             print qq!<BR><INPUT TYPE=SUBMIT NAME="deleteconfirm" VALUE="DELETE" TITLE="Delete selected files"> \n!;
  4638.             print qq!<INPUT TYPE=SUBMIT NAME="cancel" VALUE="CANCEL" TITLE="Go back to previous page without deletion">\n!;
  4639.             print qq!<INPUT TYPE=HIDDEN NAME="delete" VALUE="1">\n!;
  4640.             print qq!<INPUT TYPE=HIDDEN NAME="selectdbname_" VALUE="$selectdbname_">\n!;
  4641.             print $pageBottom;
  4642.             return;            
  4643.         }
  4644.         else {
  4645.             foreach (@files){
  4646.                 my $file = "$userdir/$_";
  4647.                 unlink ($file) ||bail_out("Could not unlink $_ : $!", $back) ;
  4648.                 
  4649.             }
  4650.         }
  4651.     }
  4652.     if ($q->param('downloadFile')){
  4653.         if (scalar @files > 1){
  4654.             bail_out("Too many files", $back);
  4655.         }
  4656.         elsif (!@files){
  4657.             bail_out("Please select a file.", $back);
  4658.         }
  4659.         
  4660.         $files[0] =~ s/^(.*)\s\/\d*\/\s.*/$1/;
  4661.         my $file = "$userdir$delim$files[0]";
  4662. #        $| = 1; 
  4663. #        $SIG{CHLD} = 'IGNORE';
  4664.         if (my $errmsg = download($userdir, $files[0])){bail_out($errmsg, $back)}
  4665.         $dbh->disconnect if defined $dbh;
  4666.         exit 0;
  4667.     }
  4668.     if ($q->param('upload')){
  4669.         my $back = {
  4670.             page            => "$page",
  4671.             func            => 'restore',
  4672.             selectdbname_    => "$selectdbname_",
  4673.             dbname            => "$database",
  4674.             userhost        => "$userhost"
  4675.         };
  4676.         
  4677.         if (my $sourse = $q->param('localfile')) {
  4678.             my $dest = $sourse;
  4679.             $dest =~ s/^(.*[\/|\\])*(.*)/$2/;
  4680.             my $dest_ = $dest;
  4681.             if ($dest =~ /^(.*)\.([a-zA-Z]*)$/){
  4682.                 $dest_ =$1 if (($2 eq 'gz') or($2 eq 'gzip') or($2 eq 'zip'));
  4683.             }
  4684.             my $filexist = sub {
  4685.                 if ($q->param('overwrite')){
  4686.                     unlink $_[0]
  4687.                 }
  4688.                 else {
  4689.                     close $sourse or bail_out("$!");
  4690.                     bail_out("File $dest_ already exists",$back)
  4691.                 }    
  4692.             };
  4693.             my $size_ = 0;
  4694.             if (-e "$userdir$delim$dest_") 
  4695.             {&$filexist("$userdir$delim$dest_"); $size_ = -s "$userdir$delim$dest_"}
  4696.             if (-e "$userdir/$dest_.gz")
  4697.             {&$filexist("$userdir$delim$dest_.gz"); $size_ = -s "$userdir$delim$dest_.gz"}
  4698.             if (-e "$userdir/$dest_.gzip")
  4699.             {&$filexist("$userdir$delim$dest_.gzip"); $size_ = -s "$userdir$delim$dest_.gzip"}
  4700.             if (-e "$userdir/$dest_.zip")
  4701.             {&$filexist("$userdir$delim$dest_.zip"); $size_ = -s "$userdir$delim$dest_.zip"}
  4702.  
  4703.             if ($MAX_BACKUP_SIZE){
  4704.                 my $size = dirsize($userdir);
  4705.                 $size += (-s $sourse) - $size_;
  4706.                 if ($size > ($MAX_BACKUP_SIZE*1024)) {
  4707.                     my $errmsg = "Total size of backup files is limited to $MAX_BACKUP_SIZE kb.";
  4708.                     $errmsg .= "\nPlease delete some files before uploading.";            
  4709.                     bail_out("$errmsg",$back);
  4710.                 }
  4711.             }
  4712.  
  4713.             $dest = "$userdir$delim$dest";
  4714.             open (DEST, ">$dest") || bail_out ("$! $dest_", $back);
  4715.             flock (DEST,2) unless $WIN32;
  4716.             #if (-B $sourse and $WIN32) {binmode $sourse; binmode DEST;};
  4717.             binmode $sourse; binmode DEST;
  4718.             my $data;
  4719.             while (read $sourse,$data,1024) {
  4720.                 print DEST $data;
  4721.             }
  4722.             flock (DEST,8) unless $WIN32;
  4723.             close DEST;
  4724.             close $sourse or bail_out($!);
  4725.         }
  4726.         else {bail_out("Please select file to upload", $back)}
  4727.         
  4728.     }
  4729.     if ($q->param('compressFile')){
  4730.         my @files_;
  4731.         bail_out("File(s) not selected", $back) unless @files;
  4732.         foreach(@files){
  4733.             s/^(.*)\s\/\d*\/\s.*/$1/;
  4734.             my $file = "$userdir/".$_;
  4735.             my @stat = stat;
  4736.             my $size = $stat[7];
  4737.             /^.*\.([a-zA-Z]*)$/;
  4738.             my $ext = $1;
  4739.             bail_out("File $_ is already comressed", $back) if (($ext eq 'gz')or($ext eq 'zip'));
  4740.             push @files_,$file;
  4741.         }
  4742.         foreach (@files_){
  4743.             if (($COMPRESS eq 'zip') and $ALLOW_ZIP){
  4744.                 my $outfile = $_.'.zip';
  4745.                 if (system ("$ZIP $outfile $_ $ZIPLOG")){
  4746.                     bail_out("ZIP FAILED: $? $!", $back);
  4747.                 }
  4748.                 unlink $_ if (-e and (-e $outfile)) || bail_out("Could not unlink the sourse $!", $back);            
  4749.             }
  4750.             elsif (($COMPRESS eq 'gzip') and $ALLOW_GZIP){
  4751.                 if (system ("gzip -fq $_")){
  4752.                     bail_out("GZIP FAILED: $? $!", $back);
  4753.                 }
  4754.             }
  4755.             else {bail_out("\$COMPRESS Variable was not set up properly.", $back)}
  4756.         }
  4757.  
  4758.     } #COMPRESS
  4759.     if ($q->param('preview') or $q->param('runremote')){
  4760.     
  4761.         if (@files >1){bail_out "Too many files.", $back}
  4762.         if (@files == 0){bail_out "Please select a file", $back}
  4763.         my ($ext, $file, $ungzip, $unzip);
  4764.         $files[0] =~ s/^(.*)\s\/\d*\/\s.*/$1/;
  4765.         if ($files[0] =~ /^(.*)\.([a-zA-Z]*)$/){
  4766.            $file = $1; $ext = $2
  4767.         }
  4768.         elsif ($files[0] =~ /^(.*)\.$/){
  4769.            $file = $files[0]; $ext = '';
  4770.         }
  4771.         else {$file = $files[0]}
  4772.         #my @all = <$userdir/*>;
  4773.         my $filename = "$userdir$delim$file";
  4774.         my $fullname = "$userdir$delim$files[0]";
  4775.         bail_out ("File $files[0] not found", $back) unless (-e $fullname);
  4776.         if ($ext =~ /^gz$/i){
  4777.             if (system ("gzip -fdv $fullname")) {bail_out("Failed to ungzip $fullname - $? . $! ", $back)} 
  4778.             $ungzip = 1;
  4779.         }
  4780.         elsif ($ext =~ /^zip$/i){
  4781. #check for available temp. file name    - 
  4782.             my $i="0E0";
  4783.             my $tempcopy;
  4784.             my $tempzip;
  4785.             do {
  4786.                 $tempcopy = $userdir.$delim.'temcopy'.$i;
  4787.                 $tempzip = $tempcopy.'.zip';
  4788.                 $i++; bail_out("Overcycled! ($i). Please contact support\@edatanew.com", $back) if ($i>999);
  4789.             }
  4790.             while ((-e "$tempzip") or (-e "$tempcopy\.gz") or (-e "$tempcopy"));
  4791.  
  4792.             File::Copy::copy("$fullname", "$tempzip") or bail_out("Cannot copy file $files[0] to tempcopy\.zip $!", $back);
  4793.             if (system ("gzip -df -S .zip $tempzip")) {
  4794.                 unlink "$tempzip" if -e $tempzip;
  4795.                 my $message = 
  4796.                 "Failed to uncompress temporary file. $! \n".
  4797.                 "Be sure that ZIP archive contains only ONE compressed file";
  4798.                 bail_out($message, $back);
  4799.             } 
  4800.             
  4801.             $unzip = 1;
  4802.             $filename = $tempcopy;
  4803. #            chmod 0777, "$filename";
  4804.         }
  4805.         else {$filename = $fullname}
  4806. # now the file of any format is prepared to read.    
  4807.         preview($filename,$file.".$ext",$back, $pageHead, $targethost, $selectdbname_) if $q->param('preview');
  4808.         
  4809. #runremote
  4810.         my $result = runremote($filename) if ($q->param('runremote'));
  4811.         
  4812.         if ($ungzip){
  4813.             if (system ("gzip -fq $filename")) {
  4814.                 bail_out("Failed to gzip $file. $? . $! ", $back)
  4815.             } 
  4816.         }
  4817.         if ($unzip){
  4818.             unlink $filename if (-e $filename);
  4819.         }
  4820.         
  4821.         bail_out($result, $back) if $result;
  4822.         
  4823.         if ($q->param('preview')){print qq!
  4824. <INPUT TYPE=SUBMIT NAME="runremote" VALUE="APPLY TO SELECTED DATABASE" TITLE="Apply this file to database "$selectdbname_""> 
  4825. <INPUT TYPE=SUBMIT NAME="back" VALUE="BACK" TITLE="Go back to previous page">
  4826. <INPUT TYPE=HIDDEN NAME="selectdbname_" VALUE="!  . $q->param('selectdbname_') . qq!">
  4827. <INPUT TYPE=HIDDEN NAME="selectfilelist" VALUE="! . quoteit($q->param('selectfilelist')). qq!">
  4828. !
  4829. ;
  4830.         print $pageBottom;
  4831.         return;
  4832.         }
  4833.     }
  4834.     my    $selectDBlist;
  4835.     if ($dberr) {
  4836.         $selectDBlist = $q->scrolling_list(
  4837.                         -name=>'selectdbname_',
  4838.                         -values=>[''],
  4839.                         -default=>[''],
  4840.                         -size=>1,
  4841.                         -title=>'Databases available on this server',
  4842.                         -labels=>{''=>'ACCESS DENIED'}
  4843.                     );
  4844.     }
  4845.     else {
  4846.         unshift @databases, "" unless (belongs(\@databases, $selectdbname_) and $q->param('selectdbname_'));
  4847.         $selectDBlist = qq!<SELECT name="selectdbname_" size=1  onChange="this.form.submit()" title="Databases available on this server">\n!;
  4848.         foreach (@databases){
  4849.             my $selected    = 'SELECTED' if ($_ eq $selectdbname_);
  4850.             $selectDBlist .= "<OPTION VALUE=\"$_\" $selected>$_\n";
  4851.         }
  4852.         $selectDBlist .= "</SELECT>\n";
  4853.     }
  4854.     my $back_ = $back;
  4855.     undef $back_->{selectdbname_};
  4856.  
  4857.     my $query             = "SHOW TABLES";
  4858.     $query                 .= " FROM $selectdbname_" if $selectdbname_;
  4859.     my $tablelistref    = $dbh_->selectcol_arrayref($query) if $selectdbname_;
  4860.     if ($DBI::err){
  4861.         if ($DBI::errstr =~ /Access\sdenied/i){$tablelistref = ['ACCESS DENIED']}
  4862.         else {bail_out("Failed to execute:\n$query", $back)}
  4863.     }
  4864.     my $tablelist; 
  4865.     {
  4866.         my $values = (defined $tablelistref) ? $tablelistref : ['NO DATABASE SELECTED'];
  4867.         unless (@$values){$values = ['Table list is empty']}
  4868.         {
  4869.             $tablelist = $q->scrolling_list(
  4870.                         -name        =>'',
  4871.                         -values        =>$values,
  4872.                         -default    =>[''],
  4873.                         -size        =>10,
  4874.                         -style        => "color: #bbbbbb",
  4875.                         -title        =>'Tables in selected database')
  4876.         }
  4877.     };
  4878.     unless ((-e $userdir) and (-d $userdir)) {
  4879.         mkdir $userdir, 0777 or bail_out("Cannot create directory. $!", {page => 'connect'})
  4880.     }
  4881.     my $tsize;
  4882.     @files = ();
  4883.     
  4884.     opendir DIR, $userdir; 
  4885.     my @filenames    = readdir (DIR) or print "Cannot read this directory: $userdir<br>";
  4886.     closedir DIR;
  4887.     
  4888.     foreach (@filenames){
  4889.         next if (($_ eq '.') or ($_ eq '..'));
  4890.         my $file  = "$userdir$delim$_";
  4891.         unless (-d $file){
  4892.             my @stat = stat $file;
  4893.             my $size = $stat[7];
  4894.             $tsize += $size;
  4895.             my $date = scalar localtime ($stat[9]);
  4896.             $date =~ s/^\s*\w\w\w\s*(.*)/$1/;
  4897.             s/^(.*\/)*(.*)$/$2/;
  4898.             $_ .= " /$size/ $date";
  4899.             push @files, $_;
  4900.         }
  4901.     }
  4902.     $tsize = int($tsize / 1024 * 100) / 100;
  4903.     
  4904.     my $selectfilelist = qq!\n<SELECT NAME="selectfilelist" SIZE=8 MULTIPLE  TITLE="Select file">\n!;
  4905.     if (@files == 0){$selectfilelist .=  qq!\t<OPTION VALUE="">FILE LIST IS EMPTY!}
  4906.     else{foreach (@files) {$_ = quoteit($_); $selectfilelist .= qq!\t<OPTION VALUE="$_">$_\n!} }
  4907.     $selectfilelist .= "<SELECT>\n";
  4908.     
  4909.     print "\n<!-- Admin (Restore)procedure starts here -->\n\n";
  4910.  
  4911.     &$pageHead();
  4912.     my $max_size = "Max. allowed size $MAX_BACKUP_SIZE kb" if $MAX_BACKUP_SIZE;
  4913.     my $compress_button = qq!<INPUT TYPE=SUBMIT NAME="compressFile" VALUE="COMPRESS" TITLE="Compress selected file">! if ($ALLOW_GZIP or $ALLOW_ZIP);
  4914.  
  4915. #++++++++++++++++++++++++++++++++++++++
  4916.  
  4917. my $textsize = $agent ? 15 : 22 ;
  4918. my $location = $succeed ? <<EOT
  4919.     <TABLE WIDTH="100%" BORDER=0 CELLPADDING=4 CELLSPACING=0 BGCOLOR="#AAAAAA">
  4920.         <TR>
  4921.             <TD BGCOLOR="#CCCCCC" TITLE="Status"><P>CONNECTED TO FOREIGN HOST:</TD>
  4922.         </TR>
  4923.         <TR>
  4924.             <TD BGCOLOR="#CCCCCC" TITLE="Connected host name"><P><NOBR> <I>$targethost</I></NOBR></TD>
  4925.         </TR>
  4926.         <TR>
  4927.             <TD BGCOLOR="#CCCCCC" TITLE="User name"><P><NOBR>AS USER: <I>$targetuser</I></NOBR></TD>
  4928.         </TR>
  4929.         <TR>
  4930.             <TD BGCOLOR="#CCCCCC" TITLE="Click to disconnect"><P><INPUT TYPE=SUBMIT NAME="disconnect" VALUE="Disconnect">
  4931.             </TD>
  4932.         </TR>
  4933.     </TABLE>
  4934. EOT
  4935. : <<EOT
  4936.  
  4937.     <TABLE WIDTH="100%" BORDER=0 CELLPADDING=4 CELLSPACING=0 BGCOLOR="#AAAAAA">
  4938.         <TR VALIGN=MIDDLE>
  4939.             <TD BGCOLOR="#CCCCCC" TITLE="Click to connect to Target Location" COLSPAN=2 VALIGN=MIDDLE><P>CHANGE TARGET HOST <INPUT TYPE=SUBMIT NAME="targetconnect" VALUE="Connect">
  4940.             </TD>
  4941.         </TR>
  4942.         <TR>
  4943.             <TD BGCOLOR="#CCCCCC" TITLE="User name on the target location"><P>User Name:</TD>
  4944.             <TD BGCOLOR="#CCCCCC" TITLE="User name on the target location"><P><INPUT TYPE=TEXT VALUE="" NAME="targetuser" TITLE="User name on the target location" SIZE=$textsize></TD>
  4945.         </TR>
  4946.         <TR>
  4947.             <TD BGCOLOR="#CCCCCC" TITLE="Password on the target location"><P>Password:</TD>
  4948.             <TD BGCOLOR="#CCCCCC" TITLE="Password on the target location"><P><INPUT TYPE=PASSWORD VALUE="" NAME="targetpassword" TITLE="Password on the target location" SIZE=$textsize></TD>
  4949.         </TR>
  4950.         <TR>
  4951.             <TD BGCOLOR="#CCCCCC" TITLE="Target Database"><P>Database</TD>
  4952.             <TD BGCOLOR="#CCCCCC" TITLE="Target Database"><P><INPUT TYPE=TEXT VALUE="" NAME="targetdb" TITLE="Target database" SIZE=$textsize></TD>
  4953.         </TR>
  4954.         <TR>
  4955.             <TD BGCOLOR="#CCCCCC" TITLE="Target Location"><P>Host:Port</TD>
  4956.             <TD BGCOLOR="#CCCCCC" TITLE="Target Location"><P><INPUT TYPE=TEXT NAME="targethost" VALUE="" TITLE="Target Host" SIZE=$textsize></TD>
  4957.         </TR>
  4958.     </TABLE>
  4959. EOT
  4960. ;
  4961.  
  4962.     print <<ENDOFRESTORE
  4963.     
  4964.             <INPUT TYPE=SUBMIT VALUE="RELOAD" TITLE="Update page"><INPUT TYPE=SUBMIT NAME="gotobackup" VALUE="CREATE BACKUP">
  4965.     
  4966. <TABLE WIDTH="100%" BORDER=0 ID="FRAMES" CELLPADDING=4 >
  4967.     <TR VALIGN=TOP>
  4968.         <TD VALIGN=TOP>
  4969.  
  4970. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%" >
  4971.             <TR>
  4972.                 <TD width="100%"><!-- BORDER START -->
  4973.  
  4974. <TABLE WIDTH="100%" BORDER=0 ID="REMOTE_LOCATION" CELLPADDING=4 CELLSPACING=0 BGCOLOR="#AAAAAA">
  4975.     <TR>
  4976.         <TD BGCOLOR="#CCCCCC">
  4977.             <NOBR>
  4978.             <INPUT TYPE=SUBMIT NAME="runremote" VALUE="       RUN SCRIPT       " TITLE="Apply selected file to database "$selectdbname_"">
  4979.             <INPUT TYPE=SUBMIT NAME="preview" VALUE="PREVIEW HEADER" TITLE="Preview header of selected file"></NOBR><BR>
  4980. <I>Run plain text, .zip and .gz files only</I>
  4981.         </TD>
  4982.     </TR>
  4983.     <TR>
  4984.         <TD BGCOLOR="#CCCCCC">
  4985.         <TABLE BORDER=0>
  4986.             <TR>
  4987.                 <TD VALIGN=TOP TITLE="Select file"><P>
  4988. $selectfilelist</TD>
  4989.                 <TD VALIGN=TOP><P>Total size:<BR>$tsize kb<P>
  4990.                 $max_size</TD>                
  4991.             </TR>
  4992.         </TABLE>
  4993.         </TD>
  4994.     </TR>
  4995.     <TR>
  4996.         <TD BGCOLOR="#CCCCCC">
  4997. <INPUT TYPE=SUBMIT NAME="delete" VALUE="DELETE" TITLE="DELETE SELECTED FILE">
  4998. <INPUT TYPE=SUBMIT NAME="downloadFile" VALUE="DOWNLOAD" TITLE="Download selected file">
  4999. $compress_button
  5000.         </TD>
  5001.     </TR>
  5002. </TABLE>
  5003.                 
  5004.                 </TD><!-- BORDER END -->
  5005.             </TR>
  5006. </TABLE>    <BR>    
  5007. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" width="100%">
  5008.             <TR>
  5009.                 <TD width="100%"><!-- BORDER START -->
  5010.  
  5011. <TABLE WIDTH="100%" BORDER=0 CELLPADDING=4 CELLSPACING=0 BGCOLOR="#AAAAAA">
  5012.     <TR>
  5013.         <TD BGCOLOR="#CCCCCC">
  5014.         <INPUT TYPE=FILE NAME="localfile" TITLE="Select file to upload">
  5015.         <INPUT TYPE=SUBMIT NAME="upload" VALUE="UPLOAD FILE" TITLE="Upload file">
  5016.         <BR><INPUT TYPE=CHECKBOX NAME="overwrite" TITLE="Overwrite existing file">Overwrite if exists.</TD>
  5017.     </TR>
  5018.  
  5019. </TABLE></TD><!-- BORDER END -->
  5020.             </TR>
  5021. </TABLE><BR>
  5022.         
  5023.         
  5024.         </TD><TD VALIGN=TOP><!-- END OF FIRST COLUMN -->
  5025.         
  5026.         
  5027.  
  5028. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%" >
  5029.             <TR>
  5030.                 <TD width="100%"><!-- BORDER START -->
  5031.  
  5032. <TABLE WIDTH="100%" BORDER=0 CELLPADDING=4 CELLSPACING=0 BGCOLOR="#AAAAAA">
  5033.     <TR>
  5034.         <TD BGCOLOR="#CCCCCC" TITLE="Databases available on the server"><P><nobr>APPLY TO DATABASE:<BR>
  5035. $selectDBlist <INPUT TYPE=SUBMIT VALUE="<-" TITLE="Show tables in selected database"></nobr></TD>
  5036.         
  5037.     </TR>
  5038.     <TR>
  5039.         <TD BGCOLOR="#CCCCCC" TITLE="Tables in selected database" COLSPAN=2><P><U>TABLE LIST:</U><BR>
  5040. $tablelist
  5041.         </TD>
  5042.     </TR>
  5043.     <TR>
  5044.         <TD BGCOLOR="#CCCCCC"><P>
  5045. <HR SIZE=1 WIDTH="100%">
  5046. $location
  5047.         </TD>
  5048.     </TR>
  5049.  
  5050. </TABLE>
  5051.                 
  5052.                 </TD><!-- BORDER END -->
  5053.             </TR>
  5054. </TABLE>
  5055.  
  5056.         </TD>
  5057.     </TR>
  5058. </TABLE><!-- END OF FRAME TABLE -->
  5059.  
  5060.  
  5061.         </TD>
  5062.     </TR>
  5063.     <TR>
  5064.         <TD> 
  5065. $pageBottom        
  5066.  
  5067.  
  5068. <!-- Admin (Restore) procedure ends here -->
  5069.  
  5070.         
  5071. ENDOFRESTORE
  5072. ;
  5073. }
  5074. sub loadAdmin {
  5075.     my $back        = $_[0];
  5076.     my $query;
  5077.     my $func = $q->param('func');
  5078.     my $version = get_version();
  5079.     if ($q->param('show')) {
  5080.         my $errmsg;
  5081.         my $like        = $q->param('LIKE');
  5082.         my $show = $q->param('showparam');
  5083.         if (($show eq 'STATUS') and  ($like ne '')) {
  5084.             $errmsg = "Current version (".get_version().") of MYSQL SERVER does not support SHOW STATUS LIKE syntax."
  5085.              unless check_version('3.23.00');
  5086.         }
  5087.         elsif ($show eq 'CHARACTER SET') {
  5088.             $errmsg = "Current version ($version) of MYSQL SERVER does not support SHOW CHARACTER SET syntax." unless check_version('4.1');
  5089.         }
  5090.         elsif ($show eq 'COLUMN TYPES') {
  5091.             $errmsg = "Current version (".get_version().") of MYSQL SERVER does not support SHOW COLUMN TYPES syntax." unless check_version('4.1');
  5092.         }
  5093.         elsif ($show eq 'INNODB STATUS') {
  5094.             $errmsg = "Current version (".get_version().") of MYSQL SERVER does not support SHOW INNODB STATUS syntax."
  5095.             unless check_version('3.23.52');
  5096.         }
  5097.         elsif ($show eq 'LOGS') {
  5098.             $errmsg = 
  5099.             "Current version ($version) of MYSQL SERVER does not support SHOW LOGS syntax."
  5100.             unless check_version('3.23.29');
  5101.         }
  5102.         elsif ($show eq 'PRIVILEGES') {
  5103.             $errmsg = 
  5104.             "Current version ($version) of MYSQL SERVER does not support SHOW PRIVILEGES syntax."
  5105.             unless check_version('4.1');
  5106.         }
  5107.         elsif ($show eq 'SHOW FULL PROCESSLIST') {
  5108.             $errmsg = 
  5109.             "Current version ($version) of MYSQL SERVER does not support SHOW SHOW FULL PROCESSLIST syntax."
  5110.             unless check_version('3.23.7');
  5111.         }
  5112.         elsif ($show eq 'TABLE TYPES') {
  5113.             $errmsg = 
  5114.             "Current version ($version) of MYSQL SERVER does not support SHOW TABLE TYPES syntax."
  5115.             unless check_version('4.1');
  5116.         }
  5117.         elsif ($show eq 'OPEN TABLES') {
  5118.             $errmsg = 
  5119.             "Current version ($version) of MYSQL SERVER does not support SHOW OPEN TABLES syntax."
  5120.             unless check_version('3.23.33');
  5121.         }
  5122.         elsif ($show eq 'SESSION VARIABLES') {
  5123.             $errmsg = 
  5124.             "Current version ($version) of MYSQL SERVER does not support SHOW SESSION VARIABLES syntax."
  5125.             unless check_version('4.0.3');
  5126.         }
  5127.         elsif ($show eq 'GLOBAL VARIABLES') {
  5128.             $errmsg = 
  5129.             "Current version ($version) of MYSQL SERVER does not support SHOW GLOBAL VARIABLES syntax."
  5130.             unless check_version('4.0.3');
  5131.         }
  5132.         elsif ($show eq 'VARIABLES') {
  5133.             $errmsg = 
  5134.             "Current version ($version) of MYSQL SERVER does not support SHOW GRANTS syntax."
  5135.             unless check_version('3.22.0');
  5136.         }
  5137. #++++++++++++++++++++++++++++++++++++++
  5138.         bail_out($errmsg, $back) if $errmsg; 
  5139.         $query = "SHOW ".$show;
  5140.         if ($show eq 'TABLE STATUS'){
  5141.             my $db = $q->param('dbname_');
  5142.             $query .= " FROM $db" if $db;
  5143.         }
  5144.         if (belongs(['STATUS', 'TABLE STATUS', 'OPEN TABLES', 'VARIABLES', 'SESSION VARIABLES', 'GLOBAL VARIABLES'], $show)){
  5145.             unless ($like =~ /%/){$like .= '%' if $like ne ''}
  5146.             $query .= ' LIKE '.$dbh->quote($like) if ($like ne '');
  5147.         }
  5148.     }
  5149.     elsif($func eq 'RESET QUERY CACHE'){
  5150.         bail_out ("Current version ($version) of MYSQL SERVER does not support RESET QUERY CACHE syntax.", $back) unless check_version('4.0.1');
  5151.         $dbh->do($func) || bail_out("Cannot RESET QUERY CACHE", $back);
  5152.     }
  5153.  
  5154.     if ($query){
  5155.         my ($sth,$res) = prepare_execute($query, $back);
  5156.         $query = quoteit($query);
  5157.         print "<P>Executed query: $query <BR>";
  5158.         print &printresult(\$sth);
  5159.         ErrMessage ("Print Result Error. $DBI::errstr") if $DBI::err;
  5160.         print qq!<FORM ACTION="$full_url" METHOD=POST>\n!;
  5161.         print qq!<P><INPUT TYPE=SUBMIT VALUE="Back">\n!;
  5162.         foreach (keys %$back){print qq!<INPUT TYPE=HIDDEN NAME="$_" VALUE="$back->{$_}">\n!}
  5163.         print "</FORM>";
  5164.         return;
  5165.     }
  5166.     
  5167.  
  5168.  
  5169.  
  5170.  
  5171.  
  5172.     my @databases;
  5173.     my $selectdbname_   = $q->param('selectdbname_');
  5174.     $selectdbname_  = $database unless $selectdbname_;
  5175.     my $databasesref = getdblist($dbh);
  5176.     my $DBlist; my $selectDBlist;
  5177.     if ($DBI::err and !$database){
  5178.         $DBlist = $q->scrolling_list(
  5179.                         -name        =>'dbname_',
  5180.                         -values        =>[''],
  5181.                         -size        =>1,
  5182.                         -labels        =>{'' => 'ACCESS DENIED'},
  5183.                         -title        => 'Select database to use with TABLE STATUS option'
  5184.                     );
  5185.         $selectDBlist = $q->scrolling_list(
  5186.                         -name   =>'selectdbname_',
  5187.                          -labels    =>{'' => 'ACCESS DENIED'},
  5188.                            -values =>[''],
  5189.                         -size   =>1,
  5190.                     );
  5191.     }
  5192.     else {
  5193.         @databases = @$databasesref;
  5194.         $DBlist = $q->scrolling_list(
  5195.                         -name        =>'dbname_',
  5196.                         -values        =>[@databases,''],
  5197.                         -default    =>[$database],
  5198.                         -size        =>1,
  5199.                         -title        => 'Select database to use with TABLE STATUS option'
  5200.                     );
  5201.                     
  5202.         push @databases,'' unless $selectdbname_;                    
  5203.         $selectDBlist = $q->scrolling_list(
  5204.                         -default=>[$database],
  5205.                         -name=>'selectdbname_',
  5206.                         -values=>[@databases],
  5207.                         -size=>1,
  5208.                         -onChange=>'this.form.submit()'
  5209.                     );
  5210.     }
  5211.     
  5212.     my $tablelist = qq!\n<SELECT NAME="tablelist" SIZE=13 MULTIPLE>\n!;
  5213.     my $tablelistref;
  5214.     if ($selectdbname_) {
  5215.         $tablelistref = $dbh->selectcol_arrayref("SHOW TABLES FROM $selectdbname_");
  5216.         if (! defined $tablelistref ) {
  5217.             if ($DBI::err){
  5218.                 if ($DBI::errstr =~ /access/i){
  5219.                     $tablelist .= qq!<OPTION VALUE="">ACCESS DENIED\n!;
  5220.                 }
  5221.                 else{
  5222.                     $tablelist .= qq!<OPTION VALUE="">CANNOT SHOW TABLES\n!;
  5223.                     $tablelist .= qq!<OPTION VALUE="">Check database name\n!;
  5224.                 }
  5225.             }
  5226.             else {$tablelist .= qq!<OPTION VALUE="">CANNOT SHOW TABLES\n!}
  5227.         }
  5228.         elsif (@$tablelistref == 0){
  5229.             $tablelist .= qq!<OPTION VALUE="">Table list is empty\n!;
  5230.         }
  5231.         else{
  5232.             my @tblist = $q->param('tablelist');
  5233.             foreach (@$tablelistref){
  5234.                 my $selected = 'SELECTED' if belongs(\@tblist, $_);
  5235.                 $tablelist .= qq!<OPTION VALUE="$_" $selected>$_!
  5236.             }
  5237.         }
  5238.     }
  5239.     else {
  5240.         $tablelist .= qq!<OPTION VALUE="">SELECT DATABASE\n!;
  5241.     }
  5242.     $tablelist .= "</SELECT>\n";
  5243.     
  5244.  
  5245.     my  $buttonwidth     = '110px';
  5246.     my  $buttonsmall     = '50px';
  5247.     my  $buttonwidth2     =  ($buttonwidth * 2) + 15;
  5248.     my $style;
  5249.     my $showselect = qq!<SELECT NAME="showparam">\n!;
  5250.     $showselect .= qq!<OPTION VALUE="" SELECTED>!;
  5251.     $showselect .= qq!<OPTION VALUE="PROCESSLIST">PROCESSLIST\n!;
  5252.     $showselect .= qq!<OPTION VALUE="STATUS">STATUS\n!;
  5253.     unless (check_version("3.22.00")){$style = qq!style="color: #bbbbbb"!}
  5254.     $showselect .= qq!<OPTION VALUE="VARIABLES" $style>VARIABLES\n!;
  5255.     unless (check_version("3.22.00")){$style = qq!style="color: #bbbbbb"!}
  5256.     $showselect .= qq!<OPTION VALUE="TABLE STATUS" $style>TABLE STATUS\n!;
  5257.     unless (check_version("3.23.29")){$style = qq!style="color: #bbbbbb"!}
  5258.     $showselect .= qq!<OPTION VALUE="LOGS" $style>LOGS\n!;
  5259.     unless (check_version("3.23.33")){$style = qq!style="color: #bbbbbb"!}
  5260.     $showselect .= qq!<OPTION VALUE="OPEN TABLES" $style>OPEN TABLES\n!;
  5261.     unless (check_version("3.23.52")){$style = qq!style="color: #bbbbbb"!}
  5262.     $showselect .= qq!<OPTION VALUE="INNODB STATUS" $style>INNODB STATUS\n!;
  5263.     unless (check_version("4.0.3")){$style = qq!style="color: #bbbbbb"!}
  5264.     $showselect .= qq!<OPTION VALUE="SESSION VARIABLES" $style>SESSION VARIABLES\n!;
  5265.     $showselect .= qq!<OPTION VALUE="GLOBAL VARIABLES" $style>GLOBAL VARIABLES\n!;
  5266.     unless (check_version("4.1")){$style = qq!style="color: #bbbbbb"!}
  5267.     $showselect .= qq!<OPTION VALUE="CHARACTER SET" $style>CHARACTER SET\n!;;
  5268.     $showselect .= qq!<OPTION VALUE="COLUMN TYPES" $style>COLUMN TYPES\n!;
  5269.     $showselect .= qq!<OPTION VALUE="TABLE TYPES" $style>TABLE TYPES\n!;
  5270.     $showselect .= qq!<OPTION VALUE="PRIVILEGES" $style>PRIVILEGES\n!;
  5271.  
  5272.     $showselect .= qq!</SELECT>    \n!;
  5273.  
  5274.     $style = '';
  5275.     unless (check_version("3.23.18")){$style = qq!style="color: #bbbbbb"!}
  5276.     my $flashselect = qq!<OPTION VALUE="TABLES WITH READ LOCK" $style>TABLES WITH READ LOCK!;
  5277.     unless (check_version("4.0.1")){$style = qq!style="color: #bbbbbb"!}
  5278.     $flashselect .= qq!<OPTION VALUE="DES_KEY_FILE" $style>DES KEYS!;
  5279.     $flashselect .= qq!<OPTION VALUE="QUERY CACHE" $style>QUERY CACHE!;
  5280.     
  5281.     unless (check_version("4.0.2")){$style = qq!style="color: #bbbbbb"!}
  5282.     $flashselect .= qq!<OPTION VALUE="USER_RESOURCES" $style>USER RESOURCES!;
  5283.     
  5284.     
  5285.     print <<ENDOFADMIN    
  5286. <!-- Admin procedure starts here -->
  5287.  
  5288. <FORM METHOD=POST ACTION="$full_url">
  5289. <TABLE BORDER=0>
  5290.     <TR><TH ALIGN=LEFT COLSPAN=3>ADMINISTRATION</TH></TR>
  5291.     <TR><TD VALIGN=TOP>
  5292.     
  5293.  
  5294.     
  5295. <!-- ACCESS CONTROL    -->
  5296. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA">
  5297.             <TR>
  5298.                 <TD WIDTH=300><!-- BORDER START -->
  5299.     <TABLE BORDER=0 CELLPADDING=4 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH=100%>
  5300.         <TR>
  5301.             <TD BGCOLOR="#CCCCCC"><INPUT TYPE=SUBMIT NAME="func" VALUE="  ACCESS CONTROL  " style="width: $buttonwidth2"></TD>
  5302.         </TR>
  5303.     </TABLE>
  5304.                 </TD><!-- BORDER END -->
  5305.             </TR>
  5306. </TABLE>
  5307.  
  5308. <BR>    
  5309.  
  5310.  
  5311. <!-- -------------------- SHOW--------------- -->
  5312.  
  5313. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" >
  5314.             <TR>
  5315.                 <TD width=300><!-- BORDER START -->
  5316.  
  5317. <TABLE WIDTH=100% BORDER=0 ID="FUNC_TABLE1" CELLPADDING=3 CELLSPACING=0 BGCOLOR="#AAAAAA">
  5318.     <TR>
  5319.         <TD BGCOLOR="#CCCCCC" TITLE="Show selected option">
  5320.         <INPUT TYPE=SUBMIT NAME="show" VALUE="   SHOW   " TITLE="Show selected option" style="width: $buttonwidth"></TD></TR>
  5321.     <TR BGCOLOR="#CCCCCC">
  5322.         <TD BGCOLOR="#CCCCCC" HEIGHT=20 VALIGN=TOP TITLE="Select option to show">
  5323. $showselect
  5324. <BR></TD>
  5325.     </TR>
  5326.     <TR>
  5327.         <TD BGCOLOR="#CCCCCC">[LIKE] <BR><INPUT TYPE=TEXT NAME="LIKE" SIZE=10 TITLE="Specify pattern to show result"></TD>
  5328.     </TR>
  5329.     <TR>
  5330.         <TD BGCOLOR="#CCCCCC" TITLE="Select database to use with TABLE STATUS option">[FROM DATABASE]<BR>
  5331. $DBlist
  5332.        </TD>
  5333.     </TR>
  5334.  
  5335. </TABLE>
  5336.  
  5337.  
  5338.                 </TD><!-- BORDER END -->
  5339.             </TR>
  5340. </TABLE><BR>
  5341. <!-- FLUSH -->
  5342. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" >
  5343.             <TR>
  5344.                 <TD width=300><!-- BORDER START -->
  5345.                 
  5346. <TABLE BORDER=0 BGCOLOR="#AAAAAA" CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
  5347.     <TR VALIGN=TOP>
  5348.         <TD BGCOLOR="#CCCCCC" HEIGHT=25 TITLE="Select option to flush" VALIGN=TOP>
  5349.         <INPUT TYPE=SUBMIT NAME="func" VALUE="   FLUSH   " TITLE="Flush selected option" style="width: $buttonwidth"><BR></TD>
  5350.         <TD HEIGHT=15  BGCOLOR="#CCCCCC"  TITLE="Select option to flush">
  5351. <SELECT NAME="flush" TITLE="Select option to flush">
  5352. <OPTION VALUE="" SELECTED>
  5353. <OPTION VALUE="HOSTS">HOSTS
  5354. <OPTION VALUE="LOGS">LOGS
  5355. <OPTION VALUE="PRIVILEGES">PRIVILEGES
  5356. <OPTION VALUE="TABLES">TABLES
  5357. <OPTION VALUE="STATUS">STATUS
  5358. $flashselect
  5359. </SELECT></TD>
  5360.     </TR>
  5361. </TABLE>
  5362.  
  5363.  
  5364.                 </TD><!-- BORDER END -->
  5365.             </TR>
  5366. </TABLE><br>
  5367.  
  5368. <!-- RESET -->
  5369. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" >
  5370.             <TR>
  5371.                 <TD width=300><!-- BORDER START -->
  5372.                 
  5373. <TABLE BORDER=0 BGCOLOR="#AAAAAA" CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
  5374.     <TR VALIGN=TOP>
  5375.         <TD BGCOLOR="#CCCCCC" HEIGHT=25 TITLE="Select option to flush" VALIGN=TOP>
  5376.         <INPUT TYPE=SUBMIT NAME="func" VALUE="RESET QUERY CACHE" TITLE="Flush selected option" style="width: $buttonwidth2"><BR></TD>
  5377.     </TR>
  5378. </TABLE>
  5379.  
  5380.  
  5381.                 </TD><!-- BORDER END -->
  5382.             </TR>
  5383. </TABLE>
  5384.  
  5385.             <!-- COLUMN 1 END -->
  5386.             </TD>
  5387.             <TD WIDTH=10>  </TD>
  5388. <!-- -----select database, select tables-------- -->
  5389.             
  5390.             <TD VALIGN=TOP>
  5391. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" ><!-- BORDER START -->
  5392.             <TR>
  5393.                 <TD width=260><!-- BORDER START -->
  5394.                 
  5395. <TABLE BORDER=0 BGCOLOR="#AAAAAA" CELLSPACING=0 CELLPADDING=3 WIDTH=100%>
  5396.     <TR>
  5397.         <TD BGCOLOR="#CCCCCC"><INPUT TYPE=SUBMIT NAME="func" VALUE="OPTIMIZE" TITLE="Optimize selected tables" style="width: $buttonwidth"></TD>
  5398.         
  5399.         <TD BGCOLOR="#CCCCCC"> </TD>
  5400.         
  5401.         <TD BGCOLOR="#CCCCCC"><INPUT TYPE=SUBMIT NAME="func" VALUE=" CHECK " TITLE="Check selected tables" style="width: $buttonwidth"></TD>
  5402.     </TR>
  5403.     <TR>
  5404.         <TD BGCOLOR="#CCCCCC"><INPUT TYPE=SUBMIT NAME="func" VALUE="ANALYZE " TITLE="Analyze selected tables" style="width: $buttonwidth"></TD>
  5405.         
  5406.         <TD BGCOLOR="#CCCCCC"> </TD>
  5407.         
  5408.         <TD BGCOLOR="#CCCCCC"><INPUT TYPE=SUBMIT NAME="func" VALUE=" REPAIR " TITLE="Repair selected tables" style="width: $buttonwidth"></TD>
  5409.     </TR>
  5410.     <TR>
  5411.     <TR><TD COLSPAN=3 BGCOLOR="#CCCCCC"> </TD></TR>
  5412.         <TD BGCOLOR="#CCCCCC" TITLE="Databases available on this server" COLSPAN=3>SELECT DATABASE:<BR><nobr>$selectDBlist <INPUT TYPE=SUBMIT VALUE="<-" TITLE="Show tables in selected database"></nobr></TD>
  5413.     </TR>
  5414.     <TR>
  5415.         <TD BGCOLOR="#CCCCCC"  COLSPAN=3 TITLE="Select tables to use with Check, Repair, Analyze or Optimize">SELECT TABLE:<BR>$tablelist</TD>
  5416.     </TR>
  5417.     <TR>
  5418.         <TD BGCOLOR="#CCCCCC"  COLSPAN=3 TITLE="Select all tables"><INPUT TYPE=CHECKBOX NAME="selectalltables" TITLE="Select all tables"> SELECT ALL TABLES</TD>
  5419.     </TR>
  5420. </TABLE>
  5421.                 
  5422.                 </TD><!-- BORDER END -->
  5423.             </TR>
  5424. </TABLE>
  5425.  
  5426.  
  5427.  
  5428.         </TD>
  5429.     </TR>
  5430. </TABLE><!-- END OF BIG TABLE -->
  5431.  
  5432. <INPUT TYPE=HIDDEN NAME="page" VALUE="admin">
  5433. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  5434. </FORM>
  5435.  
  5436.  
  5437. <!-- Admin procedure ends here -->
  5438.     
  5439. ENDOFADMIN
  5440. ;
  5441. }
  5442. sub execBackup {
  5443.  
  5444.     my $ERRMSG = <<EndERRMSG
  5445. THE FOLLOWING MUST BE SELECTED:
  5446.  
  5447. DATABASE,
  5448. TABLES,
  5449. BACKUP FILE DESTINATION (save and/or download),
  5450. BACKUP FILE TYPE (zip, gzip, plain text),
  5451. BACKUP FILE NAME
  5452. EndERRMSG
  5453. ;
  5454.     
  5455.     my $userhost = myhost();
  5456.     my $dbname                = $q->param('selectdbname_');
  5457.     my $back                = {page => "$page",
  5458.                               func => "backup"};
  5459.     $back->{dbname}            = "$database" if $database;
  5460.     $back->{selectdbname_}    = "$dbname" if $dbname;
  5461.     bail_out($ERRMSG,$back) unless $dbname;
  5462.     my $DOWNLOAD            = $q->param('downloadBackup');
  5463.     my $KEEPFILE            = $q->param('keep');
  5464.     bail_out($ERRMSG,$back) unless ($KEEPFILE or $DOWNLOAD);
  5465.     my $fyletype            = $q->param('type');
  5466.     bail_out($ERRMSG,$back) unless $fyletype;
  5467.     my $filename            = $q->param('remotefile');
  5468.     bail_out($ERRMSG,$back) unless $filename;    
  5469.     unless ($dbh->do("USE $dbname")){bail_out("Can not use $dbname", $back)}
  5470.     if (($filename =~ /[\\\/]/g) or ($filename =~ /[\/]/g)){
  5471.         bail_out("File name is incorrect", $back)
  5472.     }
  5473.     if (my $errmsg = checkuserdir('backup')){bail_out("$errmsg\n$!", $back)}
  5474.     my $userdir                = "$USER_DIR$delim$user.$userhost$delim" . "backup";
  5475.     my $file                 = "$userdir$delim$filename";
  5476.     bail_out ("File $filename already exists.", $back) if (-e $file);
  5477.     bail_out ("File $filename already exists.", $back) if (-e $file.'.gz');
  5478.     bail_out ("File $filename already exists.", $back) if (-e $file.'.zip');
  5479.  
  5480.     my $tablelistref;
  5481.     my @tablelist;
  5482.     if ($q->param('selectalltables')) {
  5483.         my $query = "SHOW TABLES";
  5484.         $tablelistref = $dbh->selectcol_arrayref($query) || bail_out("Cannot SHOW TABLE", $back);
  5485.         @tablelist = @$tablelistref;
  5486.     }
  5487.     else {@tablelist = $q->param('tablelist'); $tablelistref = \@tablelist}
  5488.     bail_out ($ERRMSG,$back) unless $tablelist[0];
  5489.     my $dropifexists = $q->param('dropifexists');
  5490.     my $include = $q->param('include');
  5491.     my $filecontent = "#\tDATABASE '$dbname' \n";
  5492.     $filecontent .= "#\tUser: $user\@$userhost\n#\n";
  5493.     $filecontent .= "#\tServer Version: ".get_version()."\n";
  5494.     $filecontent .= "#\tBACKUP CREATED ". scalar gmtime()." (GMT)\n";
  5495.     $filecontent .= "#\tby MYSQL DATA MANAGER (http://www.edatanew.com)\n";
  5496.     $filecontent .= "#\t----------------------------------------------------\n#\n";
  5497.     $filecontent .= "#\tOPTIONS:\n";
  5498.     $filecontent .= "#\t- \"DROP TABLE IF EXISTS\" added\n" if ($dropifexists and ($include ne 'data'));
  5499.     $filecontent .= "#\t- Only tables structure included\n" if ($include eq 'structure') ;
  5500.     $filecontent .= "#\t- Only data included\n" if ($include eq 'data');
  5501.     $filecontent .= "#\t----------------------------------------------------\n";
  5502.     $filecontent .= "#\n#\tTABLE LIST:\t\t\n#\t".join("\n#\t", @tablelist);
  5503.     $filecontent .= "\n#\n#\n#EndOfHeader\n\n";
  5504.     my $hashref     = {
  5505.         tablelist         => \@tablelist,
  5506.         include            => $include,
  5507.         dropifexists    => $dropifexists,
  5508.         back            => $back,
  5509.         comments        => 1,
  5510.         lock            => 0
  5511.     };
  5512.     $filecontent .= getdatanstructure($hashref);
  5513.     open (FH, "+> $file") || bail_out ("Can not open $file $!", $back);
  5514.     #binmode FH;
  5515.     flock(FH, 2) unless $WIN32;
  5516.     print FH $filecontent;
  5517.     flock(FH, 8) unless $WIN32;
  5518.     close FH;
  5519.     undef $filecontent;
  5520.     #chmod 0777, "$file";
  5521.     my ($outfile, $outfilename, $mimetype);
  5522.     my $i=0;
  5523.     if ($q->param('type') eq 'zip'){
  5524.         $outfile = $file.'.zip';
  5525.         $mimetype = 'application/zip';
  5526.         if (system ("$ZIP $outfile $file $ZIPLOG")){
  5527.             unlink $file if (-e $file);
  5528.             bail_out("$? zip $!", $back);
  5529.         }
  5530.         
  5531.         $outfilename = $filename.'.zip';
  5532.     }
  5533.     elsif ($q->param('type') eq 'gzip'){
  5534.     my $i=0;
  5535.         if (system ("gzip -fq $file")){
  5536.             unlink "$file" if (-e $file);
  5537.             bail_out("$? $! gzip ");
  5538.         }
  5539.         $outfile = $file.'.gz';
  5540.         $outfilename = $filename.'.gz';
  5541.         $mimetype = 'application/x-gzip';
  5542.     }
  5543.     else {
  5544.         $mimetype = 'application/x-perl';
  5545.         $outfile = $file;
  5546.         $outfilename = $filename;
  5547.     }
  5548. #    chmod 0777, "$outfile";
  5549.     unless ($q->param('type') eq 'text') {
  5550.         if (-e $file){unlink $file || bail_out("Cannot unlink $file $!", $back)}
  5551.     }    
  5552.     if ($q->param('keep') and $MAX_BACKUP_SIZE){
  5553.         my $size = dirsize($userdir);
  5554.         if ($size > ($MAX_BACKUP_SIZE*1024)) {
  5555.             my $errmsg = "Total size of backup files is limited to $MAX_BACKUP_SIZE kb.\n";
  5556.             $errmsg .= "New backup file can only be downloaded.\n";
  5557.             $errmsg .= "Please delete some files if you need to keep new backup file on the server.\n";            
  5558.             unlink $outfile || bail_out("Cannot unlink $outfilename $! \n$errmsg", $back);
  5559.             print "SIZE: $size<BR>";
  5560.             bail_out("$errmsg",$back);
  5561.         }
  5562.     }#if keep
  5563.  
  5564.     if ($q->param('downloadBackup')){
  5565.         $| = 1; 
  5566.         $SIG{CHLD}  = 'IGNORE';    
  5567.  
  5568.         my $size = -s "$outfile" or bail_out("$! $outfile", $back);
  5569.         open FHN, $outfile or bail_out("$! $outfile", $back);
  5570.         flock (FHN,2) unless $WIN32;
  5571.         binmode FHN;
  5572.         
  5573.         print "Content-disposition: inline; filename=$outfilename\n";
  5574.         print "Content-length: $size\n";
  5575.         print "Content-type: $mimetype; name=\"$outfilename\"\n\n";
  5576.  
  5577.         binmode STDOUT;
  5578.         my $data;
  5579.         while (read FHN, $data, 1024) {
  5580.             print $data
  5581.         }
  5582.         flock (FHN,8) unless $WIN32;
  5583.         close FHN;
  5584.     
  5585.         unless ($q->param('keep')) {unlink $outfile || bail_out("Cannot unlink $outfile $!", $back)}
  5586.         $dbh->disconnect if defined $dbh;
  5587.         exit 0;
  5588.     } # if download
  5589. }
  5590.  
  5591.  
  5592. sub execFlush {
  5593.     my $back = $_[0];
  5594.     if ($q->param('flush')) {
  5595.         my $flush = $q->param('flush');
  5596.         my $version = get_version();
  5597.         my $errmsg;
  5598.         if (($flush eq 'DES_KEY_FILE') or ($flush eq 'QUERY CACHE')) {
  5599.             $errmsg = 
  5600.             "Current version ($version) of MYSQL SERVER does not support SHOW GLOBAL VARIABLES syntax."    unless check_version('4.0.1');
  5601.         }
  5602.         elsif ($flush eq 'USER_RESOURCES') {
  5603.             $errmsg = 
  5604.             "Current version ($version) of MYSQL SERVER does not support SHOW GLOBAL VARIABLES syntax."    unless check_version('4.0.2');
  5605.         }
  5606.         elsif ($flush eq 'TABLES WITH READ LOCK') {
  5607.             $errmsg = 
  5608.             "Current version ($version) of MYSQL SERVER does not support SHOW GLOBAL VARIABLES syntax."    unless check_version('4.23.18');
  5609.         }
  5610.         bail_out($errmsg, $back) if $errmsg;
  5611.         my $query = "FLUSH $flush";
  5612.         unless ($dbh->do($query)){bail_out("Failed to Flush", $back)}
  5613.     }
  5614. #    else{bail_out("Can not Flush. Nothing was selected", $back)}
  5615. }
  5616.  
  5617. sub execCheckRepair {
  5618.     my $back = $_[0];
  5619.     my $func = $_[1];
  5620.     bail_out("Database is not selected.", $back) unless ($q->param('selectdbname_'));
  5621.     my @tablelist;
  5622.     if ($q->param('selectalltables')) {
  5623.         my $tablelistref = getTablelist($q->param('selectdbname_'), $back);
  5624.         @tablelist = @$tablelistref;
  5625.     }
  5626.     else {@tablelist = $q->param('tablelist')}
  5627.     bail_out("Table list is not selected.", $back) unless ($tablelist[0]);
  5628.     
  5629.     
  5630.     my $errmsg = 
  5631.     "Current version (".get_version().") of MYSQL SERVER does not support $func TABLES syntax.";    
  5632.     if ($func eq 'ANALYZE'){
  5633.          bail_out($errmsg,$back)    unless check_version('3.23.22')
  5634.     }
  5635.     elsif ($func eq 'CHECK'){
  5636.          bail_out($errmsg,$back)    unless check_version('3.23.13')
  5637.     }
  5638.     elsif ($func eq 'REPAIR'){
  5639.            bail_out($errmsg,$back)    unless check_version('3.23.14');
  5640.     }
  5641.     elsif ($func eq 'OPTIMIZE'){
  5642.            bail_out($errmsg,$back)    unless check_version('3.22.7');
  5643.         bail_out("Too many tables selected for current version Mysql (".get_version().")") 
  5644.                       if (!check_version('3.23.00') and (@tablelist > 1));
  5645.     }
  5646.     unless ($q->param('selectdbname_')){loadAdmin(); return}
  5647.     unless ($q->param('selectdbname_') eq $database){
  5648.         my $query = "USE ".$q->param('selectdbname_');
  5649.         $dbh->do($query) || bail_out ("Cannot use secected database.", $back);
  5650.     }
  5651.     unless (@tablelist) {loadAdmin(); return}
  5652.     my $query = "$func TABLE ";
  5653.     $query .= join (', ', @tablelist);
  5654.     my ($sth, $res) = prepare_execute($query, $back);
  5655.     print "<P>Executed query:\n$query <BR>";
  5656.     if (belongs(\@selectlike,$func)){
  5657.        print &printresult(\$sth);
  5658.        ErrMessage ("Print Result Error. $DBI::errstr") if $DBI::err;
  5659.     }
  5660.     print qq!<FORM ACTION="$full_url" METHOD=POST>\n!;
  5661.     print qq!<P><INPUT TYPE=SUBMIT VALUE="Back">\n!;
  5662.     foreach (keys %$back){print qq!<INPUT TYPE=HIDDEN NAME="$_" VALUE="$back->{$_}">\n!}
  5663.     print "</FORM>";
  5664. }
  5665. sub preview {
  5666.         my ($filename, $file, $back, $pageHead, $targethost, $selectdbname_) = @_;
  5667.         open (FH, "$filename") || bail_out("Can not open file$!", $back);
  5668.         flock (FH,2) unless $WIN32;
  5669.         $targethost = myhost($targethost)             if $targethost;
  5670.         my $onhost    = "  on $targethost"     if ($targethost and $selectdbname_);
  5671.         my $ondb    = "   Selected Database: <U><I>$selectdbname_</I></U>"     if $selectdbname_;
  5672.         &$pageHead("$ondb $onhost");
  5673.         print "<BR><B>FILE HEADER PREVIEW (",quoteit($file),")</B><BR>\n";
  5674.         print qq!<TEXTAREA COLS=70 ROWS=15 TITLE="Header of selected file">\n!;
  5675.         
  5676.         my $i;
  5677.         while(<FH>){
  5678.             last unless ((/^#/) or ($i<12));
  5679.             $_ = quoteit($_);
  5680.             print;
  5681.             if ($i++ > 10000) {bail_out("OVERCYCLED!", $back)} 
  5682.         }
  5683.         print "</TEXTAREA><BR>\n";
  5684.         flock (FH,8) unless $WIN32;
  5685.         close FH;
  5686. }
  5687.  
  5688. sub runremote  {
  5689.     my ($filename) = shift;
  5690.     return ("Database is not selected") unless (my $selectdbname_ = $q->param('selectdbname_'));
  5691.     if ($WIN32) {
  5692.         $filename =~ s/\//\\/g;
  5693.     }
  5694. # Syntax:
  5695. # DBI:mysql:db_name:host_name:port,user,password
  5696. # DBI:mysql:db_name;host=host_name:port,user,password
  5697. # DBI:mysql:database=db_name;host_name:port,user,password
  5698. # DBI:mysql:database=db_name;host=host_name:port,user,password
  5699. # DBI:mysql:database=db_name;host=host_name;port=port,user,password
  5700. # DBI:mysql:database=db_name;param_name=param_value;host=host_name;port=port,user,password
  5701.  
  5702. # other parameters:
  5703. # mysql_compression=1
  5704. # mysql_read_default_file=file_name;
  5705. # mysql_read_default_group=group_name;
  5706. # mysql_socket=socket_name
  5707.         
  5708.         my ($hostname, $portnum, $username, $ppassword, $options);
  5709. #-----port:
  5710.         my $back = {
  5711.             page => 'admin',
  5712.             func => 'restore'
  5713.         };
  5714.         $back->{selectdbname_}    = $q->param('selectdbname_') if $q->param('selectdbname_');
  5715.         $back->{dbname}            = $q->param('dbname')         if $q->param('dbname');
  5716.         $back->{target}            = $q->param('target');
  5717.         if ($q->param('target')){
  5718.             my ($targetuser, $targetpassword, $targethost)    = $q->cookie('target_db');
  5719.             ($hostname, $portnum)                            = myhost($targethost);
  5720.             $username                                        = " -u $targetuser"        if $targetuser;
  5721.             $ppassword                                         = " -p$targetpassword"    if $targetpassword;
  5722.         }
  5723.         else{
  5724.             ($hostname, $portnum)                            = myhost();
  5725.             $username                                        = " -u $user"        if $user;
  5726.             $ppassword                                         = " -p$password"    if $password;
  5727.         }
  5728.         $hostname                = " -h $hostname"    if $hostname;
  5729.         $portnum                = " -P $portnum"    if $portnum;
  5730.         $options                 = $hostname         if $hostname;
  5731.         $options                 .= $portnum         if $portnum;
  5732.         $options                 .= $username         if $username;
  5733.         $options                 .= $ppassword         if $ppassword;
  5734.         $options                 .= " -S $SOCKET"     if $SOCKET;
  5735.         $options                 .= " $OTHER_MYSQL"     if $OTHER_MYSQL;
  5736.         my $command = "EXECUTED COMMAND:\n$MYSQL $options $selectdbname_ \< $filename";
  5737.  
  5738. #++++++++++++++++++++++++++++++++++++++
  5739.     CGI::Carp::carpout(\*STDOUT);
  5740.     if (system("$MYSQL $options $selectdbname_ \< $filename")){return ("ERROR: $DBI::errstr\n$command\n")}
  5741.     
  5742.     return undef;
  5743.  
  5744. }
  5745.  
  5746. #++++++++++++++++++++++++++++++++++++++
  5747.  
  5748. sub loadexecscript  {
  5749.  
  5750. # attempt to create directory if not exist
  5751.  
  5752.     my $script            = $q->param('script');
  5753.     if ($script eq 'print'){execExecuteQuery(); return}
  5754.     my $userhost        = myhost();
  5755.     my $userdir         = "$USER_DIR$delim$user.$userhost";
  5756.     my $errmsg            = "";
  5757.     unless ((-e $userdir) and (-d $userdir)) {mkdir $userdir, 0777 || {$errmsg = $!}}
  5758.     unless ($errmsg ){
  5759.         unless ((-e $userdir) and (-d $userdir)){$errmsg = $!}
  5760.         unless ($errmsg ){
  5761.             $userdir .= $delim."sql";
  5762.             unless ((-e $userdir) and (-d $userdir)) {mkdir $userdir, 0777 || {$errmsg = $!}}
  5763.             unless (!$errmsg and (-e $userdir) and (-d $userdir)) {$errmsg = $!}
  5764.         }
  5765.     }
  5766.     my $selectscript;
  5767.     my $selectedscript = $q->param('selectedscript') unless $q->param('script') eq 'Close';
  5768.     my $back = {
  5769.             dbname                => "$database",
  5770.             page                => "tables",
  5771.             func                => 'script',
  5772.             selectedscript        => $selectedscript,
  5773.             SQL                    => $q->param('SQL')
  5774.     };
  5775.     my $readscript = sub {
  5776.         my $script;
  5777.         my $file     = "$userdir$delim$_[0]";
  5778.         open (FH, "$file") || bail_out("Can not open file $_[0]\n$!", $back);
  5779.         flock (FH,2) unless $WIN32;
  5780.         my $i;
  5781.         while(<FH>){
  5782.             $script .= $_;
  5783.             if ($i++ > 10000) {bail_out("The script is too big", $back)} 
  5784.         }
  5785.         flock (FH,8) unless $WIN32;
  5786.         close FH;
  5787.         return $script;
  5788.     };
  5789.     my @files                 = $q->param('selectscript');
  5790.     my $SQL;
  5791.     
  5792.     if ($script        =~ /(Edit)|(Open)/i ){
  5793.         bail_out("Too many files", $back) if (@files > 1);
  5794.         bail_out("Please select a file", $back) if (@files == 0);
  5795.         bail_out("Script list is empty",$back) unless ($files[0]);
  5796.         $selectedscript                = $files[0];
  5797.         $SQL                        = &$readscript($selectedscript);
  5798.     }
  5799.     else {
  5800.         $SQL = $q->param('SQL');
  5801.     }
  5802.     $SQL =~ s/^\s*(.*)$/$1/m;
  5803.     $SQL =~ s/^(.*?)\s*$/$1/s;
  5804.     my $SQL_ = quoteit($SQL);
  5805.     $back->{SQL} = $SQL;
  5806. #    if ($errmsg){bail_out("$errmsg iiiii", $back)}
  5807.     
  5808.     
  5809.  
  5810.     my $printSaveAs = sub {
  5811.         my $file = quoteit($_[0]);
  5812.         my $var = qq!\n<FORM METHOD=POST ACTION="$full_url">\n!;
  5813.         $var .= qq!<BR><P><INPUT TYPE=SUBMIT NAME="script" VALUE="SAVE AS"> \n!;
  5814.         $var .= qq!<INPUT TYPE=TEXT NAME="saveasname" SIZE=40 VALUE="$file"><P>\n!;
  5815.         $var .= qq!<INPUT TYPE=SUBMIT NAME="script" VALUE=" CANCEL">\n!;
  5816.         $var .= qq!<INPUT TYPE=HIDDEN NAME="overwrite" VALUE="1">\n!    if ($_[1] eq '1');    
  5817.         $var .= qq!<INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">\n!;
  5818.         $var .= qq!<INPUT TYPE=HIDDEN NAME="page" VALUE="tables">\n!;
  5819.         $var .= qq!<INPUT TYPE=HIDDEN NAME="func" VALUE="script">\n!;
  5820.         if ($SQL){$var .= qq!<INPUT TYPE=HIDDEN NAME="SQL" VALUE="$SQL_">\n! ;}
  5821.         $var .= qq!<INPUT TYPE=HIDDEN NAME="selectedscript" VALUE="!.quoteit($selectedscript).qq!">\n! if $selectedscript;
  5822.         $var .= qq!</FORM>!;
  5823.     };
  5824.     if ($script eq 'Rename'){
  5825.         bail_out("Too many files", $back) if (@files > 1);
  5826.         bail_out("Please select a file", $back) if (@files == 0);
  5827.         bail_out("Script list is empty",$back) unless ($files[0]);
  5828.         my $newname = $q->param('rename');
  5829.         $newname =~ s/^\s*(.*)$/$1/m;
  5830.         $newname =~ s/^(.*?)\s*$/$1/s;
  5831.         unless ($newname){bail_out("Please enter a name", $back)}
  5832.         checkfilename($newname, $back);
  5833.         rename "$userdir$delim$files[0]", "$userdir$delim$newname" or bail_out("Cannot rename $files[0].\n$!", $back);
  5834.         if ($files[0] eq $selectedscript){$selectedscript = $newname}
  5835.     }
  5836.     if ($script eq 'Save'){
  5837.         unless ($selectedscript) {
  5838.             print &$printSaveAs();
  5839.             return;
  5840.         }
  5841.         my $size = dirsize($userdir);
  5842.         $size += length $SQL; 
  5843.         $size -= -s "$userdir$delim$selectedscript";
  5844.         if ($MAX_SCRIPT_SIZE and ($size > ($MAX_SCRIPT_SIZE*1024))) {
  5845.             my $errmsg = "Total size of user scripts is limited to $MAX_SCRIPT_SIZE kb.\n";
  5846.             $errmsg .= "Please delete some files or contact us ($CONTACT_EMAIL) if you need more disk space.\n";            
  5847.             bail_out("$errmsg",$back);
  5848.         }
  5849.         open (FH, ">$userdir$delim$selectedscript") || bail_out ("Can not open file $selectedscript\n$!", $back);
  5850.         flock(FH, 2) unless $WIN32;
  5851.         print FH $SQL;
  5852.         flock(FH, 8) unless $WIN32;
  5853.         close FH;
  5854.     }
  5855.     elsif ($script    =~ /Save as/i ){
  5856.         my $size = dirsize($userdir);
  5857.         $size += length $SQL; 
  5858.         if ($MAX_SCRIPT_SIZE and ($size > ($MAX_SCRIPT_SIZE*1024))) {
  5859.             my $errmsg = "Total size of user scripts is limited to $MAX_SCRIPT_SIZE kb.\n";
  5860.             $errmsg .= "Please delete some files or contact us ($CONTACT_EMAIL) if you need more disk space.\n";            
  5861.             bail_out("$errmsg",$back);
  5862.         }
  5863.         my $filename    = $q->param('saveasname');
  5864.         checkfilename($filename, $back);
  5865.         my $file             = "$userdir$delim$filename";
  5866.         $filename        =~ s/^\s*(.*)/$1/;
  5867.         $filename        =~ s/^(.*)\s*$/$1/;
  5868.         unless ($filename) {
  5869.             print "<BR><B>PLEASE SELECT FILE NAME</B><P>";
  5870.             print &$printSaveAs();
  5871.             return;
  5872.         }
  5873.         elsif ((-e $file) and !$q->param('overwrite')){
  5874.             print "<BR><B>THIS FILE NAME ALREADY EXISTS</B><P>";
  5875.             print "<B>CLICK <U>'SAVE AS'</U> TO OVERWRITE</B><P>";
  5876.             print &$printSaveAs($filename,'1');
  5877.             return;
  5878.         }
  5879.         else{
  5880.             open (FH, ">$file") || bail_out ("Can not open file $filename\n$!", $back);
  5881.             flock(FH, 2) unless $WIN32;
  5882.             print FH $SQL;
  5883.             flock(FH, 8) unless $WIN32;
  5884.             close FH;
  5885.         }
  5886.         $selectedscript        = quoteit($q->param('saveasname')) if (-e "$file");
  5887.     }
  5888.     elsif ($script    =~ /close/i ){$selectedscript = ''; $SQL = $SQL_ = ''}
  5889.     elsif ($script    =~ /Back/i ){loadSelectTables(); return}
  5890.     elsif ($script    =~ /delete/i){
  5891.         unless($q->param('cancel')){
  5892.             if ($q->param('confirm')){
  5893.                 my @filedelete = $q->param('filedelete');
  5894.                 my @couldnot;
  5895.                 foreach (@filedelete){
  5896.                     my $filedelete = $userdir.$delim.$_;
  5897.                     unless (unlink $filedelete) {push @couldnot, $_}
  5898.                 }
  5899.                 if (belongs(\@filedelete, $selectedscript) and ! belongs(\@couldnot, $selectedscript)){
  5900.                     $selectedscript        = '';
  5901.                 }
  5902.                 if (@couldnot) {my $files = join (@couldnot, "\n"); bail_out("Can not delete files: $files\n $!", $back)}
  5903.             }
  5904.             else {
  5905.                  bail_out("Please select a file", $back) if (@files == 0);
  5906.                 bail_out("Script list is empty",$back) unless ($files[0]);
  5907.                 print qq!\n<FORM METHOD=POST ACTION="$full_url">\n!;
  5908.                 print "<BR><P><B>THESE FILES WILL BE DELETED:</B><P>\n";
  5909.                 foreach (@files){
  5910.                     s/^(.*[\/|\\])*(.*)/$2/;
  5911.                     $_ = quoteit($_);
  5912.                     print "<INPUT TYPE=CHECKBOX NAME=\"filedelete\" VALUE=\"$_\" CHECKED> $_ <BR>\n";
  5913.                 }
  5914.                 print qq!<BR>!;
  5915.                 print qq!<INPUT TYPE=SUBMIT NAME="confirm" VALUE="DELETE"> \n!;
  5916.                 print qq!<INPUT TYPE=SUBMIT NAME="cancel" VALUE="CANCEL">\n!;
  5917.                 print qq!<INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">\n!;
  5918.                 print qq!<INPUT TYPE=HIDDEN NAME="script" VALUE="delete">\n!;
  5919.                 print qq!<INPUT TYPE=HIDDEN NAME="page" VALUE="tables">\n!;
  5920.                 print qq!<INPUT TYPE=HIDDEN NAME="SQL" VALUE="$SQL_">\n!;
  5921.                 print qq!<INPUT TYPE=HIDDEN NAME="func" VALUE="script">\n!;
  5922.                 print qq!<INPUT TYPE=HIDDEN NAME="selectedscript" VALUE="!.quoteit($selectedscript).qq!">\n!;
  5923.                 print qq!</FORM>!;
  5924.                 return
  5925.             }
  5926.         }
  5927.     }
  5928.  
  5929.     if ($errmsg){$selectscript = qq!\t<OPTION VALUE="">CANNOT CREATE DIRECTORY\n\t<OPTION VALUE="">$errmsg\n!;}
  5930.     my ($tsize, @filelist);
  5931.     unless ($errmsg){
  5932.         opendir DIR, $userdir;
  5933.         my @filenames    = readdir (DIR) or print "Cannot read this directory: $userdir<br>";
  5934.         closedir DIR;
  5935.         foreach (@filenames){
  5936.             next if (($_ eq '.') or ($_ eq '..'));
  5937.             my $file  = "$userdir$delim$_";
  5938.             my @stat = stat $file;
  5939.             unless (-d _){
  5940.                 my $size = $stat[7];
  5941.                 $tsize += $size;
  5942.                 s/^(.*\/)*(.*)$/$2/;
  5943.                 $_ = quoteit($_);
  5944. #                $selectscript .= qq!\t<OPTION VALUE="$_">$_ \/$size\/ $date\n!;
  5945.                 push @filelist, [$_, $size, $stat[9]];
  5946.             }
  5947.         }
  5948.     }
  5949.  
  5950.     my $sort_ = $q->param('sort');
  5951.     my @orderedfiles;
  5952.     if ($sort_ eq 'name'){                      
  5953.         @orderedfiles    = sort {
  5954.                 uc $a->[0] cmp uc $b->[0]    # sort by names
  5955.                         ||
  5956.                 uc $a->[2] <=> uc $b->[2]    # then by date
  5957.             } @filelist;
  5958.     }
  5959.     elsif ($sort_ eq 'size') {                     
  5960.         @orderedfiles    = sort {
  5961.                 uc $a->[1] <=> uc $b->[1]    # sort by size
  5962.                         ||
  5963.                 uc $a->[0] cmp uc $b->[0]    #then by name
  5964.             } @filelist;
  5965.     }
  5966.     elsif($sort_ eq 'date')
  5967.      {
  5968.         @orderedfiles    = sort {
  5969.                 $a->[2] <=> $b->[2] #sort by date
  5970.                         ||
  5971.                 uc $a->[0] cmp uc $b->[0]      # then by name
  5972.             } @filelist ;
  5973.     }
  5974.     else {@orderedfiles = @filelist}
  5975. #    if ($order){@orderedfiles = reverse @orderedfiles}
  5976.  
  5977.     foreach my $element (@orderedfiles){
  5978.         my $date = scalar localtime ($element->[2]);
  5979.         $date =~ s/^\s*\w\w\w\s*(.*)/$1/;
  5980.  
  5981.         $selectscript .= qq!\t<OPTION VALUE="$element->[0]">$element->[0] : $element->[1] : $date\n!;
  5982.     }
  5983.     my $ch_name = 'CHECKED' if $sort_ eq 'name';
  5984.     my $ch_size = 'CHECKED' if $sort_ eq 'size';
  5985.     my $ch_date = 'CHECKED' if $sort_ eq 'date';
  5986.     
  5987.     my $sortby = <<EOT
  5988.     <TR>
  5989.         <TD><INPUT TYPE=SUBMIT NAME="script" VALUE="Sort by" style="width: 70px;" TITLE="SORT FILES BY NAME, SIZE OR DATE"></TD>
  5990.         <TD><NOBR> Name<INPUT TYPE=RADIO NAME="sort" VALUE="name" $ch_name> Size<INPUT TYPE=RADIO NAME="sort" VALUE="size" $ch_size> Date<INPUT TYPE=RADIO NAME="sort" VALUE="date" $ch_date></NOBR></TD>
  5991.     </TR>
  5992. EOT
  5993. ;
  5994.  
  5995.     unless ($selectscript){$selectscript = qq!\t<OPTION VALUE="">Script list is empty\n!}
  5996.     $selectscript = qq!<SELECT NAME="selectscript" MULTIPLE SIZE=12 TITLE="Select a script">\n!.$selectscript;
  5997.     $selectscript .= "</SELECT>\n";
  5998.     $tsize = int($tsize / 1024 * 100) / 100;
  5999.     
  6000.     my $selectedscriptname        = "LOADED SCRIPT: <B><U>". quoteit($selectedscript) ."</U></B>" if $selectedscript;
  6001.     my $closebutton                = qq!<INPUT TYPE=SUBMIT NAME="script" VALUE=" Close " style="width: 60px" TITLE="Close the script "$selectedscript"">! if $selectedscript;
  6002.  
  6003.     my $abort = $q->checkbox(    -name=>'abortsql', -label=>'',  -title=>"Check to abort execution if error occurs. (For multiple queries)");
  6004.     
  6005.     my ($textareasize, $saveassize) = $agent ?
  6006.         (50, 12) :
  6007.         (80, 34) ;
  6008.     my $buttonwidth     = '123px';
  6009.     my $buttonwidth2    = $buttonwidth * 2;
  6010.     
  6011.     
  6012.     my $renamesize = $agent ? 19 : 29;
  6013.     print <<EOT
  6014. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=285>
  6015. <FORM METHOD=POST ACTION="$full_url">
  6016. <INPUT TYPE=HIDDEN NAME=page VALUE=tables>
  6017. <INPUT TYPE=HIDDEN NAME=func VALUE=scripts>
  6018. <INPUT TYPE=HIDDEN NAME=dbname VALUE=$database>
  6019. <INPUT TYPE=HIDDEN NAME="selectedscript" VALUE="$selectedscript">
  6020.  
  6021.     <TR>
  6022.         <TH ALIGN=LEFT COLSPAN=2 ><p>SQL SCRIPTS<p></TH>
  6023.     </TR>
  6024.     <TR>
  6025.         <TD VALIGN=TOP>
  6026.         <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=285>            
  6027.                 <TR>
  6028.                     <TD>
  6029. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>            
  6030.     <TR>
  6031.         <TD><INPUT TYPE=SUBMIT NAME="script" VALUE="Rename" style="width: 70px" TITLE="RENAME SELECTED FILE"></TD><TD><INPUT TYPE=TEXT SIZE="$renamesize" NAME="rename" VALUE=""></td>
  6032.     </TR>
  6033. $sortby
  6034. </TABLE>
  6035. $selectscript
  6036.                      </TD>
  6037.                 </TR>
  6038.             </TABLE>
  6039.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  6040.                 <TR>
  6041.                     <TD VALIGN=BOTTOM><INPUT TYPE=SUBMIT NAME="script" VALUE=" Edit " style="width: 60px" TITLE="Load selected script to view and edit"></TD>
  6042.                     <TD VALIGN=BOTTOM><INPUT TYPE=SUBMIT NAME="script" VALUE="  Open " style="width: 60px" TITLE="Execute selected script"></TD>
  6043.                     <TD VALIGN=BOTTOM>$closebutton</TD>
  6044.                     <TD VALIGN=BOTTOM><INPUT TYPE=SUBMIT NAME="script" VALUE=" Delete " style="width: 60px; color=#CC0000" TITLE="DELETE SELECTED SCRIPT"></TD>
  6045.                 </TR>
  6046.                 
  6047.             </TABLE><p>$selectedscriptname
  6048.         </TD>
  6049.         <TD VALIGN=TOP><p>
  6050. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%">    
  6051.     <TR>            
  6052.         <TD>
  6053.         <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  6054.             <TR>
  6055.                 <TD><TEXTAREA WRAP=PHYSICAL NAME="SQL" ROWS=15 COLS=$textareasize TITLE="SQL script editor">$SQL_</TEXTAREA></TD>
  6056.             </TR>
  6057.             <TR>
  6058.                 <TD><P>
  6059.                     <TABLE BORDER=0  CELLPADDING=0 CELLSPACING=0>
  6060.                         <TR>
  6061.                             <TD><P><INPUT TYPE=SUBMIT VALUE="     Back     " style="width: 100px" NAME=script TITLE="Go back to previous page"></TD>
  6062.                             <TD><P><INPUT TYPE=RESET VALUE="   Reset   " style="width: 100px" TITLE="Reset form"></TD>
  6063.                             <TD><P><INPUT TYPE=SUBMIT NAME="script" VALUE="Execute Query" style="width: 100px" TITLE="Execute SQL script"></TD>
  6064.                             <TD TITLE="Check to abort execution if error occurs. (For multiple queries)"><P>$abort Abort on error</TD>
  6065.                         </TR>
  6066.                     </TABLE></TD>
  6067.             </TR>
  6068.         </TABLE></TD>
  6069.     </TR>                
  6070.     <TR>
  6071.         <TD HEIGHT=2></TD>
  6072.     </TR>
  6073.     <TR>            
  6074.         <TD><P>
  6075.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  6076.                 <TR VALIGN=BOTTOM>
  6077.                     <TD VALIGN=BOTTOM><INPUT TYPE=SUBMIT NAME="script" VALUE="Save" style="width: 100px" TITLE="Save SQL script "$selectedscript""></TD>
  6078.                     <TD VALIGN=BOTTOM><INPUT TYPE=SUBMIT NAME="script" VALUE="Save as" style="width: 100px" TITLE="Save SQL script as ..."></TD>
  6079.                     <TD VALIGN=BOTTOM> <INPUT TYPE=TEXT NAME="saveasname" SIZE=30 TITLE="Type name to save as"></TD>
  6080.                     <TD> </TD>
  6081.                 </TR>
  6082.             </TABLE>
  6083.             </TD>
  6084.         </TR>
  6085.     </TABLE>
  6086. </TD></TR></form></TABLE>
  6087.  
  6088. EOT
  6089. ;
  6090.  
  6091.     if ($q->param('script') =~ /(Open)|(execute)/i){
  6092.         print "\n<hr size=1>\n";
  6093.         execExecuteQuery($back)
  6094.     }
  6095. }
  6096.  
  6097. sub execSearch {
  6098.     my ($table)        = $q->param('tables');
  6099.     my $back =           {
  6100.        page =>            'tables',
  6101.        dbname =>        "$database",
  6102.        tables =>        "$table",
  6103.        func =>            "search"     
  6104.     };
  6105. #        $back->{func}    = "return";
  6106. #        $back->{page}     = "searchresult";
  6107. #        $back->{order}    = "$order";
  6108. #        $back->{where}    = "$where";
  6109. #        $back->{fields}    = \@fields;
  6110. #        $back->{start}    = "$start";
  6111. #        $back->{rows}    = "$rows";
  6112.     my $query         = "SELECT * FROM $table WHERE 1=0";
  6113.     my ($sth,$res)    = prepare_execute($query, {page => 'select_db', dbname => "$database"});
  6114.     my @names         = @{$sth->{NAME}};
  6115.     my $null         = $sth->{NULLABLE};
  6116.     $sth->finish;
  6117.     my @fields        = $q->param('fields');
  6118.     my @where;
  6119.     my @unquote        = $q->param('unquote');
  6120.     my $j             = 0;
  6121.     sub regescape {
  6122.         $_ = shift;
  6123.         s{(.)}{
  6124.                 if ($1 eq '\\')            { '\\\\\\\\' }
  6125.                 elsif ($1 eq '%')        { '\%' }
  6126.                 elsif ($1 eq "'")        { "\\'" }
  6127.                 elsif ($1 eq '^')        { '\^' }
  6128.                 elsif ($1 eq '$')        { '\$' }
  6129.                 elsif ($1 eq '.')        { '\.' }
  6130.                 elsif ($1 eq '[')        { '\[' }
  6131.                 elsif ($1 eq ']')        { '\]' }
  6132.                 elsif ($1 eq '*')        { '\*' }
  6133.                 elsif ($1 eq '+')        { '\+' }
  6134.                 elsif ($1 eq '?')        { '\?' }
  6135.                 elsif ($1 eq '|')        { '\|' }
  6136.                 elsif ($1 eq '{')        { '\{' }
  6137.                 elsif ($1 eq '}')        { '\}' }
  6138.                 elsif ($1 eq ')')        { '\)' }
  6139.                 elsif ($1 eq '(')        { '\(' }
  6140.                 else                    { $1   }
  6141.             }gsex;
  6142.         return $_;
  6143.     }
  6144.     for(my $i=0; $i<@names; $i++){
  6145.         my $data     = $q->param("$names[$i]\_data");
  6146.         my $oper     = $q->param("operator\_$names[$i]");
  6147.         next if (($data eq '') and !$oper);
  6148.         my $not     = ' NOT'     if $q->param("not\_$names[$i]");
  6149.         my $case     = ' BINARY' if $q->param("case\_$names[$i]");
  6150.         my $unquote;
  6151.         my $likexpr = sub {
  6152.             if (belongsb(\@unquote,$names[$i])){
  6153.                 $unquote = 1;
  6154.                 return ['REGEXP', $case, '', $data, '', '']
  6155.             }
  6156.             else {
  6157.                 $case = '' unless check_version('3.23.4');
  6158.                 return ['LIKE', $case, "'%", regescape($data), "%'", "'"]
  6159.             }
  6160.         } ;#if (!$oper or ($oper eq 'AND') or ($oper eq 'OR'));
  6161.         if (!$oper) {
  6162.             my $expr    = &$likexpr;
  6163.             $where[$j]    = "$names[$i]$not $expr->[0]$expr->[1] $expr->[2]$expr->[3]$expr->[4]";
  6164.         }
  6165.         elsif ($oper eq 'start') {
  6166.             my $expr    = &$likexpr;
  6167.             my @data    = split ',', $expr->[3];
  6168.             my @where_;
  6169.             for(my $k=0; $k<@data; $k++){
  6170.                 $data[$k] =~ s/^\s*(.*)\s*$/$1/;
  6171.                 push @where_, "$names[$i]$not $expr->[0]$expr->[1] $expr->[5]$data[$k]$expr->[4]"; 
  6172.             }
  6173.             $where[$j]    = join " OR \n", @where_;
  6174.         }
  6175.         elsif ($oper eq 'end') {
  6176.             my $expr    = &$likexpr;
  6177.             my @data    = split ',', $expr->[3];
  6178.             my @where_;
  6179.             for(my $k=0; $k<@data; $k++){
  6180.                 $data[$k] =~ s/^\s*(.*)\s*$/$1/;
  6181.                 push @where_, "$names[$i]$not $expr->[0]$expr->[1] $expr->[2]$data[$k]$expr->[5]"; 
  6182.             }
  6183.             $where[$j]    = join " OR \n", @where_;
  6184.         }
  6185.         elsif (($oper eq 'AND') or ($oper eq 'OR')){
  6186.             my $expr    = &$likexpr;
  6187.             my @data    = split ',', $expr->[3];
  6188.             my @where_;
  6189.             for(my $k=0; $k<@data; $k++){
  6190.                 $data[$k] =~ s/^\s*(.*)\s*$/$1/;
  6191.                 push @where_, "$names[$i]$not $expr->[0]$expr->[1] $expr->[2]$data[$k]$expr->[4]"; 
  6192.             }
  6193.             $where[$j]    = join " $oper \n", @where_;
  6194.         }
  6195.         elsif ($oper eq '>'){
  6196.             $oper         = '<=' if $not;
  6197.             $data        = "'". regescape($data) ."'" unless (DBI::looks_like_number($data) or $unquote);
  6198.             $where[$j]    = "$case $names[$i] $oper $data ";
  6199.             
  6200.         }
  6201.         elsif ($oper eq '>='){
  6202.             $oper         = '<' if $not;
  6203.             if (($data eq '') and $null->[$i] and !$not) {$where[$j] = " OR $names[$i] IS NULL"}
  6204.             $data        = "'". regescape($data) ."'" unless (DBI::looks_like_number($data) or $unquote);
  6205.             $where[$j]    = "$case $names[$i] $oper $data $where[$j] ";
  6206.         }
  6207.         elsif ($oper eq '<'){
  6208.             $oper        = '>=' if $not;
  6209.             if (($data eq '') and $null->[$i] and $not) {$where[$j] = " OR $names[$i] IS NULL"}
  6210.             $data        = "'". regescape($data) ."'" unless (DBI::looks_like_number($data) or $unquote);
  6211.             $where[$j]    = "$case $names[$i] $oper $data $where[$j] ";
  6212.         }
  6213.         elsif ($oper eq '<='){
  6214.             $oper        = '>' if $not;
  6215.             $data        = "'". regescape($data) ."'" unless (DBI::looks_like_number($data) or $unquote);
  6216.             $where[$j]    = "$case $names[$i] $oper $data ";
  6217.         }
  6218.         elsif ($oper eq '='){
  6219.             $oper        = '<>' if $not;
  6220.             if (($data eq '') and $null->[$i] and !$not) {$where[$j] = " OR $names[$i] IS NULL"}
  6221.             $data        = "'". regescape($data) ."'" unless (DBI::looks_like_number($data) or $unquote);
  6222.             $where[$j]    = "$case $names[$i] $oper $data $where[$j] ";
  6223.         }
  6224.         elsif ($oper eq 'BETWEEN'){
  6225.             my @data    = split ',', $data;
  6226.             bail_out("\"BETWEEN\" option requires TWO arguments to be comma separated.",$back) 
  6227.                 if ((@data > 2) or (@data < 2));
  6228.             for(my $k=0; $k<2; $k++){
  6229.                 $data[$k]    =~ s/^\s*(\S*)\s*$/$1/g;
  6230.                 $data[$k]    = "'". regescape($data[$k]) ."'" unless (DBI::looks_like_number($data[$k]) or $unquote);
  6231.             }
  6232.             $where[$j] = "$case $names[$i]$not BETWEEN $data[0] AND $data[1]";
  6233.         }
  6234.         elsif ($oper eq 'IN'){
  6235.             my $expr     = &$likexpr;
  6236.             my @data    = split ',', $expr->[3];
  6237.             
  6238.             for(my $k=0; $k<@data; $k++){
  6239.                 $data[$k]    =~ s/^\s*(\S*)\s*$/$1/g;
  6240.                 $data[$k]    = "$expr->[5]$data[$k]$expr->[5]";
  6241.             }
  6242.             $where[$j]        = join ' ,',@data;
  6243.             $where[$j]        = "$case $names[$i]$not IN ($where[$j])";
  6244.          
  6245.         }
  6246.         elsif ($oper eq 'REGEXP'){
  6247.             my $expr        = &$likexpr;
  6248.             $where[$j]        = "$case $names[$i]$not REGEXP $expr->[5]$expr->[3]$expr->[5]";
  6249.         }
  6250.         elsif ($oper eq 'LIKE') {
  6251.             my $expr         = &$likexpr;
  6252.             $where[$j]         = "$names[$i]$not $oper$expr->[1] $expr->[5]$expr->[3]$expr->[5]";
  6253.         }
  6254.         elsif ($oper eq 'NULL'){
  6255.             $where[$j]         = "$names[$i] IS $not NULL";
  6256.         }
  6257.         elsif ($oper eq 'FUNCTION'){
  6258.             $where[$j]         = "$names[$i] $data";
  6259.         }
  6260.         $where[$j]    = "($where[$j])";
  6261.         $j++;
  6262.     } 
  6263.     my $andor            = $q->param('andor');
  6264.     my $where             = join " $andor ", @where;
  6265.     $where                 = "WHERE $where" if $where;
  6266.     my $sort             = $q->param('sort');
  6267.     my $sortorder         = $q->param('sortorder');
  6268.     my $order             = "ORDER BY $sort $sortorder" if $sort;
  6269.     searchresult($where, $order);
  6270.  
  6271. return;
  6272. }
  6273.  
  6274. sub searchresult {
  6275. #input:
  6276. # $_[0] - where
  6277. # $_[1] - order
  6278.  
  6279.     my $where         = defined $_[0] ? $_[0] : $q->param('where');
  6280.     my $order         = defined $_[1] ? $_[1] : $q->param('order');
  6281.     my ($table)        = $q->param('tables');
  6282.     my $start         = $q->param('start');
  6283.     my $rows         = $q->param('rows');
  6284.     my $func         = $q->param('func');
  6285.     my @fields        = $q->param('fields');
  6286.     my $selectfrom    = "SELECT ". join (', ', @fields). " FROM $table";
  6287.     my $query_         = "$selectfrom $where $order";
  6288.     my $deletepreview = '1' if (($func =~ /delete/i) and !$q->param('back') and !$q->param('confirm'));
  6289.     my $hidden        = $q->hidden(-name=>'fields', -value=>\@fields, -override=>1);
  6290.     my $back =     {
  6291.         tables         => "$table",
  6292.         dbname         => "$database"
  6293.     };
  6294.  
  6295.     if ($page eq 'search'){
  6296.         $back->{func}    = "search";
  6297.         $back->{page}     = "tables";
  6298.     }
  6299.     else {
  6300.         $back->{func}    = "return";
  6301.         $back->{page}     = "searchresult";
  6302.         $back->{order}    = "$order";
  6303.         $back->{where}    = "$where";
  6304.         $back->{fields}    = \@fields;
  6305.         $back->{start}    = "$start";
  6306.         $back->{rows}    = "$rows";
  6307.     }
  6308.     unless ($start =~ /^\s*\d*\s*$/){bail_out("Please check the 'Start' row number",$back)}
  6309.     unless ($rows =~ /^\s*\d*\s*$/){bail_out("Please check the number of 'hits' to be displayed",$back)}
  6310.     if    ($q->param('confirm') and ($func =~ /delete/i)){
  6311.         my $query = $q->param('deletequery');
  6312.         bail_out("Cannot delete records", $back) unless $dbh->do($query);
  6313.     }
  6314.  
  6315.     my $count        = count_rows("$table $where", $back);
  6316.     if (($func         =~ /next/i) and (($start + $rows)<$count)) {$start = ($start + $rows)}
  6317.     elsif (($func     =~ /prev/i) and ($start > $rows)) {$start = ($start - $rows)}
  6318.     elsif (($func    =~ /prev/i) and ($start <= $rows)) {$start = '0'}
  6319.     my $deletequery;
  6320.     my $limit;
  6321.     my ($controlbar, $title, $confirmation, $conftitle, $printpage, $pr_res_up, $pr_res_down);
  6322.     if ($deletepreview) {
  6323.         bail_out("Please select rows to delete!", $back) unless defined $q->param('SelectRow');
  6324.         my $query         = "SELECT *  FROM $table $where $order";
  6325.  
  6326.         my $calldelete = {
  6327.             count => "$count", table => "$table", start => "$start", rows => "$rows", query => "$query", back => $back
  6328.         };
  6329.         $deletequery         = "DELETE ".$q->param('delete_option1')." FROM  $table ";
  6330.         my $deletewhere     = getwhere($calldelete);
  6331.         if ($where and !$deletewhere){bail_out("Selected records where not found", $back)}
  6332.         $deletewhere         = "WHERE $deletewhere" if $deletewhere;
  6333.         $deletequery         .= $deletewhere;
  6334.         $query_                 = "$selectfrom $deletewhere $order";
  6335.         $deletequery         = quoteit($deletequery);
  6336.         $hidden .= qq!\n<INPUT TYPE=HIDDEN NAME="func" VALUE="DELETE">\n!;
  6337.         $hidden .= qq!\n<INPUT TYPE=HIDDEN NAME="deletequery" VALUE="$deletequery">\n!;
  6338.         $title = 'DELETE RECORDS';
  6339.         $confirmation = "Selected records will be deleted:";
  6340.         $controlbar = <<EOT
  6341.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  6342.                 <TR>
  6343.                     <TD><INPUT TYPE=SUBMIT NAME="confirm" VALUE=" CONFIRM " style="color=#CC0000" TITLE="Confirm deletion"></TD>
  6344.                     <TD><INPUT TYPE=SUBMIT NAME="back" VALUE="  BACK  " TITLE="Cancel and return back"></TD>
  6345.                 </TR>
  6346.                 <TR>
  6347.                     <TD COLSPAN=2 HEIGHT=6></TD>
  6348.                 </TR>
  6349.             </TABLE>        
  6350. EOT
  6351. ;
  6352.  
  6353.         
  6354.     }
  6355.     elsif ($q->param('printpage') ne 'full'){
  6356.         if ($start and ($rows ne ''))    {$limit = "LIMIT $start, $rows"}
  6357.         elsif ($start and ($rows eq '')){$rows = $count - $start; $limit = "LIMIT $start, $rows"}
  6358.         elsif (!$start and $rows ne '') {$limit    = "LIMIT $rows"}
  6359.         else {$rows = $count - $start}
  6360.         $query_             .= " $limit";    
  6361.     }
  6362.     $query                     = quoteit($query_);
  6363.     my ($sth,$res)             =     prepare_execute($query_, $back);
  6364.     if ($print) {print &printresult(\$sth, 0, 1);return}
  6365.     my ($sth_, $res_)          = prepare_execute("SELECT * FROM $table WHERE 1=0", $back);
  6366.     my $pri_                   = get_mysql_pri($sth_);
  6367.     my $offset                 = ($start + 0);
  6368.     my $i                     = 0;
  6369.     my $array;
  6370.     $array->[0][0]             = qq!<TD BGCOLOR="#CCCCCC">No</TH>!;
  6371.     $array->[0][1]            = qq!<TD BGCOLOR="#CCCCCC">Select</TD>! unless ($deletepreview);
  6372.     my $pri                 = get_mysql_pri($sth);
  6373.     unless (defined $pri){$pri = []}
  6374.     my $bgcolorH            = $print ? '#FFFFFF' : '#EEEEEE';
  6375.     my $bgcolor                = $print ? '#FFFFFF' : '#EEEEEE';
  6376.     my $pricolor             = $print ? '#000000' : '#ff0000';
  6377.     foreach (my $i = 0; $i < $sth->{NUM_OF_FIELDS}; $i++) {
  6378.         my $color = '#000000';
  6379.         if ($pri->[$i]){
  6380.             $array->[0][$i+2] = qq!<TH BGCOLOR="$bgcolorH"><FONT COLOR="$pricolor">$sth->{NAME}->[$i]</TH>!;
  6381.         }
  6382.         else {
  6383.             $array->[0][$i+2] = qq!<TH BGCOLOR="$bgcolor"><FONT COLOR="#000000">$sth->{NAME}->[$i]</TH>!;
  6384.         }
  6385.     }
  6386.     my $j=1;
  6387.     my @offset = $deletepreview ? $q->param('SelectRow') : ($start..($start+$rows));
  6388.     while (@ary = $sth->fetchrow_array)    {
  6389.         @ary     = quoteit(@ary);
  6390.         $offset = $offset[$j-1];
  6391.         unless ($print) {
  6392.             $array->[$j][0] = qq!<TD BGCOLOR="#CCCCCC">$offset</TD>!;
  6393.             $array->[$j][1] = qq!<TD BGCOLOR="#CCCCCC"><INPUT TYPE=CHECKBOX NAME="SelectRow" VALUE="$offset" TITLE="Select record"></TD>! unless
  6394.                     ($deletepreview);
  6395.         }
  6396.         for (my $i = 0; $i < @ary; $i++){
  6397.             $ary[$i] =~ s/(\r\n)|\n/<BR>/mg;
  6398.             $ary[$i] = ' ' if ($ary[$i] eq '' or !defined $ary[$i]);
  6399.             $array->[$j][$i+2]= qq!<TD BGCOLOR="$bgcolor">$ary[$i]</TD>!;
  6400.         }
  6401.         $j++;
  6402.         $offset++;
  6403.     }
  6404.     $where = quoteit($where);
  6405.  
  6406.     unless ($deletepreview){
  6407.         my $prev     = qq!<INPUT TYPE=SUBMIT NAME="func" VALUE="<<Prev" TITLE="Show previous hits">! if ($start > 0);
  6408.         my $next     = qq!<INPUT TYPE=SUBMIT NAME="func" VALUE="Next>>" TITLE="Show next hits">! if ((($start + $rows) < $count) and $rows);
  6409.         if ($prev or $next){
  6410.             $printpage = qq!Full result <INPUT TYPE=RADIO NAME="printpage" VALUE="full" TITLE="Print all found hits"> Current Page <INPUT TYPE=RADIO NAME="printpage" VALUE="this" CHECKED TITLE="Print only shown hits">!;
  6411.         }
  6412.         $title = 'SEARCH RESULT';
  6413.         $confirmation = "Records found: $count";
  6414.         $conftitle    =  qq!TITLE="Totally $count hits were found with given search criteria"!;
  6415.         $controlbar = <<EndOfControlbar
  6416.             <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=650>
  6417.                 <TR>
  6418.                     <TD WIDTH=120>
  6419.                     <TABLE CELLPADDING=0 CELLSPACING=0 WIDTH=120 BORDER=0>
  6420.                         <TR>
  6421.                             <TD>
  6422.                                 <TABLE CELLPADDING=0 CELLSPACING=0 WIDTH=60 BORDER=0>
  6423.                                     <TR>
  6424.                                         <TD WIDTH=60>$prev</TD>
  6425.                                     </TR>
  6426.                                 </TABLE>
  6427.                             </TD>
  6428.                             <TD WIDTH=60>
  6429.                                 <TABLE CELLPADDING=0 CELLSPACING=0 WIDTH=60 BORDER=0>
  6430.                                     <TR>
  6431.                                         <TD WIDTH=60>$next</TD>
  6432.                                     </TR>
  6433.                                 </TABLE>
  6434.                             </TD>
  6435.                         </TR>
  6436.                     </TABLE>
  6437.                     </TD>
  6438.                     <TD WIDTH=20> </TD>
  6439.                     <TD>
  6440.                         <TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0>
  6441.                             <TR>
  6442.                                 <TD WIDTH=68><INPUT TYPE=SUBMIT NAME="func" VALUE="  BACK  " TITLE="Go back to select search criteria"></TD>
  6443.                                 <TD WIDTH=120 ALIGN=LEFT><INPUT TYPE=SUBMIT NAME="func" VALUE="EDIT RECORD " TITLE="Edit selected records"></TD>
  6444.                                 <TD WIDTH=120 ALIGN=LEFT><INPUT TYPE=SUBMIT NAME="func" VALUE=" NEW RECORD " TITLE="Insert new records"></TD>
  6445.                                 <TD WIDTH=118 ALIGN=LEFT><INPUT TYPE=SUBMIT NAME="func" VALUE="DELETE RECORD" TITLE="Delete selected records"></TD>
  6446.                             </TR>
  6447.                         </TABLE>
  6448.                     </TD>
  6449.                 </TR>
  6450.                 <TR>
  6451.                     <TD COLSPAN=3 HEIGHT=6></TD>
  6452.                 </TR>
  6453.             </TABLE>        
  6454.  
  6455. EndOfControlbar
  6456. ;
  6457.     my $titlesize = $agent ? 15 : 20;
  6458.     $pr_res_up = <<EOPR
  6459. <INPUT TYPE=SUBMIT NAME="print" VALUE="Print result" TITLE="Generate printer friendly report"></TD>
  6460.         <TD><nobr>$printpage</nobr></TD>
  6461.         <TD> </TD>
  6462.         <TD>Title: <INPUT TYPE=TEXT SIZE=$titlesize NAME="title" TITLE="Type page title to place on printout">
  6463. EOPR
  6464. ;
  6465. $pr_res_down = <<EOT
  6466. Height:</TD>
  6467.         <TD><nobr>Rows: <SELECT NAME="rowheight" TITLE="Select height of table rows for printout">
  6468.         <OPTION VALUE="" SELECTED>min
  6469.         <OPTION VALUE="HEIGHT=20">20
  6470.         <OPTION VALUE="HEIGHT=30">30
  6471. </SELECT> Header: <SELECT NAME="headerheight" TITLE="Select height of table header for printout">
  6472.         <OPTION VALUE="">min
  6473.         <OPTION VALUE="HEIGHT=20">20
  6474.         <OPTION VALUE="HEIGHT=30" SELECTED>30
  6475. </SELECT></nobr></TD>
  6476.         <TD> </TD>
  6477.         <TD><nobr>Align: <SELECT NAME="align" TITLE="Select alignment of page title">
  6478. <OPTION VALUE="LEFT" SELECTED>left
  6479. <OPTION VALUE="CENTER">center
  6480. <OPTION VALUE="RIGHT">right
  6481. </SELECT> <B>B</B> <INPUT TYPE=CHECKBOX NAME="style" 
  6482. VALUE="B" TITLE="Style of page title - Bold"> <B><I>I</I></B><INPUT TYPE=CHECKBOX NAME="style" 
  6483. VALUE="I" TITLE="Style of page title - Italic"> <B><U>U</U></B><INPUT TYPE=CHECKBOX NAME="style" VALUE="U" TITLE="Style of page title - Underline"></nobr>
  6484.  
  6485. EOT
  6486. ;
  6487. }
  6488.  
  6489.     my $export = <<EOT
  6490.     <TABLE BORDER=0>
  6491.     <FORM ACTION=$full_url METHOD=POST>
  6492. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  6493. <INPUT TYPE=HIDDEN NAME="page"             VALUE="tables">
  6494. <INPUT TYPE=HIDDEN NAME="count"         VALUE="$count">
  6495. <INPUT TYPE=HIDDEN NAME="tables"         VALUE="$table">
  6496. <INPUT TYPE=HIDDEN NAME="start"         VALUE="$start">
  6497. <INPUT TYPE=HIDDEN NAME="rows"             VALUE="$rows">
  6498. <INPUT TYPE=HIDDEN NAME="where"         VALUE="$where">
  6499. <INPUT TYPE=HIDDEN NAME="order"         VALUE="$order">
  6500. <INPUT TYPE=HIDDEN NAME="searchresult"     VALUE="1">
  6501. $hidden
  6502. <INPUT TYPE=HIDDEN NAME="query"         VALUE="$query">
  6503.     <TR>
  6504.         <TD><P><INPUT TYPE=SUBMIT NAME="func" VALUE="Export Result" style="width: 110"></TD>
  6505.         <TD> </TD>
  6506.         <TD>CSV File<INPUT TYPE=RADIO NAME="mode" VALUE="simple" CHECKED></TD>
  6507.         <TD> </TD>
  6508.         <TD>Advanced<INPUT TYPE=RADIO NAME="mode" VALUE="advanced"></TD>
  6509.         <TD> </TD>
  6510.     </TR>
  6511. </FORM>
  6512.     </TABLE>
  6513. EOT
  6514. unless $deletepreview;
  6515.  
  6516.     print <<EOT
  6517. <!-- Header Table -->
  6518. <TABLE BORDER=0>
  6519.     <TR>
  6520.         <TD VALIGN=TOP><P>
  6521.     <TABLE BORDER=0>
  6522.         <TR>
  6523.             <TH ALIGN=LEFT>$title</TH>
  6524.             <TD> </TD>
  6525.             <TD $conftitle> <CODE>$confirmation</CODE> </TD>
  6526.         </TR>
  6527.         <TR>
  6528.             <TD COLSPAN=3><CODE>TABLE "$table" </CODE></TD>
  6529.         </TR>
  6530.         <TR>
  6531.             <TD COLSPAN=3> </TD>
  6532.         </TR>
  6533.     </TABLE>
  6534.         </TD>
  6535.         <TD VALIGN=TOP><P>
  6536.     <TABLE BORDER=0>
  6537.     <FORM METHOD=POST ACTION="$full_url" TARGET=_blank>
  6538.         <TR>
  6539.             <TD>$pr_res_up</TD>
  6540.         </TR>
  6541.         <TR>
  6542.             <TD ALIGN=CENTER>$pr_res_down</TD>
  6543.         </TR>
  6544. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  6545. <INPUT TYPE=HIDDEN NAME="page" VALUE="searchresult">
  6546. <INPUT TYPE=HIDDEN NAME="count" VALUE="$count">
  6547. <INPUT TYPE=HIDDEN NAME="tables" VALUE="$table">
  6548. <INPUT TYPE=HIDDEN NAME="start" VALUE="$start">
  6549. <INPUT TYPE=HIDDEN NAME="rows" VALUE="$rows">
  6550. <INPUT TYPE=HIDDEN NAME="where" VALUE="$where">
  6551. <INPUT TYPE=HIDDEN NAME="order" VALUE="$order">
  6552. $hidden
  6553. </FORM>
  6554.     </TABLE>
  6555. $export
  6556.         </TD>
  6557.     </TR>
  6558. </TABLE>
  6559. <!-- End of Header Table -->
  6560. EOT
  6561. unless $print;
  6562.  
  6563.     my $bordercolor = '#AAAAAA';
  6564.     print <<EOT
  6565.           <!-- Search Result -->
  6566. <FORM METHOD=POST ACTION="$full_url">
  6567. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%">
  6568.     <TR>
  6569.         <TD WIDTH="100%">
  6570. <!-- Control Bar starts here -->
  6571. $controlbar
  6572. <!-- Control Bar ends here -->
  6573.         </TD>
  6574.     </TR>
  6575.     <TR>
  6576.         <TD WIDTH="100%">
  6577.             <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
  6578.                 <TR>
  6579.                     <TD BGCOLOR="$bordercolor">
  6580.                         <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2>
  6581. EOT
  6582. ;
  6583.  
  6584.     #my $firstrow  ;
  6585.     my $rowheight = $q->param('rowheight');
  6586.     my $headerheight = $q->param('headerheight');
  6587.     print qq!\t<TR $headerheight>!, @{shift (@$array)}, qq!</TR>\n!;
  6588.     foreach (@$array){print qq!\t<TR $rowheight>@{$_}</TR>\n!}
  6589.     print <<EOT
  6590.                         </TABLE>
  6591.                     </TD>
  6592.                 </TR>
  6593.             </TABLE>
  6594.         </TD>
  6595.     </TR>
  6596. </TABLE>
  6597. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  6598. <INPUT TYPE=HIDDEN NAME="page" VALUE="searchresult">
  6599. <INPUT TYPE=HIDDEN NAME="count" VALUE="$count">
  6600. <INPUT TYPE=HIDDEN NAME="tables" VALUE="$table">
  6601. <INPUT TYPE=HIDDEN NAME="start" VALUE="$start">
  6602. <INPUT TYPE=HIDDEN NAME="rows" VALUE="$rows">
  6603. <INPUT TYPE=HIDDEN NAME="where" VALUE="$where">
  6604. <INPUT TYPE=HIDDEN NAME="order" VALUE="$order">
  6605. $hidden
  6606. </FORM>
  6607.          <!-- end of printresult subroutine -->
  6608. EOT
  6609. ;
  6610.  
  6611.  
  6612. }
  6613. sub execSearchupdate {
  6614.     my ($back, $updatewhere) = @_;
  6615.     my $table         = $q->param('tables');
  6616.     my $err_msg;
  6617.     $updatewhere     = "WHERE $updatewhere" if $updatewhere;
  6618.     my $query         = "SELECT * FROM $table $updatewhere";
  6619.     my ($sth,$res)    = prepare_execute($query,$back);
  6620.     if ($res > 1){bail_out("Too many results. Check the code", $back)}
  6621.     my @names        = @{$sth->{NAME}};
  6622.     my @ary         = $sth->fetchrow_array();#||bail_out("",$back);
  6623.     my @unquote        = $q->param('unquote');
  6624.     my @upload        = $q->param('upload');
  6625.     my $num            = $sth->{NUM_OF_FIELDS};
  6626.     $sth->finish;
  6627.     my @setarray;
  6628.     for (my $i = 0; $i<$num; $i++) {
  6629.         my $data;
  6630.         if (belongs(\@upload, $names[$i])){
  6631.             $data = $q->param("$names[$i]\_data_upload")||bail_out("No file entered ('$names[$i]' column).",$back);
  6632.             my $buf;
  6633.             $err_msg .= "File not found or is empty. $! - column '$names[$i]'\n" unless (-s $data);
  6634. #            binmode $data if -B $data;
  6635.             binmode $data;
  6636.             my $line = '';
  6637.  
  6638.             while (read $data, $buf, 1024) {$line .= $buf; bail_out("$!", $back) if $! }
  6639.             close $data;
  6640.             bail_out("$!", $back) if $!;
  6641.             $data = $line;    
  6642.         }
  6643.         else {$data = $q->param("$names[$i]\_data").''}
  6644.  
  6645. #++++++++++++++++++++++++++++++++++++++
  6646.  
  6647.         if (belongs(\@unquote, $names[$i])){
  6648.             my $data_ = $data;
  6649.             my $sth     = $dbh->prepare("SELECT $data");
  6650.             my $res     = $sth->execute() || bail_out("CHECK YOUR INPUT. WRONG UNQUOTED PARAMETERS IN COLUMN: '$names[$i]'\n\n$data\n\n", $back);
  6651.             ($data_)    = $sth->fetchrow_array();
  6652.             if (($data_ ne $ary[$i]) or (!defined $data_) or (!defined $ary[$i])){
  6653.                 push @setarray, "$names[$i]=$data"; 
  6654.             }
  6655.         }
  6656.         else {
  6657.             unless ($data eq $ary[$i]){
  6658.                 $data = $dbh->quote($data);
  6659.                 push @setarray, "$names[$i]=$data";
  6660.             }
  6661.         }
  6662.     }#for
  6663.     bail_out($err_msg, $back) if $err_msg;
  6664.     unless (@setarray == 0) {
  6665.         bail_out($demomsg, $back);
  6666.     }#end update
  6667. }#execSearchupdate
  6668.  
  6669.  
  6670. sub printHeaderTable {
  6671.     my $headtab = $_[0];
  6672. # $_[0]->{name} - the name of proc.
  6673. # $_[0]->{title1} - table name
  6674. # $_[0]->{title2} - count rows
  6675. # $_[0]->{rows} - No of rows
  6676. # $_[0]->{table} - Table name
  6677.  
  6678.     my $total = qq!<CODE>$headtab->{rows}</CODE>! if (defined $headtab->{rows});
  6679.     my $table = qq!<CODE>$headtab->{table}</CODE>! if $headtab->{table};
  6680.     print <<EOT
  6681. <TABLE BORDER=0><!-- Header Table -->
  6682.     <TR><TH COLSPAN=5 ALIGN=LEFT>$headtab->{name}</TH><TR>
  6683.     <TR>
  6684.         <TD TITLE="$headtab->{title1}">$table</TD>
  6685.         <TD>   </TD>
  6686.         <TD TITLE="$headtab->{title2}">  $total  </TD>
  6687.         <TD>    </TD>
  6688.         <TD>$headtab->{msg}</TD>
  6689.     </TR>
  6690. </TABLE><!-- End of Header Table -->
  6691. EOT
  6692. ;
  6693. }
  6694. sub backtoselect {
  6695.         my $tables    = quoteit ($q->param('tables'));
  6696.         my @cols     = $q->param("fields_$tables");
  6697.         return {
  6698.             select                => "".$q->param('select'),
  6699.             tables                => "".$tables,
  6700.             where                => "".$q->param('where'),
  6701.             groupby                => "".$q->param('groupby'),
  6702.             orderby                => "".$q->param('orderby'),
  6703.             limit                => "".$q->param('limit'),
  6704.             "fields_$tables"    => \@cols
  6705.         }
  6706. }
  6707.  
  6708. sub printform {
  6709.     my $input = shift;
  6710.     my $hidden = qq!<INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">\n!;
  6711.     $hidden .= qq!<INPUT TYPE=HIDDEN NAME="page" VALUE="tables">\n!;
  6712.     my $query    = $input->{query};
  6713.     if ($q->param('func') =~ /^select/i){
  6714.         my $param = backtoselect();
  6715.         foreach (keys %$param){
  6716.             $hidden .= $q->hidden(-name=>$_, -value=>$param->{$_}, -override=>1)."\n";
  6717.         }
  6718.         $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="query" VALUE="$query">\n!;
  6719.     }
  6720.     else {
  6721.         my $sql                .= quoteit ($input->{'SQL'});
  6722.         my $selectedscript    .= quoteit ($input->{'selectedscript'});
  6723.          $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="SQL" VALUE="$sql">!;
  6724.         $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="selectedscript" VALUE="$selectedscript">! if $selectedscript;
  6725.         $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="query" VALUE="$query">\n!;
  6726.         $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="script" VALUE="execute">\n!;
  6727. #        $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="func" VALUE="script">!;
  6728.     }
  6729.     print <<EOT
  6730.     <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  6731.     <TR><TD><P>
  6732.  
  6733. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=1>
  6734. <FORM ACTION=$full_url METHOD=POST TARGET=_blank>
  6735. <INPUT TYPE=HIDDEN NAME="SQL" VALUE="$input->{query}">
  6736. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  6737. <INPUT TYPE=HIDDEN NAME="page" VALUE="tables">
  6738. <INPUT TYPE=HIDDEN NAME="script" VALUE="print">
  6739. <INPUT TYPE=HIDDEN NAME="func" VALUE="script">
  6740.     <TR>
  6741.         <TD><INPUT TYPE=SUBMIT NAME="print" VALUE="Print Result" TITLE="Generate printer friendly report"  style="width: 110"> </TD>
  6742.         <TD> Heights:</TD>
  6743.         <TD>Rows <SELECT NAME="rowheight" TITLE="Select height of table rows for printout">
  6744. <OPTION VALUE="" SELECTED>min
  6745. <OPTION VALUE="HEIGHT=20">20
  6746. <OPTION VALUE="HEIGHT=30">30
  6747. </SELECT></TD>
  6748.         <TD>Header <SELECT NAME="headerheight" TITLE="Select height of table header for printout">
  6749. <OPTION VALUE="">min
  6750. <OPTION VALUE="HEIGHT=20">20
  6751. <OPTION VALUE="HEIGHT=30" SELECTED>30
  6752. </SELECT></TD>
  6753.         <TD>Title: <INPUT TYPE=TEXT SIZE=20 NAME="title" TITLE="Type page title to place on printout"></TD>
  6754.         <TD><NOBR>Align: <SELECT NAME="align" TITLE="Select alignment of page title">
  6755. <OPTION VALUE="LEFT" SELECTED>left
  6756. <OPTION VALUE="CENTER">center
  6757. <OPTION VALUE="RIGHT">right
  6758. </SELECT> <B>B</B> <INPUT TYPE=CHECKBOX NAME="style" 
  6759. VALUE="B" TITLE="Style of page title - Bold"> <B><I>I</I></B><INPUT TYPE=CHECKBOX NAME="style" 
  6760. VALUE="I" TITLE="Style of page title - Italic"> <B><U>U</U></B><INPUT TYPE=CHECKBOX NAME="style" VALUE="U" TITLE="Style of page title - Underline"></NOBR></TD>
  6761.  
  6762.     </TR>
  6763. </FORM>    
  6764. </TABLE>
  6765.  
  6766. </TD></TR>
  6767. <TR><TD><P>
  6768.  
  6769. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=1>
  6770.     <FORM ACTION=$full_url METHOD=POST><TR>
  6771. $hidden
  6772.         <TD><P><INPUT TYPE=SUBMIT NAME="func" VALUE="Export Result" style="width: 110"></TD>
  6773.         <TD> </TD>
  6774.         <TD>CSV File<INPUT TYPE=RADIO NAME="mode" VALUE="simple" CHECKED></TD>
  6775.         <TD> </TD>
  6776.         <TD>Advanced<INPUT TYPE=RADIO NAME="mode" VALUE="advanced"></TD>
  6777.         <TD> </TD>
  6778.     </TR>
  6779. </FORM>
  6780. </TABLE>
  6781.  
  6782. </TD></TR></TABLE>
  6783. EOT
  6784. ;
  6785.  
  6786. }
  6787. sub removeUser {
  6788.     my $back = {page => 'admin', func =>'access', dbname => "$database"};
  6789.     bail_out("Access denied to database 'mysql'", $back) if defined $q->param('add');
  6790.     my @userlist = $q->param('userlist');
  6791.     unless (@userlist and ($userlist[0] =~/@/)){bail_out "Please select from user list", $back}
  6792.     if ($q->param('confirm')){
  6793.         my @tables = ('mysql.user', 'mysql.columns_priv', 'mysql.db', 'mysql.tables_priv');
  6794.         foreach (@tables) {
  6795.             my $query = "DELETE FROM $_ WHERE ";
  6796.             my @where = ();
  6797.             foreach (@userlist){
  6798.                 /^\s*('\S*.*')\@('.*\S*')\s*$/;
  6799.                 push @where, "((User = $1) AND (Host = $2))";
  6800.             }
  6801.             $query .= join (' OR ', @where);
  6802.             $dbh->do($query) || bail_out("Can not do query:/n$query",$back);
  6803.         }
  6804.         $dbh->do("FLUSH PRIVILEGES") || bail_out("Can not flush privileges",$back);
  6805.         return
  6806.     }
  6807.     else {
  6808.         my $accounts;
  6809.         foreach (@userlist){
  6810.             $accounts .= qq!<INPUT TYPE=CHECKBOX NAME="userlist" VALUE="$_" CHECKED> $_ <BR>\n!;
  6811.         }
  6812.         my $message;
  6813.         my $buttons;
  6814.         unless (@userlist){
  6815.             $message = "Please select from user list";
  6816.             $buttons = qq!<INPUT TYPE=SUBMIT NAME="" VALUE="Back">\n!;
  6817.         }
  6818.         else {
  6819.             $message = 'You are going to remove the folowing accounts';
  6820.             $buttons = qq!<INPUT TYPE=SUBMIT NAME="action" VALUE="REMOVE" style="color=#CC0000">!;
  6821.             $buttons .= qq! <INPUT TYPE=SUBMIT NAME="" VALUE="Cancel">\n!;
  6822.         }
  6823.         print <<EOT
  6824. <FORM ACTION="$full_url" METHOD=POST>
  6825. <B>$message</B><BR>
  6826. $accounts<P>
  6827. $buttons
  6828. <INPUT TYPE=HIDDEN NAME="page" VALUE="admin">
  6829. <INPUT TYPE=HIDDEN NAME="func" VALUE="access">
  6830. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  6831. <INPUT TYPE=HIDDEN NAME="confirm" VALUE="1">
  6832. </FORM>
  6833. EOT
  6834. ;
  6835.     }
  6836.  
  6837. }
  6838. sub showGrants {
  6839.     my $back = {page => 'admin', func =>'access', dbname => "$database"};
  6840.     unless (check_version('3.23.4')){
  6841.         my $version = get_version();
  6842.         bail_out("Current version of mysql server ($version) does not allow this operation.\nYou need to upgrade mysql installation.", $back);
  6843.     }
  6844.     my @userlist = get_user_host();
  6845.     if (@userlist == 0){bail_out ("Please select from user list", $back)}
  6846.     foreach (@userlist){
  6847.  
  6848.         print "SHOW GRANTS FOR $_ <BR>";
  6849.         my ($sth, $res) = prepare_execute("SHOW GRANTS FOR $_", $back);
  6850.         print &printresult(\$sth), "<BR>";
  6851.         ErrMessage ("<BR>Print Result Error. $DBI::errstr") if $DBI::err;
  6852.     }
  6853.     bail_out('',$back);
  6854. }
  6855. sub getAnotherUser {
  6856.     my $user_  = $q->param('user1');
  6857.     my $host_  = $q->param('host1');
  6858.     my $add       = ($host_ ne '') ? '@' : $q->param('add');
  6859.     $host_       = $dbh->quote($host_) if $add;
  6860.     $user_       = $dbh->quote($user_);
  6861.     return ($user_.$add.$host_)
  6862. }
  6863. sub get_user_host {
  6864.     my @userlist;
  6865.     if (defined $q->param('add')){
  6866.         $userlist[0] = getAnotherUser();
  6867.     }
  6868.     else {
  6869.         @userlist = $q->param('userlist');
  6870.     }
  6871.     return @userlist;
  6872. }
  6873. sub changePassword {
  6874.     my $back = {page => 'admin', func =>'access', dbname => "$database"};
  6875. #++++++++++++++++++++++++++++++++++++++
  6876.  
  6877.     my $new_password; 
  6878.     my $password_     = $q->param('new_password');
  6879.     if ($password_ =~/\S/){
  6880.         $password_ = $dbh->quote($password_);
  6881.         $new_password = "PASSWORD($password_)"
  6882.     }
  6883.     else {$new_password = "''"}
  6884.     my $for;
  6885.     my $message;
  6886.     unless ($q->param('for') eq 'self'){
  6887.         my @userlist = get_user_host;
  6888.         bail_out ("Please select only one user name", $back) if (@userlist > 1);
  6889.         bail_out ("Please select from user list", $back) if (@userlist == 0);
  6890.         $for = "FOR $userlist[0]";
  6891.         $message = quoteit("New password was set for $userlist[0]")
  6892.     }
  6893.     else {$message = "My password was changed"}
  6894.     my $query = "SET PASSWORD $for = $new_password";
  6895.     $dbh->do($query) || bail_out("Can not set password.\n$query",$back);
  6896.     print $query;
  6897. #++++++++++++++++++++++++++++++++++++++
  6898.     bail_out ($message, $back);
  6899.  
  6900. }
  6901. sub loadAccessControl {
  6902.  
  6903. #++++++++++++++++++++++++++++++++++++++
  6904.  
  6905.  
  6906.  
  6907.     my $action                = $q->param('action');
  6908.     my $back                = $_[0];
  6909.     if ($action =~ /SHOW/i){showGrants();return}
  6910.     elsif ($action =~ /REMOVE/i){removeUser();return unless $q->param('confirm')}
  6911.     elsif ($action =~ /(GRANT)|(REVOKE)|(NEXT)|(CREATE)/i){loadGrantTables(); return}
  6912.     elsif ($action =~ /CHANGE/i){changePassword();return unless $q->param('confirm')}
  6913.     my $show_grants_button = qq!<INPUT TYPE=SUBMIT NAME="action" VALUE="SHOW GRANTS" style="Width: 150px" TITLE="Show grants for selected users">!;
  6914.     my $selectdbname_         = $q->param('selectdbname_');
  6915.     my ($userlist, $labels) = getuserlist();
  6916. #    unshift @$userlist, ''; 
  6917.     my $num_of_acc; my $myuser;
  6918.     if ($userlist->[0] =~/@/){$num_of_acc  = "<B>".(scalar @$userlist)." accounts found</B>"}
  6919.     else {
  6920.         if ($userlist->[0] == 1){
  6921.             $myuser = <<EOT
  6922. <TABLE WIDTH="100%" BORDER=0 CELLPADDING=0 CELLSPACING=0>
  6923.     <TR>
  6924.         <TD ALIGN=CENTER>user</TD><TD> </TD><TD ALIGN=CENTER>host</TD>
  6925.     </TR>
  6926.     <TR>
  6927.         <TD><INPUT TYPE=TEXT NAME="user1" SIZE=10 TITLE="User name"></TD>
  6928.         <TD><SELECT NAME="add">
  6929.                     <OPTION VALUE="">
  6930.                     <OPTION VALUE="\@" SELECTED>@
  6931.             </SELECT></TD>
  6932.         <TD><INPUT TYPE=TEXT NAME="host1" SIZE=10 TITLE="Host name"></TD>
  6933.     </TR>
  6934. </TABLE>
  6935. EOT
  6936. ;
  6937.         }
  6938.         $num_of_acc = ''}
  6939.     
  6940.     my $SelectUser    = $q->scrolling_list(
  6941.                                                  -name        => 'userlist',
  6942.                                         -value        => $userlist,
  6943.                                         -labels        => $labels,
  6944.                                         -multiple    => 1,
  6945.                                         -size        => 8
  6946.                                 );
  6947.     my ($other_users, $alt_hostname, $reload);
  6948.     my $apply        = 'NEXT>>';
  6949.     my $new_num        = $q->param('new_num');
  6950.     my $uh             = $q->param('alt_hostname');
  6951.     $new_num =~ s/^\s*(.+)\s*$/$1/;
  6952.     if (($new_num =~ /\d+/) and ($new_num > 0)){
  6953.         $other_users = <<EOT
  6954.         <TABLE BORDER=0>
  6955.             <TR>
  6956.                 <TD> </TD><TD>USER</TD><TD>PASSWORD</TD><TD>HOST</TD><TD> </TD>
  6957.             </TR>
  6958. EOT
  6959. ;
  6960.         $reload            = qq!<INPUT TYPE=SUBMIT VALUE="Reload"><INPUT TYPE=RESET>!;
  6961.         my @un             = $q->param('user_name');
  6962.         my @up             = $q->param('user_password');
  6963.         my @uh;
  6964.         my $uh            = quoteit($uh);
  6965.         $apply            = 'Apply';
  6966.         if ($q->param('apply_alt_host')){for(1..$new_num){push @uh, $uh}}
  6967.         else {@uh = $q->param('user_host');@uh = quoteit @uh}
  6968.         @un     = quoteit @un;
  6969.         @up     = quoteit @up;
  6970.         for(0..$new_num-1){
  6971.             my $create_button = $_ ? " " : qq!<INPUT TYPE=SUBMIT NAME="action" VALUE="NEXT>>" TITLE="Show privileges">! ;
  6972.             my $n = $_ + 1;
  6973.             $other_users .= <<EOT
  6974.             <TR>
  6975.                 <TD>$n</TD><TD><INPUT TYPE=TEXT SIZE=20 NAME="user_name" VALUE="$un[$_]" TITLE="User name"></TD>
  6976.                 <TD><INPUT TYPE=TEXT SIZE=20 NAME="user_password" VALUE="$up[$_]" TITLE="Password"></TD>
  6977.                 <TD><INPUT TYPE=TEXT SIZE=20 NAME="user_host" VALUE="$uh[$_]" TITLE="Host name or IP"></TD>
  6978.                 <TD>$create_button</TD>
  6979.             </TR>
  6980. EOT
  6981. ;
  6982.  
  6983.         }
  6984.         $other_users .=    "\n\t\t</TABLE>\n";    
  6985.  
  6986.     }
  6987.     elsif($new_num =~ /\S/){
  6988.         $other_users .= qq!<FONT COLOR="#FF0000">"Number of accounts" field must contain a number > 0</FONT>!;
  6989.         $new_num = '';
  6990.     }
  6991.     else {$other_users = " "; $new_num = '';}
  6992.     unless (defined $new_num){$new_num = 1}
  6993.     my $textsize = $agent ? 15 : 20 ;
  6994.     $alt_hostname =<<EOT
  6995.    
  6996.             <I>Use this host name for all accounts</I> 
  6997.             <INPUT TYPE=TEXT NAME="alt_hostname" VALUE="$uh" SIZE=20 TITLE="Type host name and click '$apply'"> 
  6998.             <INPUT TYPE=SUBMIT NAME="apply_alt_host" VALUE="$apply" TITLE="Click here to apply this host name to all accounts">
  6999. $reload
  7000. EOT
  7001. ;
  7002.  
  7003.     print <<EOT
  7004.  
  7005. <!-- MAIN TABLE1 STARTS -->
  7006. <TABLE  BORDER=0>
  7007.     <TR><TH ALIGN=LEFT>ADMINISTRATION -> ACCESS CONTROL</TH></TR>
  7008.     <TR>
  7009.         <TD><FORM ACTION="$full_url" METHOD=POST>
  7010.     <TABLE WIDTH="100%" BORDER=0 CELLPADDING=0 CELLSPACING=0>
  7011.         <TR><!-- Grant, Revoke, Show -->
  7012.             <TD VALIGN=TOP ALIGN=RIGHT WIDTH="50%"><P>
  7013.         <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%" >
  7014.             <TR>
  7015.                 <TD width="100%"><!-- BORDER START -->
  7016.             <TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0 ALIGN=LEFT BGCOLOR="#CCCCCC" WIDTH="100%" >
  7017.                    <TR><TD><P><BR><INPUT TYPE=SUBMIT NAME="action" VALUE="      GRANT     " style="Width: 150px" TITLE="Grant privileges to selected users"></TD><!-- BUTTONS -->
  7018.                     <TD ROWSPAN=5 TITLE="Select user"><!-- SELECT USER -->
  7019. $num_of_acc <BR>
  7020. $SelectUser
  7021. <BR>
  7022. $myuser
  7023.                        </TD>
  7024.                     </TR>
  7025.                     <TR><TD><P><INPUT TYPE=SUBMIT NAME="action" VALUE="     REVOKE     " style="Width: 150px" TITLE="Revoke privileges from selected users"></TD></TR>
  7026.                     <TR><TD><P><INPUT TYPE=SUBMIT NAME="action" VALUE="    REMOVE     " style="Width: 150px; color=#CC0000" TITLE="Remove selected users"></TD></TR>
  7027.                     <TR><TD><P>$show_grants_button</TD></TR>
  7028.                     <TR HEIGHT=25><TD HEIGHT=25 ><P> </TD></TR>
  7029.             </TABLE>
  7030.         </TD></TR></TABLE>
  7031.             </TD><!-- End of Grant, Revoke, Show --><TD>  </TD>
  7032.             <TD VALIGN=TOP WIDTH="50%"><!-- Change Password -->
  7033.             
  7034.             
  7035.             <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%" >
  7036.             <TR>
  7037.                 <TD width="100%"><!-- BORDER START -->
  7038.             <TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%">
  7039.                 <TR>
  7040.                     <TD VALIGN=BOTTOM >
  7041.                     <INPUT TYPE=SUBMIT NAME="action" VALUE="CHANGE PASSWORD" style="width: 180px" TITLE="Change password"></TD>
  7042.                     <TD VALIGN=BOTTOM>   New Password</B><BR>
  7043.                     <INPUT TYPE=TEXT NAME="new_password" SIZE=$textsize TITLE="Type new password"></TD>
  7044.                 </TR>
  7045.                 <TR>
  7046.                     <TD COLSPAN=2>
  7047.                     <INPUT TYPE=RADIO NAME="for" CHECKED TITLE="Change password for selected user">For selected user
  7048.                     <INPUT TYPE=RADIO NAME="for" VALUE="self" TITLE="Change my password">For myself
  7049.                     </TD>
  7050.                 </TR>
  7051.             </TABLE>
  7052.             </TD></TR></TABLE><BR>
  7053.             
  7054.         <!--    <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" WIDTH="100%">
  7055.             <TR>
  7056.                 <TD width="100%">
  7057.             <TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%">
  7058.                 <TR>
  7059.                     <TD VALIGN=BOTTOM >
  7060.                     <INPUT TYPE=SUBMIT NAME="host_priv" VALUE="  HOST PRIVILEGES " style="width: 180px" TITLE="Assign host privilege"></TD>
  7061.                 </TR>
  7062.             </TABLE>
  7063.             </TD></TR></TABLE> -->
  7064.             
  7065.             
  7066.             </TD>
  7067.         </TR><!-- End of Change Password -->
  7068.         
  7069.     </TABLE>
  7070.     
  7071. <INPUT TYPE=HIDDEN NAME="page" VALUE="admin">
  7072. <INPUT TYPE=HIDDEN NAME="func" VALUE="access">
  7073. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  7074. <INPUT TYPE=HIDDEN NAME="selectdbname_" VALUE="$selectdbname_">
  7075.  
  7076. </FORM>
  7077.         </TD>
  7078.     </TR>
  7079.     <TR>
  7080.         <TD><HR SIZE=1></TD>
  7081.     </TR>
  7082.     <TR>
  7083.         <TD><FORM ACTION="$full_url" METHOD=POST><P><B>
  7084. CREATE</B> <INPUT TYPE=TEXT SIZE=3 MAXLENGTH=3 NAME="new_num" VALUE="$new_num" TITLE="Type number of new accounts to be created"><B> ACCOUNTS</B>$alt_hostname<BR>
  7085.  
  7086.  
  7087. $other_users
  7088. <INPUT TYPE=HIDDEN NAME="page" VALUE="admin">
  7089. <INPUT TYPE=HIDDEN NAME="func" VALUE="access">
  7090. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  7091. <INPUT TYPE=HIDDEN NAME="selectdbname_" VALUE="$selectdbname_">
  7092.  
  7093. </FORM>
  7094.         </TD>
  7095.     </TR>
  7096. </TABLE>
  7097. <!-- MAIN TABLE ENDS -->
  7098.  
  7099.  
  7100.  
  7101. EOT
  7102. ;
  7103. return
  7104.  
  7105.  
  7106. }
  7107. sub loadGrantTables {
  7108. # $_[0] contains $back
  7109.     my $back = {page => 'admin', func =>'access', dbname => "$database"};
  7110.     my @userlist = get_user_host();
  7111.     my $action = $q->param('action');
  7112.     my $num;
  7113.     my ($hidden_userlist, $hidden_password, $hidden_glob, $hidden_db, $hidden_table, $hidden_column);
  7114.     my @global = $q->param('global');
  7115.     my %global_lables = (
  7116.     'SELECT'                    =>'Select_priv',
  7117.     'INSERT'                    =>'Insert_priv',
  7118.     'UPDATE'                    =>'Update_priv',
  7119.     'DELETE'                    =>'Delete_priv',
  7120.     'CREATE'                    =>'Create_priv',
  7121.     'DROP'                        =>'Drop_priv',
  7122.     'RELOAD'                    =>'Reload_priv',
  7123.     'SHUTDOWN'                    =>'Shutdown_priv',
  7124.     'PROCESS'                    =>'Process_priv',
  7125.     'FILE'                        =>'File_priv',
  7126.     'GRANT'                        =>'Grant_priv',
  7127.     'REFERENCES'                =>'References_priv',
  7128.     'INDEX'                        =>'Index_priv',
  7129.     'ALTER'                        =>'Alter_priv',
  7130.     'CREATE TEMPORARY TABLES'    =>'Create_tmp_table_priv',
  7131.     'EXECUTE'                    =>'Execute_priv' ,
  7132.     'LOCK TABLES'                =>'Lock_tables_priv' ,
  7133.     'REPLICATION CLIENT'        =>'Repl_client_priv',
  7134.     'REPLICATION SLAVE'            =>'Repl_slave_priv',
  7135.     'SHOW DATABASES'            =>'Show_db_priv',
  7136.     'SUPER'                        =>'Super_priv'
  7137.     );
  7138.     my @database_values = (
  7139.     'SELECT', 'INSERT','UPDATE','DELETE','CREATE', 'DROP', 'REFERENCES', 'INDEX', 'ALTER'
  7140.     );
  7141.     
  7142.     my $table_values = [
  7143.     'SELECT', 'INSERT','UPDATE','DELETE','CREATE', 'DROP', 'REFERENCES', 'INDEX', 'ALTER', 'GRANT', ''
  7144.     ];
  7145.     my $column_values = ['SELECT', 'INSERT','UPDATE','REFERENCES'];
  7146.     my ($textsize, $textareasize) = $agent ? (12, 70) : (19, 100) ;
  7147.     my @password = $q->param('user_password') if ($action =~ /next/i or $action =~ /create/i);
  7148.     if($action =~ /next/i){
  7149.         $action = 'create';
  7150.         my $userlist_     = getuserlist();
  7151.         @userlist            = ();
  7152.         my @username        = $q->param('user_name');
  7153.         my @host;
  7154.         @host = $q->param('user_host');
  7155.         $num                 = scalar @username;
  7156.         my @username_        = @username;
  7157.         my @password_        = @password;
  7158.         my @host_            = @host;
  7159.         $back->{new_num}    = $q->param('new_num');
  7160.         $back->{user_name} = \@username_;
  7161.         $back->{user_host} = \@host_;
  7162.         $back->{user_password} = \@password_;
  7163.         # do revike
  7164.         #return
  7165.         for (my $i = 0; $i<$num; $i++){
  7166.             $password[$i]     =~ s/^\s*(\S*.*\S)\s*$/$1/;
  7167.             $password[$i]     = $dbh->quote($password[$i]) if ($password[$i] ne '');
  7168.             $host[$i]         =~ s/^\s*(\S*.*\S)\s*$/$1/;
  7169.             bail_out("Illegal host name '$host[$i]'", $back) if $host[$i] =~ /\s/;
  7170.             $host[$i]        = $dbh->quote($host[$i]);
  7171.             $username[$i]     =~ s/^\s*(\S*.*\S)\s*$/$1/;
  7172.             bail_out("Illegal user name '$username[$i]'", $back) if $username[$i] =~ /\s/;
  7173.             $username[$i]    = $dbh->quote($username[$i]);
  7174.             if (belongs \@userlist, "$username[$i]\@$host[$i]") {
  7175.                 bail_out("The entry $username[$i]\@$host[$i] is duplicated.\nCheck user/host names.", $back);
  7176.             }
  7177.             if (belongs $userlist_, "$username[$i]\@$host[$i]") {
  7178.                 bail_out("The entry $username[$i]\@$host[$i] already exists.\nCheck user/host names.", $back);
  7179.             }
  7180.             push @userlist,"$username[$i]\@$host[$i]";
  7181.         }
  7182.     }
  7183.     elsif ($action =~/(grant)|(create)|(revoke)/i){
  7184.         $num = scalar @userlist
  7185.     }
  7186.  
  7187.     my $back_; my @query; 
  7188.     my @x = $q->param();
  7189.     foreach (@x){
  7190.         my @y         = $q->param($_);
  7191.         $back_->{$_} = [@y];
  7192.     }
  7193.     undef  $back_->{'create'};
  7194.     $action                    = uc $action;
  7195.     my $s                     = 'S' if $num > 1;
  7196.     my $num_                = $num;
  7197.     $num_                     = '' if $num == 1;
  7198.     my $actionDescr         = ($action eq "CREATE") ? "CREATE $num_ NEW ACCOUNT$s" : "$action PRIVILEGES" ;
  7199.     my $count = 0;
  7200.     
  7201.     if ($q->param('create') and !$q->param('after_preview')){
  7202.         my $v4opt;
  7203.         {
  7204.             $v4opt = sub {
  7205.                 return {} if $count;
  7206.                 my $with = shift || "\n";
  7207.                 my $errmessage;
  7208.                 my $grant_opt;
  7209.                 my $queriesph = deletespace($q->param('queriesph'));
  7210.                 if ($queriesph ne ''){
  7211.                     if (($queriesph =~ /^\d+$/) or ($queriesph =~ /^\d*\.?\d+e?\d+$/i) or ($queriesph =~ /^\d+\.?\d*e?\d+$/i)){
  7212.                         $grant_opt    .= "$with  MAX_QUERIES_PER_HOUR $queriesph ";
  7213.                         $with        = '';
  7214.                     }
  7215.                     else{
  7216.                         $errmessage .= "Value MAX_QUIRIES_PER_HOUR must be Numeric\n"
  7217.                     }
  7218.                 }
  7219.                 my $updatesph        = deletespace($q->param('updatesph'));
  7220.                 if($updatesph ne ''){
  7221.                     if (($updatesph =~ /^\d+$/) or ($updatesph =~ /^\d*\.?\d+e?\d+$/i) or ($updatesph =~ /^\d+\.?\d*e?\d+$/i)){
  7222.                         $grant_opt    .= "$with MAX_UPDATES_PER_HOUR $updatesph ";
  7223.                         $with        = '';
  7224.                     }
  7225.                     elsif(!$errmessage){
  7226.                         $errmessage .= "Value MAX_UPDATES_PER_HOUR must be Numeric\n"
  7227.                     }
  7228.                 }
  7229.                 my $connectionsph    = deletespace($q->param('connectionsph'));
  7230.                 if ($connectionsph ne ''){
  7231.                     if (($connectionsph =~ /^\d+$/) or ($connectionsph =~ /^\d*\.?\d+e?\d+$/i) or ($connectionsph =~ /^\d+\.?\d*e?\d+$/i)){
  7232.                         $grant_opt    .= "$with MAX_CONNECTIONS_PER_HOUR $connectionsph ";
  7233.                     }
  7234.                     elsif(!$errmessage){
  7235.                         $errmessage .= "Value MAX_CONNECTIONS_PER_HOUR must be Numeric\n"
  7236.                     }
  7237.                 }
  7238.                 if ($errmessage){bail_out($errmessage, $back_)}
  7239.                 my $v4output;
  7240.                 $v4output->{max} = "$grant_opt";
  7241.                 
  7242.         
  7243.                 my $require;
  7244.                 if ($q->param('require')){
  7245.                     if ($q->param('require_opt') eq 'none'){$require = "\nREQUIRE NONE"}
  7246.                     if ($q->param('require_opt') eq 'ssl'){$require = "\nREQUIRE SSL"}
  7247.                     if ($q->param('require_opt') eq 'x509'){$require = "\nREQUIRE X509"}
  7248.                     if ($q->param('require_opt') eq 'other'){
  7249.                         my $req = "\nREQUIRE";
  7250.                         if (my $cipher    = deletespace($q->param('cipher'))){$require .= qq!$req CIPHER "$cipher"!; $req = "\n\t"}
  7251.                         if (my $issuer    = deletespace($q->param('issuer'))){$require .= qq!$req ISSUER "$issuer"!; $req = "\n\t"}
  7252.                         if (my $subject    = deletespace($q->param('subject'))){$require .= qq!$req SUBJECT "$subject"!}
  7253.                     }
  7254.                 }
  7255.                 $v4output->{req} = "$require";
  7256.                 return $v4output;
  7257.             };
  7258.         }
  7259.         my $ident;
  7260.         my $with = "\nWITH";
  7261.         my $global_priv    = $q->param('global_priv');
  7262.         my $db_priv        = $q->param('db_priv');
  7263.         my $table_priv    = $q->param('table_priv');
  7264.         my $column_priv    = $q->param('column_priv');
  7265.         if ($global_priv and ($global[0]  or !($db_priv or $table_priv or $column_priv))){
  7266.             my $priv_type;
  7267.             my $grant_opt;
  7268.             my @privileges        = @global;
  7269.             my @to                = @userlist;
  7270.             $ident                = 1;
  7271.             shift @privileges         if ($privileges[0]    eq '');
  7272.             my $t;
  7273.             until($privileges[-1]){pop @privileges; last unless @privileges}
  7274.             my $max = check_version('4.0.2') ? 20 : 13;
  7275.             if ($action =~ /revoke/i){
  7276.                 if  ($privileges[-1] eq 'GRANT'){
  7277.                     $privileges[-1] = 'GRANT OPTION';
  7278.                     $priv_type = join (', ', @privileges)
  7279.                 }
  7280.                 elsif (scalar @privileges == $max){$priv_type = ' ALL'}
  7281.                 elsif (scalar @privileges == 0) {$priv_type = ' USAGE'}
  7282.                 else {$priv_type = join (', ', @privileges)}
  7283.                 my $to = join ', ', @to;
  7284.                 push @query, "REVOKE $priv_type ON *.* FROM \n$to$grant_opt\n";
  7285.             }
  7286.             else {
  7287.                 if ($privileges[-1] eq 'GRANT'){
  7288.                     $grant_opt = "$with GRANT OPTION";
  7289.                     pop @privileges;
  7290.                     $with = '';
  7291.                 }
  7292.                 my $v4output = &$v4opt($with);
  7293.                 $count = 1;
  7294.                 $grant_opt .= $v4output->{max};
  7295.                 my $require = $v4output->{req};
  7296.                 if (scalar @privileges == $max){$priv_type = ' ALL'}
  7297.                 elsif (scalar @privileges == 0) {
  7298.                     $priv_type = ' USAGE'
  7299.                 }
  7300.                 else {$priv_type = join (', ', @privileges)}
  7301.                 for(my $i=0; $i < $num; $i++){
  7302.                     $to[$i]    .= " IDENTIFIED BY $password[$i]" if $password[$i];
  7303.                 }
  7304.                 my $to = join ', ', @to;
  7305.                 push @query, "GRANT $priv_type \nON *.* TO $to $require$grant_opt\n";
  7306.             }
  7307.         }
  7308.         if ($db_priv){
  7309.             my @query3                 = (); #
  7310.             my $priv_type;
  7311.             my $grant_opt;
  7312.             my @db                    = $q->param('d_db');
  7313.             shift @db unless $db[0];
  7314.             my @other_db            = split ',', $q->param('d1_db');
  7315.             my @db3;
  7316.             my $i;
  7317.             foreach(@other_db){
  7318.                 my $db = $_;
  7319.                 $db = deletespace($db);
  7320.                 next if ($db eq '');
  7321.                 next if belongsb (\@db, $db);
  7322.                 my $chars;
  7323.                 while($db =~ /(?=(\W)(.?))/g){
  7324.                     if ($1 eq "\\"){
  7325.                         $chars .= $1 unless ($2 eq '_')
  7326.                     }
  7327.                     elsif(($1 ne '?') and ($1 ne '%')){
  7328.                         if ($1 eq ' '){$chars .= 'SPACE '}    
  7329.                         elsif ($1 eq "\t"){$chars .= 'TAB '}
  7330.                         else {$chars .= $1}
  7331.                     }
  7332.                 }
  7333.                         bail_out("Illegal characters $chars in database name '$db'.\n", $back_) if $chars;
  7334.                 
  7335.                 my $db_temp = $db;
  7336.                 $db_temp =~ s/\?//ig;
  7337.                 if ($db =~ /^[a-zA-Z0-9_\$]*$/){push @db, $db}            # legal db names
  7338.                 elsif ($db !~ /\?/){push @db, "`$db`"}                     # db names with non-alphanumeric chars but the `?'
  7339.                 elsif ($db_temp =~ /^[a-zA-Z0-9_\$]*$/){push @db3,$db}  # legal db names with `?' variable
  7340.                 else {push @db3, "`$db`"}                                 # names with non-alphanumeric chars and `?'
  7341.             }
  7342.             bail_out("Database privileges failed.\nNo database was selected.\n\n", $back_) unless (@db or @db3);
  7343.             my @privileges            = $q->param('database');
  7344.             shift @privileges         if ($privileges[0]    eq '');        
  7345.             until($privileges[-1]){pop @privileges; last unless @privileges}
  7346.             my ($priv_cols, @priv_cols);
  7347.             foreach (@privileges){
  7348.                 $priv_cols .= ", $global_lables{$_}";
  7349.                 push @priv_cols, $global_lables{$_};
  7350.             }
  7351.                     
  7352.             my (@query2, $j, @values1, @set, $set);
  7353.             my $max = check_version("4.0.4") ? 11 : 9;
  7354.             if ($action =~ /revoke/i){
  7355.                 my @privileges_ = @privileges;
  7356.                 if  ($privileges[-1] eq 'GRANT'){
  7357.                     $privileges[-1] = 'GRANT OPTION';
  7358.                     $priv_type = join (', ', @privileges)
  7359.                 }
  7360.                 elsif (scalar @privileges == $max){$priv_type = ' ALL'}
  7361.                 elsif (scalar @privileges == 0) {$priv_type = ' USAGE'}
  7362.                 else {$priv_type = join (', ', @privileges)}
  7363.                 my @query1; my @where_delete; my @where_update;
  7364.                 my @to         = @userlist;
  7365.                 my @to1        = @to;
  7366.                 for(my $i=0; $i < $num; $i++){
  7367.                     
  7368.                     if (@db3) {
  7369.                         $userlist[$i]        =~ /^'(.*)'\@'(.*)'/;
  7370.                         my $username         = $1;
  7371.                         my $hostname        = $2;
  7372.                         foreach (@db3){
  7373.                             my $db3 = $_;
  7374.                             $db3    =~ s/\?/$username/gi;
  7375.                             unless (belongs(\@db, $db3)){
  7376.                                 push @query3, "REVOKE $priv_type \n ON $db3\.* \n FROM '$username'\@'$hostname'\n";
  7377.                             }
  7378.                         }
  7379.                 
  7380.                     }#if (@db2)
  7381.                 }#for(my $i=0; $i < $num; $i++)
  7382.                 my $to = join ', ',@to;
  7383.                 my $to1 = join ', ',@to1;
  7384.                 if ($db[0]){
  7385.                     push @query, "REVOKE $priv_type \n ON $db[0]\.* \n FROM $to\n";
  7386.                     shift @db;
  7387.                 }
  7388.                 foreach (@db){
  7389.                     push @query, "REVOKE $priv_type \n ON $_\.*  \n FROM $to1\n";
  7390.  
  7391.                 }
  7392.             }
  7393.             else{#create, grant
  7394.                 if  ($privileges[-1] eq 'GRANT'){
  7395.                     $grant_opt        = " \nWITH GRANT OPTION";
  7396.                     pop @privileges;
  7397.                     $with = '';
  7398.                 }
  7399.                 if (scalar @privileges == $max){$priv_type = ' ALL'}
  7400.                 elsif (scalar @privileges == 0) {$priv_type = ' USAGE'}
  7401.                 else {$priv_type = join (', ', @privileges)}
  7402.                 my @query1;
  7403.                 my @to         = @userlist;
  7404.                 my @to1        = @to;
  7405.                 my @where_update;
  7406.                 for(my $i=0; $i < $num; $i++){
  7407.                     if (@db){
  7408.                         $to[$i]    .= " IDENTIFIED BY $password[$i]" if (($password[$i] ne '') and !$ident);
  7409.                     }
  7410.                     if (@db3) {
  7411.                         $userlist[$i]        =~ /^'(.*)'\@'(.*)'/;
  7412.                         my $username         = $1;
  7413.                         my $hostname        = $2;
  7414.                         my $count_            = $count;
  7415.                         if ($action =~ /create/i){
  7416.                             my $ident_ = $ident;
  7417.                             foreach (@db3){
  7418.                                 my $grant;
  7419.                                 unless(@db or $count_){
  7420.                                     my $v4output = &$v4opt($with);
  7421.                                     my $max = $v4output->{max};
  7422.                                     $count_ = 1;
  7423.                                     my $require = $v4output->{req};
  7424.                                     $grant = "$require$grant_opt$max";
  7425.                                 }
  7426.                                 my $db3 = $_;
  7427.                                 $db3    =~ s/\?/$username/ig;
  7428.                                 unless (belongs(\@db, $db3)){
  7429.                                     my $pw = "IDENTIFIED BY $password[$i]" unless ($ident_ or @db);
  7430.                                     push @query3, "GRANT $priv_type \nON $db3.* \nTO '$username'\@'$hostname' $pw $grant\n";
  7431.                                 }
  7432.                                 $ident_ = 1;
  7433.                             }
  7434.                         }
  7435.                         else { #GRANT
  7436.                             foreach (@db3){
  7437.                                 my $grant;
  7438.                                 unless(@db or $count_){
  7439.                                     my $v4output = &$v4opt($with);
  7440.                                     my $max = $v4output->{max};
  7441.                                     $count_ = 1;
  7442.                                     my $require = $v4output->{req};
  7443.                                     $grant = "$require$grant_opt$max";
  7444.                                 }
  7445.                                 my $v4output = &$v4opt($with);
  7446.                                 my $max = $v4output->{max};
  7447.                                 my $require = $v4output->{req};
  7448.                                 my $db3 = $_;
  7449.                                 $db3    =~ s/\?/$username/gi;
  7450.                                 unless (belongs(\@db, $db3)){
  7451.                                     push @query3, "GRANT $priv_type \nON $db3.* \nTO '$username'\@'$hostname' $grant\n";
  7452.                                 }
  7453.                             }
  7454.                         }#else
  7455.                     }#if (@db3)
  7456.                 }#for(my $i=0; $i < $num; $i++)
  7457.                 my $to = join ', ',@to;
  7458.                 my $to1 = join ', ',@to1;
  7459.  
  7460.                 for (my $i=0; $i<@db; $i++){
  7461.                     my $v4output = &$v4opt($with) unless $count;
  7462.                     $count = 1;
  7463.                     my $max = $v4output->{max};
  7464.                     my $require = $v4output->{req};
  7465.                     unless ($i) {push @query,    "GRANT $priv_type \nON $db[0]\.* \nTO $to $require$grant_opt$max\n"}
  7466.                     else {push @query,             "GRANT $priv_type \nON $db[$i]\.* \nTO $to1 $require$grant_opt$max\n"}
  7467.                 }
  7468.             }# create, grant
  7469.  
  7470.             push @query, @query3;
  7471.             
  7472.             $ident = 1;
  7473.         }
  7474.  
  7475.         if ($table_priv){
  7476.             my ($db, @tb);
  7477.             $db               = $q->param('t_db');
  7478.             @tb                  = $q->param('t_table');
  7479.             shift @tb unless $tb[0];
  7480.             $db = deletespace($db);
  7481.             bail_out("Table privileges failed.\nDatabase was not selected.\n\n", $back_) if ($db eq '');
  7482.             
  7483.             my @privileges        = $q->param('table_t');
  7484.             my $grant_opt        = '';
  7485.             my $priv_type        = '';
  7486.             shift @privileges         if ($privileges[0]    eq '');
  7487.             until($privileges[-1]){pop @privileges; last unless @privileges}
  7488.                my $ok = 0;
  7489.             if ($action =~ /revoke/i){
  7490.                 if  ($privileges[-1] eq 'GRANT'){
  7491.                     $privileges[-1] = 'GRANT OPTION';
  7492.                     $priv_type = join (', ', @privileges)
  7493.                 }
  7494.                 elsif (scalar @privileges == 9){$priv_type = ' ALL'}
  7495.                 elsif (scalar @privileges == 0) {$priv_type = ' USAGE'}
  7496.                 else {$priv_type = join (', ', @privileges)}
  7497.  
  7498.                 my @to = @userlist;
  7499.                 my @to1 = @to;
  7500.                 my $to = join ', ',@to;
  7501.                 my $to1 = join ', ',@to1;
  7502.                 if ($tb[0]){
  7503.                     $tb[0] =~ s/^\s*(.*)\s*$/$1/; 
  7504.                     $ok =1;
  7505.                     push @query, "REVOKE $priv_type \nON $db.$tb[0] FROM $to\n";
  7506.                     shift @tb
  7507.                 }
  7508.                 foreach (@tb){
  7509.                     s/^\s*(.*)\s*$/$1/;
  7510.                     next unless $_;
  7511.                     $ok =1;
  7512.                     push @query, "REVOKE $priv_type \nON $db.$_ FROM $to1\n "
  7513.                 }
  7514.             }
  7515.             else{
  7516.                 if ($privileges[-1] eq 'GRANT') {
  7517.                     $grant_opt = " \nWITH GRANT OPTION";
  7518.                     pop @privileges;
  7519.                     $with = '';
  7520.                 }
  7521.                 if (scalar @privileges == 9){$priv_type = ' ALL'}
  7522.                 elsif (scalar @privileges == 0) {$priv_type = ' USAGE'}
  7523.                 else {$priv_type = join (', ', @privileges)}
  7524.                 
  7525.                 my @to = @userlist;
  7526.                 my @to1 = @to;
  7527.                 for (my $i=0; $i<$num; $i++){
  7528.                     
  7529.                     if ($password[$i] and !$ident){$to[$i] .= " IDENTIFIED BY $password[$i]"} 
  7530.                 }
  7531.                 my $to = join ', ',@to;
  7532.                 my $to1 = join ', ',@to1;
  7533.                 
  7534.                 if ($tb[0]){
  7535.                     $tb[0] =~ s/^\s*(.*)\s*$/$1/; 
  7536.                     $ok =1;
  7537.                     my $v4output = &$v4opt($with) unless $count;
  7538.                     $count = 1;
  7539.                     my $max = $v4output->{max};
  7540.                     my $require = $v4output->{req};
  7541.                     push @query, "GRANT $priv_type \nON $db.$tb[0] \nTO $to $require$grant_opt$max\n";
  7542.                     shift @tb
  7543.                 }
  7544.                 foreach (@tb){
  7545.                     s/^\s*(.*)\s*$/$1/;
  7546.                     next unless $_;
  7547.                     $ok =1;
  7548.                     push @query, "GRANT $priv_type \nON $db.$_ \nTO $to1 $grant_opt\n "
  7549.                 }
  7550.             }            
  7551.             bail_out("Table privileges failed.\nTable was not selected.\n\n", $back_) unless $ok;
  7552.             $ident = 1;
  7553.         }
  7554.         if ($column_priv){
  7555.             my ($db, $tb, @col, $col);
  7556.             $db             = $q->param('c_db');
  7557.             $tb                = $q->param('c_table');
  7558.             @col            = $q->param('c_column');
  7559.             $db =~ s/^\s*(.*)\s*$/$1/;
  7560.             bail_out("Column privileges failed.\nDatabase was not selected.\n\n", $back_) if ($db eq '');
  7561.             $tb =~ s/^\s*(.*)\s*$/$1/;
  7562.             bail_out("Column privileges failed.\nTable was not selected.\n\n", $back_) if ($tb eq '');
  7563.             my @privileges        = $q->param('column');
  7564.             my $priv_type        = '';
  7565.             shift @privileges         if ($privileges[0]    eq '');
  7566.             until($privileges[-1]){pop @privileges; last unless @privileges}
  7567.             if (scalar @privileges == 0) {bail_out("Error. Column privileges are not selected", $back_)}
  7568.             else {$priv_type = join (', ', @privileges)}
  7569.             my @to = @userlist;
  7570.             for (my $i=0; $i<$num; $i++){
  7571.                 $to[$i] .= " IDENTIFIED BY $password[$i]" if ($password[$i] and !$ident)
  7572.             }
  7573.             my $to = join ', ',@to;
  7574.             my @col_ = ();
  7575.             foreach (@col){
  7576.                 s/^\s*(.*)\s*$/$1/;
  7577.                 next unless $_;
  7578.                 push @col_,$_
  7579.             }
  7580.             bail_out("Column privileges failed.\nColumn was not selected.\n\n", $back_) unless @col_;
  7581.             $col = join ', ',@col_;
  7582.             if ($action =~ /revoke/i){push @query, "REVOKE $priv_type ($col) \nON $db.$tb FROM $to\n "}
  7583.             else {
  7584.  
  7585.                 my $v4output = &$v4opt($with) unless $count;
  7586.                 $count = 1;
  7587.                 my $max = $v4output->{max};
  7588.                 my $require = $v4output->{req};
  7589.                 push @query, "GRANT $priv_type ($col) ON $db.$tb \nTO $to $require$max\n "
  7590.             }
  7591.             $ident = 1;
  7592.         }
  7593.     }
  7594.     print <<EOT
  7595. <TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0 WIDTH=650>
  7596.         <TR><FORM ACTION="$full_url" METHOD=POST>
  7597.             <TH ALIGN=LEFT WIDTH=550>
  7598.             ADMINISTRATION -> ACCESS CONTROL -> $actionDescr </TH>
  7599.             <TH WIDTH=100 ALIGN=RIGHT VALIGN=CENTER>
  7600.             <INPUT TYPE=SUBMIT VALUE="Cancel">
  7601.             <INPUT TYPE=HIDDEN NAME="page" VALUE="admin">
  7602.             <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  7603.             <INPUT TYPE=HIDDEN NAME="func" VALUE="access">
  7604.             </TH></FORM>
  7605.         </TR>
  7606. </TABLE>
  7607. EOT
  7608. ;
  7609.     if ($q->param('create')){
  7610.     
  7611.         if ($q->param('preview')){
  7612.             undef $back_->{'preview'};
  7613.             $back_->{'after_preview'} = '1';
  7614.             print qq!\n<FORM ACTION="$full_url" METHOD=POST>!;
  7615.             print qq!<P><TABLE><TR><TD></TD><TD>The following queries were generated:!;
  7616.             print qq!\n<B><INPUT TYPE=SUBMIT NAME="create" VALUE="Confirm" style="font-weight: bold" TITLE="Proceed with selected options"></B>\n!;
  7617.             print qq!\n<INPUT TYPE=SUBMIT VALUE="Back" TITLE="Back to edit privileges"></TD></TR>\n!;
  7618.             
  7619.             @query = quoteit(@query);
  7620.             my $i = 1;
  7621.             foreach (@query){
  7622.                 $_ = deletespace($_);
  7623.                 next unless ($_);
  7624.                 my $count;
  7625.                 while(/\n/g){$count++; last if $count > 8}
  7626.                 my $rows = $count+1;
  7627.                 if ($rows < 2){$rows = 2}
  7628.                 print qq!\t<TR><TD>$i</TD><TD><TEXTAREA NAME="query" COLS=$textareasize ROWS=$rows  WRAP=OFF>$_</TEXTAREA></TD></TR>\n!;
  7629.                 $i++;
  7630.             }
  7631.             print "</TABLE>\n";
  7632.             foreach (keys %$back_){
  7633.                     print $q->hidden(-name=>$_, -value=>$back_->{$_}, -override=>1),"\n";
  7634.             }
  7635.  
  7636.             print qq!\n</FORM>!;
  7637.             return
  7638.  
  7639.         }
  7640.         else {
  7641.             if ($q->param('after_preview')){@query = $q->param('query')}
  7642.             my $i=0;
  7643.             
  7644.             print "<P>";
  7645.             my $message;
  7646.             #$dbh->{AutoCommit} = 0;
  7647.             foreach(@query){
  7648.                 next unless $_;
  7649.                 $i++;
  7650.                 my $query = quoteit $_;
  7651.                 $query =~ s/$/<BR>/mg;
  7652.                 print"$i) $query<BR>";
  7653.                 next if  /^\/\*\s*error/i;
  7654.                 my $message_ = '';
  7655.                 my $res = $dbh->do($_);
  7656.                 if ($dbh->err()){
  7657.                     $message_        = quoteit($DBI::errstr);
  7658.                     $message_        =~ s/^/<BR>/mg;
  7659.                     $message_        = "Error  $DBI::err (<B>$message_ </B>)\n\n" ;
  7660.                 }
  7661.                 elsif (/^\s*((INSERT)|(DELETE)|(UPDATE))\s/i and ($res == 0)){
  7662.                     $message_ = "<B>The result of this query is zero. Probably the privileges have been set/revoked before.</B>\n\n";
  7663.                 }
  7664.                 print "<P>$message_<BR>\n" if $message_;
  7665.                 print "_" x 30, "<P>\n";
  7666.                 $message .= $message_
  7667.             }
  7668.             #$dbh->commit() or bail_out("", $back_);
  7669.             #$dbh->{AutoCommit} = 1;
  7670.             print "<B>Result: OK</B>\n\n" unless $message;
  7671.             print qq!\n<FORM ACTION="$full_url" METHOD=POST>!;
  7672.             print qq!\n<INPUT TYPE=SUBMIT VALUE="Back" TITLE="Back to privileges"></TD></TR>\n!;
  7673.             foreach (keys %$back_){
  7674.                     print $q->hidden(-name=>$_, -value=>$back_->{$_}, -override=>1),"\n";
  7675.             }
  7676.  
  7677.             print qq!\n</FORM>!;
  7678.             return
  7679.         }
  7680.     }
  7681.         
  7682.  
  7683.     @password = quoteit(@password);
  7684.     foreach (@password){
  7685.         $hidden_password .= "\t<INPUT TYPE=HIDDEN NAME=\"user_password\" VALUE=\"$_\">\n";
  7686.     }
  7687.     bail_out("User(s) not defined", $back) unless (@userlist);
  7688.  
  7689.     @userlist = quoteit(@userlist);
  7690.     foreach (@userlist){
  7691.         $hidden_userlist .= "\t<INPUT TYPE=HIDDEN NAME=\"userlist\" VALUE=\"$_\">\n";
  7692.     }
  7693.     my $globs    = 1 if (($q->param('global_priv') or $q->param('global_priv_on')) and !$q->param('global_priv_off'));
  7694.     my $dbs          = 1 if (($q->param('db_priv') or $q->param('db_priv_on')) and !$q->param('db_priv_off'));
  7695.     my $tables    = 1 if (($q->param('table_priv') or $q->param('table_priv_on')) and !$q->param('table_priv_off'));
  7696.     my $columns    = 1 if (($q->param('column_priv') or $q->param('column_priv_on')) and !$q->param('column_priv_off'));
  7697.     if ($globs) {$hidden_glob = qq!<INPUT TYPE=HIDDEN NAME="global_priv" VALUE="on">!}
  7698.     if ($dbs) {$hidden_db = qq!<INPUT TYPE=HIDDEN NAME="db_priv" VALUE="on">!}
  7699.     if ($tables) {$hidden_table = qq!<INPUT TYPE=HIDDEN NAME="table_priv" VALUE="on">!}
  7700.     if ($columns) {$hidden_column = qq!<INPUT TYPE=HIDDEN NAME="column_priv" VALUE="on">!}
  7701.  
  7702.     my $d_db            = $q->param('d_db');
  7703.     my $t_db            = $q->param('t_db');
  7704.     my $c_db            = $q->param('c_db');
  7705.     my $dblistref         = getdblist($dbh);
  7706.     my @dblist;
  7707.     my ($d_dblist, $t_dblist, $c_dblist);
  7708.     if ($DBI::err and !$database) {
  7709.         $d_dblist    = $q->scrolling_list(
  7710.                                         -name        => 'd_db',
  7711.                                         -values        => [''],
  7712.                                         -labels        => {'' => 'ACCESS DENIED'},
  7713.                                         -size        => 4,
  7714.                                         -multiple    =>1                                        
  7715.                     );
  7716.         $t_dblist    = $q->scrolling_list(
  7717.                                         -name        => 't_db',
  7718.                                         -values        => [''],
  7719.                                         -labels        => {'' => 'ACCESS DENIED'},
  7720.                                         -size        => 1,
  7721.                     );
  7722.         $c_dblist    = $q->scrolling_list(
  7723.                                         -name        => 'c_db',
  7724.                                         -values        => [''],
  7725.                                         -labels        => {'' => 'ACCESS DENIED'},
  7726.                                         -size        => 1,
  7727.                     );    
  7728.     }
  7729.     else {
  7730.         @dblist        = @$dblistref;
  7731.         unshift        @dblist, '';
  7732.         $d_dblist    = $q->scrolling_list(
  7733.                                         -name        => 'd_db',
  7734.                                         -values        => \@dblist,
  7735.                                         -size        => 6,
  7736.                                         -multiple    =>1                                        
  7737.                     );
  7738.         $t_dblist    = $q->scrolling_list(
  7739.                                         -name        => 't_db',
  7740.                                         -values        => \@dblist,
  7741.                                         -size        => 1,
  7742.                                         -default    => '',
  7743.                                         -onChange    => 'this.form.submit()'
  7744.                     );
  7745.         $c_dblist    = $q->scrolling_list(
  7746.                                         -name        => 'c_db',
  7747.                                         -values        => \@dblist,
  7748.                                         -size        => 1,
  7749.                                         -default    => '',
  7750.                                         -onChange    => 'this.form.submit()'
  7751.                     );
  7752.         }
  7753.     my $t_table        = $q->param('t_table');
  7754.     my $c_table        = $q->param('c_table');
  7755.     my $t_tablelist;
  7756.     my $c_tablelist;
  7757.     my $T_Table;
  7758.     my $database_checkbox;
  7759.     my $d1_db;
  7760.     my ($C_Other_Db, $C_Other_Table, $C_Other_Column);
  7761.     if ($t_db){
  7762.         $back_->{t_db} = '';
  7763.         my @t_tablelist;
  7764.         my $sth = $dbh->prepare("SHOW TABLES FROM $t_db") || bail_out("Cannot prepare query\nSHOW TABLES FROM $t_db");
  7765.         my $res = $sth->execute();
  7766.         if ($DBI::err){
  7767.             if ($DBI::errstr =~ /(access)|(denied)/i){
  7768.                 $t_tablelist = <<EOT
  7769. <SELECT NAME="t_table">
  7770. <OPTION VALUE="">ACCESS DENIED
  7771. </SELECT>
  7772. EOT
  7773. ;
  7774.             }
  7775.             else {bail_out("Cannot execute query:\nSHOW TABLES FROM $t_db", $back_)}
  7776.         }
  7777.         else{
  7778.             my $i = 0;
  7779.             while(my ($tab) = $sth->fetchrow_array){
  7780.                 push @t_tablelist, $tab;
  7781.                 if ($i++ > 100){bail_out("", $$back_)}
  7782.             }
  7783.             $back_->{t_db} = $t_db;
  7784.             my $size        = scalar @t_tablelist;
  7785.             unshift         @t_tablelist, '';
  7786.             if ($size == 0){
  7787.                 $t_tablelist = $q->scrolling_list(
  7788.                                                  -name        => 't_table',
  7789.                                         -value        => '',
  7790.                                         -labels        => {'' => "Table list is empty\n"},
  7791.                                         -size        => 1
  7792.                             ) ;
  7793.             }
  7794.             else {
  7795.                 if ($size > 7) {$size    = 8} else {$size = $size + 1} ;
  7796.                 $t_tablelist = $q->scrolling_list(
  7797.                                         -name        => 't_table',
  7798.                                         -values        => \@t_tablelist,
  7799.                                         -size        => $size,
  7800.                                         -multiple    => 1
  7801.                             );
  7802.             }
  7803.         }
  7804.         $T_Table    =<<EOT
  7805.                 <TR>
  7806.                     <TD TITLE="Select one or more tables"><B>Table</B></TD>
  7807.                     <TD TITLE="Select one or more tables" ALIGN=RIGHT>$t_tablelist</TD>
  7808.                 </TR>
  7809. EOT
  7810. ;
  7811.     }
  7812.     else {
  7813.         $t_tablelist = $q->scrolling_list(
  7814.                                     -name   => 't_table',
  7815.                                     -value  => '',
  7816.                                     -labels  => {'' => "DB is not selected\n"},
  7817.                                     -size    => 1
  7818.                     );
  7819.         $T_Table    =<<EOT
  7820.                 <TR>
  7821.                     <TD TITLE="Select a database in the scrolling list above"><B>Table</B></TD>
  7822.                     <TD TITLE="Select a database in the scrolling list above" ALIGN=RIGHT>$t_tablelist</TD>
  7823.                 </TR>
  7824. EOT
  7825. ;
  7826.     }
  7827.     my @c_tablelist; 
  7828.     my $C_Table;
  7829.     my $columnlist;
  7830.     my $column        = $q->param('column');
  7831.     unless ($q->param('column_priv_off')){
  7832.         if ($c_db){
  7833.             $back_->{c_db} = '';
  7834.             @c_tablelist = @{getTablelist($c_db, $back_)};
  7835.             $back_->{c_db} = $c_db;
  7836.             unshift         @c_tablelist, '';
  7837.             if (@c_tablelist == 1){
  7838.                 $c_tablelist = $q->scrolling_list(
  7839.                                                  -name        => 'c_table',
  7840.                                         -value        => '',
  7841.                                         -labels        => {'' => "Table list is empty\n"},
  7842.                                         -size        => 1
  7843.                             );
  7844.             }
  7845.             else {
  7846.                 $c_tablelist = $q->scrolling_list(
  7847.                                         -name        => 'c_table',
  7848.                                         -values        => \@c_tablelist,
  7849.                                         -size        => 1,
  7850.                                         -onChange    => 'this.form.submit()'
  7851.                             );
  7852.             }
  7853.             $C_Table = <<EOT
  7854.                 <TR>
  7855.                     <TD TITLE="Select table"><B>Table</B></TD>
  7856.                     <TD ALIGN=RIGHT TITLE="Select table">$c_tablelist</TD>
  7857.                 </TR>
  7858. EOT
  7859. ;
  7860.         }
  7861.         else{
  7862.             $c_tablelist = $q->scrolling_list(
  7863.                                     -name        => 'c_table',
  7864.                                     -value        => '',
  7865.                                     -labels        => {'' => "DB is not selected\n"},
  7866.                                     -size        => 1
  7867.                     );
  7868.             $C_Table = <<EOT
  7869.                 <TR>
  7870.                     <TD TITLE="Select a database in the scrolling list above"><B>Table</B></TD>
  7871.                     <TD ALIGN=RIGHT TITLE="Select a database in the scrolling list above">$c_tablelist</TD>
  7872.                 </TR>
  7873. EOT
  7874. ;
  7875.  
  7876.         }    
  7877.     
  7878.             my $title;
  7879.             if ($c_table and belongs(\@c_tablelist, $c_table)) {
  7880.                 my @columnlist = ();
  7881.                 my $size;
  7882.                 my $multiple = 0;
  7883.                 #$back_->{column_priv_off} = 1;
  7884.                 $back_->{c_table} = '';
  7885.                 my $sth        = $dbh->prepare("DESCRIBE $c_db.$c_table") || bail_out ("Cannot prepare query:\n$query", $back_);
  7886.                 my $res        = $sth->execute();
  7887.                 if ($DBI::err){
  7888.                     if ($DBI::errstr =~ /(denied)|(access)/i){
  7889.                         @columnlist = ('ACCESS DENIED');
  7890.                         $size = 1;
  7891.                         $multiple = 0;
  7892.                     }
  7893.                     else {bail_out("Cannot execute query:\n$query", $back_)}
  7894.                 }
  7895.                 else {
  7896.                     while (my @row = $sth->fetchrow_array){
  7897.                         push @columnlist, $row[0];
  7898.                     }
  7899.                     unshift @columnlist,'';
  7900.                     $size = scalar @columnlist;
  7901.                     if ($size > 7) {$size    = 8};
  7902.                     $multiple = 1
  7903.                 }
  7904.                 $sth->finish;
  7905.                 $columnlist = $q->scrolling_list(
  7906.                                     -name        => 'c_column',
  7907.                                     -values        => \@columnlist,
  7908.                                     -size        => $size,
  7909.                                     -multiple    => $multiple
  7910.                             );
  7911.                 $title = "Select one or more columns."
  7912.             }
  7913.             else {
  7914.                 $columnlist = $q->scrolling_list(
  7915.                                     -name        => 'c_column',
  7916.                                     -value        => '',
  7917.                                     -labels        => {'' => "Table is not selected\n"},
  7918.                                     -size        => 1
  7919.                         );
  7920.                 $title = 'Select a table in the scrolling list above';
  7921.             }
  7922.             $columnlist = <<EOT
  7923.                 <TR>
  7924.                     <TD TITLE="$title"><B>Column</B></TD>
  7925.                     <TD ALIGN=RIGHT TITLE="$title">$columnlist</TD>
  7926.                 </TR>
  7927. EOT
  7928. ;
  7929.         
  7930.     }
  7931.     my $global_priv     = $globs    ? 'global_priv_off' : 'global_priv_on';
  7932.     my $db_priv            = $dbs        ? 'db_priv_off'         : 'db_priv_on';
  7933.     my $table_priv        = $tables    ? 'table_priv_off'    : 'table_priv_on';
  7934.     my $column_priv        = $columns    ? 'column_priv_off'    : 'column_priv_on';
  7935.  
  7936.     my $v402 = sub {
  7937.         return '' if $action =~ /REVOKE/i;
  7938.         my $color            = "#000000";
  7939.         my $color_max        = "#000000";
  7940.         my $disabled        = '';
  7941.         my $disabled_max     = '';
  7942.         my $title_req;
  7943.         my $title1;
  7944.         my $title_maxq;
  7945.         my $title_maxu;
  7946.         my $title_maxc;
  7947.         my $queriesph;
  7948.         my $updatesph;
  7949.         my $connectionsph;
  7950.         my $cipher;
  7951.         my $issuer;
  7952.         my $subject;
  7953.         my $requirecheck;
  7954.         my @require_opt_check;
  7955.         if (check_version("4.0.2")){
  7956.             $title_maxq     = qq!TITLE="Parameter MAX_QUERIES_PER_HOUR. Numeric value"!;
  7957.             $title_maxu     = qq!TITLE="Parameter MAX_UPDATES_PER_HOUR. Numeric value"!;
  7958.             $title_maxc     = qq!TITLE="Parameter MAX_CONNECTIONS_PER_HOUR. Numeric value "!;
  7959.             $queriesph        = quoteit($q->param('queriesph'));
  7960.             $updatesph        = quoteit($q->param('updatesph'));
  7961.             $connectionsph    = quoteit($q->param('connectionsph'));
  7962.         }
  7963.         else{
  7964.             $color_max        = "#999999";
  7965.             $queriesph        = $updatesph = $connectionsph = "N/A";
  7966.             $disabled_max    = 'DISABLED';
  7967.             $title_maxq = $title_maxu = $title_maxc = qq!TITLE="These options require MySQL server version 4.0.2 or higher"!;
  7968.         }
  7969.         if(check_version("4.0.4")){
  7970.             $title_req                = qq!TITLE="Check this to use the options below"!;
  7971.             $cipher                    = quoteit($q->param('cipher'));
  7972.             $issuer                    = quoteit($q->param('issuer'));
  7973.             $subject                = quoteit($q->param('subject'));
  7974.             $requirecheck            = "CHECKED" if $q->param('require');
  7975.             $require_opt_check[0]     = "CHECKED" if ($q->param('require_opt') eq 'none');
  7976.             $require_opt_check[1]     = "CHECKED" if ($q->param('require_opt') eq 'ssl');
  7977.             $require_opt_check[2]     = "CHECKED" if ($q->param('require_opt') eq 'x509');
  7978.             $require_opt_check[3]     = "CHECKED" if ($q->param('require_opt') eq 'other');
  7979.         }
  7980.         else{
  7981.             $title_req        = $title1 = qq!TITLE="These options require MySQL server version 4.0.4 or higher"!;
  7982.             $color            = "#999999";
  7983.             $requirecheck    = $disabled = 'DISABLED';
  7984.             $cipher         = $issuer = $subject = "N/A";
  7985.             for(my $i = 0; $i < 4; $i++){$require_opt_check[$i] = 'DISABLED'}
  7986.         }
  7987.         my $h1    = $agent ? 140    : 105;
  7988.         my $r1    = $agent ? 1    : 2;
  7989.         my $c1    = $agent ? 10    : 16;
  7990.         my $s1    = $agent ? 3    : 4;
  7991.         
  7992.             return qq!
  7993. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=2 WIDTH="100" style="color: $color; font-weight: bold">
  7994.     <TR>
  7995.         <TD COLSPAN=4 HEIGHT=5></TD>
  7996.     </TR>
  7997.     <TR>
  7998.         <TD BGCOLOR="#AAAAAA">
  7999.     <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20>
  8000. <INPUT TYPE=CHECKBOX NAME="require" $requirecheck $title_req>
  8001.     </TD></TR></TABLE>
  8002.         </TD>
  8003.         <TD COLSPAN=3 BGCOLOR="#AAAAAA" $title_req>
  8004.     <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 BGCOLOR="#CCCCCC" WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20><P style="color: $color; font-weight: bold" >REQUIRE:</p></TD></TR></TABLE>
  8005.     </TD>
  8006.     </TR>
  8007.     <TR>
  8008.         <TD BGCOLOR="#AAAAAA">
  8009.         
  8010. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20>        
  8011.         <INPUT NAME="require_opt" TYPE=RADIO VALUE="none" $require_opt_check[0] $title1>
  8012. </TD></TR></TABLE>
  8013.         
  8014.         </TD><TD COLSPAN=3 BGCOLOR="#AAAAAA">
  8015. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20 $title1><P style="color: $color">
  8016.         NONE
  8017. </TD></TR></TABLE>
  8018.         </TD>
  8019.     </TR>
  8020.     <TR>
  8021.         <TD WIDTH="10%" BGCOLOR="#AAAAAA">
  8022. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20>        
  8023.         <INPUT NAME="require_opt" TYPE=RADIO VALUE="ssl" $require_opt_check[1] $title1>
  8024. </TD></TR></TABLE>
  8025.         </TD>
  8026.         <TD WIDTH="40%" BGCOLOR="#AAAAAA">
  8027. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20 $title1><P style="color: $color">
  8028.         SSL
  8029. </TD></TR></TABLE>
  8030.         </TD>
  8031.         <TD WIDTH="10%" BGCOLOR="#AAAAAA">
  8032. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20>        
  8033.         <INPUT NAME="require_opt" TYPE=RADIO VALUE="x509" $require_opt_check[2] $title1>
  8034. </TD></TR></TABLE>
  8035.         </TD>
  8036.         <TD WIDTH="40%" BGCOLOR="#AAAAAA">
  8037. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=20 $title1><P style="color: $color">
  8038.         X509
  8039. </TD></TR></TABLE>
  8040.         </TD>
  8041.     </TR>
  8042.     <TR>
  8043.         <TD VALIGN=TOP BGCOLOR="#AAAAAA">
  8044. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%"><TR><TD BGCOLOR="#CCCCCC" HEIGHT=$h1>
  8045.         <INPUT NAME="require_opt" TYPE=RADIO VALUE="other" $require_opt_check[3] $title1>
  8046. </TD></TR></TABLE>
  8047.         </TD><TD COLSPAN=3 BGCOLOR="#AAAAAA">
  8048.         
  8049.         <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%" BGCOLOR="#CCCCCC" HEIGHT=$h1>    
  8050.         <TR><TD $title1><P style="color: $color">cipher</TD><TD><TEXTAREA COLS=$c1 ROWS=$r1 NAME="cipher" SCROLLING=OFF $title1 $disabled>$cipher</TEXTAREA></TD></TR>
  8051.         <TR><TD $title1><P style="color: $color">issuer</TD><TD><TEXTAREA COLS=$c1 ROWS=$r1 NAME="issuer" SCROLLING=OFF $title1 $disabled>$issuer</TEXTAREA></TD></TR>
  8052.         <TR><TD $title1><P style="color: $color">subject</TD><TD><TEXTAREA COLS=$c1 ROWS=$r1 NAME="subject" SCROLLING=OFF $title1 $disabled>$subject</TEXTAREA></TD></TR>
  8053.         </TABLE>
  8054.         
  8055.         </TD>
  8056.     </TR>
  8057.     <TR>
  8058.         <TD COLSPAN=4 HEIGHT=5></TD>
  8059.     </TR>
  8060.     <TR>
  8061.         <TD COLSPAN=4 BGCOLOR="#AAAAAA">
  8062. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH="100%" BGCOLOR="#CCCCCC" >    
  8063. <TR><TD><P style="color: $color_max">max queries/hour</TD><TD><INPUT TYPE=TEXT NAME="queriesph" VALUE="$queriesph" $disabled_max SIZE=$s1 $title_maxq ></TD></TR>
  8064. <TR><TD><P style="color: $color_max">max updates/hour</TD><TD><INPUT TYPE=TEXT NAME="updatesph" VALUE="$updatesph" $disabled_max SIZE=$s1 $title_maxu ></TD></TR>
  8065. <TR><TD><P style="color: $color_max">max connections/hour</TD><TD><INPUT TYPE=TEXT NAME="connectionsph" VALUE="$connectionsph" $disabled_max SIZE=$s1 $title_maxc ></TD></TR>
  8066. </TABLE>
  8067.         </TD>
  8068.     </TR>
  8069. </TABLE>
  8070.  
  8071. !;
  8072.         
  8073.     };
  8074.     my $objectpriv;
  8075.     my $global_checkbox;
  8076.     if ($globs){
  8077.         $objectpriv = 1;
  8078.         my $size = 22;
  8079.         my @global_values = (
  8080.         'SELECT', 'INSERT','UPDATE','DELETE','CREATE', 'DROP', 'RELOAD', 
  8081.         'SHUTDOWN', 'PROCESS', 'FILE', 'REFERENCES', 'INDEX', 'ALTER'
  8082.         );
  8083.         my @global_values_ext = (
  8084.         'SHOW DATABASES', 'SUPER', 'CREATE TEMPORARY TABLES', 'LOCK TABLES',
  8085.         'EXECUTE', 'REPLICATION CLIENT', 'REPLICATION SLAVE'
  8086.         );
  8087.         
  8088.         
  8089.         if (check_version("4.0.2")){
  8090.             foreach (@global_values, @global_values_ext, "GRANT"){
  8091.                 my $selected        = "SELECTED" if belongs(\@global, $_);
  8092.                 $global_checkbox    .= qq!<OPTION VALUE="$_" $selected>$_\n!; 
  8093.             }
  8094.         }
  8095.         else {
  8096.             foreach (@global_values, 'GRANT'){
  8097.                 my $selected        = "SELECTED" if belongs(\@global, $_);
  8098.                 $global_checkbox    .= qq!<OPTION VALUE="$_" $selected>$_\n!; 
  8099.             }
  8100.  
  8101.             my $style = qq!STYLE="color: #bbbbbb;"!;
  8102.             foreach (@global_values_ext){
  8103.                 my $element = (lc $_);
  8104.                 $global_checkbox    .= qq!<OPTION VALUE="" $style>(N/A) $element\n!;
  8105.             }
  8106.         }
  8107.         
  8108.         
  8109.         $global_checkbox    .= qq!<OPTION VALUE="">\n!;
  8110.         $global_checkbox    .= qq!</SELECT><br>!;
  8111.         $global_checkbox    .= &$v402;
  8112.         $global_checkbox = qq!<SELECT NAME="global" MULTIPLE SIZE=$size>\n! . $global_checkbox;
  8113.         
  8114.     }
  8115.                             
  8116.     if ($dbs) {
  8117.         my $size = 13;
  8118.         my @database = $q->param('database');
  8119.         my @database_values_ext = ('LOCK TABLES', 'CREATE TEMPORARY TABLES');
  8120.         if (check_version("4.0.4")){
  8121.             foreach (@database_values, @database_values_ext, 'GRANT'){
  8122.                 my $selected        = "SELECTED" if belongs(\@database, $_);
  8123.                 $database_checkbox    .= qq!<OPTION VALUE="$_" $selected>$_\n!;
  8124.             }
  8125.         }
  8126.         else{
  8127.             foreach (@database_values, 'GRANT'){
  8128.                 my $selected        = "SELECTED" if belongs(\@database, $_);
  8129.                 $database_checkbox    .= qq!<OPTION VALUE=$_ $selected>$_\n!;
  8130.             }
  8131.             my $style = qq!STYLE="color: #bbbbbb;"!;
  8132.  
  8133.             foreach (@database_values_ext){
  8134.                 $_ = lc $_;
  8135.                 $database_checkbox .= qq!<OPTION VALUE="" $style>(N/A) $_\n!;
  8136.             }
  8137.         }
  8138.         $database_checkbox = qq!<SELECT NAME="database" MULTIPLE SIZE=$size>\n$database_checkbox<OPTION VALUE="">\n</SELECT><br>!;
  8139.         $database_checkbox = <<EOT
  8140.                     <TR>
  8141.                         <TD TITLE="Choose Database Privileges" COLSPAN=2>$database_checkbox</TD>
  8142.                     </TR>
  8143. EOT
  8144. ;
  8145.         
  8146.         unless ($objectpriv){
  8147.             $database_checkbox .= qq!
  8148.                     <TR>
  8149.                         <TD TITLE="Choose Database Privileges" COLSPAN=2 ALIGN=RIGHT>! . &$v402 . qq!</TD>
  8150.                     </TR>
  8151.             
  8152. !
  8153. ;
  8154.         }
  8155.         $objectpriv            = 1;
  8156.         $d_dblist         =    <<EOT    
  8157.                     <TR>
  8158.                         <TD ALIGN=RIGHT VALIGN=MIDDLE TITLE="Select one or more databases"><B>Db</B></TD>
  8159.                         <TD ALIGN=RIGHT TITLE="Select one or more databases">$d_dblist</TD>
  8160.                     </TR>
  8161. EOT
  8162. ;
  8163.         my $d1db = $q->textfield(-name=>'d1_db', -size=>$textsize, -title=>"Type database names (comma separated).\nPlaceholder `?' will be substituted\nwith user name for each user." );
  8164.         $d1_db            =     <<EOT
  8165.                     <TR>
  8166.                         <TD COLSPAN=2 ALIGN=RIGHT TITLE="Type database names (comma separated).\nPlaceholder `?' will be substituted\nwith user name for each user."><I>Other Db </I>$d1db</TD>
  8167.                     </TR>
  8168. EOT
  8169. ;
  8170.     } else {$d_dblist = ''; }
  8171.     my $table_checkbox_t;
  8172.     if ($tables){
  8173.         $table_checkbox_t = $q->scrolling_list(
  8174.                               -name        => 'table_t',
  8175.                             -values        => $table_values,
  8176.                             -size        =>11,
  8177.                             -multiple    =>1
  8178.                             );
  8179.         my $ext = qq!
  8180.                 <TR>
  8181.                     <TD COLSPAN=2 ALIGN=RIGHT>! . &$v402 . qq!</TD>
  8182.                 </TR>
  8183. ! unless ($objectpriv);
  8184.         $objectpriv            = 1;
  8185.         $t_dblist = <<EOT
  8186.             <TABLE BORDER=0 WIDTH="100%">
  8187.                 <TR>
  8188.                     <TD TITLE="Select database"><INPUT TYPE=SUBMIT VALUE=">" TITLE="Reload page to apply changes"> <B>Db</B></TD>
  8189.                     <TD TITLE="Select database" ALIGN=RIGHT>$t_dblist</TD>
  8190.                 </TR>
  8191.                 $T_Table
  8192.                 <TR HEIGHT=6>
  8193.                     <TD HEIGHT=6></TD>
  8194.                     <TD HEIGHT=6></TD>
  8195.                 </TR>
  8196.                 <TR>
  8197.                     
  8198.                     <TD TITLE="Choose table privileges" COLSPAN=2 ALIGN=RIGHT>$table_checkbox_t</TD>
  8199.                 </TR>
  8200. $ext
  8201.             </TABLE>
  8202. EOT
  8203. ;
  8204.  
  8205.     }
  8206.     else {$t_dblist = ''}
  8207.     my $column_checkbox;
  8208.     if ($columns){
  8209.         $column_checkbox = $q->scrolling_list(
  8210.                               -name        => 'column',
  8211.                             -values        => $column_values,
  8212.                             -size        => 4,
  8213.                             -multiple    => 1
  8214.                             ) ;
  8215.         my $ext = qq!
  8216.                 <TR>
  8217.                     <TD COLSPAN=2 ALIGN=RIGHT>! . &$v402 . qq!</TD>
  8218.                 </TR>
  8219. ! unless ($objectpriv);
  8220.  
  8221.         $c_dblist = <<EOT
  8222.                 <TABLE BORDER=0 WIDTH="100%">
  8223.                 <TR>
  8224.                     <TD TITLE="Select database"><INPUT TYPE=SUBMIT VALUE=">" TITLE="Reload page to apply changes"> <B>Db</B></TD>
  8225.                     <TD ALIGN=RIGHT TITLE="Select database">$c_dblist</TD>
  8226.                 </TR>
  8227.                 $C_Other_Db
  8228.                 $C_Table
  8229.                 $C_Other_Table
  8230.                 $columnlist
  8231.                 $C_Other_Column
  8232.                 <TR HEIGHT=6>
  8233.                     <TD HEIGHT=6></TD>
  8234.                     <TD HEIGHT=6></TD>
  8235.                 </TR>
  8236.                 <TR>
  8237.                     <TD TITLE="Choose column privileges"> </TD>
  8238.                     <TD ALIGN=RIGHT TITLE="Choose column privileges">$column_checkbox</TD>
  8239.                 </TR>
  8240. $ext
  8241.                 </TABLE>
  8242. EOT
  8243. ;
  8244.     
  8245.     }
  8246.     else {$c_dblist = ''}
  8247.     my $action_bar    = <<EOT
  8248.     <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  8249.         <TR>
  8250.             <TD ALIGN=LEFT>
  8251.             <INPUT TYPE=RESET TITLE="Reset" style="width: 65">  
  8252.             <INPUT TYPE=SUBMIT VALUE="Reload" TITLE="Reload this page" style="width: 65">  <B>
  8253.             <INPUT TYPE=SUBMIT NAME="create" VALUE="$action" style="font-weight: bold" TITLE="Proceed with selected options"></B>
  8254.                 <I>Preview queries</I> <INPUT NAME="preview" TYPE=CHECKBOX CHECKED></TD>
  8255.         </TR>
  8256.         <TR HEIGHT=4><TD HEIGHT=4></TD</TR>
  8257.     </TABLE>
  8258. EOT
  8259.     if ($globs or $dbs or ($tables and $t_db) or ($columns and ($c_db and $c_table)) or $C_Other_Db);
  8260.  
  8261. print <<EOT
  8262. <!-- USER ACCOUNTS PROCEDURE STARTS HERE -->
  8263.  
  8264. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  8265.     <TR HEIGHT=10><TD ALIGN=LEFT HEIGHT=10></TD></TR>
  8266.     <TR>
  8267.         <TD>
  8268.     <FORM ACTION="$full_url" METHOD=POST>
  8269.  
  8270. $action_bar    
  8271.     <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 BGCOLOR="#AAAAAA"><!-- PRIVILEGES -->
  8272.  
  8273.         <TR><TD BGCOLOR="#AAAAAA"><!-- SET OF GLOBAL PRIVILEGES -->
  8274.             <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1 BGCOLOR="#AAAAAA">
  8275.                 <TR><TD BGCOLOR="#CCCCCC"><P TITLE="Check to assign Global Privileges"> <B><INPUT TYPE=SUBMIT        VALUE="Global privileges"     NAME="$global_priv"    style="font-weight: bold; width=150px" TITLE="Click to show/hide privileges"> </B></TD>
  8276.                     <TD BGCOLOR="#CCCCCC"><P TITLE="Check to assign Database Privileges"> <B><INPUT TYPE=SUBMIT    VALUE="Database privileges"    NAME="$db_priv"     style="font-weight: bold; width=150px" TITLE="Click to show/hide privileges"> </B></TD>
  8277.                     <TD BGCOLOR="#CCCCCC"><P TITLE="Check to assign Table Privileges"> <B><INPUT TYPE=SUBMIT        VALUE="Table privileges"    NAME="$table_priv"    style="font-weight: bold; width=150px" TITLE="Click to show/hide privileges"> </B></TD>
  8278.                     <TD BGCOLOR="#CCCCCC"><P TITLE="Check to assign Column Privileges"> <B><INPUT TYPE=SUBMIT        VALUE="Column privileges"    NAME="$column_priv"    style="font-weight: bold; width=150px" TITLE="Click to show/hide privileges"> </B></TD>
  8279.                 </TR>
  8280.                 <TR BGCOLOR="#AAAAAA">
  8281.                     <TD VALIGN=TOP BGCOLOR="#CCCCCC" ALIGN=LEFT><P> <BR><!-- GLOBAL PRIVILEGES -->
  8282. $global_checkbox
  8283.                 </TD>
  8284.                 <TD VALIGN=TOP BGCOLOR="#CCCCCC"><!-- DATABASE PRIVILEGES -->
  8285.                 <TABLE BORDER=0>
  8286.                     $d_dblist
  8287.                     $d1_db
  8288.                     <TR HEIGHT=6>
  8289.                         <TD HEIGHT=6 COLSPAN=2></TD>
  8290.                     </TR>
  8291.                     <TR>
  8292.                         <TD TITLE="Choose Database Privileges" COLSPAN=2>$database_checkbox</TD>
  8293.                     </TR>
  8294.                 </TABLE></TD>
  8295.                 <TD VALIGN=TOP BGCOLOR="#CCCCCC"><P><!-- TABLE PRIVILEGES -->
  8296.                 $t_dblist
  8297.                 </TD>
  8298.                 <TD VALIGN=TOP BGCOLOR="#CCCCCC"><P><!-- COLUMN PRIVILEGES -->
  8299.                 $c_dblist
  8300.                 </TD>
  8301.             </TR>    
  8302.             </TABLE>
  8303.         </TR></TD>
  8304.     </TABLE>
  8305.  
  8306.     <INPUT TYPE=HIDDEN NAME="page" VALUE="admin">
  8307.     <INPUT TYPE=HIDDEN NAME="func" VALUE="access">
  8308.     <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  8309.     <INPUT TYPE=HIDDEN NAME="action" VALUE="$action">
  8310.     $hidden_glob
  8311.     $hidden_db
  8312.     $hidden_table
  8313.     $hidden_column
  8314.     $hidden_userlist
  8315.     $hidden_password
  8316. </FORM>
  8317.     </TD></TR>
  8318.     </TABLE><BR>
  8319.  
  8320. <!-- USER access PROCEDURE STARTS HERE -->
  8321. EOT
  8322. ;
  8323.     print "\n\n<TABLE><TR><TD><B>USER LIST:</B></TD></TR>\n";
  8324.     foreach (@userlist){print "\t<TR><TD><B>$_</B></TD></TR>\n"}
  8325.     print "</TABLE>\n";
  8326.       return
  8327. }
  8328. sub setup {
  8329.     if ($q->param('cancel')){
  8330.         $page= '';
  8331.         logout();
  8332.         return
  8333.     }
  8334.     if ($q->param('save')){
  8335.         sub exitonerror{
  8336.             print     $q->header();
  8337.             &startpage();
  8338.             print qq!<FORM ACTION="$full_url" METHOD=POST>\n!;
  8339.             print <<EOT
  8340. <FONT COLOR="#FF0000">$_[0]</FONT><BR>
  8341.         <P><INPUT TYPE=SUBMIT VALUE="BACK">
  8342.         <INPUT TYPE=HIDDEN NAME="page" VALUE="setup" >
  8343.         </FORM>
  8344. </TD></TR></TABLE>
  8345. </BODY>
  8346. </HTML>
  8347. EOT
  8348. ;
  8349. exit 0
  8350.         }
  8351.         if ($q->param('charset') !~ /iso-8859-1/i){
  8352.             local $SIG{__DIE__} = sub{
  8353.                 my $message = <<EOT
  8354. Perl module CGI.pm is outdated on this system.<br>
  8355. Please pass this message to your system administrator.<br>
  8356. You can not use Character Set other than ISO-8859-1 before the module CGI.pm is updated.
  8357. EOT
  8358. ;
  8359. &exitonerror($message);
  8360.             };
  8361.             $q->charset($CHARSET)
  8362.         }
  8363.         my @config;
  8364.         my ($userName, $Password, $type) = $q->cookie('mdm_setup');
  8365.         unless (open FH, "$configFile") {exitonerror ("$configFile, $!") }
  8366.         flock (FH,2) unless $WIN32;
  8367.         while(<FH>){
  8368.             push @config, $_;
  8369.         }
  8370.         flock (FH,8) unless $WIN32;
  8371.         close FH;
  8372.         my $i=0;
  8373.         unless ($q->param('new_admin')){
  8374.             my $config = readconfig(\@config);
  8375.             if (($config->{userName} ne $userName) or ($config->{Password} ne $Password)){
  8376.                 exitonerror("Login incorrect!")
  8377.             }
  8378.             
  8379.         }
  8380.         my $err_message;
  8381.         if($q->param('setPW')){
  8382.             unless ($q->param('userName') =~ /^\w+$/){
  8383.                 $err_message = "User name can not be blank and must consist of alphanumeric characters only.<BR>\n";
  8384.             }
  8385.             unless ($q->param('Password') =~ /^\w+$/){
  8386.                 $err_message .= "Password can not be blank and must consist of alphanumeric characters only.<BR>\n";
  8387.             }
  8388.             unless ($q->param('Password') eq $q->param('Password_')){
  8389.                 $err_message .= "Password was incorrect.<BR>\n"
  8390.             }
  8391.         }
  8392.         foreach(@config){
  8393.             if (/^\s*#/ or /^\s*$/){$i++; next}
  8394.             s/^\s*(\S+.*\S*)\s*$/$1/;
  8395.             if (/^userName\b/){
  8396.                 if ($q->param('setPW') and !$err_message){
  8397.                     $config[$i] = 'userName = '.$q->param('userName')."\n" ;
  8398.                 }
  8399.                 else {$config[$i] .= "\n" }
  8400.             }
  8401.             elsif(/^Password\b/){
  8402.                 if ($q->param('setPW') and !$err_message){
  8403.                         my $pw =  crypt $q->param('Password'), $q->param('userName');
  8404.                         $config[$i] = "Password=$pw\n";
  8405.                 }
  8406.                 else {$config[$i] .= "\n";}
  8407.             }
  8408.             elsif(/^(\w*\b)/){
  8409.                 $config[$i] = "$1 = ".$q->param($1)."\n";
  8410.             }
  8411.             $i++;
  8412.         }
  8413.         unless (open FH, ">$configFile") {exitonerror ("$configFile, $!") }
  8414.         else {
  8415.             flock (FH,2) unless $WIN32;
  8416.             foreach (@config) {print FH }
  8417.             flock (FH,8) unless $WIN32;
  8418.             close FH;
  8419.         }
  8420.         if ($err_message){
  8421.             $err_message = "User name and password were not changed.<P>\n$err_message<BR>\n";
  8422.             exitonerror($err_message)
  8423.         }
  8424.         
  8425.         $page= '';
  8426.         logout();
  8427.         return
  8428.     }
  8429.     #print     $q->header();
  8430.     if ($q->param('login')){
  8431.         my $pw = crypt $q->param('Password'),$q->param('userName');
  8432.         my $cookies = $q->cookie(    
  8433.                             -name=>'mdm_setup',
  8434.                             -value=>[$q->param('userName'), $pw, 'glob'],
  8435.                             -secure=>0
  8436.                             );
  8437.         print     $q->header(-cookie=>$cookies, -expires=>0);
  8438.     }
  8439.     else {print     $q->header()}
  8440.     &startpage();
  8441.     print qq!<FORM ACTION="$full_url" METHOD=POST>\n!;
  8442.     printHeaderTable({name=>'SETUP'});
  8443.     my @config;
  8444.     my ($user_password,$config, $zip_CHECKED, $gzip_CHECKED);
  8445.     if (-e $configFile){
  8446.     my @params = qw(
  8447. userName 
  8448. Password
  8449. homeURL
  8450. helpURL
  8451. defaultSocket
  8452. defaultHost
  8453. defaultPort
  8454. mysql
  8455. otherMysql
  8456. userDirectory
  8457. backupMax
  8458. SQLMax
  8459. asciiMax
  8460. adminEmail
  8461. compressCommand
  8462. allowZIP
  8463. allowGZIP
  8464. zipSyntax
  8465. zipLog
  8466. printPopUp
  8467. bgcolor1
  8468. bgcolor2
  8469. statusfontcolor
  8470. logo
  8471. slogan
  8472. slogancolor
  8473. logolink
  8474. logotarget
  8475. charset
  8476. );
  8477.     
  8478.         open FH, $configFile or die $!;
  8479.         flock (FH,2) unless $WIN32;
  8480.         while(<FH>){
  8481.             push @config, $_;
  8482.         }
  8483.         flock (FH,8) unless $WIN32;
  8484.         close FH;
  8485.         $config         = readconfig(\@config);
  8486.         my @param_missing;
  8487.         foreach (@params){
  8488.             unless (exists $config->{$_}){push @param_missing, "$_ = \n"}
  8489.         }
  8490.         if (@param_missing){
  8491.             open FH, ">>$configFile" or exitonerror ("$configFile, $!");
  8492.             flock (FH,2) unless $WIN32;
  8493.             foreach (@param_missing) {print FH }
  8494.             flock (FH,8) unless $WIN32;
  8495.             close FH;
  8496.         }
  8497.     }
  8498.     else {
  8499.         @config = @{config()};
  8500.         unless (open FH, ">$configFile") {print qq?<FONT COLOR="#FF0000">$configFile, $!</FONT><BR>? }
  8501.         else {
  8502.             flock (FH,2) unless $WIN32;
  8503.             foreach (@config) {print FH "$_\n"}
  8504.             flock (FH,8) unless $WIN32;
  8505.             close FH;
  8506.             $config         = readconfig(\@config);
  8507.         }
  8508.     }
  8509.     my $new_admin;
  8510.     my $printPopUp_CHECKED     = 'CHECKED' if ($config->{printPopUp} > 0);
  8511.     my $allowZIP_CHECKED    = 'CHECKED' if ($config->{allowZIP} > 0);
  8512.     my $allowGZIP_CHECKED    = 'CHECKED' if ($config->{allowGZIP} > 0);
  8513.     if ($config->{compressCommand} eq 'zip'){$zip_CHECKED = 'CHECKED'}
  8514.     elsif ($config->{compressCommand} eq 'gzip'){$gzip_CHECKED = 'CHECKED'}
  8515.     
  8516.     if ($config->{userName}){
  8517.         unless ($q->param('login')){
  8518.             print <<EOT
  8519. <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=0>
  8520.     <TR>
  8521.         <TD WIDTH=100 HEIGNT=30><P> </TD>
  8522.         <TD><P>Admin Name </TD>
  8523.         <TD><P><INPUT TYPE=TEXT NAME="userName" SIZE=25> </TD>
  8524.     </TR>    
  8525.     <TR>
  8526.         <TD WIDTH=100 HEIGNT=10><P> </TD>
  8527.         <TD HEIGNT=10><P> </TD>
  8528.         <TD HEIGNT=10><P> </TD>
  8529.     </TR>    
  8530.     <TR>
  8531.         <TD WIDTH=100 HEIGNT=30><P> </TD>
  8532.         <TD><P>Password </TD>
  8533.         <TD><P><INPUT TYPE=PASSWORD NAME="Password" SIZE=25> </TD>
  8534.     </TR>
  8535.     <TR>
  8536.         <TD WIDTH=100 HEIGNT=10><P> </TD>
  8537.         <TD HEIGNT=10><P> </TD>
  8538.         <TD HEIGNT=10><P> </TD>
  8539.     </TR>    
  8540.     <TR>
  8541.         <TD WIDTH=100 HEIGNT=30><P> </TD>
  8542.         <TD><P> </TD>
  8543.         <TD><P><INPUT TYPE=SUBMIT NAME="login" VALUE="SUBMIT" SIZE=30> </TD>
  8544.     </TR>
  8545. </TABLE>
  8546. <INPUT TYPE=HIDDEN NAME="page" VALUE="setup">
  8547. </FORM>
  8548. </TD></TR></TABLE>
  8549. </BODY>
  8550. </HTML>
  8551. EOT
  8552. ;
  8553.             return
  8554.         }
  8555.         my $pw = crypt $q->param('Password'), $q->param('userName');
  8556.         if (($config->{userName} ne $q->param('userName')) or ($pw ne $config->{Password})){
  8557.             
  8558.             print <<EOT
  8559.         <FONT COLOR="#FF0000"><B>INCORRECT USER NAME OR PASSWORD</B></FONT><P>
  8560.         <P><INPUT TYPE=SUBMIT VALUE="BACK">
  8561.         <INPUT TYPE=HIDDEN NAME="page" VALUE="setup">
  8562.         </FORM>
  8563. </TD></TR></TABLE>
  8564. </BODY>
  8565. </HTML>
  8566.  
  8567.  
  8568. EOT
  8569. ;
  8570.     return
  8571.         }
  8572.  
  8573.         $user_password     = "CHANGE USER NAME AND PASSWORD ";
  8574.         $new_admin        = '';
  8575.     }
  8576.  
  8577.     else {
  8578.         $user_password     = "CREATE ADMIN USER ";
  8579.         $new_admin        = '1';
  8580.     }
  8581.     foreach (keys %{$config}){$config->{$_} = quoteit $config->{$_}}    
  8582.     print <<EOT
  8583.                     
  8584.                     <TABLE BORDER=0 BGCOLOR="#CCCCCC" CELLPADDING=1 CELLSPACING=2 WIDTH=650>
  8585.                         <TR>
  8586.                             <TD ALIGN=RIGHT><P>
  8587. <TABLE BORDER=0 BGCOLOR="#AAAAAA" CELLPADDING=1 CELLSPACING=0><TR><TD>        
  8588.                     <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=2 BGCOLOR="#CCCCCC">
  8589.                         <TR><TD COLSPAN=2><P><INPUT TYPE=CHECKBOX NAME="setPW" TITLE="Check to submit user name and password"> <B>$user_password</B></TD>
  8590.                         </TR>
  8591.                         <TR>
  8592.                             <TD><P>User Name:</TD>
  8593.                             <TD>
  8594.                                 <P><INPUT TYPE=TEXT NAME="userName" VALUE="" SIZE=20 
  8595.                                 TITLE="Admin user name.\nOnly alphanumeric characters are allowed"> 
  8596.                             </TD>
  8597.                         </TR>
  8598.                         <TR>
  8599.                             <TD><P>Password:</TD>
  8600.                             <TD>
  8601.                                 <P><INPUT TYPE=PASSWORD NAME="Password" VALUE="" SIZE=20 
  8602.                                 TITLE="Password.\nOnly alphanumeric characters are allowed"> 
  8603.                             </TD>
  8604.                         </TR>
  8605.                         <TR>
  8606.                             <TD><P>Confirm Password:</TD>
  8607.                             <TD>
  8608.                                 <P><INPUT TYPE=PASSWORD NAME="Password_" VALUE="" SIZE=20 
  8609.                                 TITLE="Confirm Password.\nOnly alphanumeric characters are allowed"> 
  8610.                             </TD>
  8611.                         </TR>
  8612.                     </TABLE></TD></TR></TABLE>
  8613.                             </TD>
  8614.                         </TR>
  8615.                         <TR>
  8616.                             <TD BGCOLOR="#AAAAAA">
  8617.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8618.                                     <TR>
  8619.                                         <TD WIDTH="48%"><P><B>PARAMETERS</B></TD>
  8620.                                         <TD WIDTH="51%"><P><B>DESCRIPTION</B></TD>
  8621.                                     </TR>
  8622.                                 </TABLE>
  8623.                             </TD>
  8624.                         </TR>
  8625.                         <TR>
  8626.                             <TD BGCOLOR="#AAAAAA"><P>
  8627.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8628.                                     <TR>
  8629.                                         <TD WIDTH="48%"><P>Home page URL:<BR>
  8630.                                         <INPUT TYPE=TEXT NAME="homeURL" VALUE="$config->{homeURL}" SIZE=32 
  8631.                                         TITLE="URL of your Home Page. For example,\n http://www.edatanew.com/index.html\nor ../index.html"> </TD>
  8632.                                         <TD WIDTH="51%"><P>Your home page URL. </TD>
  8633.                                     </TR>
  8634.                                 </TABLE>
  8635.                             </TD>
  8636.                         </TR>
  8637.                         <TR>
  8638.                             <TD BGCOLOR="#AAAAAA">
  8639.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8640.                                     <TR>
  8641.                                         <TD WIDTH="48%" HEIGHT=16><P>Help directory URL:<BR>
  8642.                                         <INPUT TYPE=TEXT NAME="helpURL" VALUE="$config->{helpURL}" SIZE=32 
  8643.                                         TITLE="URL of 'help' directory. For example,\nhttp://www.edatanew.com/help\nor  ../help"> </TD>
  8644.                                         <TD WIDTH="51%"><P>URL of directory where 'help' files are installed</TD>
  8645.                                     </TR>
  8646.                                 </TABLE>
  8647.                             </TD>
  8648.                         </TR>
  8649.                         <TR>
  8650.                             <TD BGCOLOR="#AAAAAA">
  8651.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8652.                                     <TR>
  8653.                                         <TD WIDTH="48%" HEIGHT=16><P>MYSQL CONNECTION PARAMETERS<BR><BR>Default socket<BR>
  8654.                                         <INPUT TYPE=TEXT NAME="defaultSocket" VALUE="$config->{defaultSocket}" SIZE=32 
  8655.                                         TITLE="These are connection parameters of the most frequently used Mysql server. If defined as default, it will be not necessarily to type them at login page.">
  8656.                                         <BR>Default host<BR>
  8657.                                         <INPUT TYPE=TEXT NAME="defaultHost" VALUE="$config->{defaultHost}" SIZE=32 
  8658.                                         TITLE="These are connection parameters of the most frequently used Mysql server. If defined as default, it will be not necessarily to type them at login page.">
  8659.                                         <BR>Default port number<BR>
  8660.                                         <INPUT TYPE=TEXT NAME="defaultPort" VALUE="$config->{defaultPort}" SIZE=16 
  8661.                                         TITLE="These are connection parameters of the most frequently used Mysql server. If defined as default, it will be not necessarily to type them at login page."> </TD>
  8662.                                         <TD WIDTH="51%"><P>Default socket, Default host and Default port are used when the field 'HOST:PORT' is blank (login page).<BR> </TD>
  8663.                                     </TR>
  8664.                                 </TABLE>
  8665.                             </TD>
  8666.                         </TR>
  8667.                         <TR>
  8668.                             <TD BGCOLOR="#AAAAAA">
  8669.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8670.                                     <TR>
  8671.                                         <TD WIDTH="100%" COLSPAN=2><P><I>mysql</I> CLIENT PARAMETERS (Restore databases)</TD>
  8672.                                    </TR>
  8673.                                     <TR>
  8674.                                         <TD WIDTH="48%" HEIGHT=16><P>Path to binary <i>mysql</i> client<BR>
  8675.                                         <INPUT TYPE=TEXT NAME="mysql" VALUE="$config->{mysql}" SIZE=32 MAXLENGTH=200
  8676.                                         TITLE="Path to binary mysql client.\nFor example,\n for Windows: c:\\mysql\\bin\\mysql.exe\n for Unix/Linux: /usr/local/mysql/bin/mysql">
  8677.                                         <TD WIDTH="51%"><P>Path to binary <i>mysql</i> client</TD>
  8678.                                     </TR>
  8679.                                     <TR>
  8680.                                         <TD WIDTH="48%" ><P>Other parameters<BR>
  8681.                                         <INPUT TYPE=TEXT NAME="otherMysql" VALUE="$config->{otherMysql}" SIZE=32 MAXLENGTH=200
  8682.                                         TITLE="You can use some additional parameters in mysql client call syntax">
  8683.                                         <TD WIDTH="51%"><P>Additional parameters used to call <i>mysql</i><br>
  8684.                                         For example 'SILENT' AND 'COMPRESS': -s -C</TD>
  8685.                                     </TR>
  8686.                                 </TABLE>
  8687.                             </TD>
  8688.                         </TR>
  8689.                         <TR>
  8690.                             <TD BGCOLOR="#AAAAAA">
  8691.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8692.                                     <TR>
  8693.                                         <TD WIDTH="48%" HEIGHT=16><P>Path to user directory:<BR>
  8694.                                         <INPUT TYPE=TEXT NAME="userDirectory" VALUE="$config->{userDirectory}" SIZE=32 MAXLENGTH=200
  8695.                                         TITLE="Path to user directory.\nFor example,\nfor Windows: C:\\MYDOCU~1\\DATA\\USR\nfor Unix/Linux: /home/mydirname/usr"> </TD>
  8696.                                         <TD WIDTH="51%"><P>Path to directory where user subdirectories are stored.</TD>
  8697.                                     </TR>
  8698.                                 </TABLE>
  8699.                             </TD>
  8700.                         </TR>
  8701.                         <TR>
  8702.                             <TD BGCOLOR="#AAAAAA">
  8703.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8704.                                     <TR>
  8705.                                         <TD WIDTH="48%" HEIGHT=16><P>Max. total size of backup files (per user): <BR>
  8706.                                         <INPUT TYPE=TEXT NAME="backupMax" VALUE="$config->{backupMax}" SIZE=10 MAXLENGTH=10
  8707.                                         TITLE="Maximum total size of backup files per user [kilobytes].\nZero value or blank field means 'Unlimited'"> [kbyte] </TD>
  8708.                                         <TD WIDTH="51%"><P>Maximum allowed total size of bacup files for each user (in kilobytes)</TD>
  8709.                                     </TR>
  8710.                                 </TABLE>
  8711.                             </TD>
  8712.                         </TR>
  8713.                         <TR>
  8714.                             <TD BGCOLOR="#AAAAAA">
  8715.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8716.                                     <TR>
  8717.                                         <TD WIDTH="48%" HEIGHT=16><P>Max. total size of SQL scripts (per user):<BR>
  8718.                                         <INPUT TYPE=TEXT NAME="SQLMax" VALUE="$config->{SQLMax}" SIZE=10 MAXLENGTH=10
  8719.                                         TITLE="Maximum total size of SQL scripts per user [kilobytes].\nZero value or blank field means 'Unlimited'"> [kbyte]</TD>
  8720.                                         <TD WIDTH="51%"><P>Maximum allowed total size of SQL scripts for each user (in kilobytes)</TD>
  8721.                                     </TR>
  8722.                                 </TABLE>
  8723.                             </TD>
  8724.                         </TR>
  8725.                         <TR>
  8726.                             <TD BGCOLOR="#AAAAAA">
  8727.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8728.                                     <TR>
  8729.                                         <TD WIDTH="48%" HEIGHT=16><P>Max. total size of ASCII delimited files (per user):<BR>
  8730.                                         <INPUT TYPE=TEXT NAME="asciiMax" VALUE="$config->{asciiMax}" SIZE=10 MAXLENGTH=10
  8731.                                         TITLE="Maximum total size of ASCII delimited files per user [kilobytes].\nZero value or blank field means 'Unlimited'"> [kbyte]</TD>
  8732.                                         <TD WIDTH="51%"><P>Maximum allowed total size of ASCII delimited files for each user (in kilobytes)</TD>
  8733.                                     </TR>
  8734.                                 </TABLE>
  8735.                             </TD>
  8736.                         </TR>
  8737.                         <TR>
  8738.                             <TD BGCOLOR="#AAAAAA">
  8739.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8740.                                     <TR>
  8741.                                         <TD WIDTH="48%" HEIGHT=16><P>Administrator email:<BR>
  8742.                                         <INPUT TYPE=TEXT NAME="adminEmail" VALUE="$config->{adminEmail}" SIZE=32 MAXLENGTH=200
  8743.                                         TITLE="Put your administrator email address here"> </TD>
  8744.                                         <TD WIDTH="51%"><P>Email address used in error messages</TD>
  8745.                                     </TR>
  8746.                                 </TABLE>
  8747.                             </TD>
  8748.                         </TR>
  8749.                         <TR>
  8750.                             <TD BGCOLOR="#AAAAAA">
  8751.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8752.                                     <TR>
  8753.                                         <TD WIDTH="48%" HEIGHT=16><P>Compressing method:<BR>
  8754.                                         <INPUT TYPE=RADIO $zip_CHECKED NAME="compressCommand" VALUE="zip"
  8755.                                         TITLE="It defines, which method 'ZIP' or 'GZIP' will be used in 'Compress File' command"> zip 
  8756.                                         <INPUT TYPE=RADIO $gzip_CHECKED NAME="compressCommand" VALUE="gzip"
  8757.                                         TITLE="It defines, which method 'ZIP' or 'GZIP' will be used in 'Compress File' command"> gzip</TD>
  8758.                                         <TD WIDTH="51%"><P>Compressing method used by "Compress" command</TD>
  8759.                                     </TR>
  8760.                                 </TABLE>
  8761.                             </TD>
  8762.                         </TR>
  8763.                         <TR>
  8764.                             <TD BGCOLOR="#AAAAAA">
  8765.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8766.                                     <TR>
  8767.                                         <TD WIDTH="48%" HEIGHT=16><P>
  8768.                                         <INPUT TYPE=CHECKBOX NAME="allowZIP" VALUE="1" $allowZIP_CHECKED
  8769.                                         TITLE="Check to allow ZIP method to compress backup files"> Allow ZIP </TD>
  8770.                                         <TD WIDTH="51%"><P>Uncheck if zip utility is not installed</TD>
  8771.                                     </TR>
  8772.                                 </TABLE>
  8773.                             </TD>
  8774.                         </TR>
  8775.                         <TR>
  8776.                             <TD BGCOLOR="#AAAAAA">
  8777.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8778.                                     <TR>
  8779.                                         <TD WIDTH="48%" HEIGHT=16><P>
  8780.                                         <INPUT TYPE=CHECKBOX NAME="allowGZIP" VALUE="1" $allowGZIP_CHECKED
  8781.                                         TITLE="Check to allow GZIP method to compress backup files"> Allow GZIP </TD>
  8782.                                         <TD WIDTH="51%"><P>Uncheck if gzip utility is not installed</TD>
  8783.                                     </TR>
  8784.                                 </TABLE>
  8785.                             </TD>
  8786.                         </TR>
  8787.                         <TR>
  8788.                             <TD BGCOLOR="#AAAAAA">
  8789.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8790.                                     <TR>
  8791.                                         <TD WIDTH="48%" HEIGHT=16><P>ZIP call syntax:<BR>
  8792.                                         <INPUT TYPE=TEXT NAME="zipSyntax" VALUE="$config->{zipSyntax}" SIZE=16 
  8793.                                         TITLE="For Windows command line utility 'Wzzip' syntax is: 'Wzzip -Pr' \nFor Unix/Linux zip utility: 'zip -qj'"> </TD>
  8794.                                         <TD WIDTH="51%"><P>Syntax used to call ZIP utility.</TD>
  8795.                                     </TR>
  8796.                                 </TABLE>
  8797.                             </TD>
  8798.                         </TR>
  8799.                         <TR>
  8800.                             <TD BGCOLOR="#AAAAAA">
  8801.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8802.                                     <TR>
  8803.                                         <TD WIDTH="48%" HEIGHT=16><P>Syntax to suppress the output from ZIP utility<BR>
  8804.                                         <INPUT TYPE=TEXT NAME="zipLog" VALUE="$config->{zipLog}" SIZE=16 
  8805.                                         TITLE="In the case of Windows command line ZIP utility 'Wzzip' this syntax looks like: 1>NUL"> </TD>
  8806.                                         <TD WIDTH="51%"><P>Some command lline ZIP programs print output information that must be 
  8807.                                         suppressed using this syntax.</TD>
  8808.                                     </TR>
  8809.                                 </TABLE>
  8810.                             </TD>
  8811.                         </TR>
  8812.                         <TR>
  8813.                             <TD BGCOLOR="#AAAAAA">
  8814.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8815.                                     <TR>
  8816.                                         <TD WIDTH="48%" HEIGHT=16><P>
  8817.                                         <INPUT TYPE=CHECKBOX NAME="printPopUp" VALUE="1" $printPopUp_CHECKED 
  8818.                                         TITLE="Check to enable print pop up window"> Print Pop Up </TD>
  8819.                                         <TD WIDTH="51%"><P>Unchech if your browser does not support JavaScript function window.print(), or you do not want print pop up window to appear </TD>
  8820.                                     </TR>
  8821.                                 </TABLE>
  8822.                             </TD>
  8823.                         </TR>
  8824.                         <TR>
  8825.                             <TD BGCOLOR="#AAAAAA">
  8826.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8827.                                     <TR>
  8828.                                         <TD WIDTH="48%" HEIGHT=16><P>Specify the character set<BR>
  8829.                                         <INPUT TYPE=TEXT NAME="charset" VALUE="$CHARSET" SIZE=16
  8830.                                         TITLE="Specify the character set to be used in the documents"></TD>
  8831.                                         <TD WIDTH="51%"><P>Specify the character set to be used in the documents and forms. The default value is ISO-8859-1. Leave it blank if you are not sure.</TD>
  8832.                                     </TR>
  8833.                                 </TABLE>
  8834.                             </TD>
  8835.                         </TR>
  8836.                         
  8837.                         <TR>
  8838.                             <TD BGCOLOR="#AAAAAA">
  8839.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8840.                                     <TR>
  8841.                                         <TD WIDTH="48%" HEIGHT=16><P>SETTING UP OF LOOK AND FEEL</TD>
  8842.                                         <TD WIDTH="51%"><P> </TD>
  8843.                                     </TR>
  8844.                                 </TABLE>
  8845.                             </TD>
  8846.                         </TR>
  8847.                         
  8848.                         <TR>
  8849.                             <TD BGCOLOR="#AAAAAA">
  8850.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8851.                                     <TR>
  8852.                                         <TD WIDTH="48%" HEIGHT=16><P>The color of the upper part of the banner<BR>
  8853.                                         <INPUT TYPE=TEXT NAME="bgcolor1" VALUE="$config->{bgcolor1}" SIZE=16 
  8854.                                         TITLE="Color of the upper part of the banner"> </TD>
  8855.                                         <TD WIDTH="51%"><P>Hexadecimal value. 336699 by default.</TD>
  8856.                                     </TR>
  8857.                                 </TABLE>
  8858.                             </TD>
  8859.                         </TR>
  8860.                         <TR>
  8861.                             <TD BGCOLOR="#AAAAAA">
  8862.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8863.                                     <TR>
  8864.                                         <TD WIDTH="48%" HEIGHT=16><P>The color of the status bar<BR>
  8865.                                         <INPUT TYPE=TEXT NAME="bgcolor2" VALUE="$config->{bgcolor2}" SIZE=16 
  8866.                                         TITLE="Color of the status bar"> </TD>
  8867.                                         <TD WIDTH="51%"><P>Hexadecimal value. 003366 by default.</TD>
  8868.                                     </TR>
  8869.                                 </TABLE>
  8870.                             </TD>
  8871.                         </TR>
  8872.                         <TR>
  8873.                             <TD BGCOLOR="#AAAAAA">
  8874.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8875.                                     <TR>
  8876.                                         <TD WIDTH="48%" HEIGHT=16><P>Font color in the status bar<BR>
  8877.                                         <INPUT TYPE=TEXT NAME="statusfontcolor" VALUE="$config->{statusfontcolor}" SIZE=16 
  8878.                                         TITLE="Font color in the status bar"> </TD>
  8879.                                         <TD WIDTH="51%"><P>Hexadecimal value. 336699 by default.</TD>
  8880.                                     </TR>
  8881.                                 </TABLE>
  8882.                             </TD>
  8883.                         </TR>
  8884.                         <TR>
  8885.                             <TD BGCOLOR="#AAAAAA">
  8886.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8887.                                     <TR>
  8888.                                         <TD WIDTH="48%" HEIGHT=16><P>URL of logo image<BR>
  8889.                                         <INPUT TYPE=TEXT NAME="logo" VALUE="$config->{logo}" SIZE=16 
  8890.                                         TITLE="URL of logo image"> </TD>
  8891.                                         <TD WIDTH="51%"><P>Location of Logo Image. For example:<BR> http://www.mydomain.com/images/logo.jpg</TD>
  8892.                                     </TR>
  8893.                                 </TABLE>
  8894.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8895.                                     <TR>
  8896.                                         <TD WIDTH="48%" HEIGHT=16><P>Logo is linked to URL:<BR>
  8897.                                         <INPUT TYPE=TEXT NAME="logolink" VALUE="$config->{logolink}" SIZE=16 
  8898.                                         TITLE="Type web address the logo is linked to"> </TD>
  8899.                                         <TD WIDTH="51%"><P>Web address the logo is linket to. For example:<BR> http://www.mywebsite.com</TD>
  8900.                                     </TR>
  8901.                                 </TABLE>
  8902.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8903.                                     <TR>
  8904.                                         <TD WIDTH="48%" HEIGHT=16><P>Target window of Logo link<BR>
  8905.                                         <INPUT TYPE=TEXT NAME="logotarget" VALUE="$config->{logotarget}" SIZE=16 
  8906.                                         TITLE="Target window of Logo Link. Leave blank to open the link in the same window"> </TD>
  8907.                                         <TD WIDTH="51%"><P>Name of the target window (or frame) of the above link. For example:<BR>_blank - new window; _self - the same window</TD>
  8908.                                     </TR>
  8909.                                 </TABLE>
  8910.                             </TD>
  8911.                         </TR>
  8912.                         <TR>
  8913.                             <TD BGCOLOR="#AAAAAA">
  8914.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8915.                                     <TR>
  8916.                                         <TD WIDTH="48%" HEIGHT=16><P>Your company slogan<BR>
  8917.                                         <INPUT TYPE=TEXT NAME="slogan" VALUE="$config->{slogan}" SIZE=16 
  8918.                                         TITLE="Your company slogan"> </TD>
  8919.                                         <TD WIDTH="51%"><P>Text. For example: MYSQL DATA MANAGER (default value)</TD>
  8920.                                     </TR>
  8921.                                 </TABLE>
  8922.                             </TD>
  8923.                         </TR>
  8924.                         <TR>
  8925.                             <TD BGCOLOR="#AAAAAA">
  8926.                                 <TABLE BORDER=0 WIDTH="100%" BGCOLOR="#CCCCCC" CELLPADDING=2 CELLSPACING=0>
  8927.                                     <TR>
  8928.                                         <TD WIDTH="48%" HEIGHT=16><P>Slogan font color<BR>
  8929.                                         <INPUT TYPE=TEXT NAME="slogancolor" VALUE="$config->{slogancolor}" SIZE=16 
  8930.                                         TITLE="Slogan font color"> </TD>
  8931.                                         <TD WIDTH="51%"><P>Hexadecimal value. ffffff - by default</TD>
  8932.                                     </TR>
  8933.                                 </TABLE>
  8934.                             </TD>
  8935.                         </TR>
  8936.                         
  8937.                         <TR>
  8938.                             <TD ALIGN=RIGHT>
  8939.                             <INPUT TYPE=SUBMIT NAME="save" VALUE="SAVE AND EXIT">
  8940.                             <INPUT TYPE=SUBMIT NAME="cancel" VALUE="CANCEL">
  8941.                             <INPUT TYPE=RESET>
  8942.                             </TD>
  8943.                         </TR>
  8944.                     </TABLE>
  8945.                     <INPUT TYPE=HIDDEN NAME="page" VALUE="setup">
  8946.                     <INPUT TYPE=HIDDEN NAME="new_admin" VALUE="$new_admin">
  8947.  
  8948. </FORM>
  8949. </TD></TR></TABLE>
  8950. </BODY>
  8951. </HTML>
  8952.  
  8953. EOT
  8954. ;
  8955.     
  8956. }
  8957.  
  8958. sub getdatanstructure {
  8959.     my $hashref            = shift;
  8960.     my @tablelist         = @{$hashref->{tablelist}} if defined $hashref->{tablelist};
  8961.     my @newtablelist    = @{$hashref->{newtablelist}} if defined $hashref->{newtablelist};
  8962.     my $include            = $hashref->{include};
  8963.     my $dropifexists    = $hashref->{dropifexists};
  8964.     my $back            = $hashref->{back};
  8965.     my $comments        = $hashref->{comments};
  8966.     my @locks;
  8967.     my $filecontent        = '';
  8968.     if ($hashref->{lock}){
  8969.         my $query = "LOCK TABLES";
  8970.         foreach (@tablelist){
  8971.             push @locks, " $_ READ";
  8972.         }
  8973.         $query .= join(',',@locks);
  8974.         $dbh->do($query) or bail_out("Cannon lock!",$back);
  8975.     }
  8976.     my $j    = 0;
  8977.     my @filecontent;
  8978.     my $fk;
  8979.     foreach my $table (@tablelist) {
  8980. #        my $tbname        = "\n#\tTABLE $table \n" if $comments;
  8981.         my $text        = getCreateTableSQL({
  8982.             tabsref         => [$table],
  8983.             dropifexists     => "$dropifexists",
  8984.             newtabs         => $hashref->{newtablelist},
  8985.             back            => $back
  8986.             }) unless ($include eq 'data');
  8987.         if ($text =~ /FOREIGN KEY/si){$fk = 1}
  8988.         $text = "\n#\tTABLE $table \n$text" if $comments;
  8989.         unless ($include eq 'structure') {
  8990.             $text .= "\n#\tDUMPING DATA\n\n" if $comments;    
  8991.     
  8992.             my $query         = "SELECT * FROM $table";
  8993.             my ($sth, $res) = prepare_execute($query,$back);
  8994.             $table            = $newtablelist[$j] if $newtablelist[$j];
  8995.             while (my @row = $sth->fetchrow_array){
  8996.                 $text .= "INSERT INTO $table VALUES ( ";
  8997.                 my @rowdata;
  8998.                 for (my $i = 0; $i < @row; $i++) {
  8999.                     push @rowdata, $dbh->quote($row[$i]);
  9000.                 }
  9001.                 $text .= join (', ', @rowdata);
  9002.                 $text .= ");\n";
  9003.  
  9004.             }
  9005.             $sth->finish;
  9006.         }
  9007.         $text .= "\n#--------------------------------------------------------\n" if $comments;
  9008.         if ($fk){push @filecontent, $text} else {unshift @filecontent, $text}
  9009.         $j++;
  9010.         $fk = 0;
  9011.     }
  9012.     $filecontent = join '', @filecontent;
  9013.     $filecontent .= "#\tEND OF FILE\n" if ($filecontent and $comments);
  9014.     if ($hashref->{lock}){
  9015.         $dbh->do("UNLOCK TABLES") or bail_out("Cannot unlock!", $back);
  9016.     }
  9017.     return $filecontent
  9018. }
  9019. sub config {
  9020.     my $config = <<EOT
  9021. #######################################################################################
  9022. #                 MYSQL DATA MANAGER CONFIGURATION FILE
  9023. #######################################################################################
  9024. userName = 
  9025. Password = 
  9026. homeURL = 
  9027. helpURL = ../help
  9028. defaultSocket = 
  9029. defaultHost = localhost
  9030. defaultPort = 3306
  9031. mysql = /usr/local/mysql/bin/mysql
  9032. otherMysql = 
  9033. userDirectory = SET VALID VALUE!
  9034. backupMax = 200
  9035. SQLMax = 50
  9036. adminEmail = 
  9037. compressCommand = gzip
  9038. allowZIP = 1
  9039. allowGZIP = 1
  9040. zipSyntax = zip -qj
  9041. zipLog = 
  9042. printPopUp = 1
  9043. bgcolor1 = 336699
  9044. bgcolor2 = 003366
  9045. statusfontcolor = 336699
  9046. logo = 
  9047. slogan = Mysql Data Manager
  9048. slogancolor = ffffff
  9049. logolink = 
  9050. logotarget = _blank
  9051.  
  9052.  
  9053. EOT
  9054. ;
  9055.     my @config = split "\n", $config;
  9056.     return (\@config);
  9057. }
  9058. sub readconfig {
  9059.     my $config;
  9060.     my @config = @{$_[0]};
  9061.     foreach(@config){
  9062.         next if (/^\s*#/ or /^\s*$/);
  9063.         s/^\s*(\S+.*\S*)\s*$/$1/;
  9064.         if (/^\w*/){
  9065.             /^(\w*)\s*=\s*(\S*.*\S*)\s*$/;
  9066.             $config->{$1}=$2;
  9067.         }
  9068.     }
  9069.     return $config
  9070. }
  9071.  
  9072. sub checkuserdir {
  9073.         my $dirname                    = shift;
  9074.         my $userhost                = myhost();
  9075.         unless ((-e $USER_DIR) and (-d $USER_DIR)) {return "Cannot create user directory." unless mkdir $USER_DIR, 0777}
  9076.         my $userdir                    = "$USER_DIR$delim$user.$userhost";
  9077.         unless ((-e $userdir) and (-d $userdir)) {return "Cannot create directory $user.$userhost" unless mkdir $userdir, 0777 }
  9078.         $userdir                     = "$USER_DIR$delim$user.$userhost$delim$dirname";
  9079.         unless ((-e $userdir) and (-d $userdir)) {return "Cannot create directory $dirname." unless mkdir $userdir, 0777}
  9080.         return 0;
  9081.         
  9082. # see:     LoadRestore
  9083. #        suggest
  9084. #        create backup
  9085. #        loadImport
  9086. }
  9087. sub download {
  9088.     my $path_    = $_[0]; # Path to directory or -1 to download from variable $content
  9089.     my $file     = $_[1]; # File name to be downloaded. Must be defined
  9090.     my $content    = $_[2]; # If Path = -1, this shoud be array reference, containing downloadable information
  9091.     my $size = 0;
  9092.     my $EOL    = $WIN32 ? "\r\n" : "\n" ;
  9093.     if ($path_ == -1){
  9094.         foreach (@$content){
  9095.             $size += length ;
  9096.         }
  9097.         print "Content-disposition: application; filename=$file$EOL";
  9098.         print "Content-Type: application/download$EOL$EOL";
  9099.         binmode STDOUT;
  9100.         foreach (@$content){print}
  9101.     }
  9102.     else {
  9103.         my @stat = stat $path_.$delim.$file;
  9104.         $size = $stat[7];
  9105.         open FH, $path_.$delim.$file or return("Could not open file $path_$delim$file. $!");
  9106.         flock(FH, 2) unless $WIN32;
  9107.         binmode FH;
  9108. #        print "Content-type: application/download$EOL";
  9109. #        print  "Content-Length: $size$EOL";
  9110. #        print  "Content-Disposition: attachment; filename=$file$EOL";
  9111. #        print  "Content-Transfer-Encoding: binary$EOL$EOL";
  9112.         print "Content-disposition: application; filename=$file$EOL";
  9113.         print "Content-Type: application/download$EOL$EOL";
  9114.         binmode STDOUT;
  9115.         my $data;
  9116.         while (read FH, $data, 1024) {print $data}
  9117.         flock(FH, 8) unless $WIN32 ;
  9118.         close FH;
  9119.     }
  9120.     return undef;
  9121. }
  9122. sub backslash {
  9123.     my $input    = shift;
  9124.     $input        =~ s/\\a/\a/g;
  9125.     $input        =~ s/\\b/\b/g;
  9126.     $input        =~ s/\\e/\e/g;
  9127.     $input        =~ s/\\f/\f/g;
  9128.     $input        =~ s/\\n/\n/g;
  9129.     $input        =~ s/\\r/\r/g;
  9130.     $input        =~ s/\\t/\t/g;
  9131.     $input        =~ s{\&\#(\w+)\;}{
  9132.                 chr($1)
  9133.         }gsex;
  9134.     return $input
  9135. }
  9136. sub charesc {
  9137.     my $seq = ["+","?",".","*","^","\$","(",")","[","{","|","\\"];
  9138.     my @char = @_;
  9139.     foreach (@char){if (belongsb($seq, $_)){$_ = "\\".$_}}
  9140.     return @char if wantarray;
  9141.     return $char[0];    
  9142. }
  9143.  
  9144. sub import_ {
  9145.     my $input        = shift;
  9146.     my $back        = $input->{back};
  9147.     my @file         = $q->param('selectfilelist');
  9148.     if (@file > 1)        {return "Too many files selected"}
  9149.     unless ($file[0])    {return "Please select a file"}
  9150.  
  9151.     my $userhost    = myhost();
  9152.     my $userdir        = "$USER_DIR$delim$user.$userhost$delim" . "ascii";
  9153.     my $fterm         = $q->param('fterm1')    ? $q->param('fterm2')    : $q->param('fterm');
  9154.     my $fencl         = $q->param('fencl1')    ? $q->param('fencl2')    : $q->param('fencl');
  9155.     my $fesc         = $q->param('fesc1')    ? $q->param('fesc2')    : $q->param('fesc');
  9156.     my $lterm         = $q->param('lterm1')    ? $q->param('lterm2')    : $q->param('lterm');
  9157.     my $ignore        = $q->param('ignore');
  9158.     {
  9159.         my $long = "The `FIELDS [OPTIONALLY] ENCLOSED BY' and `FIELDS ESCAPED BY' values must be a single character or empty.\nThey can be specified as backslash followed by a letter: \\x,\nor as a Numeric Entity: &#xxx; (where xxx is character's three-digit numerical value)";
  9160.         if (length $fencl > 1 and ($fencl !~ /^(\\[a-zA-Z]|&#\d\d\d;)$/)) {
  9161.             return $long
  9162.         }
  9163.         if (length $fesc > 1 and ($fesc !~ /^(\\[a-zA-Z]|&#\d\d\d;)$/)) {
  9164.             return $long
  9165.         }
  9166.     }
  9167.     $ignore =~ s/^\s*(\S*)/$1/;
  9168.     $ignore =~ s/^(\S*)\s*/$1/;
  9169.     unless ($ignore =~ /^\d*$/){return "Parameter IGNORE ... LINES must consist of digits only"}
  9170.     $fterm            = backslash($fterm);
  9171.     $fencl            = backslash($fencl);
  9172.     $fesc            = backslash($fesc);
  9173.     $lterm            = backslash($lterm);
  9174.     my $content;
  9175.     open FH, "$userdir$delim$file[0]" or return (qq?$! "$file[0]"?);
  9176.     flock (FH,2) unless $WIN32;
  9177.     while (read FH, my $data, 1024) {$content .= $data}
  9178.     flock (FH,8) unless $WIN32;
  9179.     close FH;
  9180.     my $insert    = [[]];
  9181.     my $jj = 0;
  9182.     my $i = 0;
  9183.     my @esc = ();
  9184.         my %test;
  9185.  
  9186.     if ($q->param('mode') =~ /simple/i){
  9187.         $_ = $content;
  9188.         while (
  9189.             m/
  9190.                 (?:
  9191.                     (?<!$fesc)$fencl
  9192.                     ([^$fencl]*?(?:$fesc$fesc)+[^$fencl]*?)        #1
  9193.                     (?<!$fesc)$fencl
  9194.                     |
  9195.                     (?<!$fesc)$fencl
  9196.                     (.*?)                                        #2
  9197.                     $fesc(?!$fencl)
  9198.                     |
  9199.                     ([^\n\r$fterm$fesc]*?)                        #3
  9200.                 )?
  9201.                 ($fterm|\n|\r\n)
  9202.             /gxs
  9203.         )
  9204.         {
  9205.             my $cell            = $1.$2.$3;
  9206.             my $eoc                = $4;
  9207.             $cell                =~ s/$fesc$fencl/$fencl/g;
  9208.             $insert->[$jj]->[$i] = $cell;
  9209.             bail_out("Too big", $back) if ($i++ > 100000);
  9210.             if ($eoc ne $fterm){
  9211.                 if ($ignore){$ignore--;$insert->[0]=[]}
  9212.                 else {$jj++}
  9213.                 $i=0
  9214.             }
  9215.         }
  9216.     }# end of simple mode
  9217.     else {
  9218.         my $ii;
  9219.         foreach($fterm,$fencl,$fesc,$lterm){if ($_ ne ''){$esc[$ii] = "\\" unless m/[a-zA-Z0-9]/} ; $ii++} #m/[\+\?\.\*\^\$\(\)\[\{\|\\]/
  9220.         $_ = $content;
  9221.         my $lterm1;
  9222.         if ($lterm eq "\n"){$lterm1 = "\r"; $esc[4]="\\"}
  9223.         elsif ($lterm eq "\r"){$lterm1 = "\n"; $esc[4]="\\"}
  9224.         my $null = $fesc ? "$esc[2]$fesc"."N" : 'NULL';
  9225.         my $cut;
  9226.         my @lines = split /(?<!$esc[2]$fesc)(?:esc[3]$lterm$esc[4]$lterm1$|$esc[3]$lterm)/s, $_;
  9227.         foreach (@lines){
  9228.             while (
  9229.                 m/
  9230.                     (?:
  9231.                         ($null)                                        #1
  9232.                         |
  9233.                         (?<!$esc[2]$fesc)$esc[1]$fencl?
  9234.                         (.*?)                                        #2
  9235.                         (?<!$esc[2]$fesc)$esc[1]$fencl?
  9236.                     )?
  9237.                     ((?<!$esc[2]$fesc)(?:$esc[0]$fterm)|\z)    #3
  9238.                 /gxs
  9239.             )
  9240.             {
  9241. #             print "1-'$1'; 2-'$2', 3-'$3', 4-'$4'<BR>";
  9242.                 my $cell            = "$1$2";
  9243.                 my $eoc                = $3;
  9244.                 my $zero            = 0;
  9245.                 $cell                =~ s/$esc[2]$fesc$zero/chr(0)/gsxe;
  9246.                 $test{"$i-$4"} = $1 ;
  9247.                 if ($cell eq "$fesc"."N"){$cell = undef}
  9248.                 else {$cell            =~ s/$esc[2]$fesc([$esc[0]$fterm$esc[1]$fencl$esc[2]$fesc$esc[3]$lterm])/$1/g}
  9249.                 $insert->[$jj]->[$i] = $cell;
  9250.                 $i++;
  9251.                 
  9252.             }
  9253.             pop @{$insert->[$jj]};
  9254.             if ($ignore){$ignore--;$insert->[0]=[]}
  9255.             else {$jj++}
  9256.             $i=0;
  9257.         }
  9258.     }
  9259.  
  9260.  
  9261.     my $table = $q->param('tables');
  9262.     my ($sth,$res) = prepare_execute("SELECT * FROM $table WHERE 1=0");
  9263.     my $Type    = $sth->{TYPE};
  9264.     my $bool = $sth->{mysql_is_num};
  9265.     $sth->finish();
  9266.     for (my $i=0; $i<@$insert; $i++){
  9267.         for (my $j=0; $j<@{$insert->[$i]}; $j++){
  9268.             $insert->[$i]->[$j] = $dbh->quote($insert->[$i]->[$j]);
  9269. #            $insert->[$i]->[$j] = $dbh->quote($insert->[$i]->[$j], $Type->[$j]);
  9270.         }
  9271.     }
  9272.     my $insertopt;
  9273.     if ($q->param('replacekey') eq 'ignore'){
  9274.         $insertopt = 'INSERT IGNORE';
  9275.     }
  9276.     elsif ($q->param('replacekey') eq 'replace'){$insertopt = 'REPLACE'}
  9277.     elsif ($q->param('replacekey') eq 'error'){$insertopt = 'INSERT'}
  9278.     my @value = ();
  9279.     foreach (@$insert){
  9280.         my $value = join ',',@{$_};
  9281.         push @value, "(".$value.")"; 
  9282.     }
  9283.     if (check_version("3.22.5")){
  9284.         my $value =  join ",\n",@value;
  9285.         my $query = "$insertopt INTO $table VALUES\n$value";
  9286.         $dbh->do($query) || return "Cannot insert.\n$query";
  9287.         return "Selected file was imported successfully\n";
  9288.     }
  9289.     else{
  9290.         foreach (@value){
  9291.             my $query = "$insertopt INTO $table VALUES\n$_";
  9292.             $dbh->do($query) || return "Cannot insert.\n$query\n";
  9293.         }
  9294.     }
  9295.  
  9296.     
  9297. }
  9298. sub export_ {
  9299.     my $input        = shift;
  9300.     my $query        = $input->{query};
  9301.     my $back        = $input->{back};
  9302.     my @file         = ($q->param('exportintofile') eq 'new') ? $q->param('newfilename') : $q->param('selectfilelist');
  9303.     if (@file > 1)    {return "Too many files selected"}
  9304.     $file[0]        = deletespace($file[0]);
  9305.     if ($file[0]        =~ /[\/\\:\*\?\"<>]/){return qq!A filename cannot contain any of the following character:\n \\/:*?"<>|!}
  9306.     if (!$file[0] or ($file[0] eq 'NEW FILE NAME')){return "Please select a file or create a new one"}
  9307.     my ($sth, $res) = prepare_execute($query, $back);
  9308.     my $userhost    = myhost();
  9309.     my $userdir        = "$USER_DIR$delim$user.$userhost$delim" . "ascii";
  9310.     
  9311.     if ($q->param('exportintofile') eq 'new'){
  9312.         if (-e "$userdir$delim$file[0]"){return "File $file[0] already exists"}    
  9313.     }
  9314.     my $fterm         = $q->param('fterm1')    ? $q->param('fterm2')    : $q->param('fterm');
  9315.     my $fencl         = $q->param('fencl1')    ? $q->param('fencl2')    : $q->param('fencl');
  9316.     my $fesc         = $q->param('fesc1')    ? $q->param('fesc2')    : $q->param('fesc');
  9317.     my $lterm         = $q->param('lterm1')    ? $q->param('lterm2')    : $q->param('lterm');
  9318.     {
  9319.         my $long = "The `FIELDS [OPTIONALLY] ENCLOSED BY' and `FIELDS ESCAPED BY' values must be a single character or empty.\nThey can be specified as backslash followed by a letter: \\x,\nor as a Numeric Entity: &#xxx; (where xxx is character's three-digit numerical value)";
  9320.         if (length $fencl > 1 and ($fencl !~ /^(\\[a-zA-Z]|&#\d\d\d;)$/)) {
  9321.             return $long
  9322.         }
  9323.         if (length $fesc > 1 and ($fesc !~ /^(\\[a-zA-Z]|&#\d\d\d;)$/)) {
  9324.             return $long
  9325.         }
  9326.     }
  9327.     open FH, ">$userdir$delim$file[0]" or return (qq?$! "$file[0]"?);
  9328.     flock (FH,2) unless $WIN32;
  9329.     my $length             = $sth->{mysql_length};
  9330.     my $maxlength         = $sth->{mysql_max_length};
  9331.     my $Type             = $sth->{TYPE};
  9332.     my $mysql_type_name    = $sth->{mysql_type_name};
  9333.     my $Nullable         = $sth->{NULLABLE};
  9334.     my $Nameref            = $sth->{NAME};
  9335.     #($fterm,$fencl,$fesc,$lterm) = charesc($fterm,$fencl,$fesc,$lterm);
  9336.     $fterm            = backslash($fterm);
  9337.     $fencl            = backslash($fencl);
  9338.     $fesc            = backslash($fesc);
  9339.     $lterm            = backslash($lterm);
  9340.     my $zero        = chr(0);
  9341.     if ($q->param('mode') =~ /simple/i){
  9342.         if ($q->param('colnames')){
  9343.             my $result = join $fterm, @$Nameref;
  9344.             print FH $result, "\n";
  9345.         }
  9346.         while(my @result = $sth->fetchrow_array()){
  9347.             my $i = 0;
  9348.             foreach (@result){
  9349. # escape ENCLOSE and ESCAPE characters
  9350.                 s{$fencl}{$fesc.$fencl}gse;
  9351. # convert ASCII 0 into ASCII 48 and escape it
  9352.                 s{$zero}{$fesc."0"}gse;
  9353.                 #s/\x0D\x0D/\x0D/gm;
  9354. # enclose when appropriate
  9355.                 $_ = "$fencl$_$fencl" if /[$fterm"\n]/;
  9356.             }
  9357.             my $result = join $fterm,@result;                        # add FIELDS TERMINATED BY characters
  9358. #            print FH $result,$lterm;                                # add LINES TERMINATED BY characters
  9359.             print FH $result,"\n";                                # add LINES TERMINATED BY characters
  9360.         }    
  9361.         $sth->finish();
  9362.         flock (FH,8) unless $WIN32;
  9363.         close FH;
  9364.         return 0;
  9365.     }
  9366.     
  9367.     if (($lterm eq '') and $fterm){$lterm = $fterm}
  9368. # ........
  9369. # If the FIELDS TERMINATED BY and FIELDS ENCLOSED BY values are both empty (''), 
  9370. # a fixed-row (non-delimited) format is used. With fixed-row format, no delimiters are used between fields. 
  9371. # Instead, column values are written and read using the ``display'' widths of the columns. 
  9372. # For example, if a column is declared as INT(7), values for the column are written using 7-character fields. 
  9373. # On input, values for the column are obtained by reading 7 characters. 
  9374. # Fixed-row format also affects handling of NULL values; see below. 
  9375. # Note that fixed-size format will not work if you are using a multi-byte character set.
  9376. # NULLs are treated as empty strings
  9377. #.........
  9378. #                                                MySQL Manual
  9379. #
  9380.     my $fixed            = 0;
  9381.     if ($fencl eq '' and $fterm eq ''){
  9382.         unless (belongsb($Type, -1)){$fixed = 1}
  9383.     }
  9384.     
  9385.     my ($fencl_,$fesc_,$fterm_,$lterm_) = ($fencl,$fesc,$fterm,$lterm);
  9386.  
  9387.     while(my @result = $sth->fetchrow_array()){
  9388.         my $i = 0;
  9389.         foreach (@result){
  9390.             ($fencl,$fesc,$fterm,$lterm) = ($fencl_,$fesc_,$fterm_,$lterm_);
  9391.             if ($fixed){
  9392.                 my $len    = $length->[$i];
  9393.                 my $kk = (substr $_, 0, $len).(" " x($len - length $_));
  9394.                 $_ = $kk;
  9395.             }
  9396.             else {
  9397.                 my $esc = "\\";
  9398. # escape FIELDS ESCAPED BY characters
  9399.                 if ($fesc ne ''){
  9400.                     $fesc =~ /^(.)/s;
  9401.                     my $fc = $1;
  9402.                     if ($fesc =~ /[\+\?\.\*\^\$\(\)\[\{\|\\]/){
  9403.                         s{$esc$fc}{$fesc.$fc}gsex
  9404.                     }
  9405.                     else{s{$fc}{$fesc.$fc}gse}
  9406.                 }
  9407. # escape FIELDS ENCLOSED BY characters
  9408.                 $fencl =~ /^(.)/s;
  9409.                 if (($fesc ne $1) and ($fencl ne '')){
  9410.                     my $fc = $1;
  9411.                     if ($fencl =~ /[\+\?\.\*\^\$\(\)\[\{\|\\]/){s{$esc$fc}{$fesc.$fc}gse}
  9412.                     else{s{$fc}{$fesc.$fc}gse}
  9413.                 }
  9414. # escape The first character in FIELDS TERMINATED BY
  9415.                 $fterm =~ /^(.)/s;
  9416.                 if (($fesc ne $1) and ($fterm ne $fencl) and ($fterm ne '') and ($fencl eq '')){
  9417.                     my $fc = $1;
  9418.                     if ($fterm =~ /[\+\?\.\*\^\$\(\)\[\{\|\\]/){s{$esc$fc}{$fesc.$fc}gse}    
  9419.                     else {s{$fc}{$fesc.$fc}gse}        
  9420.                 }
  9421. # escape LINES TERMINATED BY characters
  9422.                 $lterm =~ /^(.)/s;
  9423.                 if (($fesc ne $1) and ($lterm ne $fencl) and ($lterm ne $fterm) and ($lterm ne '')){
  9424.                     my $fc = $1;
  9425.                     if ($lterm =~ /[\+\?\.\*\^\$\(\)\[\{\|\\]/){s{$esc$fc}{$fesc.$fc}gse}    
  9426.                     else {s{$fc}{$fesc.$fc}gse}        
  9427.                 }
  9428. # convert ASCII 0 into ASCII 48 and escape it
  9429.                 s{$zero}{$fesc."0"}gse unless ($lterm eq "");
  9430. # escape NULLs
  9431.                 unless (defined $_){$_ = ($fesc eq '') ? "NULL" : $fesc."N"} 
  9432. # enclose the correct data types
  9433.                 else {$_ = "$fencl$_$fencl"  if  (                    
  9434.                         !$q->param('optionally') or 
  9435.         ((abs $Type->[$i] <= 1) or (( $Type->[$i] >= 9 ) and (($Type->[$i]!=11) or $Nullable->[$i])))
  9436.                             )
  9437.                 }
  9438.             }
  9439.             #$_ = "<$_ LENGTH=$length->[$i], MAX_LENGTH=$maxlength->[$i], mTYPE=$Type->[$i], mTYPE_NAME=$mysql_type_name->[$i]>";  
  9440.             $i++;
  9441.         }
  9442.         my $result = join $fterm,@result;                        # add FIELDS TERMINATED BY characters
  9443.         print FH $result,$lterm;                                # add LINES TERMINATED BY characters
  9444.     }
  9445.     $sth->finish();
  9446.     flock (FH,8) unless $WIN32;
  9447.     close FH;
  9448.     return 0;
  9449. }
  9450. sub loadImportExportFile {
  9451.     my $border            = 0;
  9452.     my $input            = shift;
  9453.     my $func            = $q->param('func');
  9454.     my $action            = $q->param('action');
  9455.     my $userhost         = myhost();
  9456.     my $chkusrdir        =  checkuserdir('ascii');
  9457.     my $userdir            = "$USER_DIR$delim$user.$userhost$delim" . "ascii";
  9458.     my $mode            = $q->param('setmode') || $q->param('mode') || "simple";
  9459.     my $sql                = $q->param('query');
  9460.     my $back             = {    page => 'select_db', dbname => "$database"};
  9461.     my $table;            
  9462.     {
  9463.         my @table        = $q->param('tables'); 
  9464.         bail_out ("Too many tables selected", $back) if  @table > 1;
  9465.         $table            = $table[0];
  9466.     }
  9467.     $back->{page}                 = 'tables';
  9468.     $back->{func}                 = $func;
  9469.     $back->{tables}             = $table if $table;
  9470.     $back->{query}                = $sql if $sql;
  9471.     $back->{mode}                 = $mode;
  9472.     $back->{replacekey}         = $q->param('replacekey'); 
  9473.     $back->{fterm}                 = $q->param('fterm'); 
  9474.     $back->{fterm1}             = $q->param('fterm1'); 
  9475.     $back->{fterm2}             = $q->param('fterm2'); 
  9476.     $back->{fencl}                 = $q->param('fencl'); 
  9477.     $back->{fencl1}             = $q->param('fencl1'); 
  9478.     $back->{fencl2}             = $q->param('fencl2'); 
  9479.     $back->{fesc}                 = $q->param('fesc'); 
  9480.     $back->{fesc1}                 = $q->param('fesc1'); 
  9481.     $back->{fesc2}                 = $q->param('fesc2'); 
  9482.     $back->{lterm}                 = $q->param('lterm'); 
  9483.     $back->{lterm1}             = $q->param('lterm1'); 
  9484.     $back->{lterm2}             = $q->param('lterm2');
  9485.     $back->{exportintofile}     = $q->param('exportintofile');
  9486.     $back->{optionally}         = $q->param('optionally');
  9487.     $back->{colnames}             = $q->param('colnames');
  9488.     if ($func =~ /export/i){
  9489.         if (defined $q->param('SQL')){
  9490.             $back->{SQL}                 = $q->param('SQL');
  9491.             $back->{selectedscript}     = $q->param('selectedscript');
  9492.         }
  9493.         elsif (defined $q->param('select')){
  9494.             my $tables                    = $q->param('tables');
  9495.             my @cols                     = $q->param("fields_$tables");
  9496.             $back->{"select"}            = $q->param('select');
  9497.             $back->{where}                = $q->param('where');
  9498.             $back->{groupby}            = $q->param('groupby');
  9499.             $back->{orderby}            = $q->param('orderby');
  9500.             $back->{limit}                = $q->param('limit');
  9501.             $back->{"fields_$tables"}    = \@cols;
  9502.         }
  9503.         elsif (defined $q->param('searchresult')){
  9504.             my @fields                    = $q->param('fields');
  9505.             $back->{rows}                = $q->param('rows');
  9506.             $back->{order}                = $q->param('order');
  9507.             $back->{where}                = $q->param('where');
  9508.             $back->{start}                = $q->param('start');
  9509.             $back->{count}                = $q->param('count');
  9510.             $back->{searchresult}        = $q->param('searchresult');
  9511.             $back->{fields}                = \@fields;
  9512.         }
  9513.     }
  9514.     if ($action =~ /export/i){
  9515.         my $sql_        = $sql || "SELECT * FROM $table";
  9516.         if(my $errmsg = export_({query => $sql_, back => $back})){bail_out($errmsg, $back)}
  9517.     }
  9518.     elsif ($action =~ /import/i){
  9519.         if(my $errmsg = import_({back => $back})){bail_out($errmsg, $back)}
  9520.     }
  9521.     elsif ($action =~ /(alter)|(create)/i){
  9522.         &loadAlterTable({back => $back});
  9523.         return
  9524.     }
  9525.     elsif ($action =~ /download/i){
  9526.         my @file = $q->param('selectfilelist');
  9527.         bail_out("Too many files selected", $back) if (@file > 1);
  9528.         bail_out("Please select a file", $back) if (@file == 0);
  9529.         if (my $errmsg = download($userdir, $file[0])){bail_out($errmsg, $back)} 
  9530.         exit
  9531.     }
  9532.     elsif ($action =~ /upload/i){
  9533.         if (my $sourse = $q->param('localfile')) {
  9534.             my $dest = $sourse;
  9535.             $dest =~ s/^(.*[\/|\\])*(.*)/$2/;
  9536.             my $dest_ = $dest;
  9537.             my $filexist = sub {
  9538.                 if ($q->param('overwrite')){
  9539.                     unlink $_[0]
  9540.                 }
  9541.                 else {
  9542.                     close $sourse or bail_out("$!");
  9543.                     bail_out("File $dest_ already exists",$back)
  9544.                 }    
  9545.             };
  9546.             my $size_ = 0;
  9547.             if (-e "$userdir$delim$dest_") 
  9548.             {&$filexist("$userdir$delim$dest_"); $size_ = -s "$userdir$delim$dest_"}
  9549.             if ($MAX_ASCII_SIZE){
  9550.                 my $size = dirsize($userdir);
  9551.                 $size += (-s $sourse) - $size_;
  9552.                 if ($size > ($MAX_ASCII_SIZE*1024)) {
  9553.                     my $errmsg = "Total size of this directory is limited to $MAX_ASCII_SIZE kb.";
  9554.                     $errmsg .= "\nPlease delete some files before uploading.";            
  9555.                     bail_out("$errmsg",$back);
  9556.                 }
  9557.             }
  9558.             $dest = "$userdir$delim$dest";
  9559.             open (DEST, ">$dest") || bail_out ("$! $dest_", $back);
  9560.             flock (DEST,2) unless $WIN32;
  9561.             binmode $sourse;
  9562.             binmode DEST;
  9563.             my $data;
  9564.             while (read $sourse,$data,1024) {
  9565.                 print DEST $data;
  9566.             }
  9567.             flock (DEST,8) unless $WIN32;
  9568.             close DEST;
  9569.             close $sourse or bail_out($!);
  9570.         }
  9571.         else {bail_out("Please select file to upload", $back)}
  9572.     }
  9573.     elsif ($action =~ /edit/i){
  9574.         my @file = $q->param('selectfilelist');
  9575.         bail_out("Too many files selected", $back) if (@file > 1);
  9576.         bail_out("Please select a file", $back) if (@file == 0);
  9577.         my $errmsg = editfile({path => $userdir, back => $back});
  9578.         bail_out($errmsg, $back) if $errmsg;
  9579.         return 0 unless defined $errmsg
  9580.     }
  9581.     elsif ($action =~ /delete/i){
  9582.         my @file = $q->param('selectfilelist');
  9583.         bail_out("Please select a file", $back) if (@file == 0);
  9584.         my $errmsg = deletefiles({path => $userdir, back => $back});
  9585.         bail_out($errmsg, $back) if $errmsg;
  9586.         return 0 unless defined $errmsg;
  9587.     }
  9588.     my $multiform = $q->start_multipart_form(-action=>$full_url, -method=>"post");
  9589.     my $selectfilelist = qq!\n<SELECT NAME="selectfilelist" SIZE=8 MULTIPLE  TITLE="Select file">\n!;
  9590.     my $tsize        = 0;
  9591.     my @files         = ();
  9592.     my @lables        = ();
  9593.     unless ($chkusrdir){
  9594.  
  9595.         opendir DIR, $userdir; 
  9596.         my @filenames    = readdir (DIR) or print "Cannot read this directory: $userdir<br>";
  9597.         closedir DIR;
  9598.  
  9599.         foreach (@filenames){
  9600.             next if (($_ eq '.') or ($_ eq '..'));
  9601.             my $file  = "$userdir$delim$_";
  9602.             unless (-d $file){
  9603.                 my @stat = stat $file;
  9604.                 my $size = $stat[7];
  9605.                 $tsize += $size;
  9606.                 my $date = scalar localtime ($stat[9]);
  9607.                 $date =~ s/^\s*\w\w\w\s*(.*)/$1/;
  9608.                 s/^(.*[\/\\])*(.*)$/$2/;
  9609.                 push @files, $_;
  9610.                 push @lables, "$_ /$size/ $date";
  9611.             }
  9612.         }
  9613.         $tsize = int($tsize / 1024 * 100) / 100;
  9614.         if (@files == 0){$selectfilelist .=  "\t<OPTION VALUE=\"\">FILE LIST IS EMPTY"}
  9615.         else{
  9616.             @files         = quoteit(@files);
  9617.             @lables        = quoteit(@lables);
  9618.             for (my $j=0; $j<@files; $j++) {
  9619.                 $selectfilelist .= "\t<OPTION VALUE=\"$files[$j]\">$lables[$j]\n"
  9620.             }
  9621.         }
  9622.     }
  9623.     else {
  9624.         $selectfilelist .= qq!<OPTION VALUE="">$chkusrdir\n!;
  9625.         $selectfilelist .= qq?<OPTION VALUE="">$!\n?;
  9626.     }
  9627.     my $exportfile        = '';
  9628.     my $hidden = <<EOT
  9629. <INPUT TYPE=HIDDEN NAME="page"         VALUE="tables">
  9630. <INPUT TYPE=HIDDEN NAME="dbname"     VALUE="$database">
  9631. <INPUT TYPE=HIDDEN NAME="func"         VALUE="$func">
  9632. <INPUT TYPE=HIDDEN NAME="mode"         VALUE="$mode">
  9633. EOT
  9634. ;
  9635.     my $nameheader = uc $func;
  9636.     if ($func =~ /export/i){
  9637.         if (defined $sql){ # Export query result
  9638.             bail_out ("Query is empty", {dbname => $database, page => 'select_db'}) unless $sql;
  9639.             $sql                 = quoteit($sql);
  9640.             $hidden .= qq!<INPUT TYPE=HIDDEN NAME="query"             VALUE="$sql">\n!;
  9641.             my $backhidden = qq!<INPUT TYPE=HIDDEN NAME="dbname"             VALUE="$database">\n!;
  9642.             if (defined $q->param('SQL')){
  9643.                 my $value            = quoteit ($q->param('SQL'));
  9644.                 my $selectedscript    = quoteit ($q->param('selectedscript'));
  9645.                 $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="SQL"             VALUE="$value">\n!;
  9646.                 $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="selectedscript"     VALUE="$selectedscript">\n!;
  9647.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="SQL"             VALUE="$value">\n!;
  9648.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="selectedscript"     VALUE="$selectedscript">\n!;
  9649.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="script"             VALUE="execute">\n!;
  9650.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="page"             VALUE="tables">\n!;
  9651.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="func"             VALUE="script">\n!;
  9652.             }
  9653.             elsif(defined $q->param('select')){
  9654.                 my $param            = backtoselect();
  9655.                 my $concatenate;
  9656.                 foreach (keys %$param){
  9657.                     $concatenate .= $q->hidden(-name=>$_, -value=>$param->{$_}, -override=>1)."\n";
  9658.                 }
  9659.                 $backhidden         .= $concatenate;
  9660.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="func"             VALUE="select">\n!;
  9661.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="page"             VALUE="tables">\n!;
  9662.  
  9663.                 $hidden             .= $concatenate;
  9664.             }
  9665.             elsif (defined $q->param('searchresult')){
  9666.                 my @fields                    = $q->param('fields');
  9667.                 my $concatenate;
  9668.                 foreach ('rows','tables','order','where','start','count'){
  9669.                     $concatenate .= $q->hidden(-name=>$_, -value=>$q->param($_), -override=>1)."\n";
  9670.                 }
  9671.                 $concatenate .= $q->hidden(-name=>"fields", -value=>\@fields, -override=>1)."\n";
  9672.                 $backhidden         .= $concatenate;
  9673.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="func"             VALUE="return">\n!;
  9674.                 $backhidden         .= qq!<INPUT TYPE=HIDDEN NAME="page"             VALUE="searchresult">\n!;
  9675.                 $hidden             .= $concatenate;
  9676.                 $hidden             .= qq!<INPUT TYPE=HIDDEN NAME="searchresult"     VALUE="1">\n!;
  9677.             }
  9678.             
  9679.             print <<EOT
  9680. <TABLE BORDER=0><!-- Header Table -->
  9681. <FORM ACTION=$full_url METHOD=POST>
  9682.     <TR><TH COLSPAN=5 ALIGN=LEFT>$nameheader</TH><TR>
  9683.     <TR>
  9684.         <TD><INPUT TYPE=SUBMIT NAME="" VALUE="BACK" TITLE="Return to previous page"></TD>
  9685.     </TR>
  9686. $backhidden
  9687. </FORM>
  9688. </TABLE><!-- End of Header Table -->
  9689. EOT
  9690. ;
  9691.  
  9692.         }
  9693.         else { # Export the entire table
  9694.             bail_out ("Table is not selected", {dbname => $database, page => 'select_db'}) unless $table;
  9695.             $hidden .= qq!<INPUT TYPE=HIDDEN NAME="tables"     VALUE="$table">\n!;
  9696.             printHeaderTable( {name =>(uc $func), table => "TABLE: $table"} );
  9697.         }
  9698.         my $newformsize        = $agent ? 16 : 27;
  9699.         my $exportintofile1            = $q->radio_group(-name => "exportintofile", -values => ["new"],         labels => {new => ''},        default=>"new", title=>"Check to create new file");
  9700.         my $exportintofile2            = $q->radio_group(-name => "exportintofile", -values => ["existing"],    labels => {existing => ''},    default=>"-", title=>"Check to overwrite an existing file");
  9701.         $exportfile =<<EOT
  9702. $exportintofile1 Create New File <INPUT TYPE=TEXT NAME="newfilename" SIZE=$newformsize TITLE="Type the Name of a new file" 
  9703. onFocus="if(this.value=='NEW FILE NAME')this.value='';" onBlur="if(this.value=='')this.value='NEW FILE NAME';" VALUE="NEW FILE NAME"><BR>        
  9704. $exportintofile2 Overwrite existing file<BR>        
  9705. EOT
  9706. ;        
  9707.     }
  9708.     else { # IMPORT
  9709.         bail_out ("Table is not selected", {dbname => $database, page => 'select_db'}) unless $table;
  9710.         $hidden .= qq!<INPUT TYPE=HIDDEN NAME="tables"     VALUE="$table">\n!;
  9711.         printHeaderTable( {name =>(uc $func), table => "TABLE: $table"} );
  9712.     }
  9713.     
  9714.     $selectfilelist     .= "</SELECT> \n";
  9715.     my $narrowstyle     = qq!style="width: 100;"!;
  9716.     my $buttonstyle1     = qq!style="width: 150;"!;
  9717.     my $buttonstyle2     = qq!style="width: 360;"!;
  9718.     my $finput            = $agent ? 25 : 36;
  9719.     my $advanced;
  9720.     my $setmode;
  9721.     my $colnames        = $q->checkbox(-name => "colnames", -label => '', title=>"Check to include column names into first row");
  9722.     my $ignorekey        = $q->radio_group(-name => "replacekey", -values => ["ignore"],     -label => {ignore => ''},    default=>"-", title=>"Check to ignore input on duplicate Unique Key Values" );
  9723.     my $replacekey        = $q->radio_group(-name => "replacekey", -values => ["replace"],     -label => {replace => ''},    default=>"-", title=>"Check to replace existing row on duplicate Unique Key Values");
  9724.     my $errorkey        = $q->radio_group(-name => "replacekey", -values => ["error"],         -label => {error => ''},    default=>"error", title=>"Check to abort input on duplicate Unique Key Values and get Error message");
  9725. if ($mode =~ /advanced/i){
  9726.         my $ignore = <<EOT
  9727.     <TR>
  9728.         <TD COLSPAN=5 ALIGN=CENTER><P><B>Other Options:</B></TD>
  9729.     </TR>
  9730.     <TR>
  9731.         <TD ALIGN=RIGHT COLSPAN=4><P>Ignore:</TD>
  9732.         <TD><INPUT TYPE=TEXT NAME="ignore" VALUE="" SIZE=4 TITLE="Type number of lines to ignore"> lines</TD>
  9733.     </TR>
  9734.     <TR>
  9735.         <TD ALIGN=RIGHT COLSPAN=4><P>Ignore input on duplicate Unique Key Values:</TD>
  9736.         <TD>$ignorekey</TD>
  9737.     </TR>
  9738.     <TR>
  9739.         <TD ALIGN=RIGHT COLSPAN=4><P>Replace existing row on duplicate Unique Key Values:</TD>
  9740.         <TD>$replacekey</TD>
  9741.     </TR>
  9742.     <TR>
  9743.         <TD ALIGN=RIGHT COLSPAN=4><P>Get error on duplicate Unique Key Values:</TD>
  9744.         <TD>$errorkey</TD>
  9745.     </TR>
  9746. EOT
  9747.         if ($func =~ /import/i);
  9748.         my $fterm     = $q->scrolling_list(
  9749.                                                  -name        => 'fterm',
  9750.                                         -value        => ["\ ", ",", ";", "|", " ", ""],
  9751.                                         -labels        => {"\ "    => 'tab (\\t)',
  9752.                                                         ","        => 'comma',
  9753.                                                         ";"        => 'semicolon',
  9754.                                                         "|"        => 'pipe',
  9755.                                                         " "        => 'space',
  9756.                                                         ""        => ''},
  9757.                                         -size        => 1,
  9758.                                         -default    => "\t",
  9759.                                         -title        => 'Select delimiter'
  9760.                                 );
  9761.         my $fencl     = $q->scrolling_list(
  9762.                                                  -name        => 'fencl',
  9763.                                         -value        => ["", "'", '"'],
  9764.                                         -size        => 1,
  9765.                                         -default    => "",
  9766.                                         -title        => 'Select Enclosed By character'
  9767.                                 );
  9768.         my $fesc     = $q->scrolling_list(
  9769.                                                  -name        => 'fesc',
  9770.                                         -value        => ["\\"],
  9771.                                         -size        => 1,
  9772.                                         -default    => "\\",
  9773.                                         -title        => 'Select Escaped By character'
  9774.                                 );
  9775.         my $lterm     = $q->scrolling_list(
  9776.                                                  -name        => 'lterm',
  9777.                                         -value        => ["\n"],
  9778.                                         -labels        => {"\n"    => 'New Line'},
  9779.                                         -size        => 1,
  9780.                                         -title        => 'Select Lines Terminated By character'
  9781.                                 );
  9782.         my $checktitle1 = 'Check to use another character';
  9783.         my $checktitle2 = 'Type a single character or its numeric entity: &#xxx;.';
  9784.         my $checktitle3 = 'Type other characters or their numeric entity: &#xxx;.';
  9785.         my $charlength = $agent ? 4 : 6;
  9786.         my $fterm1                    = $q->checkbox(-name => 'fterm1', -label => '', title => $checktitle1);
  9787.         my $fterm2                    = $q->textfield(-name => 'fterm2', -size => $charlength, title => $checktitle2);
  9788.         my $fencl1                    = $q->checkbox(-name => 'fencl1', -label => '', title => $checktitle1);
  9789.         my $fencl2                    = $q->textfield(-name => 'fencl2', -size => $charlength, title => $checktitle2);
  9790.         my $fesc1                    = $q->checkbox(-name => 'fesc1', -label => '', title => $checktitle1);
  9791.         my $fesc2                    = $q->textfield(-name => 'fesc2', -size => $charlength, title => $checktitle2);
  9792.         my $lterm1                    = $q->checkbox(-name => 'lterm1', -label => '', title => $checktitle1);
  9793.         my $lterm2                    = $q->textfield(-name => 'lterm2', -size => $charlength, title => $checktitle3);
  9794.         my $optionally                = $q->checkbox(-name => 'optionally', -label => '', title => "If checked, only strings will be enclosed");
  9795.         $advanced = <<EOT
  9796.     <TABLE BORDER=$border>
  9797.         <TR>
  9798.             <TD COLSPAN=5><P><INPUT TYPE=SUBMIT NAME="action" VALUE="$func" $buttonstyle2></TD>
  9799.         </TR>
  9800.         <TR>
  9801.             <TD COLSPAN=5 ALIGN=CENTER><P><B>File Format:</B></TD>
  9802.         </TR>
  9803.         <TR>
  9804.             <TD ALIGN=RIGHT TITLE="Select a delimiter"><P>Fields terminated by:</TD>
  9805.             <TD TITLE="Select a delimiter"><P>
  9806.  
  9807. $fterm</TD>
  9808.             <TD><P>Other $fterm1</TD>
  9809.             <TD><P>$fterm2</TD>
  9810.             <TD><P> </TD>
  9811.         </TR>
  9812.         <TR>
  9813.             <TD ALIGN=RIGHT TITLE="Select Enclosed By character"><P>Fields enclosed by:</TD>
  9814.             <TD TITLE="Select Enclosed By character"><P>
  9815. $fencl</TD>
  9816.             <TD><P>Other $fencl1</TD>
  9817.             <TD><P>$fencl2</TD>
  9818.             <TD><P>$optionally Optionally</TD>
  9819.         </TR>
  9820.         <TR>
  9821.             <TD ALIGN=RIGHT TITLE="Select Escaped By character"><P>Fields escaped by:</TD>
  9822.             <TD TITLE="Select Escaped By character"><P>
  9823. $fesc</TD>
  9824.             <TD><P>Other $fesc1</TD>
  9825.             <TD><P>$fesc2</TD>
  9826.             <TD><P> </TD>
  9827.         </TR>
  9828.         <TR>
  9829.             <TD ALIGN=RIGHT TITLE="Select Lines Terminated By character"><P>Lines terminated by:</TD>
  9830.             <TD TITLE="Select Lines Terminated By character"><P>
  9831. $lterm</TD>
  9832.             <TD><P>Other $lterm1</TD>
  9833.             <TD><P>$lterm2</TD>
  9834.             <TD><P> </TD>
  9835.         </TR>
  9836.  
  9837. $ignore
  9838.  
  9839.     </TABLE>
  9840.  
  9841. EOT
  9842. ;
  9843.     $setmode = <<EOT
  9844.  
  9845.     <TR>
  9846.         <TD ALIGN=RIGHT><P>
  9847. <INPUT TYPE=SUBMIT NAME="" VALUE="Reload Default Values" TITLE="Click to reset all values">
  9848.         </TD>
  9849.         <TD ALIGN=RIGHT><P>
  9850. <INPUT TYPE=SUBMIT NAME="setmode" VALUE="<< Simple (CSV)" style="width: 150;" TITLE="Click to switch to CSV mode">
  9851.         </TD><TD WIDTH=80><P> </TD>
  9852.     </TR>
  9853. EOT
  9854. ;
  9855.     }
  9856.     else {
  9857.         my $ignore = ($func =~ /import/i) ? <<EOT
  9858.     <TR>
  9859.         <TD ALIGN=RIGHT><P>Ignore:</TD>
  9860.         <TD><INPUT TYPE=TEXT NAME="ignore" VALUE="" SIZE=4 TITLE="Type number of lines to ignore"> lines</TD>
  9861.     </TR>
  9862.     <TR>
  9863.         <TD ALIGN=RIGHT><P>Ignore input on duplicate Unique Key Values:</TD>
  9864.         <TD>$ignorekey</TD>
  9865.     </TR>
  9866.     <TR>
  9867.         <TD ALIGN=RIGHT><P>Replace existing row on duplicate Unique Key Values:</TD>
  9868.         <TD>$replacekey</TD>
  9869.     </TR>
  9870.     <TR>
  9871.         <TD ALIGN=RIGHT><P>Get error on duplicate Unique Key Values:</TD>
  9872.         <TD>$errorkey</TD>
  9873.     </TR>
  9874.  
  9875. EOT
  9876. :
  9877.         <<EOT
  9878.         <TR>
  9879.             <TD ALIGN=RIGHT>Include column names:</TD>
  9880.             <TD> $colnames</TD>
  9881.         </TR>
  9882. EOT
  9883. ;
  9884.     my @fterm = (
  9885.         $q->radio_group(-name=>"fterm", -values=>[','], -labels=>{','=>''}, -default=>",", title=>"Check to use comma separated values"),
  9886.         $q->radio_group(-name=>"fterm", -values=>[';'], -labels=>{';'=>''}, -default=>"-", title=>"Check to use semicolon separated values")
  9887.         );
  9888.     
  9889.     $advanced = <<EOT
  9890. <INPUT TYPE=SUBMIT NAME="action" VALUE="$func" $buttonstyle2 TITLE="Click to $func text file">
  9891.     <TABLE BORDER=$border>
  9892.         <TR>
  9893.             <TD COLSPAN=2 ALIGN=CENTER><B>File Format (CSV):</B></TD>
  9894.         </TR>
  9895.         <TR>
  9896.             <TD ALIGN=RIGHT>Comma-separated values:</TD>
  9897.             <TD> $fterm[0]</TD>
  9898.         </TR>
  9899.         <TR>
  9900.             <TD ALIGN=RIGHT>Semicolon-separated values:</TD>
  9901.             <TD> $fterm[1]</TD>
  9902.         </TR>
  9903.         <TR>
  9904.             <TD COLSPAN=2 ALIGN=CENTER><B>Other Options:</B></TD>
  9905.         </TR>
  9906. $ignore
  9907.     </TABLE>
  9908. <INPUT TYPE=HIDDEN NAME="fencl" VALUE=""">
  9909. <INPUT TYPE=HIDDEN NAME="fesc" VALUE=""">
  9910. <INPUT TYPE=HIDDEN NAME="lterm" VALUE="
  9911. ">
  9912.  
  9913. EOT
  9914. ;
  9915.     $setmode = <<EOT
  9916.     <TR>
  9917.         <TD ALIGN=RIGHT><P>
  9918. <INPUT TYPE=SUBMIT NAME="setmode" VALUE="Advanced >>" $buttonstyle1 TITLE="Click to switch to Advanced mode (Mysql compatible text files)">
  9919.         </TD>
  9920.         <TD WIDTH=30></TD>
  9921.     </TR>
  9922. EOT
  9923. ;
  9924.         
  9925.     }
  9926.     print <<EOT
  9927.  
  9928.         <TABLE BORDER=$border>
  9929.             <TR>
  9930.                 <TD>
  9931. <TABLE BORDER=$border>
  9932. $multiform
  9933.         <TR>
  9934.         <TD VALIGN=TOP><P>
  9935. $exportfile
  9936. $selectfilelist
  9937. <BR>
  9938.         <TABLE CELLPADDING=0 CELLSPACING=0 BORDER=$border>
  9939.             <TR>
  9940.                 <TD><P>
  9941.                 <TABLE CELLPADDING=0 CELLSPACING=0 BORDER=$border>
  9942.                     <TR>
  9943.                         <TD><P><INPUT TYPE=SUBMIT NAME="action" VALUE="View/Edit" $narrowstyle TITLE="Click to view/edit selected file"></TD>
  9944.                         <TD><P><INPUT TYPE=SUBMIT NAME="action" VALUE="Delete" $narrowstyle TITLE="Click to delete selected files"></TD>
  9945.                         <TD><P><INPUT TYPE=SUBMIT NAME="action" VALUE="Download" $narrowstyle TITLE="Click to download selected files"></TD>
  9946.                     </TR>
  9947.                 </TABLE></TD>
  9948.                 <TD><P> </TD>
  9949.             </TR>
  9950.         <!--    <TR>
  9951.                 <TD><INPUT TYPE=SUBMIT NAME="action" VALUE="Download" TITLE="Click to download selected files"></TD>
  9952.                 <TD ALIGN=RIGHT><INPUT TYPE=SUBMIT NAME="action" VALUE="Compress" $buttonstyle1 TITLE="Click to compress selected files"></TD>
  9953.                 </TD>
  9954.             </TR> -->
  9955.             <TR>
  9956.                 <TD COLSPAN=2 HEIGHT=6></TD>
  9957.             </TR>
  9958.             <TR>
  9959.                 <TD COLSPAN=2><P><INPUT TYPE=FILE NAME="localfile" SIZE=$finput title="Select file to upload"></TD>
  9960.             </TR>
  9961.             <TR>
  9962.                 <TD><P>
  9963.                 <TABLE CELLPADDING=0 CELLSPACING=0 BORDER=$border WIDTH="100%">
  9964.                     <TR>
  9965.                         <TD><P><INPUT TYPE=CHECKBOX NAME="overwrite" TITLE="Check to overwrite existing file"> Overwrite if exists</TD>
  9966.                         <TD ALIGN=RIGHT><P><INPUT TYPE=SUBMIT NAME="action" VALUE="Upload" $buttonstyle1 TITLE="Click to upload selected file"></TD>
  9967.                     </TR>
  9968.                 </TABLE></TD>
  9969.                 <TD ALIGN=RIGHT><P> </TD>
  9970.             </TR>
  9971.         </TABLE>
  9972.         </TD>
  9973.         <TD> </TD>
  9974.             <TD VALIGN=TOP><P>
  9975. <!-- selecttable -->
  9976. $advanced
  9977.         </TD>
  9978.     </TR>
  9979. $hidden
  9980. </FORM>    
  9981. </TABLE>
  9982.  
  9983.     </TD>
  9984.         </TR>
  9985.         <TR>
  9986.     <TD ALIGN=RIGHT>
  9987.  
  9988. <TABLE BORDER=$border CELLPADDING=0 CELLSPACING=0>
  9989. <FORM METHOD=POST ACTION="$full_url">
  9990. $setmode
  9991. $hidden
  9992. </FORM>
  9993.     
  9994. </TABLE>
  9995.             </TD>
  9996.         </TR>
  9997.     </TABLE>
  9998. EOT
  9999. ;
  10000.     
  10001. }
  10002.  
  10003. sub editfile {
  10004.     my $input = shift;
  10005.     my $path    = $input->{path};
  10006.     my $back    = $input->{back};
  10007.     my $errmsg = '';
  10008.     my @files = $q->param('selectfilelist');
  10009.     if ($q->param('save')){
  10010.         open FH, ">$path$delim$files[0]" or $errmsg = qq?<font color="#ff0000">Could not open file $files[0]. $!</font>?;
  10011.         flock (FH,2) unless $WIN32;
  10012.         print FH $q->param('filebody');
  10013.         flock (FH,8) unless $WIN32;
  10014.         close FH;
  10015.     }
  10016.     elsif($q->param('saveas')){
  10017.         my $filename = $q->param('filename');
  10018.         if (!$q->param('overwrite') and -e "$path$delim$filename"){
  10019.             $errmsg = qq!<font color="#ff0000">File <b>$filename</b> already exists</font>!;
  10020.         }
  10021.         else {
  10022.             open FH, ">$path$delim$filename" or $errmsg = qq?<font color="#ff0000">Could not open File $filename. $!</font>?;
  10023.             flock (FH,2) unless $WIN32;
  10024.             print FH $q->param('filebody');
  10025.             flock (FH,8) unless $WIN32;
  10026.             close FH;
  10027.         }
  10028.         $files[0] = $filename;
  10029.     }
  10030.     elsif ($q->param('back')){
  10031.         return 0;
  10032.     }
  10033.     else{
  10034.         unless ($input->{new}){
  10035.             if(!-f $path.$delim.$files[0]){
  10036.                 return "Selected file does not seem to be editable";
  10037.             }
  10038.         }
  10039.     }
  10040.     my $file;
  10041.     if ($q->param('action') =~ /view\/edit/i or $q->param('reload')){
  10042.         $file = "";
  10043.         open FH, "$path$delim$files[0]" or return("Cannot open $files[0]");
  10044.         flock (FH,2) unless $WIN32;
  10045.         while (<FH>){
  10046.             $file .= $_
  10047.         }
  10048.         flock (FH,8) unless $WIN32;
  10049.         close FH;
  10050.     }
  10051.     else {$file = $q->param('filebody')}
  10052.     $file = quoteit($file);
  10053.     my ($wrap, $checked_on, $checked_off);
  10054.     if ($q->param('wrap') eq 'on'){
  10055.         $wrap = "wrap=virtual";
  10056.         $checked_on = "checked";
  10057.         $checked_off = "";
  10058.     }
  10059.     else {
  10060.         $wrap = "wrap=off";
  10061.         $checked_on = "";
  10062.         $checked_off = "checked";
  10063.     }
  10064.     my ($cols, $rows);
  10065.     if ($q->param('resize')){
  10066.         ($cols, $rows) = ($q->param('cols_'),$q->param('rows_'));
  10067.     }
  10068.     else {
  10069.         unless (($cols, $rows) = ($q->param('cols_h'),$q->param('rows_h'))){
  10070.             ($cols, $rows) = $agent ? (80, 25) : (150, 25)
  10071.         }
  10072.     }
  10073.     my $func = $q->param('func');
  10074.     my $hiddenback;
  10075.     foreach (keys %$back){
  10076.         $hiddenback .= $q->hidden(-name=>$_, -value=>$back->{$_}, -override=>1)."\n";
  10077.     }
  10078.     print <<EOT
  10079. <form action="$full_url" method=post>
  10080. <table border=0 cellpadding=0 cellspacing=0>
  10081.     <tr height=6>
  10082.         <td colspan=7><p>
  10083.         <table  border=0 cellpadding=0 cellspacing=0>
  10084.             <tr>
  10085.                 <td><input type=submit name="save" value="Save" title="Click to save changes" style="width: 100px"></td>
  10086.                 <td><p><input type=submit name="saveas" value="Save as" title="Click to save as another file" style="width: 100px"></td>
  10087.                 <td><p> </td>
  10088.                 <td><p><input type=text name="filename" title="Type a file name to save as"></td>
  10089.                 <td><p><input type=checkbox name="overwrite" title="Check to overwrite if file name already exists"></td>
  10090.                 <td><p>Overwrite if exists</td>
  10091.             </tr>
  10092.         </table>
  10093.         </td>
  10094.         <td colspan=3 align=right><p><input type=submit name="back" value="Close" title="Click to return back. All changes will be lost" style="width: 100"></td>
  10095.     </tr>
  10096.     <tr height=6>
  10097.         <td colspan=10 ><p>
  10098.             <table  border=0 cellpadding=2 cellspacing=2>
  10099.                 <tr>
  10100.                     <td height=14><p>$errmsg</td>
  10101.                 </tr>
  10102.             </table>
  10103.         </td>
  10104.     </tr>
  10105.     <tr valign=center>
  10106.         <td><p>
  10107.         <table  border=0 cellpadding=0 cellspacing=0>
  10108.             <tr>
  10109.                 <td><p><input type=submit name="reload" value="Reload File" title="Click to reload file. All changes will be lost" style="width: 100"></td>
  10110.                 <td><p><input type=reset style="width: 100"></td>
  10111.             </tr>
  10112.         </table>
  10113.         </td>
  10114.         <td width=60> </td>
  10115.         <td>Wrap text</td>
  10116.         <td><input type=radio name="wrap" value="on" onClick="this.form.submit()" $checked_on title="Check to wrap text"><nobr> on </nobr></td>
  10117.         <td><input type=radio name="wrap" value="off" onClick="this.form.submit()" $checked_off title="Check to unwrap text"><nobr> off</nobr></td>
  10118.         <td width=10> </td>
  10119.         <td>Cols <input type=text name="cols_" value="$cols" size=3 title="Define area width"></td>
  10120.         <td width=2> </td>
  10121.         <td>Rows <input type=text name="rows_" value="$rows" size=3 title="Define area height"></td>
  10122.         <td><input type=submit name="resize" value="Resize" title="Click to apply new area dimensions" style="width: 100"></td>
  10123.     </tr>
  10124. </table>
  10125. <br>
  10126. <textarea name="filebody" cols=$cols rows=$rows $wrap title="Edit file">$file</textarea><p>
  10127. FILE NAME: <b>$files[0]</b><br>
  10128. <input type=hidden name="path" value="$path">
  10129. <input type=hidden name="edit" value="continue">
  10130. <input type=hidden name="selectfilelist" value="$files[0]">
  10131. <input type=hidden name="cols_h" value="$cols">
  10132. <input type=hidden name="rows_h" value="$rows">
  10133. <input type=hidden name="action" value="edit">
  10134. $hiddenback
  10135. </form>
  10136. EOT
  10137. ;
  10138.     return undef;
  10139. }
  10140. sub deletefiles {    
  10141.     my $input     = shift;
  10142.     my $path     = $input->{path};
  10143.     my $back    = $input->{back};
  10144.     my @filestodelete = $q->param('selectfilelist');
  10145.     return 0 if $q->param('cancel');
  10146.     unless ($q->param('deleteconfirm')) {
  10147.         my $func = $q->param('func');
  10148.         print qq!<FORM ACTION="$full_url" METHOD=POST>!;
  10149.         print qq!<BR><P TITLE="List of files to be deleted"><B>THESE FILES WILL BE DELETED:</B></P>\n!;
  10150.         foreach (@filestodelete){
  10151.             $_ = quoteit($_);
  10152.             print qq!<INPUT TYPE=CHECKBOX NAME="selectfilelist" VALUE="$_" CHECKED TITLE="Uncheck to keep this file"> $_ <BR>\n!;
  10153.         }
  10154.         my $hiddenback;
  10155.         foreach (keys %$back){
  10156.             $hiddenback .= $q->hidden(-name=>$_, -value=>$back->{$_}, -override=>1)."\n";
  10157.         }
  10158.         print <<EOT
  10159. <BR><INPUT TYPE=SUBMIT NAME="deleteconfirm" VALUE="DELETE" TITLE="Delete selected files"> 
  10160. <INPUT TYPE=SUBMIT NAME="cancel" VALUE="CANCEL" TITLE="Go back to previous page without deletion">
  10161. <INPUT TYPE=HIDDEN NAME="delete" VALUE="1">
  10162. <INPUT TYPE=HIDDEN NAME="action" VALUE="delete">
  10163. $hiddenback
  10164. </FORM>
  10165. EOT
  10166. ;
  10167.  
  10168.         return undef;            
  10169.     }
  10170.     else {
  10171.         my $errmsg = '';
  10172.         foreach (@filestodelete){
  10173.             my $file = "$path$delim$_";
  10174.             $errmsg .= "Could not unlink $_ : $!\n" unless unlink ($file);
  10175.         }
  10176.         return $errmsg 
  10177.     }
  10178. }
  10179. sub loadBackup{
  10180.     if ($q->param('back')){loadSelectTables(); return}
  10181.     elsif($q->param('backup')){&execBackup()}
  10182.     elsif($q->param('restore')){&loadRestore(); return}
  10183.  
  10184.     my @databases;
  10185.     my $selectdbname_   = $q->param('selectdbname_');
  10186.     $selectdbname_  = $database unless $selectdbname_;
  10187.     my $databasesref = getdblist($dbh);
  10188.     my $selectDBlist;
  10189.     if ($DBI::err and !$database){
  10190.         $selectDBlist = $q->scrolling_list(
  10191.                         -name   =>'selectdbname_',
  10192.                          -labels    =>{'' => 'ACCESS DENIED'},
  10193.                            -values =>[''],
  10194.                         -size   =>1,
  10195.                     );
  10196.     }
  10197.     else {
  10198.         @databases = @$databasesref;
  10199.         push @databases,'' unless $selectdbname_;                    
  10200.         $selectDBlist = $q->scrolling_list(
  10201.                         -default=>[$database],
  10202.                         -name=>'selectdbname_',
  10203.                         -values=>[@databases],
  10204.                         -size=>1,
  10205.                         -onChange=>'this.form.submit()'
  10206.                     );
  10207.     }
  10208.     my $downloadcheck     = 'CHECKED' if $q->param('downloadBackup');
  10209.     my $keepcheck         = 'CHECKED' if ($q->param('keep') or (!$q->param('downloadBackup') and !$q->param('keep')));
  10210.     my $dropcheck         = 'CHECKED' if $q->param('dropifexists');
  10211.     my ($bothcheck, $structurecheck, $datacheck);
  10212.     if ($q->param('include') eq 'structure'){$structurecheck = 'CHECKED'}
  10213.     elsif ($q->param('include') eq 'data'){$datacheck  = 'CHECKED'}
  10214.     else {$bothcheck = 'CHECKED'}
  10215.     my  $buttonwidth     = '110px';
  10216.     my  $buttonwidth2     =  ($buttonwidth * 2) + 15;
  10217.     my $filenamestyle    = "style= 'width: $buttonwidth2"."px'";
  10218.     my $remotefile;
  10219.     if ($q->param('suggest')) {
  10220.         my $back                    = {page => "$page"};
  10221.         $back->{dbname}                = "$database" if $database;
  10222.         $back->{selectdbname_}        = "$selectdbname_" if $selectdbname_;
  10223.         my $userhost                = myhost();
  10224.         if (my $errmsg = checkuserdir('backup')){bail_out("$errmsg\n$!", $back)}
  10225.         my $userdir                 = "$USER_DIR$delim$user.$userhost$delim" . "backup";
  10226.     
  10227.     
  10228.         bail_out("Select a database first") unless ($selectdbname_);
  10229.         my @files = ();
  10230.         opendir DIR, $userdir; 
  10231.         my @filenames    = readdir (DIR) or print "Cannot read this directory: $userdir<br>";
  10232.         closedir DIR;
  10233.         my $n = 0;
  10234.         for (@filenames){
  10235.             next if (($_ eq '.') or ($_ eq '..'));
  10236.             s/^(.*\/)*(.*)$/$2/;
  10237.             if (/^(.+)(\.[a-zA-Z]*)$/){push @files, $1}
  10238.             else {push @files, $_}
  10239.         }
  10240.         $remotefile = "$user.$userhost.$selectdbname_.0";        
  10241.         for (0..$#files){
  10242.             if (belongs(\@files, $remotefile)){
  10243.                 $n++;
  10244.                 $remotefile = "$user.$userhost.$selectdbname_.$n";
  10245.             }
  10246.         }
  10247.     }
  10248.     my $tablelist = qq!\n<SELECT NAME="tablelist" SIZE=13 MULTIPLE>\n!;
  10249.     my $tablelistref;
  10250.     if ($selectdbname_) {
  10251.         $tablelistref = $dbh->selectcol_arrayref("SHOW TABLES FROM $selectdbname_");
  10252.         if (! defined $tablelistref ) {
  10253.             if ($DBI::err){
  10254.                 if ($DBI::errstr =~ /access/i){
  10255.                     $tablelist .= qq!<OPTION VALUE="">ACCESS DENIED\n!;
  10256.                 }
  10257.                 else{
  10258.                     $tablelist .= qq!<OPTION VALUE="">CANNOT SHOW TABLES\n!;
  10259.                     $tablelist .= qq!<OPTION VALUE="">Check database name\n!;
  10260.                 }
  10261.             }
  10262.             else {$tablelist .= qq!<OPTION VALUE="">CANNOT SHOW TABLES\n!}
  10263.         }
  10264.         elsif (@$tablelistref == 0){
  10265.             $tablelist .= qq!<OPTION VALUE="">Table list is empty\n!;
  10266.         }
  10267.         else{
  10268.             my @tblist = $q->param('tablelist');
  10269.             foreach (@$tablelistref){
  10270.                 my $selected = 'SELECTED' if belongs(\@tblist, $_);
  10271.                 $tablelist .= qq!<OPTION VALUE="$_" $selected>$_!
  10272.             }
  10273.         }
  10274.     }
  10275.     else {
  10276.         $tablelist .= qq!<OPTION VALUE="">SELECT DATABASE\n!;
  10277.     }
  10278.     $tablelist .= "</SELECT>\n";
  10279.     my $textsize         = $agent ? 21 : 36 ;
  10280.     my $gzipchecked     = 'CHECKED' if (($q->param('type') eq 'gzip') or  !$q->param('type'));
  10281.     my $zipchecked         = 'CHECKED' if ($q->param('type') eq 'zip');
  10282.     
  10283.     my $zipselect         = qq!<INPUT TYPE=RADIO NAME="type" VALUE="zip" $zipchecked TITLE="Select to create compressed backup file (ZIP format)"><I>zip</I>! if $ALLOW_ZIP;
  10284.     my $targzselect     = qq!<INPUT TYPE=RADIO NAME="type" VALUE="gzip" $gzipchecked TITLE="Select to create compressed backup file (GZIP format)"><I>gzip</I>! if $ALLOW_GZIP;
  10285.     my $textchecked     = 'CHECKED' if ((!$ALLOW_GZIP and !$q->param('type')) or ($q->param('type') eq 'text'));
  10286.     my $selectallcheck     = 'CHECKED' if $q->param('selectalltables');
  10287.  
  10288.     print <<EOT
  10289. <FORM METHOD=POST ACTION="$full_url">
  10290. <TABLE BORDER=0>
  10291.     <TR><TH ALIGN=LEFT COLSPAN=3>CREATE BACKUP</TH></TR>
  10292.     <TR><TD VALIGN=TOP>
  10293. <!-- BACKUP CONTROL PANEL -->
  10294. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA"   WIDTH=240><!-- BORDER START -->
  10295.             <TR>
  10296.                 <TD width="100%">
  10297. <TABLE WIDTH="100%" BORDER=0 CELLPADDING=3 CELLSPACING=0 BGCOLOR="#AAAAAA" >
  10298.     <TR><TD BGCOLOR="#CCCCCC"><INPUT TYPE=CHECKBOX NAME="downloadBackup" $downloadcheck TITLE="Download created backup file"> Download 
  10299.             <INPUT TYPE=CHECKBOX NAME="keep" $keepcheck TITLE="Save created backup file on the server"> Save</TD>
  10300.     </TR>
  10301.     <TR>
  10302.         <TD BGCOLOR="#CCCCCC"><INPUT TYPE=CHECKBOX NAME="dropifexists" $dropcheck TITLE="Include SQL query 'DROP TABLE IF EXISTS tablename' for each table into backup "> Add 'DROP TABLE'</TD>
  10303.     </TR>
  10304.     <TR>
  10305.         <TD BGCOLOR="#CCCCCC">Include: <INPUT TYPE=RADIO NAME="include" VALUE="structure" $structurecheck TITLE="Include only 'CREATE TABLE...' SQL query into backup"
  10306.         ><I>Structure</I><INPUT TYPE=RADIO NAME="include" VALUE="data" $datacheck TITLE="Include only 'INSERT INTO TABLE...' SQL query into backup"
  10307.         ><I>Data</I><INPUT TYPE=RADIO NAME="include" VALUE="both" $bothcheck TITLE="Include both 'CREATE TABLE...' and 'INSERT INTO TABLE ... ' SQL queries into backup"><I>Both</I></TD>
  10308.     </TR>
  10309.     <TR>
  10310.         <TD BGCOLOR="#CCCCCC"><P><INPUT TYPE=SUBMIT NAME="suggest" VALUE="Suggest output file name"   style="width: $buttonwidth2" TITLE="Ask the program to propose an appropriate name for backup file"><BR>
  10311.         <INPUT TYPE=TEXT NAME="remotefile" VALUE="$remotefile" SIZE=$textsize TITLE="Type name of backup file" $filenamestyle></TD>
  10312.     </TR>
  10313.     <TR>
  10314.         <TD BGCOLOR="#CCCCCC">Type: $zipselect $targzselect <INPUT TYPE=RADIO NAME="type" VALUE="text" $textchecked TITLE="Select to create plain text backup file"><I>text</I> </TD>
  10315.     </TR>
  10316.     <TR>
  10317.         <TD BGCOLOR="#CCCCCC" ><INPUT TYPE=SUBMIT NAME="backup" VALUE="CREATE BACKUP FILE"  style="width: $buttonwidth2" TITLE="Create backup file"></TD>
  10318.     </TR>
  10319.     <TR>
  10320.         <TD BGCOLOR="#CCCCCC"><INPUT TYPE=SUBMIT NAME="restore" VALUE="        SELECT FILE       "  style="width: $buttonwidth2" TITLE="Backup file manager"></TD>
  10321.     </TR>
  10322. </TABLE>
  10323.                 </TD></TR><!-- BORDER END -->
  10324. </TABLE>
  10325.  
  10326. <!-- END BACKUP CONTROL PANEL -->
  10327. </TD>
  10328. <TD> </TD>
  10329. <TD VALIGN=TOP>
  10330.  
  10331. <!-- SELECT DATABASE AND TABLE  -->
  10332.  
  10333. <TABLE BORDER=0 CELLPADDING=1 CELLSPACING=0 BGCOLOR="#AAAAAA" >
  10334.             <TR>
  10335.                 <TD width="100%"><!-- BORDER START -->
  10336.  
  10337. <TABLE WIDTH=200 BORDER=0 CELLPADDING=4 CELLSPACING=0 BGCOLOR="#AAAAAA">
  10338.     <TR>
  10339.         <TD BGCOLOR="#CCCCCC" TITLE="Databases available on this server">SELECT DATABASE:
  10340. <BR><nobr>$selectDBlist <INPUT TYPE=SUBMIT VALUE="<-" TITLE="Show tables in selected database"></nobr></TD>
  10341.         
  10342.     </TR>
  10343.     <TR>
  10344.         <TD BGCOLOR="#CCCCCC" TITLE="Select tables to backup">SELECT TABLE:<BR>
  10345. $tablelist
  10346.         </TD>
  10347.     </TR>
  10348.     <TR>
  10349.         <TD BGCOLOR="#CCCCCC" TITLE="Select all tables"><INPUT TYPE=CHECKBOX NAME="selectalltables" $selectallcheck TITLE="Select all tables"> SELECT ALL TABLES</TD>
  10350.     </TR>
  10351. </TABLE>
  10352.                 
  10353.                 </TD><!-- BORDER END -->
  10354.             </TR>
  10355. </TABLE>
  10356.  
  10357. <!-- END SELECT DATABASE AND TABLE -->
  10358.  
  10359. </TD></TR></TABLE>
  10360. <INPUT TYPE=HIDDEN NAME="page" VALUE="$page">
  10361. <INPUT TYPE=HIDDEN NAME="func" VALUE="backup">
  10362. <INPUT TYPE=HIDDEN NAME="dbname" VALUE="$database">
  10363. </FORM>
  10364.  
  10365. EOT
  10366. ;
  10367.  
  10368.  
  10369. }
  10370. sub dirsize {
  10371.     my $dir = shift;
  10372.     my $size = 0;
  10373.     opendir DIR, $dir; 
  10374.     my @filenames    = readdir (DIR); # or print "Cannot read this directory: $dir<br>";
  10375.     closedir DIR;
  10376.      foreach (@filenames){
  10377.         next if (($_ eq '.') or ($_ eq '..'));
  10378.         my $file  = "$dir$delim$_";
  10379.         unless (-d $file){
  10380.             $size += -s _;
  10381.         }
  10382.     }#foreach
  10383.     return $size
  10384. }
  10385. sub get_mysql_pri {
  10386.     my $sth = shift @_;
  10387.     my $pri;
  10388.     if (eval {local $SIG{__DIE__};  $pri = $sth->{mysql_is_pri_key}}) {
  10389.         return $pri
  10390.     }
  10391.     else {return $sth->{is_pri_key}}
  10392. }
  10393. sub get_mysql_length {
  10394.     my $sth = shift @_;
  10395.     my $len;
  10396.     if (eval {local $SIG{__DIE__};  $len = $sth->{mysql_is_pri_key}}) {
  10397.         return $len
  10398.     }
  10399.     else {return $sth->{is_pri_key}}
  10400. }
  10401. sub get_mysql_max_lendth {
  10402.     my $sth = shift @_;
  10403.     my $len;
  10404.     if (eval {local $SIG{__DIE__};  $len = $sth->{mysql_max_length}}) {
  10405.         return $len
  10406.     }
  10407.     else {return $sth->{max_length}}
  10408. }
  10409. sub checkfilename {
  10410.     my $filename    = $_[0];
  10411.     my $back        = $_[1];
  10412.     if ($filename =~ /[\/\\:\*\?"<>\|]/){bail_out("A filename cannot contain any of the following characters",$back)}
  10413.     if ($filename =~ /(\.\.)/){bail_out("File name is incorrect", $back)}
  10414.     return
  10415. }
  10416. sub deletespace {
  10417.     my $var = shift;
  10418.     $var =~ s/^\s*(.*)$/$1/m;
  10419.     $var =~ s/^(.*?)\s*$/$1/s;
  10420.     return $var;
  10421. }
  10422. print "<H1>There is no data<H1>";
  10423. exit 0;
  10424.  
  10425. #++++++++++++++++++++++++++++++++++++++
  10426.