]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Storage/CDBI.pm
removing a debugging warn
[working/Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Storage / CDBI.pm
1 package OpenILS::Application::Storage::CDBI;
2 use vars qw/@ISA/;
3 use Class::DBI;
4 use base qw/Class::DBI/;
5
6 use OpenILS::Utils::Fieldmapper;
7
8 our $VERSION = 1;
9
10
11 use OpenILS::Application::Storage::CDBI::actor;
12 use OpenILS::Application::Storage::CDBI::asset;
13 use OpenILS::Application::Storage::CDBI::biblio;
14 use OpenILS::Application::Storage::CDBI::metabib;
15
16 sub child_init {
17         my $self = shift;
18
19         __PACKAGE__->set_sql( 'OILSFastSearch', <<"     SQL", 'Main');
20                 SELECT  %s
21                   FROM  %s
22                   WHERE %s = ?
23         SQL
24
25         __PACKAGE__->set_sql( 'OILSFastOrderedSearch', <<"      SQL", 'Main');
26                 SELECT  %s
27                   FROM  %s
28                   WHERE %s = ?
29                   ORDER BY %s
30         SQL
31
32         $self->SUPER::child_init(@_);
33
34 }
35
36 sub fast_flesh_sth {
37         my $class = shift;
38         $class = ref($class) || $class;
39
40         my $field = shift;
41         my $value = shift;
42         my $order = shift;
43
44         if (!(defined($order) and ref($order) and ref($order) eq 'HASH')) {
45                 if (defined($value) and ref($order) and ref($order) eq 'HASH') {
46                         $order = $value;
47                         $value = $field;
48                         $field = $class->primary_column;
49                 } else {
50                         $order = { order_by => 'id' }
51                 }
52         }
53
54         unless (defined $value) {
55                 $value = $field;
56                 $field = $class->primary_column;
57         }
58
59         my $fm_class = 'Fieldmapper::'.$class;
60         my $field_list = join ',', $class->columns('All');
61         
62         my $sth = $class->sql_OILSFastOrderedSearch( $field_list, $class->table, $field, $order->{order_by});
63         $sth->execute($value);
64         return $sth;
65 }
66
67 sub fast_flesh {
68         my $self = shift;
69         return map $class->construct($_), $self->fast_flesh_sth(@_)->fetchall_hash;
70 }
71
72 sub fast_fieldmapper {
73         my $self = shift;
74         my $class = ref($self) || $self;
75         my $fm_class = 'Fieldmapper::'.$class;
76         my @fms;
77         for my $hash ($self->fast_flesh_sth(@_)->fetchall_hash) {
78                 my $fm = $fm_class->new;
79                 for my $field ( keys %$hash ) {
80                         $fm->$field( $$hash{$field} );
81                 }
82                 push @fms, $fm;
83         }
84         return @fms;
85 }
86
87 sub retrieve {
88         my $self = shift;
89         my $arg = shift;
90         if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
91                 $arg = $arg->id;
92         }
93         return $self->SUPER::retrieve("$arg");
94 }
95
96 sub to_fieldmapper {
97         my $obj = shift;
98         my $class = ref($obj) || $obj;
99
100         my $fm_class = 'Fieldmapper::'.$class;
101         my $fm = $fm_class->new;
102
103         if (ref($obj)) {
104                 for my $field ( $fm->real_fields ) {
105                         $fm->$field( $obj->$field );
106                 }
107         }
108
109         return $fm;
110 }
111
112 sub create {
113         my $self = shift;
114         my $arg = shift;
115
116         if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
117                 return $self->create_from_fieldmapper($arg,@_);
118         }
119
120         return $self->SUPER::create($arg,@_);
121 }
122
123 sub create_from_fieldmapper {
124         my $obj = shift;
125         my $fm = shift;
126         my @params = @_;
127
128         my $class = ref($obj) || $obj;
129
130         if (ref $fm) {
131                 my %hash = map { defined $fm->$_ ?
132                                         ($_ => $fm->$_) :
133                                         ()
134                                 } $fm->real_fields;
135                 return $class->create( \%hash, @params );
136         } else {
137                 return undef;
138         }
139 }
140
141 sub update {
142         my $self = shift;
143         my $arg = shift;
144
145         if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
146                 $self = $self->modify_from_fieldmapper($arg);
147         }
148
149         $self->SUPER::update;
150         return $self;
151 }
152
153 sub delete {
154         my $self = shift;
155         my $arg = shift;
156
157         if (ref($arg) and UNIVERSAL::isa($arg => 'Fieldmapper')) {
158                 $self = $self->retrieve($arg);
159         }
160
161         $self->SUPER::delete;
162         return $arg;
163 }
164
165 sub modify_from_fieldmapper {
166         my $obj = shift;
167         my $fm = shift;
168
169         my $class = ref($obj) || $obj;
170
171         if (!ref($obj)) {
172                 $obj = $class->retieve($fm);
173                 return undef unless ($obj);
174         }
175
176         my %hash = map { defined $fm->$_ ?
177                                 ($_ => $fm->$_) :
178                                 ()
179                         } $fm->real_fields;
180
181         my $au = $obj->autoupdate;
182         $obj->autoupdate(0);
183         
184         for my $field ( keys %hash ) {
185                 $obj->$field( $hash{$field} );
186         }
187
188         $obj->autoupdate($au);
189
190         return $obj;
191 }
192
193
194
195 #-------------------------------------------------------------------------------
196 asset::copy->has_a( call_number => 'asset::call_number' );
197 asset::copy->might_have( metadata => 'asset::copy_metadata' );
198 #-------------------------------------------------------------------------------
199 asset::copy_metadata->might_have( copy => 'asset::copy' );
200 #asset::copy_metadata->has_a( ciruclating_location => 'actor::org_unit');
201 #asset::copy_metadata->has_a( hold_radius => 'actor::org_unit_type');
202 #-------------------------------------------------------------------------------
203 asset::call_number->has_a( record => 'biblio::record_entry' );
204 asset::call_number->has_many( copies => 'asset::copy' );
205 #-------------------------------------------------------------------------------
206
207
208 #-------------------------------------------------------------------------------
209 biblio::record_note->has_a( record => 'biblio::record_entry' );
210 #-------------------------------------------------------------------------------
211 biblio::record_entry->has_many( notes => 'biblio::record_note' );
212 biblio::record_entry->has_many( nodes => 'biblio::record_node', { order_by => 'intra_doc_id' } );
213 biblio::record_entry->has_many( call_numbers => 'asset::call_number' );
214
215 # should we have just one field entry per class for each record???? (xslt vs xpath)
216 #biblio::record_entry->has_a( title_field_entries => 'metabib::title_field_entry' );
217 #biblio::record_entry->has_a( author_field_entries => 'metabib::author_field_entry' );
218 #biblio::record_entry->has_a( subject_field_entries => 'metabib::subject_field_entry' );
219 #biblio::record_entry->has_a( keyword_field_entries => 'metabib::keyword_field_entry' );
220 #-------------------------------------------------------------------------------
221 biblio::record_node->has_a( owner_doc => 'biblio::record_entry' );
222 #biblio::record_node->has_a(
223 #       parent_node     => 'biblio::record_node::subnode',
224 #       inflate         => sub { return biblio::record_node::subnode::_load(@_) }
225 #);
226 #-------------------------------------------------------------------------------
227
228 #-------------------------------------------------------------------------------
229 #metabib::metarecord->has_a( master_record => 'biblio::record_entry' );
230 #-------------------------------------------------------------------------------
231 #metabib::title_field_entry->has_a( field => 'config::metabib_field_map' );
232 #-------------------------------------------------------------------------------
233 #metabib::author_field_entry->has_a( field => 'config::metabib_field_map' );
234 #-------------------------------------------------------------------------------
235 #metabib::subject_field_entry->has_a( field => 'config::metabib_field_map' );
236 #-------------------------------------------------------------------------------
237 #metabib::keyword_field_entry->has_a( field => 'config::metabib_field_map' );
238 #-------------------------------------------------------------------------------
239
240
241 # should we have just one field entry per class for each record???? (xslt vs xpath)
242 #metabib::title_field_entry_source_map->has_a( field_entry => 'metabib::title_field_entry' );
243 #metabib::title_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
244 #-------------------------------------------------------------------------------
245 #metabib::subject_field_entry_source_map->has_a( field_entry => 'metabib::subject_field_entry' );
246 #metabib::subject_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
247 #-------------------------------------------------------------------------------
248 #metabib::author_field_entry_source_map->has_a( field_entry => 'metabib::author_field_entry' );
249 #metabib::author_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
250 #-------------------------------------------------------------------------------
251 #metabib::keyword_field_entry_source_map->has_a( field_entry => 'metabib::keyword_field_entry' );
252 #metabib::keyword_field_entry_source_map->has_a( source_record => 'biblio::record_entry' );
253 #-------------------------------------------------------------------------------
254
255
256 1;