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;