[ Index ] |
|
Code source de Mantis 1.1.0rc3 |
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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Nov 29 09:42:17 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |