summaryrefslogtreecommitdiff
path: root/FS/FS/reason.pm
diff options
context:
space:
mode:
authorjeff <jeff>2007-12-04 18:20:58 +0000
committerjeff <jeff>2007-12-04 18:20:58 +0000
commite8a09e945986a32f9b7d0a5d546142ada91654ca (patch)
treee0439507bc510ae41ef9b02c0b34bef3a9313863 /FS/FS/reason.pm
parentb8a41c45daf3e4cfa21200f5d9e59e38bd41293c (diff)
change credit reasons from freetext to new reason/reason type system (#2777)
Diffstat (limited to 'FS/FS/reason.pm')
-rw-r--r--FS/FS/reason.pm56
1 files changed, 54 insertions, 2 deletions
diff --git a/FS/FS/reason.pm b/FS/FS/reason.pm
index 08e76de..3c925d4 100644
--- a/FS/FS/reason.pm
+++ b/FS/FS/reason.pm
@@ -1,11 +1,16 @@
package FS::reason;
use strict;
-use vars qw( @ISA );
-use FS::Record qw( qsearch qsearchs );
+use vars qw( @ISA $DEBUG $me );
+use DBIx::DBSchema;
+use DBIx::DBSchema::Table;
+use DBIx::DBSchema::Column;
+use FS::Record qw( qsearch qsearchs dbh dbdef );
use FS::reason_type;
@ISA = qw(FS::Record);
+$DEBUG = 0;
+$me = '[FS::reason]';
=head1 NAME
@@ -109,6 +114,53 @@ sub reasontype {
qsearchs( 'reason_type', { 'typenum' => shift->reason_type } );
}
+# _upgrade_data
+#
+# Used by FS::Upgrade to migrate to a new database.
+#
+#
+
+sub _upgrade_data { # class method
+ my ($self, %opts) = @_;
+ my $dbh = dbh;
+
+ warn "$me upgrading $self\n" if $DEBUG;
+
+ my $column = dbdef->table($self->table)->column('reason');
+ unless ($column->type eq 'text') { # assume history matches main table
+
+ # ideally this would be supported in DBIx-DBSchema and friends
+ warn "$me Shifting reason column to type 'text'\n" if $DEBUG;
+ foreach my $table ( $self->table, 'h_'. $self->table ) {
+ my @sql = ();
+
+ $column = dbdef->table($self->table)->column('reason');
+ my $columndef = $column->line($dbh);
+ $columndef =~ s/varchar\(\d+\)/text/i;
+ if ( $dbh->{Driver}->{Name} eq 'Pg' ) {
+ my $notnull = $columndef =~ s/not null//i;
+ push @sql,"ALTER TABLE $table RENAME reason TO freeside_upgrade_reason";
+ push @sql,"ALTER TABLE $table ADD $columndef";
+ push @sql,"UPDATE $table SET reason = freeside_upgrade_reason";
+ push @sql,"ALTER TABLE $table ALTER reason SET NOT NULL"
+ if $notnull;
+ push @sql,"ALTER TABLE $table DROP freeside_upgrade_reason";
+ }elsif( $dbh->{Driver}->{Name} =~ /^mysql/i ){
+ push @sql,"ALTER TABLE $table MODIFY reason ". $column->line($dbh);
+ }else{
+ die "watchu talkin' 'bout, Willis? (unsupported database type)";
+ }
+
+ foreach (@sql) {
+ my $sth = $dbh->prepare($_) or die $dbh->errstr;
+ $sth->execute or die $dbh->errstr;
+ }
+ }
+ }
+
+ '';
+
+}
=back
=head1 BUGS