/[cvs]/nfo/php/libs/com.newsblob.phphtmllib/widgets/data_source/MemoryDataSource.inc
ViewVC logotype

Annotation of /nfo/php/libs/com.newsblob.phphtmllib/widgets/data_source/MemoryDataSource.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations)
Wed Mar 5 10:37:47 2003 UTC (21 years, 6 months ago) by joko
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +4 -1 lines
FILE REMOVED
moved to ../data_list

1 joko 1.1 <?php
2     /**
3     * This file contains the MemoryDataSource child class
4     * that inherits from the DataListSource.
5     *
6     * @author Sebastian Utz <seut@tunemedia.de>
7     * @author Andreas Motl <andreas.motl@ilo.de>
8 joko 1.2 * @copyright (c) 2003 - All Rights reserved.
9     * @license GNU LGPL (GNU Lesser General Public License)
10     *
11     * @author-url http://www.netfrag.org/~jonen/
12     * @author-url http://www.netfrag.org/~joko/
13     * @license-url http://www.gnu.org/licenses/lgpl.txt
14     *
15 joko 1.1 * @package phpHtmlLib
16 joko 1.2 * @module widgets::data_source::MemoryDataSource
17     *
18 joko 1.1 */
19    
20     /**
21 joko 1.4 * $Id: MemoryDataSource.inc,v 1.3 2003/03/03 21:24:45 joko Exp $
22 joko 1.2 *
23     * $Log: MemoryDataSource.inc,v $
24 joko 1.4 * Revision 1.3 2003/03/03 21:24:45 joko
25     * updated todo
26     *
27 joko 1.3 * Revision 1.2 2003/03/01 15:34:26 joko
28     * + introduced new 'label'-mechanism, purged old 'header'-mechanism
29     * + reworked internal data-structure and introduced new methods 'propagate_xyz'
30     * + added little debugging helper methods
31     *
32 joko 1.2 * Revision 1.1 2003/03/01 03:09:22 joko
33     * + moved here from data_list/MemoryDataListSource.inc
34 joko 1.1 *
35     *
36     * Revision 1.1 2003/02/28 17:17:59 jonen
37     * + renamed from flibRPCDataListSource.inc
38     *
39     * Revision 1.0 2003/02/xx 00:00:00 jonen
40     * + copied from CSVFILEDataListSource.inc
41     *
42     */
43    
44     /**
45     * MemoryDataSource provides a basic framework for handling
46     * arbitrary data, that is: items, lists and trees.
47     * It assumes the "list" being *not* the most abstract, but the most
48     * multipurpose thing to be able to represent/handle all the others.
49     * (regarding convenience and code-reuse: inherits from DataListSource)
50     *
51     * This could be pictured by looking at a list being either
52     * a part (tree) or a container (item) of another thing.
53     * e.g.:
54     * item = part of list (a item is a part of a list)
55     * list = list (a list is a list)
56     * tree = nested lists (a part of a tree is a list)
57     *
58     * In fact, MemoryDataSource just doesn't care a bit
59     * about the type of the actual data, so perfectly fits
60     * as an abstract base for further hackings.
61     * e.g.: look at ProxyDataSource.inc .....
62     *
63     */
64    
65     /**
66     * Todo:
67     *
68     * o introduce (g|s)etlabels to set either
69     * a) columns (for list columns) or
70     * b) captions (for object attributes)
71 joko 1.3 * o maybe use shared memory as an alternative handler
72     * look at the php Shared Memory extension at (e.g.):
73     * http://www.zend.com/manual/ref.shmop.php
74 joko 1.1 *
75     */
76    
77    
78     class MemoryDataSource extends DataListSource {
79    
80    
81     /**
82 joko 1.2 * These hold data
83 joko 1.1 *
84     */
85     var $_memory = array();
86     var $_result = array();
87    
88     /**
89     * this holds the headers read
90     * array keys
91     */
92     var $_data_keys = array();
93 joko 1.2
94     /**
95     * This holds metadata
96     *
97     */
98     var $_schema = array();
99 joko 1.1
100 joko 1.2 /**
101     * This holds some information about the tracing level.
102     *
103     */
104     var $_debug = array(
105     notice => 0,
106     trace => 0,
107     payload => 0,
108     );
109    
110     /**
111     * This accumulates errors occouring while processing.
112     * $error = array($level, $message);
113     *
114     */
115 joko 1.1 var $_errors = array();
116    
117    
118    
119     /**
120     * The constructor.
121     *
122     * @param hash - a hashed data object
123     *
124     */
125     function MemoryDataSource( &$payload ) {
126 joko 1.2
127     // tracing
128     $this->trace_payload('MemoryDataSource', $payload);
129    
130     // transfer data to "memory"
131     $this->_memory = &$payload;
132    
133 joko 1.1 }
134    
135 joko 1.2 function read_labels_from_result() {
136     $this->set_labels($this->_result[0]);
137     }
138    
139     function debug($method, $message) {
140     if ($this->_debug[notice]) {
141     if ($method) { $prefix = get_class($this) . "->" . $method . ": "; }
142     print $prefix . $message . "<br/>" . "\n";
143     }
144     }
145    
146     function trace($method, $var) {
147     if ($this->_debug[trace]) {
148     print get_class($this) . "->" . $method . ": " . Dumper($var) . "<br/>" . "\n";
149     }
150     }
151    
152     function trace_payload($method, $data) {
153     if ($this->_debug[payload]) {
154     $this->trace($method, $data);
155     }
156     }
157 joko 1.1
158     /**
159     * The prequery. We use this to read the file
160     * into memory so we can do operations on the data
161     * (search, sort, etc.)
162     */
163 joko 1.2 function O_do_prequery() {
164     $this->_read_schema();
165     }
166 joko 1.1 function do_prequery() {
167 joko 1.2 }
168    
169 joko 1.1 /**
170     * This function does the query
171     * and search/sort
172     */
173     function do_query() {
174     // short-circuit (default behaviour, maybe intercepted by inheriting and overwriting 'do_query')
175     $this->_result = $this->_memory;
176     $this->handle_result();
177     }
178    
179     function handle_result() {
180 joko 1.2 $this->debug("handle_result", "HANDLE RESULT!<br>");
181     $this->propagate_result();
182     $this->set_total_rows( $count );
183     $this->sort();
184     }
185    
186     function propagate_result() {
187     $this->debug('propagate_result', "PROPAGATE RESULT!");
188 joko 1.1 foreach ($this->_result as $value) {
189 joko 1.2 $this->trace_payload("propagate_result", $value);
190 joko 1.1 if ($this->add_data_row( $value)) {
191     $count++;
192     }
193     }
194     }
195    
196     /**
197     * This function returns the next row of
198     * valid data.
199     *
200     */
201     function get_next_data_row() {
202     $index = $this->get_data_index();
203     $limit = $this->get_limit();
204     $offset = $this->get_offset();
205    
206     if ($limit == -1) {
207     //don't limit the data
208     if ($index > $this->get_total_rows()) {
209     return NULL;
210     } else {
211     return $this->_data[$index];
212     }
213     } else {
214     $left_to_show = $limit - ($index - $offset);
215     if ($left_to_show > 0) {
216     return $this->_data[$index];
217     } else {
218     return NULL;
219     }
220     }
221     }
222    
223    
224    
225    
226     /**
227     * This file trys to get the Object Hash Keys.
228     *
229     */
230 joko 1.2 function propagate_schema() {
231     $this->debug("propagate_schema", "PROPAGATE SCHEMA!<br>");
232 joko 1.1 /*
233     // FIXME: patch to make php not croak if result is empty at this stage
234     if (!is_array($this->_memory[0])) {
235     //$this->add_data_row( array( 'empty' => '[empty]') );
236     //$this->_memory[0] = array( '' => 'empty' );
237     $this->_errors[] = array("warning", "header metadata was empty");
238     print "no header!<br/>";
239     return;
240     }
241     */
242 joko 1.2 foreach($this->_schema[labels] as $value) {
243     $this->debug("propagate_schema", "label: $value");
244     array_push($this->_data_keys, $value);
245 joko 1.1 }
246     }
247    
248    
249 joko 1.2 function O_get_header() {
250     $this->_read_schema();
251 joko 1.1 return $this->_data_keys;
252     }
253    
254 joko 1.2 function get_labels() {
255     return $this->_data_keys;
256     }
257    
258     function set_labels($labels_or_entry) {
259     if (is_hash($labels_or_entry)) {
260     if ($this->_debug[notice]) {
261     $this->debug('set_labels', 'hash was passed in (is_hash == true): just using keys');
262     }
263     $labels_or_entry = array_keys($labels_or_entry);
264     }
265     $this->trace('set_labels', $labels_or_entry);
266     $this->_schema[labels] = $labels_or_entry;
267     $this->propagate_schema();
268 joko 1.1 }
269    
270     function get_data_source() {
271    
272     }
273    
274    
275     /**
276     * This function adds a row of data
277     * if necesarry to the data array
278     *
279     */
280     function add_data_row($row) {
281     if ($row != NULL) {
282     if ($this->get_searchby_value()) {
283     //user wants to search the data
284     if ($this->_find_data($row) ) {
285     $this->_data[] = $row;
286     return TRUE;
287     } else {
288     return FALSE;
289     }
290     } else {
291     $this->_data[] = $row;
292     return TRUE;
293     }
294     } else {
295     return FALSE;
296     }
297     }
298    
299     function sort() {
300     $sortby = $this->get_orderby();
301     //ok we need to sort the data by the
302     //column in the table
303     if ($this->_is_column_sortable($sortby)) {
304     //looks like we can sort this column
305     usort($this->_data, array($this, "cmp"));
306     }
307     }
308    
309     function cmp($data1, $data2) {
310     $sortby = $this->get_orderby();
311     $ret = strnatcmp( $data1[$sortby], $data2[$sortby]);
312     if ($this->get_reverseorder() == "true") {
313     $ret *= -1;
314     }
315     return $ret;
316     }
317    
318     function _find_data( $row_data ) {
319     //look for the 'needle' in the 'haystack'
320    
321     $needle = $this->get_searchby_value();
322     $haystack = $row_data[$this->get_searchby()];
323    
324     switch ($this->get_simplesearch_modifier()) {
325     case "BEGINS":
326     if (strncasecmp($needle, $haystack, strlen($needle)) == 0) {
327     return TRUE;
328     } else {
329     return FALSE;
330     }
331     break;
332    
333     case "CONTAINS":
334     if (stristr($haystack, $needle)) {
335     return TRUE;
336     } else {
337     return FALSE;
338     }
339     break;
340     case "EXACT":
341     if (strcasecmp($needle, $haystack) == 0) {
342     return TRUE;
343     } else {
344     return FALSE;
345     }
346     break;
347     case "ENDS":
348     $needle_len = strlen( $needle );
349     $haystack_len = strlen( $haystack );
350     if ($needle_len > $haystack_len) {
351     return FALSE;
352     } else if ($needle_len == $haystack_len) {
353     $tmp = $haystack;
354     } else {
355     $tmp = substr($haystack, $haystack_len - $needle_len);
356     }
357     if (strncasecmp($needle, $tmp, $needle_len) == 0) {
358     return TRUE;
359     } else {
360     return FALSE;
361     }
362     break;
363     }
364     }
365    
366     }
367     ?>

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