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