source: LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Group.pm @ 273

Last change on this file since 273 was 251, checked in by nanardon, 15 years ago
  • try to improve fields discovery in DB
  • Property svn:keywords set to Id Rev
File size: 3.6 KB
Line 
1package LATMOS::Accounts::Bases::Sql::Group;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Sql::objects);
8
9our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
10
11=head1 NAME
12
13LATMOS::Ad - Perl extension for blah blah blah
14
15=head1 SYNOPSIS
16
17  use LATMOS::Accounts::Bases;
18  my $base = LATMOS::Accounts::Bases->new('sql');
19  ...
20
21=head1 DESCRIPTION
22
23Account base access over standard unix file format.
24
25=head1 FUNCTIONS
26
27=cut
28
29=head2 new(%options)
30
31Create a new LATMOS::Ad object for windows AD $domain.
32
33domain / server: either the Ad domain or directly the server
34
35ldap_args is an optionnal list of arguments to pass to L<Net::LDAP>.
36
37=cut
38
39sub object_table { 'group' }
40
41sub key_field { 'name' }
42
43sub has_extended_attributes { 1 }
44
45sub _initials_fields {
46    return {
47        gidNumber       => 'gidnumber',
48    }
49}
50
51sub _inline_fields {
52    my ($self, $for, $base) = @_;
53
54    my %fields = (
55        %{ $self->SUPER::_inline_fields($for, $base) },
56        memberUID       => 'memberUID',
57        member          => 'member',
58        # gidNumber       => 'gidnumber',
59        $for !~ /w/ ? (
60            sAMAccountName  => 'name',
61            groupname => 'name',
62        ) : (),
63    );
64    \%fields;
65}
66
67sub _delayed_fields {
68    my ($self)= @_;
69    return qw(memberUID member managedBy);
70}
71
72sub get_field {
73    my ($self, $field) = @_;
74    for ($field) {
75        /^(member|memberUID)$/ and do {
76            my $sth = $self->db->prepare_cached(
77                q{
78                select value from group_attributes_users
79                join "group" on "group".ikey = group_attributes_users.okey
80                where name = ? and attr = ?
81                }
82            );
83            $sth->execute($self->id, 'memberUID');
84            my @res;
85            while (my $res = $sth->fetchrow_hashref) {
86                push(@res, $res->{value});
87            }
88            return \@res;
89        };
90    }
91    $self->SUPER::get_field($field);
92}
93
94sub set_fields {
95    my ($self, %data) = @_;
96    my %fdata;
97    foreach my $attr (keys %data) {
98        $attr =~ /^memberUID|member$/ and do {
99            my %member;
100            foreach (@{ $self->get_field('memberUID') }) {
101                $member{$_}{c} = 1;
102            }
103            foreach (@{ $data{$attr} || []}) {
104                $member{$_}{n} = 1;
105            }
106
107            foreach (keys %member) {
108                $member{$_}{c} && $member{$_}{n} and next; # no change !
109                my $user = $self->base->get_object('user', $_) or next;
110                if ($member{$_}{n}) {
111                    my $sth = $self->db->prepare_cached(
112                        q{insert into group_attributes_users (value, attr, okey) values (?,?,?)}
113                    );
114                    $sth->execute($_, 'memberUID', $self->_get_ikey);
115                } elsif ($member{$_}{c}) {
116                    my $sth = $self->db->prepare_cached(
117                        q{delete from group_attributes_users where value = ? and attr = ? and okey = ?}
118                    );
119                    $sth->execute($_, 'memberUID', $self->_get_ikey);
120                } # else {} # can't happend
121            }
122            next;
123        };
124        $fdata{$attr} = $data{$attr};
125    }
126    if (keys %fdata) {
127        $self->SUPER::set_fields(%fdata);
128    }
129}
130
1311;
132
133__END__
134
135=head1 SEE ALSO
136
137=head1 AUTHOR
138
139Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
140
141=head1 COPYRIGHT AND LICENSE
142
143Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
144
145This library is free software; you can redistribute it and/or modify
146it under the same terms as Perl itself, either Perl version 5.10.0 or,
147at your option, any later version of Perl 5 you may have available.
148
149
150=cut
Note: See TracBrowser for help on using the repository browser.