]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/WikiDB/adodb/drivers/adodb-fbsql.inc.php
Reformat code
[SourceForge/phpwiki.git] / lib / WikiDB / adodb / drivers / adodb-fbsql.inc.php
1 <?php
2 /*
3  @version V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jlim@natsoft.com.my). All rights reserved.
4  Released under both BSD license and Lesser GPL library license.
5   Whenever there is any discrepancy between the two licenses,
6   the BSD license will take precedence.
7  Contribution by Frank M. Kromann <frank@frontbase.com>.
8   Set tabs to 8.
9 */
10
11 if (!defined("_ADODB_FBSQL_LAYER")) {
12     define("_ADODB_FBSQL_LAYER", 1);
13
14     class ADODB_fbsql extends ADOConnection
15     {
16         var $databaseType = 'fbsql';
17         var $hasInsertID = true;
18         var $hasAffectedRows = true;
19         var $metaTablesSQL = "SHOW TABLES";
20         var $metaColumnsSQL = "SHOW COLUMNS FROM %s";
21         var $fmtTimeStamp = "'Y-m-d H:i:s'";
22         var $hasLimit = false;
23
24         function ADODB_fbsql()
25         {
26         }
27
28         function _insertid()
29         {
30             return fbsql_insert_id($this->_connectionID);
31         }
32
33         function _affectedrows()
34         {
35             return fbsql_affected_rows($this->_connectionID);
36         }
37
38         function &MetaDatabases()
39         {
40             $qid = fbsql_list_dbs($this->_connectionID);
41             $arr = array();
42             $i = 0;
43             $max = fbsql_num_rows($qid);
44             while ($i < $max) {
45                 $arr[] = fbsql_tablename($qid, $i);
46                 $i += 1;
47             }
48             return $arr;
49         }
50
51         // returns concatenated string
52         function Concat()
53         {
54             $s = "";
55             $arr = func_get_args();
56             $first = true;
57
58             $s = implode(',', $arr);
59             if (sizeof($arr) > 0) return "CONCAT($s)";
60             else return '';
61         }
62
63         // returns true or false
64         function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
65         {
66             $this->_connectionID = fbsql_connect($argHostname, $argUsername, $argPassword);
67             if ($this->_connectionID === false) return false;
68             if ($argDatabasename) return $this->SelectDB($argDatabasename);
69             return true;
70         }
71
72         // returns true or false
73         function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
74         {
75             $this->_connectionID = fbsql_pconnect($argHostname, $argUsername, $argPassword);
76             if ($this->_connectionID === false) return false;
77             if ($argDatabasename) return $this->SelectDB($argDatabasename);
78             return true;
79         }
80
81         function &MetaColumns($table)
82         {
83             if ($this->metaColumnsSQL) {
84
85                 $rs = $this->Execute(sprintf($this->metaColumnsSQL, $table));
86
87                 if ($rs === false) return false;
88
89                 $retarr = array();
90                 while (!$rs->EOF) {
91                     $fld = new ADOFieldObject();
92                     $fld->name = $rs->fields[0];
93                     $fld->type = $rs->fields[1];
94
95                     // split type into type(length):
96                     if (preg_match("/^(.+)\((\d+)\)$/", $fld->type, $query_array)) {
97                         $fld->type = $query_array[1];
98                         $fld->max_length = $query_array[2];
99                     } else {
100                         $fld->max_length = -1;
101                     }
102                     $fld->not_null = ($rs->fields[2] != 'YES');
103                     $fld->primary_key = ($rs->fields[3] == 'PRI');
104                     $fld->auto_increment = (strpos($rs->fields[5], 'auto_increment') !== false);
105                     $fld->binary = (strpos($fld->type, 'blob') !== false);
106
107                     $retarr[strtoupper($fld->name)] = $fld;
108                     $rs->MoveNext();
109                 }
110                 $rs->Close();
111                 return $retarr;
112             }
113             return false;
114         }
115
116         // returns true or false
117         function SelectDB($dbName)
118         {
119             $this->databaseName = $dbName;
120             if ($this->_connectionID) {
121                 return @fbsql_select_db($dbName, $this->_connectionID);
122             } else return false;
123         }
124
125         // returns queryID or false
126         function _query($sql, $inputarr)
127         {
128             return fbsql_query("$sql;", $this->_connectionID);
129         }
130
131         /*      Returns: the last error message from previous database operation        */
132         function ErrorMsg()
133         {
134             $this->_errorMsg = @fbsql_error($this->_connectionID);
135             return $this->_errorMsg;
136         }
137
138         /*      Returns: the last error number from previous database operation */
139         function ErrorNo()
140         {
141             return @fbsql_errno($this->_connectionID);
142         }
143
144         // returns true or false
145         function _close()
146         {
147             return @fbsql_close($this->_connectionID);
148         }
149
150     }
151
152     /*--------------------------------------------------------------------------------------
153          Class Name: Recordset
154     --------------------------------------------------------------------------------------*/
155
156     class ADORecordSet_fbsql extends ADORecordSet
157     {
158
159         var $databaseType = "fbsql";
160         var $canSeek = true;
161
162         function ADORecordSet_fbsql($queryID, $mode = false)
163         {
164             if (!$mode) {
165                 global $ADODB_FETCH_MODE;
166                 $mode = $ADODB_FETCH_MODE;
167             }
168             switch ($mode) {
169                 case ADODB_FETCH_NUM:
170                     $this->fetchMode = FBSQL_NUM;
171                     break;
172                 default:
173                 case ADODB_FETCH_BOTH:
174                     $this->fetchMode = FBSQL_BOTH;
175                     break;
176                 case ADODB_FETCH_ASSOC:
177                     $this->fetchMode = FBSQL_ASSOC;
178                     break;
179             }
180             return $this->ADORecordSet($queryID);
181         }
182
183         function _initrs()
184         {
185             GLOBAL $ADODB_COUNTRECS;
186             $this->_numOfRows = ($ADODB_COUNTRECS) ? @fbsql_num_rows($this->_queryID) : -1;
187             $this->_numOfFields = @fbsql_num_fields($this->_queryID);
188         }
189
190         function &FetchField($fieldOffset = -1)
191         {
192             if ($fieldOffset != -1) {
193                 $o = @fbsql_fetch_field($this->_queryID, $fieldOffset);
194                 //$o->max_length = -1; // fbsql returns the max length less spaces -- so it is unrealiable
195                 $f = @fbsql_field_flags($this->_queryID, $fieldOffset);
196                 $o->binary = (strpos($f, 'binary') !== false);
197             } else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1   */
198                 $o = @fbsql_fetch_field($this->_queryID); // fbsql returns the max length less spaces -- so it is unrealiable
199                 //$o->max_length = -1;
200             }
201
202             return $o;
203         }
204
205         function _seek($row)
206         {
207             return @fbsql_data_seek($this->_queryID, $row);
208         }
209
210         function _fetch($ignore_fields = false)
211         {
212             $this->fields = @fbsql_fetch_array($this->_queryID, $this->fetchMode);
213             return ($this->fields == true);
214         }
215
216         function _close()
217         {
218             return @fbsql_free_result($this->_queryID);
219         }
220
221         function MetaType($t, $len = -1, $fieldobj = false)
222         {
223             if (is_object($t)) {
224                 $fieldobj = $t;
225                 $t = $fieldobj->type;
226                 $len = $fieldobj->max_length;
227             }
228             $len = -1; // fbsql max_length is not accurate
229             switch (strtoupper($t)) {
230                 case 'CHARACTER':
231                 case 'CHARACTER VARYING':
232                 case 'BLOB':
233                 case 'CLOB':
234                 case 'BIT':
235                 case 'BIT VARYING':
236                     if ($len <= $this->blobSize) return 'C';
237
238                 // so we have to check whether binary...
239                 case 'IMAGE':
240                 case 'LONGBLOB':
241                 case 'BLOB':
242                 case 'MEDIUMBLOB':
243                     return !empty($fieldobj->binary) ? 'B' : 'X';
244
245                 case 'DATE':
246                     return 'D';
247
248                 case 'TIME':
249                 case 'TIME WITH TIME ZONE':
250                 case 'TIMESTAMP':
251                 case 'TIMESTAMP WITH TIME ZONE':
252                     return 'T';
253
254                 case 'PRIMARY_KEY':
255                     return 'R';
256                 case 'INTEGER':
257                 case 'SMALLINT':
258                 case 'BOOLEAN':
259
260                     if (!empty($fieldobj->primary_key)) return 'R';
261                     else return 'I';
262
263                 default:
264                     return 'N';
265             }
266         }
267
268     } //class
269 } // defined