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

Last change on this file since 88 was 88, checked in by nanardon, 15 years ago
  • really improve memberUID laziness on change
  • Property svn:keywords set to Id Rev
File size: 3.5 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 { 'groupname' }
42
43sub has_extended_attributes { 1 }
44
45sub _initial_fields {
46    my ($self, $for) = @_;
47    {
48        gidNumber       => 'gid',
49    }
50}
51
52sub _inline_fields {
53    my ($self, $for) = @_;
54
55    my %fields = (
56        %{ $self->_initial_fields($for) },
57        memberUID       => 'memberUID',
58    );
59    \%fields;
60}
61
62sub _delayed_fields {
63    my ($self)= @_;
64    return qw(memberUID);
65}
66
67sub get_field {
68    my ($self, $field) = @_;
69    for ($field) {
70        /^memberUID$/ and do {
71            my $sth = $self->db->prepare_cached(
72                q{
73                select login from users_groups join "user"
74                on users_groups.uid = "user".uid join
75                "group" on "group".gid = users_groups.gid
76                where "group".groupname = ? order by login
77                }
78            );
79            $sth->execute($self->id);
80            my @res;
81            while (my $res = $sth->fetchrow_hashref) {
82                push(@res, $res->{login});
83            }
84            return \@res;
85        };
86    }
87    $self->SUPER::get_field($field);
88}
89
90sub set_fields {
91    my ($self, %data) = @_;
92    my %fdata;
93    foreach my $attr (keys %data) {
94        $attr =~ /^memberUID$/ and do {
95            my $gid = $self->get_field('gid') or next;
96            my %member;
97            foreach (@{ $self->get_field('memberUID') }) {
98                $member{$_}{c} = 1;
99            }
100            foreach (@{ $data{$attr} || []}) {
101                $member{$_}{n} = 1;
102            }
103
104            foreach (keys %member) {
105                $member{$_}{c} && $member{$_}{n} and next; # no change !
106                my $user = $self->base->get_object('user', $_) or next;
107                my $uid = $user->get_field('uid') or next;
108                if ($member{$_}{n}) {
109                    my $sth = $self->db->prepare_cached(
110                        q{insert into users_groups (uid, gid) values (?,?)}
111                    );
112                    $sth->execute($uid, $gid);
113                } elsif ($member{$_}{c}) {
114                    my $sth = $self->db->prepare_cached(
115                        q{delete from users_groups where uid = ? and gid = ?}
116                    );
117                    $sth->execute($uid, $gid);
118                } # else {} # can't happend
119            }
120            next;
121        };
122        $fdata{$attr} = $data{$attr};
123    }
124    if (keys %fdata) {
125        $self->SUPER::set_fields(%fdata);
126    }
127}
128
1291;
130
131__END__
132
133=head1 SEE ALSO
134
135=head1 AUTHOR
136
137Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
138
139=head1 COPYRIGHT AND LICENSE
140
141Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
142
143This library is free software; you can redistribute it and/or modify
144it under the same terms as Perl itself, either Perl version 5.10.0 or,
145at your option, any later version of Perl 5 you may have available.
146
147
148=cut
Note: See TracBrowser for help on using the repository browser.