/[cvs]/nfo/php/libs/org.netfrag.glib/DataSource/Locator.php
ViewVC logotype

Contents of /nfo/php/libs/org.netfrag.glib/DataSource/Locator.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.18 - (show annotations)
Tue Mar 11 02:42:51 2003 UTC (21 years, 4 months ago) by joko
Branch: MAIN
Changes since 1.17: +7 -2 lines
+ fixed metadata for phpDocumentor

1 <?php
2 /**
3 * This file contains the DataSource::Locator class.
4 *
5 * It acts as a container for DataSource connection
6 * metadata. Think of it as an enhanced dsn.
7 *
8 * It gets used by DataSource::Generic
9 * to be informed about the most important stuff it
10 * has to do.
11 *
12 * @author Andreas Motl <andreas.motl@ilo.de>
13 * @package org.netfrag.glib
14 * @name DataSource::Locator
15 *
16 *
17 */
18
19
20 /**
21 * <b>Cvs-Log:</b>
22 *
23 * <pre>
24 * $Id: Locator.php,v 1.17 2003/03/11 02:34:55 joko Exp $
25 *
26 * $Log: Locator.php,v $
27 * Revision 1.17 2003/03/11 02:34:55 joko
28 * + fixed metadata for phpDocumentor
29 *
30 * Revision 1.16 2003/03/11 02:28:12 joko
31 * + fixed metadata for phpDocumentor
32 *
33 * Revision 1.15 2003/03/11 02:23:03 joko
34 * + fixed metadata for phpDocumentor
35 *
36 * Revision 1.14 2003/03/11 02:14:24 joko
37 * + fixed metadata for phpDocumentor
38 *
39 * Revision 1.13 2003/03/11 02:04:37 joko
40 * + fixed metadata for phpDocumentor
41 *
42 * Revision 1.12 2003/03/11 01:10:00 joko
43 * + fixed metadata for phpDocumentor
44 *
45 * Revision 1.11 2003/03/11 00:12:49 joko
46 * + fixed metadata for phpDocumentor
47 *
48 * Revision 1.10 2003/03/10 23:25:03 joko
49 * + fixed metadata for phpDocumentor
50 *
51 * Revision 1.9 2003/03/10 22:31:55 joko
52 * + fixed metadata for phpDocumentor
53 *
54 * Revision 1.8 2003/03/09 15:50:36 joko
55 * + additional metadata for Autodia
56 *
57 * Revision 1.7 2003/03/05 17:13:16 joko
58 * updated docu (phpDocumentor testing....)
59 *
60 * Revision 1.6 2003/03/05 16:10:08 joko
61 * updated docu (phpDocumentor testing....)
62 *
63 * Revision 1.5 2003/03/05 15:40:39 joko
64 * updated docu (phpDocumentor testing....)
65 *
66 * Revision 1.4 2003/03/05 15:26:23 joko
67 * updated docu (phpDocumentor testing....)
68 *
69 * Revision 1.3 2003/03/05 15:21:54 joko
70 * updated docu (phpDocumentor testing....)
71 *
72 * Revision 1.2 2003/03/05 15:01:10 joko
73 * updated docu
74 *
75 * Revision 1.1 2003/03/05 12:04:37 joko
76 * + initial commit
77 * </pre>
78 *
79 *
80 */
81
82 /**
83 * It helps DataSource::Generic working in different "operation modes".
84 *
85 * <p>
86 * <b>Modes:</b> (these are proposals, more or less...)
87 * o Pass-Through-Reference: php Object will get passed through all layers
88 * o Pass-Through-Memory: reference to a memory area will get used
89 * + Build-Locator: build locator from datasource-type and adapter-type
90 * o Use-Locator: directly use DataSource::Locator instance passed in
91 * o Merge-Locators: merge metadata of two or more DataSource::Locator instances
92 * o Build-AutoLocator: use global constants making up our metadata
93 * </p>
94 *
95 * <b>It can/should contain:</b>
96 * (flexible, just some parameters are required for each operation mode)
97 * o an oldschool "dsn"-string (e.g. for rdbms-connection via PEAR)
98 * + (x) name of a Proxy module to use to *wrap/hide* the connection/transport-layer
99 * (e.g. DataSource::Proxy::XMLRPC via DesignPattern::RemoteProxy)
100 * + (x) metadata (a hash) directly describing *where* to connect to (e.g. 'Host', 'Port')
101 * o an instance of an already instantiated arbitrary datasource handler (e.g. 'source')
102 * this will get propagated (pass-through-mode)
103 * o a datasource-type (of 'rpc|mysql|csv-file|xml-file')
104 * this will be mapped to a module name and used as a *Proxy*
105 * by the DataSource::Generic at runtime
106 * + (x) an adapter-type (of 'phpHtmlLib|pear')
107 * this will be mapped to a module name and used as an *Adapter*
108 * by the DataSource::Generic at runtime
109 * o names of global constants where to find these informations
110 * o datasource-type ('rpc|csv-file|...') <-> datasource-family ('orm|rdbms|odbms')
111 *
112 * <b>It can do:</b>
113 * - builds a larger locator from a minimum of information passed in via constructor-arguments
114 * - direct fallback mode to some predefined constant names if locator is empty and above method fails
115 * - direct fallback mode to some predefined values if just *everything* fails
116 *
117 * <b>How to use?</b>
118 *
119 * Pass an array holding "locator metadata" to the constructor.
120 * This module takes care of the rest.
121 * Pass an array to the constructor: (e.g.)
122 *
123 * <pre>
124 * 1. for doing rpc-calls....
125 * <code>
126 * $locator = array(
127 * datasource_type => 'rpc',
128 * [adapter_type => 'phpHtmlLib',]
129 * metadata => array( Host => 'localhost', Port => '8765' ),
130 * );
131 * $source = ne w DataSource::Generic($locator);
132 * $this->set_data_source( &$source );
133 * </code>
134 *
135 * 2. [proposal] for common/oldschool datahandles....
136 * <code>
137 * $locator = array(
138 * dsn => 'known dsn markup',
139 * );
140 * $source = ne w DataSource::Generic($locator);
141 * $this->set_data_source( &$source );
142 * </code>
143 * </pre>
144 *
145 *
146 *
147 * @author Andreas Motl <andreas.motl@ilo.de>
148 * @link http://www.netfrag.org/~joko/
149 * @copyright (c) 2003 - All Rights reserved.
150 *
151 * @license GNU LGPL (GNU Lesser General Public License)
152 * @link http://www.gnu.org/licenses/lgpl.txt
153 *
154 * @package org.netfrag.glib
155 * @subpackage DataSource
156 * @name DataSource::Locator
157 *
158 */
159 class DataSource_Locator {
160
161 /**
162 * This var holds the locator metadata hash,
163 *
164 * which is built from some predefined rules
165 * using metadata from $_options and some
166 * other presets.
167 *
168 * {@see build}, which acts as a dispatcher
169 * depending on $_options[datasource]. (main dispatching level)
170 *
171 * <p>
172 *
173 * The structure of a full blown locator looks like this:
174 *
175 * <code>
176 * $locator = array(
177 * type => '<your type specifying the datasource-type>',
178 * metadata => array(
179 * ... your arbitrary deep metadata structure ...
180 * ),
181 * [dsn => '<your dsn markup>'],
182 * );
183 * </code>
184 *
185 * Example 1 - data is inside a rdbms, using a dsn to connect to it:
186 * <code>
187 * $locator = array(
188 * dsn => 'mysql://username:password@localhost/database',
189 * );
190 * </code>
191 *
192 * Example 2 - data is inside an odbms, reachable by doing remote procedure calls (rpc):
193 * <code>
194 * $locator = array(
195 * type => 'rpc',
196 * metadata => array(
197 * package => 'Data::Driver::Proxy',
198 * Host => 'localhost',
199 * Port => '8765',
200 * )
201 * );
202 * </code>
203 *
204 * </p>
205 *
206 * @deprecated
207 *
208 */
209 var $_locator_metadata = NULL;
210
211
212 /**
213 * This var holds the arguments passed in to the constructor.
214 * We will try to build full blown locator metadata information from that.
215 *
216 * @deprecated
217 *
218 */
219 var $_in = NULL;
220
221 /**
222 * This var holds the locator metadata informations inside
223 * a single hash. This is returned from '->get()'.
224 *
225 * @deprecated
226 *
227 */
228 var $_out = NULL;
229
230
231 /**
232 * Locator metadata.
233 *
234 */
235
236 // name of a Proxy module
237 var $_datasource_type;
238
239 // name of an Adapter module
240 var $_adapter_type;
241
242 // additional information required (passed on to the Proxy by DataSource::Generic)
243 var $_metadata = array();
244
245 //var $_dsn;
246
247
248 /**
249 * The constructor is used to pass in the
250 * locator metadata hash.
251 *
252 * @param object(DataSource::Locator)|hash optional: a &$locator instance
253 */
254 function DataSource_Locator() {
255 $args_multi = func_get_args();
256
257 //php::array_shrink($args_multi);
258
259 //print Dumper($args_multi);
260 //exit;
261
262 foreach ($args_multi as $args) {
263 if (isset($args)) {
264 $this->merge_args($args);
265 }
266 }
267
268 $this->build();
269 //$this->check();
270 }
271
272 function merge_args(&$args) {
273
274 //print "args: " . Dumper($args);
275
276 // check if passed in locator is already of type *me* ...
277 // ... if so, merge it into current instance
278 if (is_object($args) && get_class($args) == get_class($this)) {
279 $this->merge_to($this, $args);
280
281 } else {
282
283 // FIXME: handle locator merging here?
284 //$this->_arguments = &$args;
285
286 // FIXME: to php::merge_to($this, $locator) here!!!
287 //$this->_data
288 // for now: assume plain hash, so just iterate and overwrite!
289 $this->merge_to($this, $args, '_');
290
291 }
292 }
293
294 function merge_to(&$target, $source, $prefix_key = '') {
295
296 //print "target: " . Dumper($target);
297 //print "source: " . Dumper($source);
298
299 // pre-flight checks
300 if (!isset($target)) {
301 user_error("variable passed as reference (merge target) is not set.");
302 return;
303 }
304 //if (!is_hash($hash)) {
305 if (!isset($source)) {
306 user_error("variable passed as source is not set.");
307 return;
308 }
309
310 // perform merge
311 foreach ($source as $key => $val) {
312 $name = $prefix_key . $key;
313 if (is_object($target)) {
314 $target->$name = $val;
315 //} elseif (php::is_hash($target)) {
316 } else {
317 $target[$name] = $val;
318 }
319 }
320
321 // indicate good
322 return 1;
323
324 }
325
326 /**
327 * Set the locator metadata hash we will feed *partly*
328 * to an encapsulated Data::Driver::Proxy instance
329 *
330 * @param LocatorMetadataHash array -
331 *
332 */
333 function set( &$locator ) {
334 $this->_out = &$locator;
335 }
336
337 function &get_metadata() {
338 //return ($this->_out);
339 return $this->_metadata;
340 }
341
342
343 function build( ) {
344
345 // trace
346 //print Dumper($this);
347
348 $good = 0;
349 switch ($this->_datasource_type) {
350 case 'rpc':
351 // get rpc connection information from global constants
352 $metadata = array(
353 //package => 'Data::Driver::Proxy',
354 //package => 'DataSource::Proxy::XMLRPC',
355 //package => 'DataSource::Generic',
356 //package => 'DesignPattern::RemoteProxy',
357 Host => RPC_HOSTNAME,
358 Port => RPC_PORT,
359 );
360 $good = 1;
361 break;
362 }
363
364 if ($good) {
365
366 // V1:
367 /*
368 $this->_out = array(
369 datasource_type => $datasource,
370 adapter_type => 'Data',
371 metadata => $metadata,
372 );
373 */
374
375 // V2:
376 //$this->_out = $metadata;
377
378 // V3:
379 $this->merge_to($this->_metadata, $metadata);
380
381 }
382
383 // trace
384 //print Dumper($this);
385
386 }
387
388 function check() {
389 if (!sizeof($this->_metadata)) {
390 user_error("DataSource::Locator::check() failed: " . "Locator metadata not established, please check configuration options.");
391 return;
392 }
393 return 1;
394 }
395
396
397 }
398
399 ?>

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