line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Maypole::Model::CDBI; |
2
|
1
|
|
|
1
|
|
1420
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
39
|
|
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
=head1 NAME |
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
Maypole::Model::CDBI - Model class based on Class::DBI |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
=head1 DESCRIPTION |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
This is a master model class which uses L to do all the hard |
11
|
|
|
|
|
|
|
work of fetching rows and representing them as objects. It is a good |
12
|
|
|
|
|
|
|
model to copy if you're replacing it with other database abstraction |
13
|
|
|
|
|
|
|
modules. |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
It implements a base set of methods required for a Maypole Data Model. |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
It inherits accessor and helper methods from L. |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
When specified as the application model, it will use Class::DBI::Loader |
20
|
|
|
|
|
|
|
to generate the model classes from the provided database. If you do not |
21
|
|
|
|
|
|
|
wish to use this functionality, use L which |
22
|
|
|
|
|
|
|
will instead use Class::DBI classes provided. |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=cut |
25
|
|
|
|
|
|
|
|
26
|
1
|
|
|
1
|
|
5
|
use base qw(Maypole::Model::CDBI::Base); |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
118
|
|
27
|
|
|
|
|
|
|
use Data::Dumper; |
28
|
|
|
|
|
|
|
use Class::DBI::Loader; |
29
|
|
|
|
|
|
|
use attributes (); |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
use Maypole::Model::CDBI::AsForm; |
32
|
|
|
|
|
|
|
use Maypole::Model::CDBI::FromCGI; |
33
|
|
|
|
|
|
|
use CGI::Untaint::Maypole; |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
=head2 Untainter |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
Set the class you use to untaint and validate form data |
38
|
|
|
|
|
|
|
Note it must be of type CGI::Untaint::Maypole (takes $r arg) or CGI::Untaint |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
=cut |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
sub Untainter { 'CGI::Untaint::Maypole' }; |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
=head2 add_model_superclass |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
Adds model as superclass to model classes (if necessary) |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
Inherited from Maypole::Model::CDBI::Base |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
=head1 Action Methods |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
Action methods are methods that are accessed through web (or other public) interface. |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
Inherited from L |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
=head2 do_edit |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
If there is an object in C<$r-Eobjects>, then it should be edited |
59
|
|
|
|
|
|
|
with the parameters in C<$r-Eparams>; otherwise, a new object should |
60
|
|
|
|
|
|
|
be created with those parameters, and put back into C<$r-Eobjects>. |
61
|
|
|
|
|
|
|
The template should be changed to C, or C if there were any |
62
|
|
|
|
|
|
|
errors. A hash of errors will be passed to the template. |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=head2 do_delete |
65
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
Inherited from Maypole::Model::CDBI::Base. |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
This action deletes records |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
=head2 do_search |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
Inherited from Maypole::Model::CDBI::Base. |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
This action method searches for database records. |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
=head2 list |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
Inherited from Maypole::Model::CDBI::Base. |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
The C method fills C<$r-Eobjects> with all of the |
81
|
|
|
|
|
|
|
objects in the class. The results are paged using a pager. |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=head1 Helper Methods |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head2 setup |
86
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
This method is inherited from Maypole::Model::Base and calls setup_database, |
88
|
|
|
|
|
|
|
which uses Class::DBI::Loader to create and load Class::DBI classes from |
89
|
|
|
|
|
|
|
the given database schema. |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
=cut |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=head2 setup_database |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
The $opts argument is a hashref of options. The "options" key is a hashref of |
96
|
|
|
|
|
|
|
Database connection options . Other keys may be various Loader arguments or |
97
|
|
|
|
|
|
|
flags. It has this form: |
98
|
|
|
|
|
|
|
{ |
99
|
|
|
|
|
|
|
# DB connection options |
100
|
|
|
|
|
|
|
options { AutoCommit => 1 , ... }, |
101
|
|
|
|
|
|
|
# Loader args |
102
|
|
|
|
|
|
|
relationships => 1, |
103
|
|
|
|
|
|
|
... |
104
|
|
|
|
|
|
|
} |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=cut |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
sub setup_database { |
109
|
|
|
|
|
|
|
my ( $class, $config, $namespace, $dsn, $u, $p, $opts ) = @_; |
110
|
|
|
|
|
|
|
$dsn ||= $config->dsn; |
111
|
|
|
|
|
|
|
$u ||= $config->user; |
112
|
|
|
|
|
|
|
$p ||= $config->pass; |
113
|
|
|
|
|
|
|
$opts ||= $config->opts; |
114
|
|
|
|
|
|
|
$config->dsn($dsn); |
115
|
|
|
|
|
|
|
warn "No DSN set in config" unless $dsn; |
116
|
|
|
|
|
|
|
$config->loader || $config->loader( |
117
|
|
|
|
|
|
|
Class::DBI::Loader->new( |
118
|
|
|
|
|
|
|
namespace => $namespace, |
119
|
|
|
|
|
|
|
dsn => $dsn, |
120
|
|
|
|
|
|
|
user => $u, |
121
|
|
|
|
|
|
|
password => $p, |
122
|
|
|
|
|
|
|
%$opts, |
123
|
|
|
|
|
|
|
) |
124
|
|
|
|
|
|
|
); |
125
|
|
|
|
|
|
|
$config->{classes} = [ $config->{loader}->classes ]; |
126
|
|
|
|
|
|
|
$config->{tables} = [ $config->{loader}->tables ]; |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
my @table_class = map { $_ . " => " . $config->{loader}->_table2class($_) } @{ $config->{tables} }; |
129
|
|
|
|
|
|
|
warn( 'Loaded tables to classes: ' . join ', ', @table_class ) |
130
|
|
|
|
|
|
|
if $namespace->debug; |
131
|
|
|
|
|
|
|
} |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
=head2 class_of |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
returns class for given table |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
=cut |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
sub class_of { |
140
|
|
|
|
|
|
|
my ( $self, $r, $table ) = @_; |
141
|
|
|
|
|
|
|
return $r->config->loader->_table2class($table); # why not find_class ? |
142
|
|
|
|
|
|
|
} |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
=head1 SEE ALSO |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
L, L. |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
=head1 AUTHOR |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
Maypole is currently maintained by Aaron Trevena. |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
=head1 AUTHOR EMERITUS |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
Simon Cozens, C |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
Simon Flack maintained Maypole from 2.05 to 2.09 |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
Sebastian Riedel, C maintained Maypole from 1.99_01 to 2.04 |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
=head1 LICENSE |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
You may distribute this code under the same terms as Perl itself. |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
=cut |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
1; |