]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/adodb-csvlib.inc.php
Reformat code
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / adodb-csvlib.inc.php
1 <?php
2 global $ADODB_INCLUDED_CSV;
3 $ADODB_INCLUDED_CSV = 1;
4
5 /*
6   V4.22 15 Apr 2004  (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
7   Released under both BSD license and Lesser GPL library license.
8   Whenever there is any discrepancy between the two licenses,
9   the BSD license will take precedence. See License.txt.
10   Set tabs to 4 for best viewing.
11
12   Latest version is available at http://php.weblogs.com/
13
14   Library for CSV serialization. This is used by the csv/proxy driver and is the
15   CacheExecute() serialization format.
16
17   ==== NOTE ====
18   Format documented at http://php.weblogs.com/ADODB_CSV
19   ==============
20 */
21
22 /**
23  * convert a recordset into special format
24  *
25  * @param rs    the recordset
26  *
27  * @return the CSV formated data
28  */
29 function _rs2serialize(&$rs, $conn = false, $sql = '')
30 {
31     $max = ($rs) ? $rs->FieldCount() : 0;
32
33     if ($sql) $sql = urlencode($sql);
34     // metadata setup
35
36     if ($max <= 0 || $rs->dataProvider == 'empty') { // is insert/update/delete
37         if (is_object($conn)) {
38             $sql .= ',' . $conn->Affected_Rows();
39             $sql .= ',' . $conn->Insert_ID();
40         } else
41             $sql .= ',,';
42
43         $text = "====-1,0,$sql\n";
44         return $text;
45     }
46     $tt = ($rs->timeCreated) ? $rs->timeCreated : time();
47
48     ## changed format from ====0 to ====1
49     $line = "====1,$tt,$sql\n";
50
51     if ($rs->databaseType == 'array') {
52         $rows =& $rs->_array;
53     } else {
54         $rows = array();
55         while (!$rs->EOF) {
56             $rows[] = $rs->fields;
57             $rs->MoveNext();
58         }
59     }
60
61     for ($i = 0; $i < $max; $i++) {
62         $o =& $rs->FetchField($i);
63         $flds[] = $o;
64     }
65
66     $rs =& new ADORecordSet_array();
67     $rs->InitArrayFields($rows, $flds);
68     return $line . serialize($rs);
69 }
70
71 /**
72  * Open CSV file and convert it into Data.
73  *
74  * @param url          file/ftp/http url
75  * @param err        returns the error message
76  * @param timeout    dispose if recordset has been alive for $timeout secs
77  *
78  * @return        recordset, or false if error occured. If no
79  *            error occurred in sql INSERT/UPDATE/DELETE,
80  *            empty recordset is returned
81  */
82 function &csv2rs($url, &$err, $timeout = 0)
83 {
84     $err = false;
85     $fp = @fopen($url, 'r');
86     if (!$fp) {
87         $err = $url . ' file/URL not found';
88         return false;
89     }
90     flock($fp, LOCK_SH);
91     $arr = array();
92     $ttl = 0;
93
94     if ($meta = fgetcsv($fp, 32000, ",")) {
95         // check if error message
96         if (strncmp($meta[0], '****', 4) === 0) {
97             $err = trim(substr($meta[0], 4, 1024));
98             fclose($fp);
99             return false;
100         }
101         // check for meta data
102         // $meta[0] is -1 means return an empty recordset
103         // $meta[1] contains a time
104
105         if (strncmp($meta[0], '====', 4) === 0) {
106
107             if ($meta[0] == "====-1") {
108                 if (sizeof($meta) < 5) {
109                     $err = "Corrupt first line for format -1";
110                     fclose($fp);
111                     return false;
112                 }
113                 fclose($fp);
114
115                 if ($timeout > 0) {
116                     $err = " Illegal Timeout $timeout ";
117                     return false;
118                 }
119                 $rs->fields = array();
120                 $rs->timeCreated = $meta[1];
121                 $rs =& new ADORecordSet($val = true);
122                 $rs->EOF = true;
123                 $rs->_numOfFields = 0;
124                 $rs->sql = urldecode($meta[2]);
125                 $rs->affectedrows = (integer)$meta[3];
126                 $rs->insertid = $meta[4];
127                 return $rs;
128             }
129             # Under high volume loads, we want only 1 thread/process to _write_file
130             # so that we don't have 50 processes queueing to write the same data.
131             # We use probabilistic timeout, ahead of time.
132             #
133             # -4 sec before timeout, give processes 1/32 chance of timing out
134             # -2 sec before timeout, give processes 1/16 chance of timing out
135             # -1 sec after timeout give processes 1/4 chance of timing out
136             # +0 sec after timeout, give processes 100% chance of timing out
137             if (sizeof($meta) > 1) {
138                 if ($timeout > 0) {
139                     $tdiff = (integer)($meta[1] + $timeout - time());
140                     if ($tdiff <= 2) {
141                         switch ($tdiff) {
142                             case 4:
143                             case 3:
144                                 if ((rand() & 31) == 0) {
145                                     fclose($fp);
146                                     $err = "Timeout 3";
147                                     return false;
148                                 }
149                                 break;
150                             case 2:
151                                 if ((rand() & 15) == 0) {
152                                     fclose($fp);
153                                     $err = "Timeout 2";
154                                     return false;
155                                 }
156                                 break;
157                             case 1:
158                                 if ((rand() & 3) == 0) {
159                                     fclose($fp);
160                                     $err = "Timeout 1";
161                                     return false;
162                                 }
163                                 break;
164                             default:
165                                 fclose($fp);
166                                 $err = "Timeout 0";
167                                 return false;
168                         } // switch
169
170                     } // if check flush cache
171                 }
172                 // (timeout>0)
173                 $ttl = $meta[1];
174             }
175             //================================================
176             // new cache format - use serialize extensively...
177             if ($meta[0] === '====1') {
178                 // slurp in the data
179                 $MAXSIZE = 128000;
180
181                 $text = fread($fp, $MAXSIZE);
182                 if (strlen($text) === $MAXSIZE) {
183                     while ($txt = fread($fp, $MAXSIZE)) {
184                         $text .= $txt;
185                     }
186                 }
187                 fclose($fp);
188                 @$rs = unserialize($text);
189                 if (is_object($rs)) $rs->timeCreated = $ttl;
190                 return $rs;
191             }
192
193             $meta = false;
194             $meta = fgetcsv($fp, 32000, ",");
195             if (!$meta) {
196                 fclose($fp);
197                 $err = "Unexpected EOF 1";
198                 return false;
199             }
200         }
201
202         // Get Column definitions
203         $flds = array();
204         foreach ($meta as $o) {
205             $o2 = explode(':', $o);
206             if (sizeof($o2) != 3) {
207                 $arr[] = $meta;
208                 $flds = false;
209                 break;
210             }
211             $fld =& new ADOFieldObject();
212             $fld->name = urldecode($o2[0]);
213             $fld->type = $o2[1];
214             $fld->max_length = $o2[2];
215             $flds[] = $fld;
216         }
217     } else {
218         fclose($fp);
219         $err = "Recordset had unexpected EOF 2";
220         return false;
221     }
222
223     // slurp in the data
224     $MAXSIZE = 128000;
225
226     $text = '';
227     while ($txt = fread($fp, $MAXSIZE)) {
228         $text .= $txt;
229     }
230
231     fclose($fp);
232     @$arr = unserialize($text);
233     //var_dump($arr);
234     if (!is_array($arr)) {
235         $err = "Recordset had unexpected EOF (in serialized recordset)";
236         if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!";
237         return false;
238     }
239     $rs =& new ADORecordSet_array();
240     $rs->timeCreated = $ttl;
241     $rs->InitArrayFields($arr, $flds);
242     return $rs;
243 }