You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							157 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							157 lines
						
					
					
						
							5.9 KiB
						
					
					
				| <?php | |
|     /** | |
|     * Helper functions to convert between ADODB recordset objects and XMLRPC values. | |
|     * Uses John Lim's AdoDB and Edd Dumbill's phpxmlrpc libs | |
|     *  | |
|     * @author Daniele Baroncelli | |
|     * @author Gaetano Giunta | |
|     * @copyright (c) 2003 Giunta/Baroncelli. All rights reserved. | |
|     *  | |
|     * @todo some more error checking here and there | |
|     * @todo document the xmlrpc-struct used to encode recordset info | |
|     */ | |
| 
 | |
|     /** | |
|     * Include the main libraries | |
|     */     | |
|     require_once('xmlrpc.inc'); | |
|     require_once('adodb.inc.php'); | |
|              | |
|     /** | |
|     * Builds an xmlrpc struct value out of an AdoDB recordset | |
|     */ | |
|     function rs2xmlrpcval(&$adodbrs) { | |
| 
 | |
|         $numfields = $adodbrs->FieldCount(); | |
|         $numrecords = $adodbrs->RecordCount(); | |
| 
 | |
|         // build structure holding recordset information | |
|         $fieldstruct = array(); | |
|         for ($i = 0; $i < $numfields; $i++) { | |
|             $fld = $adodbrs->FetchField($i); | |
|             $fieldarray = array(); | |
|             if (isset($fld->name)) | |
|                 $fieldarray["name"] = new xmlrpcval ($fld->name); | |
|             if (isset($fld->type)) | |
|                 $fieldarray["type"] = new xmlrpcval ($fld->type); | |
|             if (isset($fld->max_length)) | |
|                 $fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int"); | |
|             if (isset($fld->not_null)) | |
|                 $fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean"); | |
|             if (isset($fld->has_default)) | |
|                 $fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean"); | |
|             if (isset($fld->default_value)) | |
|                 $fieldarray["default_value"] = new xmlrpcval ($fld->default_value); | |
|             $fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct"); | |
|         } | |
|         $fieldcount = new xmlrpcval ($numfields, "int"); | |
|         $recordcount = new xmlrpcval ($numrecords, "int"); | |
|         $sql = new xmlrpcval ($adodbrs->sql); | |
|         $fieldinfo = new xmlrpcval ($fieldstruct, "array"); | |
| 
 | |
|         $header = new xmlrpcval ( array( | |
|                 "fieldcount" => $fieldcount, | |
|                 "recordcount" => $recordcount, | |
|                 "sql" => $sql, | |
|                 "fieldinfo" => $fieldinfo | |
|                 ), "struct"); | |
| 
 | |
|         // build structure containing recordset data | |
|         $rows = array(); | |
|         while (!$adodbrs->EOF) { | |
|             $columns = array(); | |
|             // This should work on all cases of fetch mode: assoc, num, both or default | |
|             if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount()) | |
|                 for ($i = 0; $i < $numfields; $i++) | |
|                     if ($columns[$i] === null) | |
|                         $columns[$i] = new xmlrpcval (''); | |
|                     else | |
|                         $columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]); | |
|             else | |
|                 foreach ($adodbrs->fields as $val) | |
|                     if ($val === null) | |
|                         $columns[$i] = new xmlrpcval (''); | |
|                     else | |
|                         $columns[] = xmlrpc_encode ($val); | |
| 
 | |
|             $rows[] = new xmlrpcval ($columns, "array"); | |
| 
 | |
|             $adodbrs->MoveNext(); | |
|         } | |
|         $body = new xmlrpcval ($rows, "array"); | |
| 
 | |
|         // put it all together and build final xmlrpc struct | |
|         $xmlrpcrs = new xmlrpcval ( array( | |
|                 "header" => $header, | |
|                 "body" => $body, | |
|                 ), "struct"); | |
| 
 | |
|         return $xmlrpcrs; | |
| 
 | |
|     } | |
| 
 | |
|     /** | |
|     * Returns an xmlrpc struct value as string out of an AdoDB recordset | |
|     */     | |
|     function rs2xmlrpcstring (&$adodbrs) { | |
|         $xmlrpc = rs2xmlrpcval ($adodbrs); | |
|         if ($xmlrpc) | |
|           return $xmlrpc->serialize(); | |
|         else | |
|           return null; | |
|     } | |
| 
 | |
|     /** | |
|     * Given a well-formed xmlrpc struct object returns an AdoDB object | |
|     *  | |
|     * @todo add some error checking on the input value | |
|     */ | |
|     function xmlrpcval2rs (&$xmlrpcval) { | |
| 
 | |
|         $fields_array = array(); | |
|         $data_array = array(); | |
|   | |
|         // rebuild column information   | |
|         $header =& $xmlrpcval->structmem('header'); | |
|          | |
|         $numfields = $header->structmem('fieldcount'); | |
|         $numfields = $numfields->scalarval(); | |
|         $numrecords = $header->structmem('recordcount'); | |
|         $numrecords = $numrecords->scalarval(); | |
|         $sqlstring = $header->structmem('sql'); | |
|         $sqlstring = $sqlstring->scalarval(); | |
|          | |
|         $fieldinfo =& $header->structmem('fieldinfo'); | |
|         for ($i = 0; $i < $numfields; $i++) { | |
|             $temp =& $fieldinfo->arraymem($i); | |
|             $fld = new ADOFieldObject(); | |
|             while (list($key,$value) = $temp->structeach()) { | |
|                 if ($key == "name") $fld->name = $value->scalarval(); | |
|                 if ($key == "type") $fld->type = $value->scalarval(); | |
|                 if ($key == "max_length") $fld->max_length = $value->scalarval(); | |
|                 if ($key == "not_null") $fld->not_null = $value->scalarval(); | |
|                 if ($key == "has_default") $fld->has_default = $value->scalarval(); | |
|                 if ($key == "default_value") $fld->default_value = $value->scalarval(); | |
|             } // while | |
|             $fields_array[] = $fld; | |
|         } // for | |
|  | |
|         // fetch recordset information into php array | |
|         $body =& $xmlrpcval->structmem('body'); | |
|         for ($i = 0; $i < $numrecords; $i++) { | |
|             $data_array[$i]= array(); | |
|             $xmlrpcrs_row =& $body->arraymem($i); | |
|             for ($j = 0; $j < $numfields; $j++) { | |
|                 $temp =& $xmlrpcrs_row->arraymem($j); | |
|                 $data_array[$i][$j] = $temp->scalarval(); | |
|             } // for j | |
|         } // for i | |
|  | |
|         // finally build in-memory recordset object and return it | |
|         $rs = new ADORecordSet_array(); | |
|         $rs->InitArrayFields($data_array,$fields_array); | |
|         return $rs; | |
| 
 | |
|     } | |
| 
 | |
| ?>
 | |
| 
 |