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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.8 - (hide annotations)
Sun Mar 9 15:50:36 2003 UTC (21 years, 5 months ago) by joko
Branch: MAIN
Changes since 1.7: +6 -3 lines
+ additional metadata for Autodia

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

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