C:/lib/adodb/drivers/adodb-sybase.inc.php Quellcode

adodb-sybase.inc.php
gehe zur Dokumentation dieser Datei
1 <?php
2 /*
3 V5.19dev ??-???-2014 (c) 2000-2014 John Lim. 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  Set tabs to 4 for best viewing.
8 
9  Latest version is available at http://adodb.sourceforge.net
10 
11  Sybase driver contributed by Toni (toni.tunkkari@finebyte.com)
12 
13  - MSSQL date patch applied.
14 
15  Date patch by Toni 15 Feb 2002
16 */
17 
18  // security - hide paths
19 if (!defined('ADODB_DIR')) die();
20 
21 class ADODB_sybase extends ADOConnection {
22  var $databaseType = "sybase";
23  var $dataProvider = 'sybase';
24  var $replaceQuote = "''"; // string to use to replace quotes
25  var $fmtDate = "'Y-m-d'";
26  var $fmtTimeStamp = "'Y-m-d H:i:s'";
27  var $hasInsertID = true;
28  var $hasAffectedRows = true;
29  var $metaTablesSQL="select name from sysobjects where type='U' or type='V'";
30  // see http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
31  var $metaColumnsSQL = "SELECT c.column_name, c.column_type, c.width FROM syscolumn c, systable t WHERE t.table_name='%s' AND c.table_id=t.table_id AND t.table_type='BASE'";
32  /*
33  "select c.name,t.name,c.length from
34  syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id
35  where o.name='%s'";
36  */
37  var $concat_operator = '+';
38  var $arrayClass = 'ADORecordSet_array_sybase';
39  var $sysDate = 'GetDate()';
40  var $leftOuter = '*=';
41  var $rightOuter = '=*';
42 
43  function ADODB_sybase()
44  {
45  }
46 
47  // might require begintrans -- committrans
48  function _insertid()
49  {
50  return $this->GetOne('select @@identity');
51  }
52  // might require begintrans -- committrans
53  function _affectedrows()
54  {
55  return $this->GetOne('select @@rowcount');
56  }
57 
58 
59  function BeginTrans()
60  {
61 
62  if ($this->transOff) return true;
63  $this->transCnt += 1;
64 
65  $this->Execute('BEGIN TRAN');
66  return true;
67  }
68 
69  function CommitTrans($ok=true)
70  {
71  if ($this->transOff) return true;
72 
73  if (!$ok) return $this->RollbackTrans();
74 
75  $this->transCnt -= 1;
76  $this->Execute('COMMIT TRAN');
77  return true;
78  }
79 
80  function RollbackTrans()
81  {
82  if ($this->transOff) return true;
83  $this->transCnt -= 1;
84  $this->Execute('ROLLBACK TRAN');
85  return true;
86  }
87 
88  // http://www.isug.com/Sybase_FAQ/ASE/section6.1.html#6.1.4
89  function RowLock($tables,$where,$col='top 1 null as ignore')
90  {
91  if (!$this->_hastrans) $this->BeginTrans();
92  $tables = str_replace(',',' HOLDLOCK,',$tables);
93  return $this->GetOne("select $col from $tables HOLDLOCK where $where");
94 
95  }
96 
97  function SelectDB($dbName)
98  {
99  $this->database = $dbName;
100  $this->databaseName = $dbName; # obsolete, retained for compat with older adodb versions
101  if ($this->_connectionID) {
102  return @sybase_select_db($dbName);
103  }
104  else return false;
105  }
106 
107  /* Returns: the last error message from previous database operation
108  Note: This function is NOT available for Microsoft SQL Server. */
109 
110 
111  function ErrorMsg()
112  {
113  if ($this->_logsql) return $this->_errorMsg;
114  if (function_exists('sybase_get_last_message'))
115  $this->_errorMsg = sybase_get_last_message();
116  else
117  $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : 'SYBASE error messages not supported on this platform';
118  return $this->_errorMsg;
119  }
120 
121  // returns true or false
122  function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
123  {
124  if (!function_exists('sybase_connect')) return null;
125 
126  if ($this->charSet) {
127  $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword, $this->charSet);
128  } else {
129  $this->_connectionID = sybase_connect($argHostname,$argUsername,$argPassword);
130  }
131 
132  if ($this->_connectionID === false) return false;
133  if ($argDatabasename) return $this->SelectDB($argDatabasename);
134  return true;
135  }
136 
137  // returns true or false
138  function _pconnect($argHostname, $argUsername, $argPassword, $argDatabasename)
139  {
140  if (!function_exists('sybase_connect')) return null;
141 
142  if ($this->charSet) {
143  $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword, $this->charSet);
144  } else {
145  $this->_connectionID = sybase_pconnect($argHostname,$argUsername,$argPassword);
146  }
147 
148  if ($this->_connectionID === false) return false;
149  if ($argDatabasename) return $this->SelectDB($argDatabasename);
150  return true;
151  }
152 
153  // returns query ID if successful, otherwise false
154  function _query($sql,$inputarr=false)
155  {
156  global $ADODB_COUNTRECS;
157 
158  if ($ADODB_COUNTRECS == false && ADODB_PHPVER >= 0x4300)
159  return sybase_unbuffered_query($sql,$this->_connectionID);
160  else
161  return sybase_query($sql,$this->_connectionID);
162  }
163 
164  // See http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12
165  function SelectLimit($sql,$nrows=-1,$offset=-1,$inputarr=false,$secs2cache=0)
166  {
167  if ($secs2cache > 0) {// we do not cache rowcount, so we have to load entire recordset
168  $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);
169  return $rs;
170  }
171 
172  $nrows = (integer) $nrows;
173  $offset = (integer) $offset;
174 
175  $cnt = ($nrows >= 0) ? $nrows : 999999999;
176  if ($offset > 0 && $cnt) $cnt += $offset;
177 
178  $this->Execute("set rowcount $cnt");
179  $rs = ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,0);
180  $this->Execute("set rowcount 0");
181 
182  return $rs;
183  }
184 
185  // returns true or false
186  function _close()
187  {
188  return @sybase_close($this->_connectionID);
189  }
190 
191  static function UnixDate($v)
192  {
194  }
195 
196  static function UnixTimeStamp($v)
197  {
199  }
200 
201 
202 
203  # Added 2003-10-05 by Chris Phillipson
204  # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=16756?target=%25N%15_12018_START_RESTART_N%25
205  # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
206  // Format date column in sql string given an input format that understands Y M D
207  function SQLDate($fmt, $col=false)
208  {
209  if (!$col) $col = $this->sysTimeStamp;
210  $s = '';
211 
212  $len = strlen($fmt);
213  for ($i=0; $i < $len; $i++) {
214  if ($s) $s .= '+';
215  $ch = $fmt[$i];
216  switch($ch) {
217  case 'Y':
218  case 'y':
219  $s .= "datename(yy,$col)";
220  break;
221  case 'M':
222  $s .= "convert(char(3),$col,0)";
223  break;
224  case 'm':
225  $s .= "str_replace(str(month($col),2),' ','0')";
226  break;
227  case 'Q':
228  case 'q':
229  $s .= "datename(qq,$col)";
230  break;
231  case 'D':
232  case 'd':
233  $s .= "str_replace(str(datepart(dd,$col),2),' ','0')";
234  break;
235  case 'h':
236  $s .= "substring(convert(char(14),$col,0),13,2)";
237  break;
238 
239  case 'H':
240  $s .= "str_replace(str(datepart(hh,$col),2),' ','0')";
241  break;
242 
243  case 'i':
244  $s .= "str_replace(str(datepart(mi,$col),2),' ','0')";
245  break;
246  case 's':
247  $s .= "str_replace(str(datepart(ss,$col),2),' ','0')";
248  break;
249  case 'a':
250  case 'A':
251  $s .= "substring(convert(char(19),$col,0),18,2)";
252  break;
253 
254  default:
255  if ($ch == '\\') {
256  $i++;
257  $ch = substr($fmt,$i,1);
258  }
259  $s .= $this->qstr($ch);
260  break;
261  }
262  }
263  return $s;
264  }
265 
266  # Added 2003-10-07 by Chris Phillipson
267  # Used ASA SQL Reference Manual -- http://sybooks.sybase.com/onlinebooks/group-aw/awg0800e/dbrfen8/@ebt-link;pt=5981;uf=0?target=0;window=new;showtoc=true;book=dbrfen8
268  # to convert similar Microsoft SQL*Server (mssql) API into Sybase compatible version
269  function MetaPrimaryKeys($table)
270  {
271  $sql = "SELECT c.column_name " .
272  "FROM syscolumn c, systable t " .
273  "WHERE t.table_name='$table' AND c.table_id=t.table_id " .
274  "AND t.table_type='BASE' " .
275  "AND c.pkey = 'Y' " .
276  "ORDER BY c.column_id";
277 
278  $a = $this->GetCol($sql);
279  if ($a && sizeof($a)>0) return $a;
280  return false;
281  }
282 }
283 
284 /*--------------------------------------------------------------------------------------
285  Class Name: Recordset
286 --------------------------------------------------------------------------------------*/
288 $ADODB_sybase_mths = array(
289  'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,
290  'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
291 
292 class ADORecordset_sybase extends ADORecordSet {
293 
294  var $databaseType = "sybase";
295  var $canSeek = true;
296  // _mths works only in non-localised system
297  var $_mths = array('JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);
298 
299  function ADORecordset_sybase($id,$mode=false)
300  {
301  if ($mode === false) {
302  global $ADODB_FETCH_MODE;
303  $mode = $ADODB_FETCH_MODE;
304  }
305  if (!$mode) $this->fetchMode = ADODB_FETCH_ASSOC;
306  else $this->fetchMode = $mode;
307  $this->ADORecordSet($id,$mode);
308  }
309 
310  /* Returns: an object containing field information.
311  Get column information in the Recordset object. fetchField() can be used in order to obtain information about
312  fields in a certain query result. If the field offset isn't specified, the next field that wasn't yet retrieved by
313  fetchField() is retrieved. */
314  function FetchField($fieldOffset = -1)
315  {
316  if ($fieldOffset != -1) {
317  $o = @sybase_fetch_field($this->_queryID, $fieldOffset);
318  }
319  else if ($fieldOffset == -1) { /* The $fieldOffset argument is not provided thus its -1 */
320  $o = @sybase_fetch_field($this->_queryID);
321  }
322  // older versions of PHP did not support type, only numeric
323  if ($o && !isset($o->type)) $o->type = ($o->numeric) ? 'float' : 'varchar';
324  return $o;
325  }
326 
327  function _initrs()
328  {
329  global $ADODB_COUNTRECS;
330  $this->_numOfRows = ($ADODB_COUNTRECS)? @sybase_num_rows($this->_queryID):-1;
331  $this->_numOfFields = @sybase_num_fields($this->_queryID);
332  }
333 
334  function _seek($row)
335  {
336  return @sybase_data_seek($this->_queryID, $row);
337  }
338 
339  function _fetch($ignore_fields=false)
340  {
341  if ($this->fetchMode == ADODB_FETCH_NUM) {
342  $this->fields = @sybase_fetch_row($this->_queryID);
343  } else if ($this->fetchMode == ADODB_FETCH_ASSOC) {
344  $this->fields = @sybase_fetch_row($this->_queryID);
345  if (is_array($this->fields)) {
346  $this->fields = $this->GetRowAssoc(ADODB_ASSOC_CASE);
347  return true;
348  }
349  return false;
350  } else {
351  $this->fields = @sybase_fetch_array($this->_queryID);
352  }
353  if ( is_array($this->fields)) {
354  return true;
355  }
356 
357  return false;
358  }
359 
360  /* close() only needs to be called if you are worried about using too much memory while your script
361  is running. All associated result memory for the specified result identifier will automatically be freed. */
362  function _close() {
363  return @sybase_free_result($this->_queryID);
364  }
365 
366  // sybase/mssql uses a default date like Dec 30 2000 12:00AM
367  static function UnixDate($v)
368  {
370  }
371 
372  static function UnixTimeStamp($v)
373  {
375  }
376 }
377 
378 class ADORecordSet_array_sybase extends ADORecordSet_array {
379  function ADORecordSet_array_sybase($id=-1)
380  {
381  $this->ADORecordSet_array($id);
382  }
383 
384  // sybase/mssql uses a default date like Dec 30 2000 12:00AM
385  static function UnixDate($v)
386  {
387  global $ADODB_sybase_mths;
388 
389  //Dec 30 2000 12:00AM
390  if (!preg_match( "/([A-Za-z]{3})[-/\. ]+([0-9]{1,2})[-/\. ]+([0-9]{4})/"
391  ,$v, $rr)) return parent::UnixDate($v);
392 
393  if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
394 
395  $themth = substr(strtoupper($rr[1]),0,3);
396  $themth = $ADODB_sybase_mths[$themth];
397  if ($themth <= 0) return false;
398  // h-m-s-MM-DD-YY
399  return adodb_mktime(0,0,0,$themth,$rr[2],$rr[3]);
400  }
401 
402  static function UnixTimeStamp($v)
403  {
404  global $ADODB_sybase_mths;
405  //11.02.2001 Toni Tunkkari toni.tunkkari@finebyte.com
406  //Changed [0-9] to [0-9 ] in day conversion
407  if (!preg_match( "/([A-Za-z]{3})[-/\. ]([0-9 ]{1,2})[-/\. ]([0-9]{4}) +([0-9]{1,2}):([0-9]{1,2}) *([apAP]{0,1})/"
408  ,$v, $rr)) return parent::UnixTimeStamp($v);
409  if ($rr[3] <= TIMESTAMP_FIRST_YEAR) return 0;
410 
411  $themth = substr(strtoupper($rr[1]),0,3);
412  $themth = $ADODB_sybase_mths[$themth];
413  if ($themth <= 0) return false;
414 
415  switch (strtoupper($rr[6])) {
416  case 'P':
417  if ($rr[4]<12) $rr[4] += 12;
418  break;
419  case 'A':
420  if ($rr[4]==12) $rr[4] = 0;
421  break;
422  default:
423  break;
424  }
425  // h-m-s-MM-DD-YY
426  return adodb_mktime($rr[4],$rr[5],0,$themth,$rr[2],$rr[3]);
427  }
428 }
429 ?>




Korrekturen, Hinweise und Ergänzungen

Bitte scheuen Sie sich nicht und melden Sie, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Support Forum wählen. Es ist eine kostenlose Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden kommentarlos entfernt.