Perl API os growing
[idzebra-moved-to-github.git] / perl / lib / IDZebra / Repository.pm
1 #!/usr/bin/perl
2 # ============================================================================
3 # Zebra perl API header
4 # =============================================================================
5 use strict;
6 # ============================================================================
7 package IDZebra::Repository;
8 use IDZebra;
9 use IDZebra::Logger qw(:flags :calls);
10 use Carp;
11 use Scalar::Util qw(weaken);
12 1;
13
14
15 # -----------------------------------------------------------------------------
16 # Repository stuff
17 # -----------------------------------------------------------------------------
18
19 sub new {
20     my ($proto,$session,%args) = @_;
21     my $class = ref($proto) || $proto;
22     my $self = {};
23     $self->{session} = $session;
24     weaken ($self->{session});
25     $self->{rg} = IDZebra::recordGroup->new();
26     IDZebra::init_recordGroup($self->{rg});
27     bless ($self, $class);
28     unless ($self->_set_options(%args)) {
29         $self->_prepare;
30     }
31     return ($self);
32 }
33
34 sub modify {
35     my ($self,%args) = @_;
36     if ($args{name}) {
37         if ($args{name} ne $self->{rg}{groupName}) {
38             $self->readConfig($args{name},"");
39         }
40         delete($args{name});
41     }
42     $self->_set_options(%args);
43 }
44
45 sub readConfig {
46     my ($self, $groupName, $ext) = @_;
47     if ($#_ > 0) { 
48       IDZebra::init_recordGroup($self->{rg});
49         $self->{rg}{groupName} = $groupName;  
50     }
51     $ext = "" unless ($ext);
52     IDZebra::res_get_recordGroup($self->{session}{zh}, $self->{rg}, $ext);
53     $self->_prepare();
54 }
55
56 sub _set_options {
57     my ($self, %args) = @_; 
58     my $i = 0;
59     foreach my $key (keys(%args)) {
60         $self->{rg}{$key} = $args{$key};
61         $i++;
62     }    
63     if ($i > 0) {
64         $self->_prepare();
65     }
66     return ($i);
67 }
68
69 sub _prepare {
70     my ($self) = @_;
71
72     IDZebra::set_group($self->{session}{zh}, $self->{rg});
73
74     my $dbName;
75     unless ($dbName = $self->{rg}{databaseName}) {
76         $dbName = 'Default';
77     }
78     if (my $res = IDZebra::select_database($self->{session}{zh}, $dbName)) {
79         logf(LOG_FATAL, 
80              "Could not select database %s errCode=%d",
81              $self->{rg}{databaseName},
82              $self->{session}->errCode());
83         croak("Fatal error opening/selecting database (record group)");
84     } else {
85         logf(LOG_LOG,"Database %s selected",$dbName);
86     }
87 }
88
89 sub DEBUG {
90     my ($self) = @_;
91     foreach my $key qw (groupName databaseName path recordId recordType flagStoreData flagStoreKeys flagRw fileVerboseLimit databaseNamePath explainDatabase followLinks) {
92         print STDERR "RG:$key:",$self->{rg}{$key},"\n";
93     }
94 }
95
96 sub init {
97     my ($self, %args) = @_;
98     $self->_set_options(%args);
99     IDZebra::init($self->{session}{zh});
100 }
101
102 sub compact {
103     my ($self, %args) = @_;
104     $self->_set_options(%args);
105     IDZebra::compact($self->{session}{zh});
106 }
107
108 sub update {
109     my ($self, %args) = @_;
110     $self->_set_options(%args);
111     IDZebra::repository_update($self->{session}{zh});
112 }
113
114 sub delete {
115     my ($self, %args) = @_;
116     $self->_set_options(%args);
117     IDZebra::repository_delete($self->{session}{zh});
118 }
119
120 sub show {
121     my ($self, %args) = @_;
122     $self->_set_options(%args);
123     IDZebra::repository_show($self->{session}{zh});
124 }
125
126 sub update_record {
127     my ($self, %args) = @_;
128     return(IDZebra::update_record($self->{session}{zh},
129                                   $self->{rg},
130                                   $self->update_args(%args)));
131 }
132
133 sub delete_record {
134     my ($self, %args) = @_;
135     return(IDZebra::delete_record($self->{session}{zh},
136                                   $self->{rg},
137                                   $self->update_args(%args)));
138 }
139
140 sub update_args {
141     my ($self, %args) = @_;
142
143     my $sysno   = $args{sysno}      ? $args{sysno}      : 0;
144     my $match   = $args{match}      ? $args{match}      : "";
145     my $rectype = $args{recordType} ? $args{recordType} : "";
146     my $fname   = $args{file}       ? $args{file}       : "<no file>";
147
148     my $buff;
149
150     if ($args{data}) {
151         $buff = $args{data};
152     } 
153     elsif ($args{file}) {
154         open (F, $args{file}) || warn ("Cannot open $args{file}");
155         $buff = join('',(<F>));
156         close (F);
157     }
158     my $len = length($buff);
159
160     # If no record type is given, then try to find it out from the
161     # file extension;
162
163     unless ($rectype) {
164         my ($ext) = $fname =~ /\.(\w+)$/;
165         $self->readConfig( $self->{rg}{groupName},$ext);
166     }
167
168     return ($rectype, $sysno, $match, $fname, $buff, $len);
169 }
170
171 sub DESTROY {
172     my ($self) = @_;
173 }
174
175 __END__
176
177 =head1 NAME
178
179 IDZebra::Repository - 
180
181 =head1 SYNOPSIS
182
183 =head1 DESCRIPTION
184
185 =head1 COPYRIGHT
186
187 Fill in
188
189 =head1 AUTHOR
190
191 Peter Popovics, pop@technomat.hu
192
193 =head1 SEE ALSO
194
195 IDZebra, IDZebra::Data1, Zebra documentation
196
197 =cut