/[cvs]/nfo/perl/libs/Data/Storage/Schema/Abstract.pm
ViewVC logotype

Contents of /nfo/perl/libs/Data/Storage/Schema/Abstract.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (show annotations)
Sat Nov 9 01:27:23 2002 UTC (21 years, 8 months ago) by joko
Branch: MAIN
Changes since 1.2: +7 -3 lines
+ dependency of Class::Tangram now is 1.13 at minimum

1 ###############################################
2 #
3 # $Id: Abstract.pm,v 1.2 2002/10/25 11:45:10 joko Exp $
4 #
5 # $Log: Abstract.pm,v $
6 # Revision 1.2 2002/10/25 11:45:10 joko
7 # + enhanced robustness
8 # + more logging for debug-levels
9 #
10 # Revision 1.1 2002/10/17 00:07:14 joko
11 # + new
12 #
13 #
14 ###############################################
15
16 # ====================================
17 package Data::Storage::Schema::Abstract;
18
19 use strict;
20 use warnings;
21
22 use Tangram;
23 use Class::Tangram;
24
25 use Tangram::RawDate;
26 use Tangram::RawTime;
27 use Tangram::RawDateTime;
28
29 use Tangram::FlatArray;
30 use Tangram::FlatHash;
31 use Tangram::PerlDump;
32
33 # get logger instance
34 my $logger = Log::Dispatch::Config->instance;
35
36
37 # ======== object constructor - %args to $self ========
38 sub new {
39 my $invocant = shift;
40 my $class = ref($invocant) || $invocant;
41 my @args = ();
42 @_ && (@args = @_);
43
44 #my $self = { @_ };
45
46 # merge all entries from all hashes in args-array to single array (key, val, key, val)
47 my @args_all = ();
48 map { push(@args_all, %{$_}); } @args;
49 # make hash from array
50 my %args = @args_all;
51
52 $logger->debug( __PACKAGE__ . "->new( @args_all )" );
53
54 my $self = { %args };
55 bless $self, $class;
56
57 # remember as which Class we are instantiated
58 $self->{invocant} = $invocant;
59
60 $self->_checkClassTangram();
61 $self->_init();
62
63 return $self;
64 }
65
66 sub _checkClassTangram {
67 my $self = shift;
68 # check version of "Class::Tangram"
69 my $ctversion = $Class::Tangram::VERSION;
70 #print "ctversion: ", $ctversion, "\n";
71 #if ($ctversion ne 1.04) {
72 if ($ctversion lt 1.13) {
73 print "Version of \"Class::Tangram\": ", $ctversion, "\n";
74 print "minimum required version : ", "1.13", "\n";
75 #print "quitting!!! (please install older version (1.04) of \"Class::Tangram\"", "\n";
76 exit;
77 }
78 }
79
80 sub _parsePackageNamesFromFile {
81 my $self = shift;
82 my $filename = shift;
83 my $exclude_pattern = shift;
84 $logger->debug( __PACKAGE__ . "->_parsePackageFile( ... )" );
85 if (!$filename) {
86 $logger->error( __PACKAGE__ . "->_parsePackageFile: you must specify a filename" );
87 return;
88 }
89 if (! -e $filename) {
90 $logger->error( __PACKAGE__ . "->_parsePackageFile: could not find $filename" );
91 }
92 my @packages = ();
93 open(FH, '<' . $filename);
94 while (<FH>) {
95 chomp();
96 my $good = 1;
97 $exclude_pattern && ($good = !m/$exclude_pattern/);
98 push @packages, $1 if m/^package (.+?);/ && $good;
99 }
100 close(FH);
101 return \@packages;
102 }
103
104 sub _doinit {
105 my $self = shift;
106
107 $logger->debug( __PACKAGE__ . "->_doinit()" );
108
109 # WHAT?
110 # imports classes to Tangram-Schema in this style, but in an abstracted way:
111 # Class::Tangram::import_schema("SystemEvent");
112 # TODO:
113 # move this code to Data::Storage::Schema::Tangram
114
115 # TODO:
116 # two cases:
117 # 1. use a given list of strings as to-be-used-object-names
118 # 2. parse the content of the given package and use all declared Perl Packages as objects
119
120 my $classlist = $self->{EXPORT_OBJECTS};
121
122 # parse complete package to build list of classes
123 if ($#{$classlist} == -1) {
124 $logger->debug( "_doinit() Initializing all Classes from " . $self->{invocant} );
125 if (!$self->{invocant}->can('getFilename')) {
126 $logger->error( __PACKAGE__ . "->_doinit: Package $self->{invocant} doesn't contain method 'getFilename'" );
127 return;
128 }
129 my $perl_packagefile = eval('return ' . $self->{invocant} . '::getFilename();');
130 my $packages = $self->_parsePackageNamesFromFile($perl_packagefile, $self->{invocant});
131 # TODO:
132 # cache list so this routine isn't called on every startup/request
133 $classlist = $packages;
134 }
135
136 # build argument to be passed to "Tangram::Schema->new(...)"
137 my @classes;
138 map {
139 $logger->debug( __PACKAGE__ . "->_doinit: Initializing Class $_" );
140 # classname
141 push @classes, $_;
142 # schema
143 my $schema;
144 my $evalstr = '$schema = $' . $_ . '::schema;';
145 my $res = eval($evalstr);
146 push @classes, $schema;
147 } @{$classlist};
148
149 # create a new Tangram schema object
150 # these classes must occour in the same order used at a previous setup
151 $self->{schema} = Tangram::Schema->new({ classes => \@classes });
152 return 1;
153
154 # ======================================
155 # template
156 $self->{schema} = Tangram::Schema->new({
157 classes => [
158
159 # misc
160 'SystemEvent' => $SystemEvent::schema,
161
162 ],
163 });
164 # ======================================
165
166
167 }
168
169 sub _init {
170 my $self = shift;
171 if (!$self->{schema}) {
172 $self->_doinit();
173 }
174 }
175
176 # return schema
177 sub getSchema {
178 my $self = shift;
179 if (!$self->{schema}) {
180 #print "schema is not yet initialized!", "\n";
181 #exit;
182 $logger->error( __PACKAGE__ . "->getSchema: Schema is not yet initialized!" );
183 return;
184 }
185 return $self->{schema};
186 }
187
188
189 1;

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed