[ Index ]
 

Code source de Mantis 1.1.0rc3

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/core/adodb/contrib/ -> toxmlrpc.inc.php (source)

   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  ?>


Généré le : Thu Nov 29 09:42:17 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics