fix bad transactional decisions that made it possible to abort and rollback a gateway...
[freeside.git] / bin / generate-table-module
1 #!/usr/bin/perl
2
3 use FS::Schema qw( dbdef_dist );
4
5 my $table = shift;
6
7 ###
8 # add a new FS/FS/table.pm
9 ###
10
11 my %ut = ( #just guesses
12   'int'     => 'number',
13   'number'  => 'float',
14   'varchar' => 'text',
15   'text'    => 'text',
16   'serial'  => 'number',
17 );
18
19 my $dbdef_table = dbdef_dist->table($table)
20   or die "define table in Schema.pm first";
21 my $primary_key = $dbdef_table->primary_key;
22
23 open(SRC,"<eg/table_template.pm") or die $!;
24 -e "FS/FS/$table.pm" and die "FS/FS/$table.pm already exists!";
25 open(DEST,">FS/FS/$table.pm") or die $!;
26
27 while (my $line = <SRC>) {
28
29   $line =~ s/table_name/$table/g;
30
31   if ( $line =~ /^=item\s+field\s+-\s+description\s*$/ ) {
32
33     foreach my $column ( $dbdef_table->columns ) {
34       print DEST "=item $column\n\n";
35       if ( $column eq $primary_key ) {
36         print DEST "primary key\n\n";
37       } else {
38         print DEST "$column\n\n";
39       }
40     }
41     next;
42
43   } elsif ( $line=~ /^(\s*)\$self->ut_numbern\('primary_key'\)\s*/ ) {
44
45     print DEST "$1\$self->ut_numbern('$primary_key')\n"
46       if $primary_key;
47     next;
48
49   } elsif (
50     $line =~ /^(\s*)\|\|\s+\$self->ut_number\('validate_other_fields'\)\s*/
51   ) {
52
53     foreach my $column ( grep { $_ ne $primary_key } $dbdef_table->columns ) {
54       my $ut = $ut{$dbdef_table->column($column)->type};
55       $ut .= 'n' if $dbdef_table->column($column)->null;
56       print DEST "$1|| \$self->ut_$ut('$column')\n";
57     }
58     next;
59
60   }
61
62   print DEST $line;
63 }
64
65 close SRC;
66 close DEST;
67
68 ###
69 # add to FS/FS/Mason.pm
70 ###
71
72 # it needs to be:
73 # 1. disablable (have an option to turn it off)
74 # 2. documented in the schema change docs
75 #
76 #my $magic = '# Sammath Naur';
77 #system("perl -pi -e 's/$magic/use FS::$table;\n  $magic/' FS/FS/Mason.pm");
78
79 ###
80 # add FS/t/table.t
81 ###
82
83 open(TEST,">FS/t/$table.t") or die $!;
84 print TEST <<ENDTEST;
85 BEGIN { \$| = 1; print "1..1\\n" }
86 END {print "not ok 1\\n" unless \$loaded;}
87 use FS::$table;
88 \$loaded=1;
89 print "ok 1\\n";
90 ENDTEST
91 close TEST;
92
93 ###
94 # add them to MANIFEST
95 ###
96
97 system('cvs edit FS/MANIFEST');
98
99 open(MANIFEST,">>FS/MANIFEST") or die $!;
100 print MANIFEST "FS/$table.pm\n",
101                "t/$table.t\n";
102 close MANIFEST;
103