Initial revision
[freeside.git] / site_perl / dbdef_column.pm
1 package FS::dbdef_column;
2
3 use strict;
4 #use Carp;
5 use Exporter;
6 use vars qw(@ISA);
7
8 @ISA = qw(Exporter);
9
10 =head1 NAME
11
12 FS::dbdef_column - Column object
13
14 =head1 SYNOPSIS
15
16   use FS::dbdef_column;
17
18   $column_object = new FS::dbdef_column ( $name, $sql_type, '' );
19   $column_object = new FS::dbdef_column ( $name, $sql_type, 'NULL' );
20   $column_object = new FS::dbdef_column ( $name, $sql_type, '', $length );
21   $column_object = new FS::dbdef_column ( $name, $sql_type, 'NULL', $length );
22
23   $name = $column_object->name;
24   $column_object->name ( 'name' );
25
26   $name = $column_object->type;
27   $column_object->name ( 'sql_type' );
28
29   $name = $column_object->null;
30   $column_object->name ( 'NOT NULL' );
31
32   $name = $column_object->length;
33   $column_object->name ( $length );
34
35   $sql_line = $column->line;
36   $sql_line = $column->line $datasrc;
37
38 =head1 DESCRIPTION
39
40 FS::dbdef::column objects represend columns in tables (see L<FS::dbdef_table>).
41
42 =head1 METHODS
43
44 =over 4
45
46 =item new
47
48 Creates a new FS::dbdef_column object.
49
50 =cut
51
52 sub new {
53   my($proto,$name,$type,$null,$length)=@_;
54
55   #croak "Illegal name: $name" if grep $name eq $_, @reserved_words;
56
57   $null =~ s/^NOT NULL$//i;
58
59   my $class = ref($proto) || $proto;
60   my $self = {
61     'name'   => $name,
62     'type'   => $type,
63     'null'   => $null,
64     'length' => $length,
65   };
66
67   bless ($self, $class);
68
69 }
70
71 =item name
72
73 Returns or sets the column name.
74
75 =cut
76
77 sub name {
78   my($self,$value)=@_;
79   if ( defined($value) ) {
80   #croak "Illegal name: $name" if grep $name eq $_, @reserved_words;
81     $self->{'name'} = $value;
82   } else {
83     $self->{'name'};
84   }
85 }
86
87 =item type
88
89 Returns or sets the column type.
90
91 =cut
92
93 sub type {
94   my($self,$value)=@_;
95   if ( defined($value) ) {
96     $self->{'type'} = $value;
97   } else {
98     $self->{'type'};
99   }
100 }
101
102 =item null
103
104 Returns or sets the column null flag.
105
106 =cut
107
108 sub null {
109   my($self,$value)=@_;
110   if ( defined($value) ) {
111     $value =~ s/^NOT NULL$//i;
112     $self->{'null'} = $value;
113   } else {
114     $self->{'null'};
115   }
116 }
117
118 =item type
119
120 Returns or sets the column length.
121
122 =cut
123
124 sub length {
125   my($self,$value)=@_;
126   if ( defined($value) ) {
127     $self->{'length'} = $value;
128   } else {
129     $self->{'length'};
130   }
131 }
132
133 =item line [ $datasrc ]
134
135 Returns an SQL column definition.
136
137 If passed a DBI $datasrc specifying L<DBD::mysql>, will use MySQL-specific
138 syntax.  Non-standard syntax for other engines (if applicable) may also be
139 supported in the future.
140
141 =cut
142
143 sub line {
144   my($self,$datasrc)=@_;
145   my($null)=$self->null;
146   $null ||= "NOT NULL" if $datasrc =~ /mysql/; #yucky mysql hack
147   join(' ',
148     $self->name,
149     $self->type. ( $self->length ? '('.$self->length.')' : '' ),
150     $null,
151   );
152 }
153
154 =back
155
156 =head1 BUGS
157
158 =head1 SEE ALSO
159
160 L<FS::dbdef_table>, L<FS::dbdef>, L<DBI>
161
162 =head1 HISTORY
163
164 class for dealing with column definitions
165
166 ivan@sisd.com 98-apr-17
167
168 now methods can be used to get or set data ivan@sisd.com 98-may-11
169
170 mySQL-specific hack for null (what should be default?) ivan@sisd.com 98-jun-2
171
172 =cut
173
174 1;
175