Blame | Last modification | View Log | Download
<?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-2004 Giunta/Baroncelli. All rights reserved.** @todo some more error checking here and there* @todo document the xmlrpc-struct used to encode recordset info* @todo verify if using xmlrpc_encode($rs->GetArray()) would work with:* - ADODB_FETCH_BOTH* - null values*//*** Include the main libraries*/require_once('xmlrpc.inc');if (!defined('ADODB_DIR')) require_once('adodb.inc.php');/*** Builds an xmlrpc struct value out of an AdoDB recordset*/function rs2xmlrpcval(&$adodbrs) {$header =& rs2xmlrpcval_header($adodbrs);$body =& rs2xmlrpcval_body($adodbrs);// put it all together and build final xmlrpc struct$xmlrpcrs =& new xmlrpcval ( array("header" => $header,"body" => $body,), "struct");return $xmlrpcrs;}/*** Builds an xmlrpc struct value describing an AdoDB recordset*/function rs2xmlrpcval_header($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");return $header;}/*** Builds an xmlrpc struct value out of an AdoDB recordset* (data values only, no data definition)*/function rs2xmlrpcval_body($adodbrs){$numfields = $adodbrs->FieldCount();// build structure containing recordset data$adodbrs->MoveFirst();$rows = array();while (!$adodbrs->EOF) {$columns = array();// This should work on all cases of fetch mode: assoc, num, both or defaultif ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount())for ($i = 0; $i < $numfields; $i++)if ($adodbrs->fields[$i] === null)$columns[$i] =& new xmlrpcval ('');else$columns[$i] =& xmlrpc_encode ($adodbrs->fields[$i]);elseforeach ($adodbrs->fields as $val)if ($val === null)$columns[] =& new xmlrpcval ('');else$columns[] =& xmlrpc_encode ($val);$rows[] =& new xmlrpcval ($columns, "array");$adodbrs->MoveNext();}$body =& new xmlrpcval ($rows, "array");return $body;}/*** Returns an xmlrpc struct value as string out of an AdoDB recordset*/function rs2xmlrpcstring (&$adodbrs) {$xmlrpc = rs2xmlrpcval ($adodbrs);if ($xmlrpc)return $xmlrpc->serialize();elsereturn 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;}?>