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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide 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 joko 1.1 ###############################################
2     #
3 joko 1.3 # $Id: Abstract.pm,v 1.2 2002/10/25 11:45:10 joko Exp $
4 joko 1.2 #
5     # $Log: Abstract.pm,v $
6 joko 1.3 # Revision 1.2 2002/10/25 11:45:10 joko
7     # + enhanced robustness
8     # + more logging for debug-levels
9     #
10 joko 1.2 # Revision 1.1 2002/10/17 00:07:14 joko
11     # + new
12 joko 1.1 #
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 joko 1.2
44 joko 1.1 #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 joko 1.2
52     $logger->debug( __PACKAGE__ . "->new( @args_all )" );
53 joko 1.1
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 joko 1.3 if ($ctversion lt 1.13) {
73 joko 1.1 print "Version of \"Class::Tangram\": ", $ctversion, "\n";
74 joko 1.3 print "minimum required version : ", "1.13", "\n";
75 joko 1.1 #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 joko 1.2 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 joko 1.1 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 joko 1.2 if (!$self->{invocant}->can('getFilename')) {
126     $logger->error( __PACKAGE__ . "->_doinit: Package $self->{invocant} doesn't contain method 'getFilename'" );
127     return;
128     }
129 joko 1.1 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 joko 1.2 $logger->debug( __PACKAGE__ . "->_doinit: Initializing Class $_" );
140 joko 1.1 # 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 joko 1.2 #print "schema is not yet initialized!", "\n";
181     #exit;
182     $logger->error( __PACKAGE__ . "->getSchema: Schema is not yet initialized!" );
183     return;
184 joko 1.1 }
185     return $self->{schema};
186     }
187    
188    
189     1;

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