Show
Ignore:
Timestamp:
05/11/08 20:24:34 (4 years ago)
Author:
dom
Message:

Refactor database setup code to support setting up old schema versions and
add wiki_info method to TestLib?, both to facilitiate automated schema upgrade
testing.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • wiki-toolkit/trunk/lib/Wiki/Toolkit/Setup/SQLite.pm

    r431 r437  
    1313use Carp; 
    1414 
    15 my %create_sql = ( 
    16     schema_info => " 
     15my $SCHEMA_VERSION = $VERSION*100; 
     16 
     17my $create_sql = { 
     18    9 => { 
     19        schema_info => [ qq| 
    1720CREATE TABLE schema_info ( 
    1821  version   integer      NOT NULL default 0 
    1922); 
    20 ", 
    21  
    22     node => " 
     23|, qq| 
     24INSERT INTO schema_info VALUES (9) 
     25| ], 
     26 
     27        node => [ qq| 
    2328CREATE TABLE node ( 
    2429  id        integer      NOT NULL PRIMARY KEY AUTOINCREMENT, 
     
    2934  moderate  boolean      NOT NULL default '0' 
    3035) 
    31 ", 
    32     content => " 
     36| ], 
     37        content => [ qq| 
    3338CREATE TABLE content ( 
    3439  node_id   integer      NOT NULL, 
     
    4045  PRIMARY KEY (node_id, version) 
    4146) 
    42 ", 
    43     internal_links => " 
     47| ], 
     48        internal_links => [ qq| 
    4449CREATE TABLE internal_links ( 
    4550  link_from varchar(200) NOT NULL default '', 
     
    4752  PRIMARY KEY (link_from, link_to) 
    4853) 
    49 ", 
    50     metadata => " 
     54| ], 
     55        metadata => [ qq| 
    5156CREATE TABLE metadata ( 
    5257  node_id        integer      NOT NULL, 
     
    5560  metadata_value mediumtext   NOT NULL DEFAULT '' 
    5661) 
    57 " 
    58 ); 
     62| ] 
     63    }, 
     64}; 
    5965 
    6066=head1 NAME 
     
    94100again with a fresh database, run C<cleardb> first. 
    95101 
     102An optional second argument may be passed specifying the schema version 
     103to use; this is B<ONLY> intended to be used during unit testing and should 
     104not normally be specified. 
     105 
    96106=cut 
    97107 
     
    100110    my $dbh = _get_dbh( @args ); 
    101111    my $disconnect_required = _disconnect_required( @args ); 
     112    my $wanted_schema = _get_wanted_schema( @args ) || $SCHEMA_VERSION; 
    102113 
    103114    # Check whether tables exist, set them up if not. 
     
    109120    my @cur_data;  
    110121    if(scalar keys %tables > 0) { 
    111         $upgrade_schema = Wiki::Toolkit::Setup::Database::get_database_upgrade_required($dbh,$VERSION); 
     122        $upgrade_schema = Wiki::Toolkit::Setup::Database::get_database_upgrade_required($dbh,$wanted_schema); 
    112123    } 
    113124    if($upgrade_schema) { 
     
    124135 
    125136    # Set up tables if not found 
    126     foreach my $required ( keys %create_sql ) { 
     137    foreach my $required ( keys %{$create_sql->{$SCHEMA_VERSION}} ) { 
    127138        if ( $tables{$required} ) { 
    128139            print "Table $required already exists... skipping...\n"; 
    129140        } else { 
    130141            print "Creating table $required... done\n"; 
    131             $dbh->do($create_sql{$required}) or croak $dbh->errstr; 
     142            foreach my $sql (@{$create_sql->{$SCHEMA_VERSION}->{$required}} ) { 
     143                $dbh->do($sql) or croak $dbh->errstr; 
     144            } 
    132145        } 
    133146    } 
    134  
    135     # Schema version 
    136     $dbh->do("DELETE FROM schema_info"); 
    137     $dbh->do("INSERT INTO schema_info VALUES (". ($VERSION*100) .")"); 
    138147 
    139148    # If upgrading, load in the new data 
     
    153162    my $sql = "SELECT name FROM sqlite_master 
    154163               WHERE type='table' AND name in (" 
    155             . join( ",", map { $dbh->quote($_) } keys %create_sql ) . ")"; 
     164            . join( ",", map { $dbh->quote($_) } keys %{$create_sql->{$SCHEMA_VERSION}} ) . ")"; 
    156165    my $sth = $dbh->prepare($sql) or croak $dbh->errstr; 
    157166    $sth->execute; 
     
    195204    my $sql = "SELECT name FROM sqlite_master 
    196205               WHERE type='table' AND name in (" 
    197             . join( ",", map { $dbh->quote($_) } keys %create_sql ) . ")"; 
     206            . join( ",", map { $dbh->quote($_) } keys %{$create_sql->{$SCHEMA_VERSION}} ) . ")"; 
    198207    foreach my $tableref (@{$dbh->selectall_arrayref($sql)}) { 
    199208        $dbh->do("DROP TABLE $tableref->[0]") or croak $dbh->errstr; 
     
    216225        if ( $args{dbh} ) { 
    217226            return $args{dbh}; 
    218     } else { 
     227        } else { 
    219228            return _make_dbh( %args ); 
    220229        } 
     
    223232    # Args passed as list of connection details. 
    224233    return _make_dbh( dbname => $_[0] ); 
     234} 
     235 
     236sub _get_wanted_schema { 
     237    # Database handle passed in. 
     238    if ( ref $_[0] and ref $_[0] eq 'DBI::db' ) { 
     239        return undef; 
     240    } 
     241 
     242    # Args passed as hashref. 
     243    if ( ref $_[0] and ref $_[0] eq 'HASH' ) { 
     244        my %args = %{$_[0]}; 
     245        return $args{wanted_schema}; 
     246    } 
     247 
     248    # Args passed as list of connection details. 
     249    return $_[1]; 
    225250} 
    226251 
     
    236261        if ( $args{dbh} ) { 
    237262            return 0; 
    238     } else { 
     263        } else { 
    239264            return 1; 
    240265        }