On Mon, Jul 19, 2004 at 10:19:47AM +0100, Tony Bowden wrote:
> On Mon, Jul 19, 2004 at 03:22:05AM -0400, Michael G Schwern wrote:
> > > The two "best" ideas we've had so far are to either run the SQL in the
> > > code against a temporary database, and then compare both SHOW CREATE
> > > TABLE outputs, or to use something like SQL::Translator to convert both
> > > lots of SQL to a common format. Both seem much too cumbersome, however.
> > > Anyone have any brighter ideas?
> > Don't use a temporary database, just a temporary table.
> 
> Surely that's more work?

Doesn't really matter how much code it is as long as you throw it into
a function.  Its certainly less permissions to worry about (don't need
perms to create a whole new database).

sub _ck_schema {
    my $schema = shift;

    (my $temp_schema = $schema) =~ 
        s/CREATE TABLE (\w+)/CREATE TEMPORARY TABLE _chk_$1/;

    my $table = $1;
    my $temp_table = "_chk_$table";

    $dbh->do($temp_schema);
    my $temp_layout = $dbh->selectrow_array("SHOW CREATE TABLE $temp_table");
    my $orig_layout = $dbh->selectrow_array('SHOW CREATE TABLE $table');
    $orig_layout =~
        s/CREATE TABLE $table/CREATE TEMPORARY TABLE $temp_table/; 

    return is( $temp_layout, $orig_layout );
}

Something like that.  You don't drop the temp table at the end because
MySQL doesn't make a distinction, permissions-wise, between dropping a
temp table and a real table until 4.1.  Closing the connection will clean
up the table.


-- 
Michael G Schwern        [EMAIL PROTECTED]  http://www.pobox.com/~schwern/
Any sufficiently encapsulated hack is no longer a hack.

Reply via email to