/[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.2 - (show annotations)
Fri Oct 25 11:45:10 2002 UTC (21 years, 8 months ago) by joko
Branch: MAIN
Changes since 1.1: +24 -8 lines
+ enhanced robustness
+ more logging for debug-levels

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

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