Title: [opsview] [9986] Added backwards compatible method for creating new schema changes
Revision
9986
Author
tvoon
Date
2012-09-06 21:57:50 +0100 (Thu, 06 Sep 2012)

Log Message

Added backwards compatible method for creating new schema changes

Modified Paths


Modified: trunk/opsview-core/bin/db_opsview
===================================================================
--- trunk/opsview-core/bin/db_opsview	2012-09-06 19:28:25 UTC (rev 9985)
+++ trunk/opsview-core/bin/db_opsview	2012-09-06 20:57:50 UTC (rev 9986)
@@ -1214,7 +1214,7 @@
 	INSERT INTO schema_version (major_release, version) VALUES ('3.7', '37');
 	INSERT INTO schema_version (major_release, version) VALUES ('3.9', '27');
 	INSERT INTO schema_version (major_release, version) VALUES ('3.11', '15');
-	INSERT INTO schema_version (major_release, version) VALUES ('3.13', '11');
+	INSERT INTO schema_version (major_release, version) VALUES ('3.13', '12');
 	INSERT INTO schema_version (major_release, version) VALUES ('3.15', '12');
 
 

Modified: trunk/opsview-core/installer/upgradedb_opsview.pl
===================================================================
--- trunk/opsview-core/installer/upgradedb_opsview.pl	2012-09-06 19:28:25 UTC (rev 9985)
+++ trunk/opsview-core/installer/upgradedb_opsview.pl	2012-09-06 20:57:50 UTC (rev 9986)
@@ -4396,6 +4396,17 @@
     $db->updated;
 }
 
+if ( $db->is_lower("3.13.12") ) {
+    $db->print( "Amending schema_version to handle new style schema changes" );
+    $dbh->do( "
+        ALTER TABLE schema_version ADD COLUMN reason VARCHAR(255), 
+            ADD COLUMN created_at DATETIME, 
+            ADD COLUMN duration INT, 
+            ADD PRIMARY KEY (major_release)
+    " );
+    $db->updated;
+}
+
 # 3.15.X schema changes are for core and commercial branch
 if ( $db->is_lower("3.15.1") ) {
     $db->print( "Updating with dashboard metrics" );

Modified: trunk/opsview-core/lib/Utils/DBVersion.pm
===================================================================
--- trunk/opsview-core/lib/Utils/DBVersion.pm	2012-09-06 19:28:25 UTC (rev 9985)
+++ trunk/opsview-core/lib/Utils/DBVersion.pm	2012-09-06 20:57:50 UTC (rev 9986)
@@ -27,7 +27,7 @@
 use base qw(Class::Accessor::Fast);
 
 __PACKAGE__->mk_accessors(
-    qw(version major_release dbh changed schema_table stop_point logfh name)
+    qw(version major_release reason start_time dbh changed schema_table stop_point logfh name)
 );
 
 =head1 NAME
@@ -179,9 +179,75 @@
 
 =cut
 
+# The old style is the old x.y.z numbering system which had problems with
+# Core and Commercial branches. The new style uses a YYYYMMDDsometext
+# to identify the change, which means each change is independent of others
 sub updated {
     my ($self) = @_;
+    if ( $self->start_time ) {
+        $self->updated_new_style;
+        $self->start_time(0);
+    }
+    else {
+        $self->updated_old_style;
+    }
+    $self->changed(1);
+}
+
+my $valid_products = {
+    "all"        => 1,
+    "core"       => 1,
+    "commercial" => 1,
+};
+
+sub is_installed ($$$) {
+    my ( $self, $version_string, $reason, $product ) = @_;
+
+    die "Version of form YYYYMMDDtext"
+      unless $version_string =~ /^\d\d\d\d\d\d\d\d/;
+    die "Reason not set"        unless $reason;
+    die "Product not set"       unless $product;
+    die "Bad product: $product" unless $valid_products->{$product};
+
+    # Check if version_string already exists
+    my $found = $self->dbh->selectrow_array(
+        "SELECT COUNT(*) FROM "
+          . $self->schema_table()
+          . " WHERE major_release=?",
+        {}, $version_string
+    );
+
+    return 1 if ($found);
+
+    $self->print($reason);
+    $self->version($product);
+    $self->major_release($version_string);
+    $self->reason($reason);
+    $self->start_time(time);
+
+    return 0;
+}
+
+sub updated_new_style {
+    my ($self) = @_;
+    my $duration = time() - $self->start_time;
     $self->dbh->do(
+        "INSERT INTO "
+          . $self->schema_table()
+          . " SET major_release=?, version=?, reason=?, created_at=FROM_UNIXTIME(?), duration=?",
+        {},
+        $self->major_release,
+        $self->version,
+        $self->reason,
+        $self->start_time,
+        $duration
+    );
+    $self->print( "Updated database to version " . $self->major_release . $/ );
+}
+
+sub updated_old_style {
+    my ($self) = @_;
+    $self->dbh->do(
         "UPDATE "
           . $self->schema_table()
           . " SET VERSION=? WHERE major_release=?",
@@ -195,7 +261,6 @@
         $self->print( "Stopping at this version", $/ );
         exit;
     }
-    $self->changed(1);
 }
 
 =item $db->changed

Modified: trunk/opsview-core/t/87dbversion.t
===================================================================
--- trunk/opsview-core/t/87dbversion.t	2012-09-06 19:28:25 UTC (rev 9985)
+++ trunk/opsview-core/t/87dbversion.t	2012-09-06 20:57:50 UTC (rev 9986)
@@ -168,3 +168,40 @@
     ],
     label => "Got notice in auditlog now",
 );
