]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/contrib/toxmlrpc.inc.php
Upgrade adodb
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / contrib / toxmlrpc.inc.php
1 <?php
2     /**
3     * Helper functions to convert between ADODB recordset objects and XMLRPC values.
4     * Uses John Lim's AdoDB and Edd Dumbill's phpxmlrpc libs
5     * 
6     * @author Daniele Baroncelli
7     * @author Gaetano Giunta
8     * @copyright (c) 2003-2004 Giunta/Baroncelli. All rights reserved.
9     * 
10     * @todo some more error checking here and there
11     * @todo document the xmlrpc-struct used to encode recordset info
12     * @todo verify if using xmlrpc_encode($rs->GetArray()) would work with:
13     *       - ADODB_FETCH_BOTH
14     *       - null values
15     */
16
17     /**
18     * Include the main libraries
19     */    
20     require_once('xmlrpc.inc');
21     if (!defined('ADODB_DIR')) require_once('adodb.inc.php');
22             
23     /**
24     * Builds an xmlrpc struct value out of an AdoDB recordset
25     */
26     function rs2xmlrpcval(&$adodbrs) {
27
28         $header = rs2xmlrpcval_header($adodbrs);
29         $body = rs2xmlrpcval_body($adodbrs);
30
31         // put it all together and build final xmlrpc struct
32         $xmlrpcrs = new xmlrpcval ( array(
33                 "header" => $header,
34                 "body" => $body,
35                 ), "struct");
36
37         return $xmlrpcrs;
38
39     }
40
41     /**
42     * Builds an xmlrpc struct value describing an AdoDB recordset
43     */
44     function rs2xmlrpcval_header($adodbrs)
45     {
46         $numfields = $adodbrs->FieldCount();
47         $numrecords = $adodbrs->RecordCount();
48
49         // build structure holding recordset information
50         $fieldstruct = array();
51         for ($i = 0; $i < $numfields; $i++) {
52             $fld = $adodbrs->FetchField($i);
53             $fieldarray = array();
54             if (isset($fld->name))
55                 $fieldarray["name"] = new xmlrpcval ($fld->name);
56             if (isset($fld->type))
57                 $fieldarray["type"] = new xmlrpcval ($fld->type);
58             if (isset($fld->max_length))
59                 $fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int");
60             if (isset($fld->not_null))
61                 $fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean");
62             if (isset($fld->has_default))
63                 $fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean");
64             if (isset($fld->default_value))
65                 $fieldarray["default_value"] = new xmlrpcval ($fld->default_value);
66             $fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct");
67         }
68         $fieldcount = new xmlrpcval ($numfields, "int");
69         $recordcount = new xmlrpcval ($numrecords, "int");
70         $sql = new xmlrpcval ($adodbrs->sql);
71         $fieldinfo = new xmlrpcval ($fieldstruct, "array");
72
73         $header = new xmlrpcval ( array(
74                 "fieldcount" => $fieldcount,
75                 "recordcount" => $recordcount,
76                 "sql" => $sql,
77                 "fieldinfo" => $fieldinfo
78                 ), "struct");
79
80         return $header;
81     }
82
83     /**
84     * Builds an xmlrpc struct value out of an AdoDB recordset
85     * (data values only, no data definition)
86     */
87     function rs2xmlrpcval_body($adodbrs)
88     {
89         $numfields = $adodbrs->FieldCount();
90
91         // build structure containing recordset data
92         $adodbrs->MoveFirst();
93         $rows = array();
94         while (!$adodbrs->EOF) {
95             $columns = array();
96             // This should work on all cases of fetch mode: assoc, num, both or default
97             if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount())
98                 for ($i = 0; $i < $numfields; $i++)
99                     if ($adodbrs->fields[$i] === null)
100                         $columns[$i] = new xmlrpcval ('');
101                     else
102                         $columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]);
103             else
104                 foreach ($adodbrs->fields as $val)
105                     if ($val === null)
106                         $columns[] = new xmlrpcval ('');
107                     else
108                         $columns[] = xmlrpc_encode ($val);
109
110             $rows[] = new xmlrpcval ($columns, "array");
111
112             $adodbrs->MoveNext();
113         }
114         $body = new xmlrpcval ($rows, "array");
115
116         return $body;    
117     }
118     
119     /**
120     * Returns an xmlrpc struct value as string out of an AdoDB recordset
121     */    
122     function rs2xmlrpcstring (&$adodbrs) {
123         $xmlrpc = rs2xmlrpcval ($adodbrs);
124         if ($xmlrpc)
125           return $xmlrpc->serialize();
126         else
127           return null;
128     }
129
130     /**
131     * Given a well-formed xmlrpc struct object returns an AdoDB object
132     * 
133     * @todo add some error checking on the input value
134     */
135     function xmlrpcval2rs (&$xmlrpcval) {
136
137         $fields_array = array();
138         $data_array = array();
139  
140         // rebuild column information  
141         $header = $xmlrpcval->structmem('header');
142         
143         $numfields = $header->structmem('fieldcount');
144         $numfields = $numfields->scalarval();
145         $numrecords = $header->structmem('recordcount');
146         $numrecords = $numrecords->scalarval();
147         $sqlstring = $header->structmem('sql');
148         $sqlstring = $sqlstring->scalarval();
149         
150         $fieldinfo = $header->structmem('fieldinfo');
151         for ($i = 0; $i < $numfields; $i++) {
152             $temp = $fieldinfo->arraymem($i);
153             $fld = new ADOFieldObject();
154             while (list($key,$value) = $temp->structeach()) {
155                 if ($key == "name") $fld->name = $value->scalarval();
156                 if ($key == "type") $fld->type = $value->scalarval();
157                 if ($key == "max_length") $fld->max_length = $value->scalarval();
158                 if ($key == "not_null") $fld->not_null = $value->scalarval();
159                 if ($key == "has_default") $fld->has_default = $value->scalarval();
160                 if ($key == "default_value") $fld->default_value = $value->scalarval();
161             } // while
162             $fields_array[] = $fld;
163         } // for
164
165         // fetch recordset information into php array
166         $body = $xmlrpcval->structmem('body');
167         for ($i = 0; $i < $numrecords; $i++) {
168             $data_array[$i]= array();
169             $xmlrpcrs_row = $body->arraymem($i);
170             for ($j = 0; $j < $numfields; $j++) {
171                 $temp = $xmlrpcrs_row->arraymem($j);
172                 $data_array[$i][$j] = $temp->scalarval();
173             } // for j
174         } // for i
175
176         // finally build in-memory recordset object and return it
177         $rs = new ADORecordSet_array();
178         $rs->InitArrayFields($data_array,$fields_array);
179         return $rs;
180
181     }
182
183 ?>