]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/adodb-csvlib.inc.php
extra_empty_lines
[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                     }// (timeout>0)
172                     $ttl = $meta[1];
173                 }
174                 //================================================
175                 // new cache format - use serialize extensively...
176                 if ($meta[0] === '====1') {
177                     // slurp in the data
178                     $MAXSIZE = 128000;
179
180                     $text = fread($fp,$MAXSIZE);
181                     if (strlen($text) === $MAXSIZE) {
182                         while ($txt = fread($fp,$MAXSIZE)) {
183                             $text .= $txt;
184                         }
185                     }
186                     fclose($fp);
187                     @$rs = unserialize($text);
188                     if (is_object($rs)) $rs->timeCreated = $ttl;
189                     return $rs;
190                 }
191
192                 $meta = false;
193                 $meta = fgetcsv($fp, 32000, ",");
194                 if (!$meta) {
195                     fclose($fp);
196                     $err = "Unexpected EOF 1";
197                     return false;
198                 }
199             }
200
201             // Get Column definitions
202             $flds = array();
203             foreach($meta as $o) {
204                 $o2 = explode(':',$o);
205                 if (sizeof($o2)!=3) {
206                     $arr[] = $meta;
207                     $flds = false;
208                     break;
209                 }
210                 $fld =& new ADOFieldObject();
211                 $fld->name = urldecode($o2[0]);
212                 $fld->type = $o2[1];
213                 $fld->max_length = $o2[2];
214                 $flds[] = $fld;
215             }
216         } else {
217             fclose($fp);
218             $err = "Recordset had unexpected EOF 2";
219             return false;
220         }
221
222         // slurp in the data
223         $MAXSIZE = 128000;
224
225         $text = '';
226         while ($txt = fread($fp,$MAXSIZE)) {
227             $text .= $txt;
228         }
229
230         fclose($fp);
231         @$arr = unserialize($text);
232         //var_dump($arr);
233         if (!is_array($arr)) {
234             $err = "Recordset had unexpected EOF (in serialized recordset)";
235             if (get_magic_quotes_runtime()) $err .= ". Magic Quotes Runtime should be disabled!";
236             return false;
237         }
238         $rs =& new ADORecordSet_array();
239         $rs->timeCreated = $ttl;
240         $rs->InitArrayFields($arr,$flds);
241         return $rs;
242     }
243 ?>