import rt 3.6.4
[freeside.git] / rt / sbin / factory
index 882e4a8..f72a296 100644 (file)
@@ -1,9 +1,9 @@
-#!/usr/bin/perl
-# {{{ BEGIN BPS TAGGED BLOCK
+#!/usr/bin/perl -w
+# BEGIN BPS TAGGED BLOCK {{{
 # 
 # COPYRIGHT:
 #  
-# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
+# This software is Copyright (c) 1996-2007 Best Practical Solutions, LLC 
 #                                          <jesse@bestpractical.com>
 # 
 # (Except where explicitly superseded by other copyright notices)
@@ -23,7 +23,9 @@
 # 
 # You should have received a copy of the GNU General Public License
 # along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/copyleft/gpl.html.
 # 
 # 
 # CONTRIBUTION SUBMISSION POLICY:
@@ -43,7 +45,8 @@
 # works based on those contributions, and sublicense and distribute
 # those contributions and any derivatives thereof.
 # 
-# }}} END BPS TAGGED BLOCK
+# END BPS TAGGED BLOCK }}}
+use strict;
 use DBI;
 
 my $database  = shift;
@@ -59,11 +62,17 @@ my $password = '';
 
 
 my $LicenseBlock = << '.';
-# BEGIN BPS TAGGED BLOCK
+# BEGIN BPS TAGGED BLOCK {{{
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
+#                                          <jesse@bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
 # 
-# Copyright (c) 1996-2003 Jesse Vincent <jesse@bestpractical.com>
 # 
-# (Except where explictly superceded by other copyright notices)
+# LICENSE:
 # 
 # This work is made available to you under the terms of Version 2 of
 # the GNU General Public License. A copy of that license should have
@@ -75,14 +84,29 @@ my $LicenseBlock = << '.';
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 # General Public License for more details.
 # 
-# Unless otherwise specified, all modifications, corrections or
-# extensions to this work which alter its source code become the
-# property of Best Practical Solutions, LLC when submitted for
-# inclusion in the work.
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 # 
 # 
-# END BPS TAGGED BLOCK
-
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# END BPS TAGGED BLOCK }}}
 .
 
 my $Attribution = << '.';
@@ -126,6 +150,7 @@ foreach my $table (@tables) {
 $tablemap{'CreatedBy'} = 'User';
 $tablemap{'UpdatedBy'} = 'User';
 
+my %typemap;
 $typemap{'id'}            = 'ro';
 $typemap{'Creator'}       = 'auto';
 $typemap{'Created'}       = 'auto';
@@ -162,7 +187,27 @@ foreach my $table (@tables) {
     my $ClassAccessible = "";
     my $FieldsPod       = "";
     my $CreatePod       = "";
+    my $RecordInit      = "";
     my %fields;
+
+
+    my $introspection = $dbh->prepare("SELECT * from $table where id is null");
+    $introspection->execute();
+    my @names =@{ $introspection->{'NAME'}};
+    my @types = @{$introspection->{'TYPE'}};
+    my @is_blob = @{$introspection->{'mysql_is_blob'}};
+    my @is_num = @{$introspection->{'mysql_is_num'}};
+
+    my %blobness = ();
+    my %sqltypes = ();
+    my %numeric = ();
+    foreach my $name (@names) {
+        $sqltypes{$name} = shift @types;
+        $blobness{$name} = (shift @is_blob || "0");
+        $numeric{$name} = (shift @is_num || "0");
+    }
+
+
     my $sth = $dbh->prepare("DESCRIBE $table");
     $sth->execute;
 
@@ -170,10 +215,16 @@ foreach my $table (@tables) {
         my $field   = $row->{'Field'};
         my $type    = $row->{'Type'};
         my $default = $row->{'Default'};
+        my $length = 0;
+        if ($type =~ /^(?:.*?)\((\d+)\)$/) {
+                $length = $1; 
+        }
         $fields{$field} = 1;
 
         #generate the 'accessible' datastructure
 
+        no warnings 'uninitialized';
+
         if ( $typemap{$field} eq 'auto' ) {
             $ClassAccessible .= "        $field => 
                {read => 1, auto => 1,";
@@ -187,7 +238,7 @@ foreach my $table (@tables) {
                {read => 1, write => 1,";
 
         }
-
+        $ClassAccessible .= " sql_type => $sqltypes{$field}, length => $length,  is_blob => $blobness{$field},  is_numeric => $numeric{$field}, ";
         $ClassAccessible .= " type => '$type', default => '$default'},\n";
 
         #generate pod for the accessible fields
@@ -199,7 +250,7 @@ Returns the current value of $field.
 
 ";
 
-        unless ( $typemap{$field} eq 'auto' || $typemap{$field} eq 'ro' ) {
+        unless ( exists $typemap{$field} && ( $typemap{$field} eq 'auto' || $typemap{$field} eq 'ro' )) {
             $FieldsPod .= "
 
 =head2 Set$field VALUE
@@ -254,7 +305,7 @@ sub ${field}Obj {
 
     }
 
-    $Create = "
+    my $Create = "
 sub Create {
     my \$self = shift;
     my \%args = ( 
@@ -306,10 +357,15 @@ sub _Init {
 
         $CollectionClass .= "
 
-  # By default, order by name
-  \$self->OrderBy( ALIAS => 'main',
-                  FIELD => 'SortOrder',
-                  ORDER => 'ASC');
+  # By default, order by SortOrder
+  \$self->OrderByCols(
+        { ALIAS => 'main',
+          FIELD => 'SortOrder',
+          ORDER => 'ASC' },
+        { ALIAS => 'main',
+          FIELD => 'id',
+          ORDER => 'ASC' },
+     );
 ";
     }
     $CollectionClass .= "
@@ -397,7 +453,7 @@ $ClassAccessible
 
     open( COL, ">$CollectionClassPath" );
     print COL $CollectionClass;
-    close($COL);
+    close(COL);
 
 }
 
@@ -438,7 +494,7 @@ _Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customiz
 
 These overlay files can contain new subs or subs to replace existing subs in this module.
 
-If you'll be working with perl 5.6.0 or greater, each of these files should begin with the line 
+Each of these files should begin with the line 
 
    no warnings qw(redefine);