Changeset 437
- Timestamp:
- 05/11/08 20:24:34 (4 years ago)
- Location:
- wiki-toolkit/trunk/lib/Wiki/Toolkit
- Files:
-
- 5 modified
-
Setup/Database.pm (modified) (2 diffs)
-
Setup/MySQL.pm (modified) (11 diffs)
-
Setup/Pg.pm (modified) (10 diffs)
-
Setup/SQLite.pm (modified) (14 diffs)
-
TestLib.pm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
wiki-toolkit/trunk/lib/Wiki/Toolkit/Setup/Database.pm
r431 r437 188 188 # Is an upgrade to the database required? 189 189 sub get_database_upgrade_required { 190 my ($dbh,$ VERSION) = @_;190 my ($dbh,$new_version) = @_; 191 191 192 192 # Get the schema version … … 194 194 195 195 # Compare it 196 my $new_ver = $VERSION * 100; 197 if($schema_version eq $new_ver) { 196 if($schema_version eq $new_version) { 198 197 # At latest version 199 198 return undef; 199 } elsif ($schema_version eq 'old' or $schema_version < $new_version) { 200 return $schema_version."_to_".$new_version; 200 201 } else { 201 return $schema_version."_to_".$new_ver;202 die "Aiee! We seem to be trying to downgrade the database schema from $schema_version to $new_version. Aborting.\n"; 202 203 } 203 204 } -
wiki-toolkit/trunk/lib/Wiki/Toolkit/Setup/MySQL.pm
r432 r437 13 13 use Carp; 14 14 15 my %create_sql = ( 16 schema_info => [ qq| 15 my $SCHEMA_VERSION = $VERSION*100; 16 17 my $create_sql = { 18 9 => { 19 schema_info => [ qq| 17 20 CREATE TABLE schema_info ( 18 21 version int(10) NOT NULL default 0 19 22 ) 20 23 |, qq| 21 INSERT INTO schema_info VALUES ( |.($VERSION*100).qq|)24 INSERT INTO schema_info VALUES (9) 22 25 | ], 23 26 24 node => [ qq|27 node => [ qq| 25 28 CREATE TABLE node ( 26 29 id integer NOT NULL AUTO_INCREMENT, … … 34 37 | ], 35 38 36 content => [ qq|39 content => [ qq| 37 40 CREATE TABLE content ( 38 41 node_id integer NOT NULL, … … 45 48 ) 46 49 | ], 47 internal_links => [ qq|50 internal_links => [ qq| 48 51 CREATE TABLE internal_links ( 49 52 link_from varchar(200) NOT NULL default '', … … 52 55 ) 53 56 | ], 54 metadata => [ qq|57 metadata => [ qq| 55 58 CREATE TABLE metadata ( 56 59 node_id integer NOT NULL, … … 62 65 CREATE INDEX metadata_index ON metadata(node_id, version, metadata_type, metadata_value(10)) 63 66 | ] 64 ); 67 }, 68 }; 65 69 66 70 =head1 NAME … … 113 117 my $dbh = _get_dbh( @args ); 114 118 my $disconnect_required = _disconnect_required( @args ); 119 my $wanted_schema = _get_wanted_schema( @args ) || $SCHEMA_VERSION; 115 120 116 121 # Check whether tables exist … … 122 127 my @cur_data; 123 128 if(scalar keys %tables > 0) { 124 $upgrade_schema = Wiki::Toolkit::Setup::Database::get_database_upgrade_required($dbh,$ VERSION);129 $upgrade_schema = Wiki::Toolkit::Setup::Database::get_database_upgrade_required($dbh,$SCHEMA_VERSION); 125 130 } 126 131 if($upgrade_schema) { … … 145 150 146 151 # Set up tables if not found 147 foreach my $required ( keys % create_sql) {152 foreach my $required ( keys %{$create_sql->{$SCHEMA_VERSION}} ) { 148 153 if ( $tables{$required} ) { 149 154 print "Table $required already exists... skipping...\n"; 150 155 } else { 151 156 print "Creating table $required... done\n"; 152 foreach my $sql ( @{ $create_sql{$required}} ) {157 foreach my $sql ( @{$create_sql->{$SCHEMA_VERSION}->{$required}} ) { 153 158 $dbh->do($sql) or croak $dbh->errstr; 154 159 } … … 174 179 my %tables; 175 180 while ( my $table = $sth->fetchrow_array ) { 176 exists $create_sql {$table} and $tables{$table} = 1;181 exists $create_sql->{$SCHEMA_VERSION}->{$table} and $tables{$table} = 1; 177 182 } 178 183 return %tables; … … 215 220 216 221 print "Dropping tables... "; 217 $dbh->do("DROP TABLE IF EXISTS " . join( ",", keys % create_sql) )222 $dbh->do("DROP TABLE IF EXISTS " . join( ",", keys %{$create_sql->{$SCHEMA_VERSION}} ) ) 218 223 or croak $dbh->errstr; 219 224 print "done\n"; … … 246 251 dbhost => $_[3], 247 252 ); 253 } 254 255 sub _get_wanted_schema { 256 # Database handle passed in. 257 if ( ref $_[0] and ref $_[0] eq 'DBI::db' ) { 258 return undef; 259 } 260 261 # Args passed as hashref. 262 if ( ref $_[0] and ref $_[0] eq 'HASH' ) { 263 my %args = %{$_[0]}; 264 return $args{wanted_schema}; 265 } 266 267 # Args passed as list of connection details. 268 return $_[1]; 248 269 } 249 270 -
wiki-toolkit/trunk/lib/Wiki/Toolkit/Setup/Pg.pm
r432 r437 13 13 use Carp; 14 14 15 my %create_sql = ( 16 schema_info => [ qq| 15 my $SCHEMA_VERSION = $VERSION*100; 16 17 my $create_sql = { 18 9 => { 19 schema_info => [ qq| 17 20 CREATE TABLE schema_info ( 18 21 version integer NOT NULL default 0 19 22 ) 20 23 |, qq| 21 INSERT INTO schema_info VALUES ( |.($VERSION*100).qq|)24 INSERT INTO schema_info VALUES (9) 22 25 | ], 23 26 24 node => [ qq|27 node => [ qq| 25 28 CREATE SEQUENCE node_seq 26 29 |, qq| … … 38 41 | ], 39 42 40 content => [ qq|43 content => [ qq| 41 44 CREATE TABLE content ( 42 45 node_id integer NOT NULL, … … 51 54 | ], 52 55 53 internal_links => [ qq|56 internal_links => [ qq| 54 57 CREATE TABLE internal_links ( 55 58 link_from varchar(200) NOT NULL default '', … … 60 63 | ], 61 64 62 metadata => [ qq|65 metadata => [ qq| 63 66 CREATE TABLE metadata ( 64 67 node_id integer NOT NULL, … … 71 74 CREATE INDEX metadata_index ON metadata (node_id, version, metadata_type, metadata_value) 72 75 | ] 73 74 );76 }, 77 }; 75 78 76 79 my %upgrades = ( … … 180 183 my $dbh = _get_dbh( @args ); 181 184 my $disconnect_required = _disconnect_required( @args ); 185 my $wanted_schema = _get_wanted_schema( @args ) || $SCHEMA_VERSION; 182 186 183 187 # Check whether tables exist 184 188 my $sql = "SELECT tablename FROM pg_tables 185 189 WHERE tablename in (" 186 . join( ",", map { $dbh->quote($_) } keys % create_sql) . ")";190 . join( ",", map { $dbh->quote($_) } keys %{$create_sql->{$SCHEMA_VERSION}} ) . ")"; 187 191 my $sth = $dbh->prepare($sql) or croak $dbh->errstr; 188 192 $sth->execute; 189 193 my %tables; 190 194 while ( my $table = $sth->fetchrow_array ) { 191 exists $create_sql {$table} and $tables{$table} = 1;195 exists $create_sql->{$SCHEMA_VERSION}->{$table} and $tables{$table} = 1; 192 196 } 193 197 … … 196 200 my $upgrade_schema; 197 201 if(scalar keys %tables > 0) { 198 $upgrade_schema = Wiki::Toolkit::Setup::Database::get_database_upgrade_required($dbh,$ VERSION);202 $upgrade_schema = Wiki::Toolkit::Setup::Database::get_database_upgrade_required($dbh,$wanted_schema); 199 203 } else { 200 204 print "Skipping schema upgrade check - no tables found\n"; … … 202 206 203 207 # Set up tables if not found 204 foreach my $required ( reverse sort keys % create_sql) {208 foreach my $required ( reverse sort keys %{$create_sql->{$SCHEMA_VERSION}} ) { 205 209 if ( $tables{$required} ) { 206 210 print "Table $required already exists... skipping...\n"; 207 211 } else { 208 212 print "Creating table $required... done\n"; 209 foreach my $sql ( @{ $create_sql {$required} } ) {213 foreach my $sql ( @{ $create_sql->{$SCHEMA_VERSION}->{$required} } ) { 210 214 $dbh->do($sql) or croak $dbh->errstr; 211 215 } … … 272 276 my $sql = "SELECT tablename FROM pg_tables 273 277 WHERE tablename in (" 274 . join( ",", map { $dbh->quote($_) } keys % create_sql) . ")";278 . join( ",", map { $dbh->quote($_) } keys %{$create_sql->{$SCHEMA_VERSION}} ) . ")"; 275 279 foreach my $tableref (@{$dbh->selectall_arrayref($sql)}) { 276 280 $dbh->do("DROP TABLE $tableref->[0] CASCADE") or croak $dbh->errstr; … … 312 316 dbhost => $_[3], 313 317 ); 318 } 319 320 sub _get_wanted_schema { 321 # Database handle passed in. 322 if ( ref $_[0] and ref $_[0] eq 'DBI::db' ) { 323 return undef; 324 } 325 326 # Args passed as hashref. 327 if ( ref $_[0] and ref $_[0] eq 'HASH' ) { 328 my %args = %{$_[0]}; 329 return $args{wanted_schema}; 330 } 331 332 # Args passed as list of connection details. 333 return $_[1]; 314 334 } 315 335 -
wiki-toolkit/trunk/lib/Wiki/Toolkit/Setup/SQLite.pm
r431 r437 13 13 use Carp; 14 14 15 my %create_sql = ( 16 schema_info => " 15 my $SCHEMA_VERSION = $VERSION*100; 16 17 my $create_sql = { 18 9 => { 19 schema_info => [ qq| 17 20 CREATE TABLE schema_info ( 18 21 version integer NOT NULL default 0 19 22 ); 20 ", 21 22 node => " 23 |, qq| 24 INSERT INTO schema_info VALUES (9) 25 | ], 26 27 node => [ qq| 23 28 CREATE TABLE node ( 24 29 id integer NOT NULL PRIMARY KEY AUTOINCREMENT, … … 29 34 moderate boolean NOT NULL default '0' 30 35 ) 31 ",32 content => "36 | ], 37 content => [ qq| 33 38 CREATE TABLE content ( 34 39 node_id integer NOT NULL, … … 40 45 PRIMARY KEY (node_id, version) 41 46 ) 42 ",43 internal_links => "47 | ], 48 internal_links => [ qq| 44 49 CREATE TABLE internal_links ( 45 50 link_from varchar(200) NOT NULL default '', … … 47 52 PRIMARY KEY (link_from, link_to) 48 53 ) 49 ",50 metadata => "54 | ], 55 metadata => [ qq| 51 56 CREATE TABLE metadata ( 52 57 node_id integer NOT NULL, … … 55 60 metadata_value mediumtext NOT NULL DEFAULT '' 56 61 ) 57 " 58 ); 62 | ] 63 }, 64 }; 59 65 60 66 =head1 NAME … … 94 100 again with a fresh database, run C<cleardb> first. 95 101 102 An optional second argument may be passed specifying the schema version 103 to use; this is B<ONLY> intended to be used during unit testing and should 104 not normally be specified. 105 96 106 =cut 97 107 … … 100 110 my $dbh = _get_dbh( @args ); 101 111 my $disconnect_required = _disconnect_required( @args ); 112 my $wanted_schema = _get_wanted_schema( @args ) || $SCHEMA_VERSION; 102 113 103 114 # Check whether tables exist, set them up if not. … … 109 120 my @cur_data; 110 121 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); 112 123 } 113 124 if($upgrade_schema) { … … 124 135 125 136 # Set up tables if not found 126 foreach my $required ( keys % create_sql) {137 foreach my $required ( keys %{$create_sql->{$SCHEMA_VERSION}} ) { 127 138 if ( $tables{$required} ) { 128 139 print "Table $required already exists... skipping...\n"; 129 140 } else { 130 141 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 } 132 145 } 133 146 } 134 135 # Schema version136 $dbh->do("DELETE FROM schema_info");137 $dbh->do("INSERT INTO schema_info VALUES (". ($VERSION*100) .")");138 147 139 148 # If upgrading, load in the new data … … 153 162 my $sql = "SELECT name FROM sqlite_master 154 163 WHERE type='table' AND name in (" 155 . join( ",", map { $dbh->quote($_) } keys % create_sql) . ")";164 . join( ",", map { $dbh->quote($_) } keys %{$create_sql->{$SCHEMA_VERSION}} ) . ")"; 156 165 my $sth = $dbh->prepare($sql) or croak $dbh->errstr; 157 166 $sth->execute; … … 195 204 my $sql = "SELECT name FROM sqlite_master 196 205 WHERE type='table' AND name in (" 197 . join( ",", map { $dbh->quote($_) } keys % create_sql) . ")";206 . join( ",", map { $dbh->quote($_) } keys %{$create_sql->{$SCHEMA_VERSION}} ) . ")"; 198 207 foreach my $tableref (@{$dbh->selectall_arrayref($sql)}) { 199 208 $dbh->do("DROP TABLE $tableref->[0]") or croak $dbh->errstr; … … 216 225 if ( $args{dbh} ) { 217 226 return $args{dbh}; 218 } else {227 } else { 219 228 return _make_dbh( %args ); 220 229 } … … 223 232 # Args passed as list of connection details. 224 233 return _make_dbh( dbname => $_[0] ); 234 } 235 236 sub _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]; 225 250 } 226 251 … … 236 261 if ( $args{dbh} ) { 237 262 return 0; 238 } else {263 } else { 239 264 return 1; 240 265 } -
wiki-toolkit/trunk/lib/Wiki/Toolkit/TestLib.pm
r432 r437 271 271 } 272 272 273 =item B<wiki_info> 274 275 my @wiki_info = $iterator->wiki_info; 276 277 Returns the @wiki_info array detailing configured test backends. 278 Useful for very low-level testing only. 279 280 =cut 281 282 sub wiki_info { 283 @wiki_info; 284 } 285 273 286 sub _test_dsn { 274 287 my ( $dsn, $dbuser, $dbpass, $dbhost ) = @_;
