Source for file toxmlrpc.inc.php

Documentation is available at 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[$inew 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== $adodbrs->FieldCount())
  98.                 for ($i 0$i $numfields$i++)
  99.                     if ($adodbrs->fields[$i=== null)
  100.                         $columns[$inew xmlrpcval ('');
  101.                     else
  102.                         $columns[$ixmlrpc_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. ?>

Documentation generated on Sun, 09 Mar 2008 23:53:38 -0300 by phpDocumentor 1.4.0

SourceForge.net Logo Support This Project