+
+is(
+    $db->is_installed( "20120906test", "some explanation", "commercial" ),
+    0, "This should not exist"
+);
+row_ok(
+    table   => "schema_version",
+    where   => [ major_release => "20120906test" ],
+    results => 0,
+    label   => "Test update doesn't exist",
+);
+sleep 1;
+$db->updated;
+row_ok(
+    table   => "schema_version",
+    where   => [ major_release => "20120906test" ],
+    results => 1,
+    tests   => [
+        version  => 'commercial',
+        reason   => "some explanation",
+        duration => 1,
+    ],
+    label => "Test update entry added",
+);
+
+eval { $db->is_installed("badtext") };
+like(
+    $@,
+    qr/Version of form YYYYMMDDtext/,
+    "Got error due to missing version"
+);
+eval { $db->is_installed("20120906text") };
+like( $@, qr/Reason not set/, "Reason not set" );
+eval { $db->is_installed( "20120906text", "Example upgrade" ) };
+like( $@, qr/Product not set/, "Product not set" );
+eval { $db->is_installed( "20120906text", "Example upgrade", "bad" ) };
+like( $@, qr/Bad product: bad/, "Bad product" );

Modified: trunk/opsview-core/t/var/opsview.test.db
===================================================================
--- trunk/opsview-core/t/var/opsview.test.db	2012-09-06 19:28:25 UTC (rev 9985)
+++ trunk/opsview-core/t/var/opsview.test.db	2012-09-06 20:57:50 UTC (rev 9986)
@@ -2038,29 +2038,33 @@
 
 DROP TABLE IF EXISTS `schema_version`;
 CREATE TABLE `schema_version` (
-  `major_release` varchar(16) DEFAULT NULL,
-  `version` varchar(16) DEFAULT NULL
+  `major_release` varchar(16) NOT NULL DEFAULT '',
+  `version` varchar(16) DEFAULT NULL,
+  `reason` varchar(255) DEFAULT NULL,
+  `created_at` datetime DEFAULT NULL,
+  `duration` int(11) DEFAULT NULL,
+  PRIMARY KEY (`major_release`)
 ) ENGINE=InnoDB;
 
 
 LOCK TABLES `schema_version` WRITE;
 /*!40000 ALTER TABLE `schema_version` DISABLE KEYS */;
-INSERT INTO `schema_version` VALUES ('2.9','4');
-INSERT INTO `schema_version` VALUES ('2.10','5');
-INSERT INTO `schema_version` VALUES ('2.11','6');
-INSERT INTO `schema_version` VALUES ('2.12','5');
-INSERT INTO `schema_version` VALUES ('2.13','2');
-INSERT INTO `schema_version` VALUES ('2.14','9');
-INSERT INTO `schema_version` VALUES ('3.0','4');
-INSERT INTO `schema_version` VALUES ('3.1','4');
-INSERT INTO `schema_version` VALUES ('3.3','9');
-INSERT INTO `schema_version` VALUES ('3.5','4');
-INSERT INTO `schema_version` VALUES ('3.6','1');
-INSERT INTO `schema_version` VALUES ('3.7','37');
-INSERT INTO `schema_version` VALUES ('3.9','27');
-INSERT INTO `schema_version` VALUES ('3.11','15');
-INSERT INTO `schema_version` VALUES ('3.13','11');
-INSERT INTO `schema_version` VALUES ('3.15','12');
+INSERT INTO `schema_version` VALUES ('2.10','5',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('2.11','6',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('2.12','5',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('2.13','2',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('2.14','9',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('2.9','4',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.0','4',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.1','4',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.11','15',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.13','12',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.15','12',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.3','9',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.5','4',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.6','1',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.7','37',NULL,NULL,NULL);
+INSERT INTO `schema_version` VALUES ('3.9','27',NULL,NULL,NULL);
 /*!40000 ALTER TABLE `schema_version` ENABLE KEYS */;
 UNLOCK TABLES;
 

_______________________________________________
Opsview-checkins mailing list
[email protected]
http://lists.opsview.org/lists/listinfo/opsview-checkins

Reply via email to