/[cvs]/nfo/php/libs/org.netfrag.elib/vops/pdl/pdl_model.php.inc
ViewVC logotype

Annotation of /nfo/php/libs/org.netfrag.elib/vops/pdl/pdl_model.php.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (vendor branch)
Wed Jan 23 17:40:37 2002 UTC (22 years, 7 months ago) by cvsjoko
Branch: nfo, MAIN
CVS Tags: v003, HEAD
Changes since 1.1: +0 -0 lines
initial

1 cvsjoko 1.1 <?
2    
3     // ==================================================================
4     // main "PDLModel"-object
5     // represents a pdl-model which consists of pdl-objects and/or pdl-associations and some other metadata
6     class PDLModel {
7    
8     // the name of this model
9     var $name;
10    
11     // hash with references to PDLModelObject-objects
12     var $pdlModelObjects;
13    
14     // hash with references to PDLModelDataOperation-objects
15     var $pdlModelDataOperations;
16    
17     // hash with references to PDLModelAssociation-objects
18     var $pdlModelAssociations;
19    
20     // some metadata
21     var $meta_VariableTypes;
22    
23    
24     // -------------------------------------------------------
25     function PDLModel($modelname, $filename) {
26    
27     slog("PDLModel: PDLModel($modelname, $filename)");
28    
29     // set the model-name
30     $this->name = $modelname;
31    
32     // clear pdl-objects and pdl-associations
33     $this->pdlModelObjects = array();
34     $this->pdlModelDataOperations = array();
35     $this->pdlModelAssociations = array();
36    
37     // initialize metadata
38     $tmp_vartypes = "BigInteger,BigDecimal,Boolean,Byte,Character,Date,Double,Float,Integer,Long,Short,String,Blob";
39     $this->meta_VariableTypes = split(',', $tmp_vartypes);
40    
41     // create new "PDLReader"-object ...
42     $pdlreader =& new PDLReader();
43     // ... and parse PDL-file
44     $pdlreader->parsePdlFile($filename, &$this);
45    
46     }
47    
48    
49     // -------------------------------------------------------
50     // adds the reference to a given PDLModelObject to local "pdlModelObjects"-hash (with its object-type as key)
51     function addObject($objecttype, &$pdlModelObject) {
52     // check for having defined any events
53     if (count($pdlModelObject->events)) {
54     $pdlModelObject->bool_autoevent = 0;
55     } else {
56     // TODO: what shall happen to "bool_autoevent"? it isn't used for now
57     // either flag "PDLModelObject" to "auto-event" ...
58     // $pdlModelObject->bool_autoevent = 1;
59     // ... or create all needed events right now
60     $pdlModelObject->createEventsFromAttributeMaps();
61     }
62     $this->pdlModelObjects[$objecttype] =& $pdlModelObject;
63     }
64    
65     // -------------------------------------------------------
66     // returns the reference to a PDLModelObject by a given ObjectType
67     function &getObject($objecttype) {
68     return $this->pdlModelObjects[$objecttype];
69     }
70    
71     // -------------------------------------------------------
72     //
73     function existsObject($objecttype) {
74     return isset($this->pdlModelObjects[$objecttype]);
75     }
76    
77    
78     // -------------------------------------------------------
79     // adds the reference to a given PDLModelObject to local "pdlModelObjects"-hash (with its object-type as key)
80     function addDataOperation($operationname, &$pdlModelDataOperation) {
81     $this->pdlModelDataOperations[$operationname] =& $pdlModelDataOperation;
82     }
83    
84     // -------------------------------------------------------
85     // returns the reference to a PDLModelDataOperation by a given operationname
86     function &getDataOperation($operationname) {
87     return $this->pdlModelDataOperations[$operationname];
88     }
89    
90     }
91    
92    
93     // -------------------------------------------------------
94     // main "PDLModelObject"-object
95     // represents a pdl-ModelObject which is used to keep track of "PDLModelEvent"-objects (register and query)
96     class PDLModelObject {
97     // -------------------------------------------------------
98    
99     // the ObjectType of this PDLModelObject
100     var $type;
101     var $objectkey;
102    
103     // is this object an auto-event-object?
104     var $bool_autoevent;
105    
106     // a hash of references to "PDLModelAttribute"-objects
107     var $attributes;
108    
109     // a hash of references to "PDLModelEvent"-objects
110     var $events;
111    
112     // ------
113     // constructor
114     function PDLModelObject($objecttype) {
115     slog("PDLModelObject: PDLModelObject($objecttype)");
116    
117     // set ObjectType
118     $this->type = $objecttype;
119    
120     // clear ObjectKey
121     $this->objectkey = '';
122    
123     $this->bool_autoevent = 0;
124    
125     // clear attributes
126     $this->attributes = array();
127     // clear events
128     $this->events = array();
129     }
130    
131     // ------
132     // creates an object-attribute ("PDLModelAttribute") and adds reference to local "attributes"-hash
133     function &addAttribute($args) {
134     //slog("PDLModelObject: addAttribute($attributename, !content!)");
135     list($name, $type, $map_name, $map_type_specific) = $args;
136     $r_attr =& new PDLModelAttribute($name, $type, $map_name, $map_type_specific);
137     $this->attributes[$name] =& $r_attr;
138     return $r_attr;
139     }
140    
141    
142     // ------------------------------------------------------------
143     // creates an event ("PDLModelEvent") and adds reference to local "events"-hash
144     function &_addEvent($args) {
145     list($name, $unreadySql) = $args;
146     $r_ev =& new PDLModelEvent($name, $unreadySql);
147     $this->events[$name] =& $r_ev;
148     return $r_ev;
149     }
150    
151    
152     // ------------------------------------------------------------
153     // creates an event and maps its metadata
154     function &addEventAndOrMap($args) {
155     list($name, $unreadySql, $map) = $args;
156     $this->_setMap_AllAttributes($map);
157     $r_ev =& $this->_addEvent(array($name, $unreadySql));
158     return $r_ev;
159     }
160    
161    
162     // ------------------------------------------------------------
163     function createEventsFromAttributeMaps() {
164    
165    
166     $attributes_ForNameReplacement = array();
167     $attributes_ForValueReplacement = array();
168     $columns = array();
169     $map_attribute2column_ForNameReplacement = array();
170    
171     $eventpart_tablename = '';
172     $eventpart_attributes_ForNameReplacement = '';
173     $eventpart_attributes_ForValueReplacement = '';
174     $eventpart_attributes_ForValueReplacement_ForInsert = '';
175     $eventpart_columns = '';
176    
177     // (insert)
178     $map_column2attribute_ForValueReplacement = array();
179     $eventpart_columns2attributes_ForValueReplacement = '';
180    
181    
182    
183     // - - - - - - - - - - - - - - - - - - - - -
184     // 1. build attribute-, column-list and mapping-table
185     reset($this->attributes);
186     while($attribute =& current($this->attributes)) {
187     $attributename = $attribute->name;
188     $attributename_ForNameReplacement = ':' . $attribute->name;
189     $attributename_ForValueReplacement = '!' . $attribute->name;
190     $mapname = $attribute->map_name;
191     // bugfix: before we continue, we should check if "$map_value" is valid, else: skip this
192     if ($mapname) {
193     // attribute
194     array_push($attributes_ForNameReplacement, $attributename_ForNameReplacement);
195     array_push($attributes_ForValueReplacement, $attributename_ForValueReplacement);
196     // column
197     $meta_sql = $attribute['meta_sql'];
198     array_push($columns, $mapname);
199     // map
200     $map_attribute2column_ForNameReplacement[$attributename_ForNameReplacement] = $mapname;
201     $map_column2attribute_ForValueReplacement[$mapname] = $attributename_ForValueReplacement;
202     }
203     next($this->attributes);
204     }
205     $eventpart_attributes_ForNameReplacement = join($attributes_ForNameReplacement, ', ');
206     $eventpart_attributes_ForValueReplacement = join($attributes_ForValueReplacement, ', ');
207     $eventpart_columns = join($columns, ', ');
208     $eventpart_columns2attributes_ForValueReplacement = getAttribStringFromHash($map_column2attribute_ForValueReplacement, ', ', '=', '');
209    
210    
211     // HACK:
212     $eventpart_tablename = substr($columns[0], 0, strpos($columns[0], '.'));
213    
214    
215     // - - - - - - - - - - - - - - - - - - - - -
216     // 2. create auto-events and store their references
217    
218     // HACKs!?
219    
220     // "retrieve single"
221     $unreadySql = "SELECT $eventpart_columns FROM $eventpart_tablename";
222     $this->_addEvent(array('retrieve single', $unreadySql));
223    
224     // "retrieve all"
225     $unreadySql = "SELECT $eventpart_columns FROM $eventpart_tablename";
226     $this->_addEvent(array('retrieve all', $unreadySql));
227    
228     // "update"
229     $unreadySql = "UPDATE $eventpart_tablename SET $eventpart_columns2attributes_ForValueReplacement";
230     $this->_addEvent(array('update', $unreadySql));
231    
232     // "add"
233     $unreadySql = "INSERT INTO $eventpart_tablename ($eventpart_columns) VALUES ($eventpart_attributes_ForValueReplacement)";
234     $this->_addEvent(array('add', $unreadySql));
235    
236     // "remove"
237     $unreadySql = "DELETE FROM $eventpart_tablename";
238     $this->_addEvent(array('remove', $unreadySql));
239    
240    
241     }
242    
243    
244     // ------------------------------------------------------------
245     function setObjectKey($objectkey = '') {
246     if ($objectkey) {
247     $this->objectkey = $objectkey;
248     array_push($this->attributes[$objectkey]->meta_sql['attribs'], "PRIMARY KEY");
249     }
250     }
251    
252     // ------
253     // sets the mapping of a single object-attribute
254     function _setMap_SingleAttribute($attributename, $mapname) {
255     slog("PDLModelObject: setMap(!map!)");
256     $this->attributes[$attributename]->set_Mapping($mapname);
257     }
258    
259     // ------
260     // sets the mapping of all object-attributes
261     function _setMap_AllAttributes($map) {
262     slog("PDLModelObject: setMap(!map!)");
263     while(list($attributename, $mapname) = each($map)) {
264     if (isset($this->attributes[$attributename])) {
265     $this->_setMap_SingleAttribute($attributename, $mapname);
266     }
267     }
268     }
269    
270     // ------
271     // returns all "PDLModelAttribute"-objects
272     function getAttributes() {
273     return $this->attributes;
274     }
275    
276     // ------
277     // returns an event by given eventname
278     function &getEvent($eventname) {
279     slog("PDLModelObject: &getEvent($eventname)");
280     return $this->events[$eventname];
281     }
282    
283    
284    
285     /*
286     function getEventContent($eventname) {
287     print "PDLModelObject_getEventContent: \"$eventname\"<br>";
288     return $this->events[$eventname]->getContent();
289     }
290     */
291    
292     }
293    
294    
295     // --------------------------------------------------------------------------------------------------------------
296     // main "PDLModelAttribute"-object
297     // represents a pdl-model-attribute which is used to hold metadata about "object-attributes"
298     class PDLModelAttribute {
299    
300     // the attributes of this attribute
301     var $name;
302     var $type;
303     var $map_name;
304     var $map_name_full;
305     var $map_type_specific;
306    
307     // sql-meta-information
308     var $meta_sql;
309    
310     // constructor
311     function PDLModelAttribute($name = '', $type = '', $map_name = '', $map_type_specific = '') {
312    
313     slog("PDLModelAttribute: PDLModelAttribute($name, !content_raw!)");
314    
315     // setting event-name ...
316     $this->name = $name;
317     $this->type = $type;
318     $this->map_name = $map_name;
319     $this->map_type_specific = $map_type_specific;
320    
321     // initialize the "meta_sql"-array with used keys
322     $this->meta_sql = array('table' => '', 'column' => '', 'type' => '', 'length' => '', 'attribs' => array());
323    
324     // do some work
325     $this->_create_meta_sql();
326    
327     }
328    
329     function set_Mapping($map_name) {
330     $this->map_name = $map_name;
331     $this->_create_meta_sql();
332     }
333    
334     function _create_meta_sql() {
335    
336     // set table / columnname
337     if (stristr($this->map_name, '.')) {
338     $tmp_arr = split('\.', $this->map_name);
339     $this->meta_sql['table'] = $tmp_arr[0];
340     $this->meta_sql['column'] = $tmp_arr[1];
341     } else {
342     // set columnname only
343     $this->meta_sql['column'] = $this->map_name;
344     }
345    
346     /*
347     The PDL Attribute Types are the allowed Java types for attributes defined in PDL.
348     Therefore, every type seen here is the Java type returned by the Persistence System.
349    
350     BigInteger
351     BigDecimal
352     Boolean
353     Byte
354     Character
355     Date
356     Double
357     Float
358     Integer
359     Long
360     Short
361     String (this should be used for both Strings and Clobs)
362     Blob (actually returns a Byte[] and will be depricated once
363     the PDL compiler supports arrays)
364     */
365    
366     if ($this->map_type_specific) {
367     $this->meta_sql['type'] = $this->map_type_specific;
368     } else {
369     switch ($this->type) {
370     case 'BigDecimal':
371     $this->meta_sql['type'] = 'bigint';
372     $this->meta_sql['length'] = 20;
373     break;
374     case 'String':
375     $this->meta_sql['type'] = 'varchar';
376     $this->meta_sql['length'] = 255;
377     break;
378     }
379     }
380    
381    
382     }
383    
384    
385     }
386    
387    
388    
389     // -------------------------------------------------------
390     // main "PDLModelEvent"-object
391     // represents a pdl-model-event which is used to hold metadata about "object-attributes" <-> "rdbms-columns" - mappings
392     class PDLModelAbstractDataOperation {
393     // -------------------------------------------------------
394    
395     // the name of this event
396     var $name;
397     var $unreadySql;
398    
399     // ------
400     // constructor
401     function PDLModelAbstractDataOperation($name, $unreadySql) {
402     slog("PDLModelEvent: PDLModelEvent($name, !content_raw!)");
403     // setting event-name ...
404     $this->name = $name;
405     // ... and the raw content
406     $this->unreadySql = $unreadySql;
407     }
408    
409     function get_unreadySql() {
410     return $this->unreadySql;
411     }
412    
413     }
414    
415     class PDLModelDataOperation extends PDLModelAbstractDataOperation { }
416     class PDLModelEvent extends PDLModelAbstractDataOperation { }
417    
418     ?>

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