#!/usr/bin/perl

# Convert given tables in a database to MYISAM

use DBI;
use Getopt::Long;

$opt_help=$opt_version=$opt_verbose=$opt_force=0;
$opt_user=$opt_database=$opt_password=undef;
$opt_host="localhost";
$opt_socket="";
$opt_type="MYISAM";
$opt_port=0;
$exit_status=0;

GetOptions("force","help","host=s","password=s","user=s","type=s","verbose","version","socket=s", "port=i") || 
  usage(0);
usage($opt_version) if ($#ARGV < 0 || $opt_help || $opt_version);
$opt_database=shift(@ARGV);

if (uc($opt_type) eq "HEAP")
{
  print "Converting to type HEAP would delete your tables; aborting\n";
  exit(1);
}

$connect_opt="";
if ($opt_port)
{
  $connect_opt.= ";port=$opt_port";
}
if (length($opt_socket))
{
  $connect_opt.=";mysql_socket=$opt_socket";
}

$dbh = DBI->connect("DBI:mysql:$opt_database:${opt_host}$connect_opt",
		    $opt_user,
		    $opt_password,
		    { PrintError => 0})
  || die "Can't connect to database $opt_database: $DBI::errstr\n";

if ($#ARGV < 0)
{
  # Fetch all table names from the database
  my ($sth,$row);
  $sth=$dbh->prepare("show tables");
  $sth->execute || die "Can't get tables from $opt_database; $DBI::errstr\n";
  while (($row = $sth->fetchrow_arrayref))
  {
    push(@ARGV,$row->[0]);
  }
  $sth->finish;
}

print "Converting tables:\n" if ($opt_verbose);
foreach $table (@ARGV)
{
  my ($sth,$row);

  # Check if table is already converted
  $sth=$dbh->prepare("show table status like '$table'");  
  if ($sth->execute && ($row = $sth->fetchrow_arrayref))
  {
    if (uc($row->[1]) eq uc($opt_type))
    {
      print "$table is already of type $opt_type;  Ignored\n";
      next;
    }
  }
  print "converting $table\n" if ($opt_verbose);
  if (!$dbh->do("ALTER TABLE $table type=$opt_type"))
  {
    print STDERR "Can't convert $table: Error $DBI::errstr\n";
    exit(1) if (!$opt_force);
    $exit_status=1;
  }
}

$dbh->disconnect;
exit($exit_status);


sub usage
{
  my($version)=shift;
  print "$0  version 1.1\n";
  exit(0) if ($version);

  print <<EOF;

Conversion of a MySQL tables to other table types.

 Usage: $0 database [tables]
 If no tables has been specifed, all tables in the database will be converted.

 The following options are available:

--force
  Continue even if there is some error.

--help or --Information
  Shows this help

--host='host name' (Default $opt_host)
  Host name where the database server is located.

--password='password'
  Password for the current user.

--port=port
  TCP/IP port to connect to if host is not "localhost".

--socket='/path/to/socket'
  Socket to connect with.

--type='table-type'
  Converts tables to the given table type (Default: $opt_type)
  MySQL 3.23 supports at least the BDB, ISAM and MYISAM types.

--user='user_name'
  User name to log into the SQL server.

--verbose
  This is a test specific option that is only used when debugging a test.
  Print more information about what is going on.

--version
  Shows the version of this program.
EOF
  exit(1);
}
