source: LATMOS-Accounts/lib/LATMOS/Accounts/Bases.pm @ 60

Last change on this file since 60 was 60, checked in by nanardon, 15 years ago
  • permform synchronisation in two step, second pass is done for fileds having foreign key constrait such user <=> group link
  • Property svn:keywords set to Id Rev
File size: 5.9 KB
Line 
1package LATMOS::Accounts::Bases;
2
3use 5.010000;
4use strict;
5use warnings;
6use LATMOS::Accounts::Bases::Objects;
7
8our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
9
10=head1 NAME
11
12LATMOS::Accounts::Bases - Base class for account data bases
13
14=head1 SYNOPSIS
15
16  use LATMOS::Accounts::Bases;
17  my $base = LATMOS::Accounts::Bases->new('type', %options);
18  ...
19
20=head1 DESCRIPTION
21
22This module provide basic functions for various account base
23
24=head1 FUNTIONS
25
26=cut
27
28=head2 new($type, %options)
29
30Return, if success, a new data base account object, $type is
31account base type, %options to setup the base.
32
33=cut
34
35sub new {
36    my ($class, $type, %options) = @_;
37
38    my $pclass = ucfirst(lc($type));
39    eval "require LATMOS::Accounts::Bases::$pclass;";
40    if ($@) { return } # error message ?
41    my $base = "LATMOS::Accounts::Bases::$pclass"->new(%options);
42    $base->{_type} = lc($pclass);
43    $base->{_label} = $options{label};
44    $base
45}
46
47sub label {
48    $_[0]->{_label};
49}
50
51sub type {
52    $_[0]->{_type};
53}
54
55sub _load_obj_class {
56    my ($self, $otype) = @_;
57
58    # finding perl class:
59    my $pclass = ref $self;
60    $pclass .= '::' . ucfirst(lc($otype));
61    eval "require $pclass;";
62    if ($@) { return } # error message ?
63    return $pclass;
64}
65
66=head2 list_canonicals_fields($otype, $for)
67
68Return the list of supported fields by the database for object type $otype.
69
70Optionnal $for specify the goal for which the list is requested, only supported
71fields will be returns
72
73=cut
74
75sub list_canonicals_fields {
76    my ($self, $otype, $for) = @_;
77    $for ||= 'rw';
78    my $pclass = $self->_load_obj_class($otype) or return;
79    $pclass->_canonical_fields($self, $for);
80}
81
82sub delayed_fields {
83    my ($self, $otype, $for) = @_;
84    $for ||= 'rw';
85    my $pclass = $self->_load_obj_class($otype) or return;
86    $pclass->_delayed_fields($self, $for);
87}
88
89=head2 get_field_name($otype, $c_fields, $for)
90
91Return the internal fields name for $otype object for
92canonical fields $c_fields
93
94=cut
95
96sub get_field_name {
97    my ($self, $otype, $c_fields, $for) = @_;
98    my $pclass = $self->_load_obj_class($otype) or return;
99    $pclass->_get_field_name($c_fields, $self, $for);
100}
101
102=head2 list_supported_objects(@otype)
103
104Return a list of supported object
105
106@type is an additionnal list of objects to check
107
108=cut
109
110sub list_supported_objects {
111    my ($self, @otype) = @_;
112    return grep { $self->is_supported_object($_) }
113        (qw(group user), @otype);
114}
115
116=head2 is_supported_object($otype)
117
118Return true is object type $otype is supported
119
120=cut
121
122sub is_supported_object {
123    my ($self, $otype) = @_;
124    return $self->_load_obj_class($otype) ? 1 : 0;
125}
126
127=head2 list_objects($otype)
128
129Return the list of UID for object of $otype.
130
131=cut
132
133sub list_objects {
134    my ($self, $otype) = @_;
135    my $pclass = $self->_load_obj_class($otype) or return;
136    $pclass->list($self);
137}
138
139=head2 get_object($type, $id)
140
141Return an object of $type (typically user or group) having identifier
142$id.
143
144=cut
145
146sub get_object {
147    my ($self, $otype, $id) = @_;
148
149    return LATMOS::Accounts::Bases::Objects->_new($self, $otype, $id);
150}
151
152=head2 create_object($type, $id, %data)
153
154Create and return an object of type $type with unique id
155$id having %data.
156
157This method should be provided by the data base handler.
158
159=cut
160
161sub create_object {
162    my ($self, $otype, $id, %data) = @_;
163    my $pclass = $self->_load_obj_class($otype);
164    $pclass->_create($self, $id, %data) or return;
165    $self->get_object($otype, $id);
166}
167
168=head2 create_c_object($type, $id, %data)
169
170Create and return an object of type $type with unique id
171$id having %data using canonical fields
172
173=cut
174
175sub create_c_object {
176    my ($self, $otype, $id, %cdata) = @_;
177
178    my %data;
179    foreach my $cfield (keys %cdata) {
180        my $field = $self->get_field_name($otype, $cfield, 'write') or next;
181        $data{$field} = $cdata{$cfield};
182    }
183    keys %data or return 0; # TODO: return an error ?
184    $self->create_object($otype, $id, %data);
185}
186
187=head2 load
188
189Make account base loading data into memory if need.
190Should always be called, if database fetch data on the fly
191(SQL, LDAP), the function just return True.
192
193=cut
194
195sub load { 1 }
196
197=head2 is_transactionnal
198
199Return True is the database support commit and rollback
200
201=cut
202
203sub is_transactionnal {
204    my ($self) = @_;
205    return($self->can('_rollback') && $self->can('_commit'));
206}
207
208=head2 commit
209
210Save change into the database if change are not done immediately.
211This should always be called as you don't know when change are applied.
212
213Return always true if database does not support any transaction.
214
215The driver should provides a _commit functions to save data.
216
217=cut
218
219sub commit {
220    my ($self) = @_;
221    return $self->can('_commit') ? $self->_commit : 1;
222}
223
224=head2 rollback
225
226If database support transaction, rollback changes. Return false
227if database does not support.
228
229If supported, driver should provides a _rollback functions
230
231=cut
232
233sub rollback {
234    my ($self) = @_;
235    return $self->can('_rollback') ? $self->_rollback : 0;
236}
237
238=head2 current_rev
239
240Return the current revision of the database
241
242Must be provide by base driver if incremental synchro is supported
243
244=cut
245
246sub current_rev { return }
247
248=head2 list_objects_from_rev($otype, $rev)
249
250Return the list of UID for object of $otype.
251
252=cut
253
254sub list_objects_from_rev {
255    my ($self, $otype, $rev) = @_;
256    my $pclass = $self->_load_obj_class($otype) or return;
257    if (defined($rev) && $pclass->can('list_from_rev')) {
258        return $pclass->list_from_rev($self, $rev);
259    } else {
260        # no support, return all objects...
261        return $self->list_objects($otype);
262    }
263}
264
2651;
266
267__END__
268
269=head1 SEE ALSO
270
271=head1 AUTHOR
272
273Thauvin Olivier, E<lt>olivier.thauvin@latmos.ipsl.fr<gt>
274
275=head1 COPYRIGHT AND LICENSE
276
277Copyright (C) 2009 by Thauvin Olivier
278
279This library is free software; you can redistribute it and/or modify
280it under the same terms as Perl itself, either Perl version 5.10.0 or,
281at your option, any later version of Perl 5 you may have available.
282
283=cut
Note: See TracBrowser for help on using the repository browser.