00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 if (!defined('ADODB_DIR')) die();
00020
00021 define("_ADODB_DB2_LAYER", 2 );
00022
00023
00024
00025
00026
00027 class ADODB_db2 extends ADOConnection {
00028 var $databaseType = "db2";
00029 var $fmtDate = "'Y-m-d'";
00030 var $concat_operator = '||';
00031
00032 var $sysTime = 'CURRENT TIME';
00033 var $sysDate = 'CURRENT DATE';
00034 var $sysTimeStamp = 'CURRENT TIMESTAMP';
00035
00036 var $fmtTimeStamp = "'Y-m-d-H.i.s'";
00037 var $replaceQuote = "''";
00038 var $dataProvider = "db2";
00039 var $hasAffectedRows = true;
00040
00041 var $binmode = DB2_BINARY;
00042
00043 var $useFetchArray = false;
00044
00045 var $_bindInputArray = false;
00046 var $_genIDSQL = "VALUES NEXTVAL FOR %s";
00047 var $_genSeqSQL = "CREATE SEQUENCE %s START WITH 1 NO MAXVALUE NO CYCLE";
00048 var $_dropSeqSQL = "DROP SEQUENCE %s";
00049 var $_autocommit = true;
00050 var $_haserrorfunctions = true;
00051 var $_lastAffectedRows = 0;
00052 var $uCaseTables = true;
00053 var $hasInsertID = true;
00054
00055 function _insertid()
00056 {
00057 return ADOConnection::GetOne('VALUES IDENTITY_VAL_LOCAL()');
00058 }
00059
00060 function ADODB_db2()
00061 {
00062 $this->_haserrorfunctions = ADODB_PHPVER >= 0x4050;
00063 }
00064
00065
00066 function _connect($argDSN, $argUsername, $argPassword, $argDatabasename)
00067 {
00068 global $php_errormsg;
00069
00070 if (!function_exists('db2_connect')) {
00071 ADOConnection::outp("Warning: The old ODBC based DB2 driver has been renamed 'odbc_db2'. This ADOdb driver calls PHP's native db2 extension.");
00072 return null;
00073 }
00074
00075
00076 ini_set('ibm_db2.binmode', $this->binmode);
00077
00078 if ($argDatabasename) {
00079 $this->_connectionID = db2_connect($argDatabasename,$argUsername,$argPassword);
00080 } else {
00081 $this->_connectionID = db2_connect($argDSN,$argUsername,$argPassword);
00082 }
00083 if (isset($php_errormsg)) $php_errormsg = '';
00084
00085
00086
00087
00088 $this->_errorMsg = @db2_conn_errormsg();
00089
00090 if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
00091
00092 return $this->_connectionID != false;
00093 }
00094
00095
00096 function _pconnect($argDSN, $argUsername, $argPassword, $argDatabasename)
00097 {
00098 global $php_errormsg;
00099
00100 if (!function_exists('db2_connect')) return null;
00101
00102
00103
00104 ini_set('ibm_db2.binmode', $this->binmode);
00105
00106 if (isset($php_errormsg)) $php_errormsg = '';
00107 $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
00108
00109 if ($argDatabasename) {
00110 $this->_connectionID = db2_pconnect($argDatabasename,$argUsername,$argPassword);
00111 } else {
00112 $this->_connectionID = db2_pconnect($argDSN,$argUsername,$argPassword);
00113 }
00114 if (isset($php_errormsg)) $php_errormsg = '';
00115
00116 $this->_errorMsg = @db2_conn_errormsg();
00117 if ($this->_connectionID && $this->autoRollback) @db2_rollback($this->_connectionID);
00118 if (isset($this->connectStmt)) $this->Execute($this->connectStmt);
00119
00120 return $this->_connectionID != false;
00121 }
00122
00123
00124 function DBTimeStamp($ts)
00125 {
00126 if (empty($ts) && $ts !== 0) return 'null';
00127 if (is_string($ts)) $ts = ADORecordSet::UnixTimeStamp($ts);
00128 return 'TO_DATE('.adodb_date($this->fmtTimeStamp,$ts).",'YYYY-MM-DD HH24:MI:SS')";
00129 }
00130
00131
00132 function SQLDate($fmt, $col=false)
00133 {
00134
00135 if (!$col) $col = $this->sysDate;
00136
00137
00138 if ($fmt== 'Y-m-d H:i:s')
00139 return 'TO_CHAR('.$col.", 'YYYY-MM-DD HH24:MI:SS')";
00140
00141 $s = '';
00142
00143 $len = strlen($fmt);
00144 for ($i=0; $i < $len; $i++) {
00145 if ($s) $s .= $this->concat_operator;
00146 $ch = $fmt[$i];
00147 switch($ch) {
00148 case 'Y':
00149 case 'y':
00150 if ($len==1) return "year($col)";
00151 $s .= "char(year($col))";
00152 break;
00153 case 'M':
00154 if ($len==1) return "monthname($col)";
00155 $s .= "substr(monthname($col),1,3)";
00156 break;
00157 case 'm':
00158 if ($len==1) return "month($col)";
00159 $s .= "right(digits(month($col)),2)";
00160 break;
00161 case 'D':
00162 case 'd':
00163 if ($len==1) return "day($col)";
00164 $s .= "right(digits(day($col)),2)";
00165 break;
00166 case 'H':
00167 case 'h':
00168 if ($len==1) return "hour($col)";
00169 if ($col != $this->sysDate) $s .= "right(digits(hour($col)),2)";
00170 else $s .= "''";
00171 break;
00172 case 'i':
00173 case 'I':
00174 if ($len==1) return "minute($col)";
00175 if ($col != $this->sysDate)
00176 $s .= "right(digits(minute($col)),2)";
00177 else $s .= "''";
00178 break;
00179 case 'S':
00180 case 's':
00181 if ($len==1) return "second($col)";
00182 if ($col != $this->sysDate)
00183 $s .= "right(digits(second($col)),2)";
00184 else $s .= "''";
00185 break;
00186 default:
00187 if ($ch == '\\') {
00188 $i++;
00189 $ch = substr($fmt,$i,1);
00190 }
00191 $s .= $this->qstr($ch);
00192 }
00193 }
00194 return $s;
00195 }
00196
00197
00198 function ServerInfo()
00199 {
00200
00201 if (!empty($this->host) && ADODB_PHPVER >= 0x4300) {
00202 $dsn = strtoupper($this->host);
00203 $first = true;
00204 $found = false;
00205
00206 if (!function_exists('db2_data_source')) return false;
00207
00208 while(true) {
00209
00210 $rez = @db2_data_source($this->_connectionID,
00211 $first ? SQL_FETCH_FIRST : SQL_FETCH_NEXT);
00212 $first = false;
00213 if (!is_array($rez)) break;
00214 if (strtoupper($rez['server']) == $dsn) {
00215 $found = true;
00216 break;
00217 }
00218 }
00219 if (!$found) return ADOConnection::ServerInfo();
00220 if (!isset($rez['version'])) $rez['version'] = '';
00221 return $rez;
00222 } else {
00223 return ADOConnection::ServerInfo();
00224 }
00225 }
00226
00227
00228 function CreateSequence($seqname='adodbseq',$start=1)
00229 {
00230 if (empty($this->_genSeqSQL)) return false;
00231 $ok = $this->Execute(sprintf($this->_genSeqSQL,$seqname));
00232 if (!$ok) return false;
00233 return true;
00234 }
00235
00236 function DropSequence($seqname)
00237 {
00238 if (empty($this->_dropSeqSQL)) return false;
00239 return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));
00240 }
00241
00242
00243
00244
00245
00246
00247
00248 function GenID($seq='adodbseq',$start=1)
00249 {
00250
00251
00252 $num = $this->GetOne("VALUES NEXTVAL FOR $seq");
00253 return $num;
00254 }
00255
00256
00257 function ErrorMsg()
00258 {
00259 if ($this->_haserrorfunctions) {
00260 if ($this->_errorMsg !== false) return $this->_errorMsg;
00261 if (empty($this->_connectionID)) return @db2_conn_errormsg();
00262 return @db2_conn_errormsg($this->_connectionID);
00263 } else return ADOConnection::ErrorMsg();
00264 }
00265
00266 function ErrorNo()
00267 {
00268
00269 if ($this->_haserrorfunctions) {
00270 if ($this->_errorCode !== false) {
00271
00272 return (strlen($this->_errorCode)<=2) ? 0 : $this->_errorCode;
00273 }
00274
00275 if (empty($this->_connectionID)) $e = @db2_conn_error();
00276 else $e = @db2_conn_error($this->_connectionID);
00277
00278
00279
00280 if (strlen($e)<=2) return 0;
00281 return $e;
00282 } else return ADOConnection::ErrorNo();
00283 }
00284
00285
00286
00287 function BeginTrans()
00288 {
00289 if (!$this->hasTransactions) return false;
00290 if ($this->transOff) return true;
00291 $this->transCnt += 1;
00292 $this->_autocommit = false;
00293 return db2_autocommit($this->_connectionID,false);
00294 }
00295
00296 function CommitTrans($ok=true)
00297 {
00298 if ($this->transOff) return true;
00299 if (!$ok) return $this->RollbackTrans();
00300 if ($this->transCnt) $this->transCnt -= 1;
00301 $this->_autocommit = true;
00302 $ret = db2_commit($this->_connectionID);
00303 db2_autocommit($this->_connectionID,true);
00304 return $ret;
00305 }
00306
00307 function RollbackTrans()
00308 {
00309 if ($this->transOff) return true;
00310 if ($this->transCnt) $this->transCnt -= 1;
00311 $this->_autocommit = true;
00312 $ret = db2_rollback($this->_connectionID);
00313 db2_autocommit($this->_connectionID,true);
00314 return $ret;
00315 }
00316
00317 function MetaPrimaryKeys($table)
00318 {
00319 global $ADODB_FETCH_MODE;
00320
00321 if ($this->uCaseTables) $table = strtoupper($table);
00322 $schema = '';
00323 $this->_findschema($table,$schema);
00324
00325 $savem = $ADODB_FETCH_MODE;
00326 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00327 $qid = @db2_primarykeys($this->_connectionID,'',$schema,$table);
00328
00329 if (!$qid) {
00330 $ADODB_FETCH_MODE = $savem;
00331 return false;
00332 }
00333 $rs = new ADORecordSet_db2($qid);
00334 $ADODB_FETCH_MODE = $savem;
00335
00336 if (!$rs) return false;
00337
00338 $arr =& $rs->GetArray();
00339 $rs->Close();
00340 $arr2 = array();
00341 for ($i=0; $i < sizeof($arr); $i++) {
00342 if ($arr[$i][3]) $arr2[] = $arr[$i][3];
00343 }
00344 return $arr2;
00345 }
00346
00347 function MetaForeignKeys($table, $owner = FALSE, $upper = FALSE, $asociative = FALSE )
00348 {
00349 global $ADODB_FETCH_MODE;
00350
00351 if ($this->uCaseTables) $table = strtoupper($table);
00352 $schema = '';
00353 $this->_findschema($table,$schema);
00354
00355 $savem = $ADODB_FETCH_MODE;
00356 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00357 $qid = @db2_foreign_keys($this->_connectionID,'',$schema,$table);
00358 if (!$qid) {
00359 $ADODB_FETCH_MODE = $savem;
00360 return false;
00361 }
00362 $rs = new ADORecordSet_db2($qid);
00363
00364 $ADODB_FETCH_MODE = $savem;
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376 if (!$rs) return false;
00377
00378 $foreign_keys = array();
00379 while (!$rs->EOF) {
00380 if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
00381 if (!is_array($foreign_keys[$rs->fields[5].'.'.$rs->fields[6]]))
00382 $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]] = array();
00383 $foreign_keys[$rs->fields[5].'.'.$rs->fields[6]][$rs->fields[7]] = $rs->fields[3];
00384 }
00385 $rs->MoveNext();
00386 }
00387
00388 $rs->Close();
00389 return $foreign_key;
00390 }
00391
00392
00393 function &MetaTables($ttype=false,$schema=false)
00394 {
00395 global $ADODB_FETCH_MODE;
00396
00397 $savem = $ADODB_FETCH_MODE;
00398 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00399 $qid = db2_tables($this->_connectionID);
00400
00401 $rs = new ADORecordSet_db2($qid);
00402
00403 $ADODB_FETCH_MODE = $savem;
00404 if (!$rs) {
00405 $false = false;
00406 return $false;
00407 }
00408
00409 $arr =& $rs->GetArray();
00410
00411 $rs->Close();
00412 $arr2 = array();
00413
00414 if ($ttype) {
00415 $isview = strncmp($ttype,'V',1) === 0;
00416 }
00417 for ($i=0; $i < sizeof($arr); $i++) {
00418 if (!$arr[$i][2]) continue;
00419 $type = $arr[$i][3];
00420 $schemaval = ($schema) ? $arr[$i][1].'.' : '';
00421 if ($ttype) {
00422 if ($isview) {
00423 if (strncmp($type,'V',1) === 0) $arr2[] = $schemaval.$arr[$i][2];
00424 } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
00425 } else if (strncmp($type,'SYS',3) !== 0) $arr2[] = $schemaval.$arr[$i][2];
00426 }
00427 return $arr2;
00428 }
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458 function DB2Types($t)
00459 {
00460 switch ((integer)$t) {
00461 case 1:
00462 case 12:
00463 case 0:
00464 case -95:
00465 case -96:
00466 return 'C';
00467 case -97:
00468 case -1:
00469 return 'X';
00470 case -4:
00471 return 'B';
00472
00473 case 9:
00474 case 91:
00475 return 'D';
00476
00477 case 10:
00478 case 11:
00479 case 92:
00480 case 93:
00481 return 'T';
00482
00483 case 4:
00484 case 5:
00485 case -6:
00486 return 'I';
00487
00488 case -11:
00489 return 'R';
00490 case -7:
00491 return 'L';
00492
00493 default:
00494 return 'N';
00495 }
00496 }
00497
00498 function &MetaColumns($table)
00499 {
00500 global $ADODB_FETCH_MODE;
00501
00502 $false = false;
00503 if ($this->uCaseTables) $table = strtoupper($table);
00504 $schema = '';
00505 $this->_findschema($table,$schema);
00506
00507 $savem = $ADODB_FETCH_MODE;
00508 $ADODB_FETCH_MODE = ADODB_FETCH_NUM;
00509
00510 $colname = "%";
00511 $qid = db2_columns($this->_connectionID, "", $schema, $table, $colname);
00512 if (empty($qid)) return $false;
00513
00514 $rs =& new ADORecordSet_db2($qid);
00515 $ADODB_FETCH_MODE = $savem;
00516
00517 if (!$rs) return $false;
00518 $rs->_fetch();
00519
00520 $retarr = array();
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537 while (!$rs->EOF) {
00538 if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
00539 $fld = new ADOFieldObject();
00540 $fld->name = $rs->fields[3];
00541 $fld->type = $this->DB2Types($rs->fields[4]);
00542
00543
00544
00545 if ($fld->type == 'C' or $fld->type == 'X') {
00546 if ($rs->fields[4] <= -95)
00547 $fld->max_length = $rs->fields[7]/2;
00548 else
00549 $fld->max_length = $rs->fields[7];
00550 } else
00551 $fld->max_length = $rs->fields[7];
00552 $fld->not_null = !empty($rs->fields[10]);
00553 $fld->scale = $rs->fields[8];
00554 $fld->primary_key = false;
00555 $retarr[strtoupper($fld->name)] = $fld;
00556 } else if (sizeof($retarr)>0)
00557 break;
00558 $rs->MoveNext();
00559 }
00560 $rs->Close();
00561 if (empty($retarr)) $retarr = false;
00562
00563 $qid = db2_primary_keys($this->_connectionID, "", $schema, $table);
00564 if (empty($qid)) return $false;
00565
00566 $rs =& new ADORecordSet_db2($qid);
00567 $ADODB_FETCH_MODE = $savem;
00568
00569 if (!$rs) return $retarr;
00570 $rs->_fetch();
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581 while (!$rs->EOF) {
00582 if (strtoupper(trim($rs->fields[2])) == $table && (!$schema || strtoupper($rs->fields[1]) == $schema)) {
00583 $retarr[strtoupper($rs->fields[3])]->primary_key = true;
00584 } else if (sizeof($retarr)>0)
00585 break;
00586 $rs->MoveNext();
00587 }
00588 $rs->Close();
00589
00590 if (empty($retarr)) $retarr = false;
00591 return $retarr;
00592 }
00593
00594 function Prepare($sql)
00595 {
00596 if (! $this->_bindInputArray) return $sql;
00597 $stmt = db2_prepare($this->_connectionID,$sql);
00598 if (!$stmt) {
00599
00600 return $sql;
00601 }
00602 return array($sql,$stmt,false);
00603 }
00604
00605
00606 function _query($sql,$inputarr=false)
00607 {
00608 GLOBAL $php_errormsg;
00609 if (isset($php_errormsg)) $php_errormsg = '';
00610 $this->_error = '';
00611
00612 if ($inputarr) {
00613 if (is_array($sql)) {
00614 $stmtid = $sql[1];
00615 } else {
00616 $stmtid = db2_prepare($this->_connectionID,$sql);
00617
00618 if ($stmtid == false) {
00619 $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
00620 return false;
00621 }
00622 }
00623
00624 if (! db2_execute($stmtid,$inputarr)) {
00625 if ($this->_haserrorfunctions) {
00626 $this->_errorMsg = db2_stmt_errormsg();
00627 $this->_errorCode = db2_stmt_error();
00628 }
00629 return false;
00630 }
00631
00632 } else if (is_array($sql)) {
00633 $stmtid = $sql[1];
00634 if (!db2_execute($stmtid)) {
00635 if ($this->_haserrorfunctions) {
00636 $this->_errorMsg = db2_stmt_errormsg();
00637 $this->_errorCode = db2_stmt_error();
00638 }
00639 return false;
00640 }
00641 } else
00642 $stmtid = @db2_exec($this->_connectionID,$sql);
00643
00644 $this->_lastAffectedRows = 0;
00645 if ($stmtid) {
00646 if (@db2_num_fields($stmtid) == 0) {
00647 $this->_lastAffectedRows = db2_num_rows($stmtid);
00648 $stmtid = true;
00649 } else {
00650 $this->_lastAffectedRows = 0;
00651 }
00652
00653 if ($this->_haserrorfunctions) {
00654 $this->_errorMsg = '';
00655 $this->_errorCode = 0;
00656 } else
00657 $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
00658 } else {
00659 if ($this->_haserrorfunctions) {
00660 $this->_errorMsg = db2_stmt_errormsg();
00661 $this->_errorCode = db2_stmt_error();
00662 } else
00663 $this->_errorMsg = isset($php_errormsg) ? $php_errormsg : '';
00664
00665 }
00666 return $stmtid;
00667 }
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678 function UpdateBlob($table,$column,$val,$where,$blobtype='BLOB')
00679 {
00680 return $this->Execute("UPDATE $table SET $column=? WHERE $where",array($val)) != false;
00681 }
00682
00683
00684 function _close()
00685 {
00686 $ret = @db2_close($this->_connectionID);
00687 $this->_connectionID = false;
00688 return $ret;
00689 }
00690
00691 function _affectedrows()
00692 {
00693 return $this->_lastAffectedRows;
00694 }
00695
00696 }
00697
00698
00699
00700
00701
00702 class ADORecordSet_db2 extends ADORecordSet {
00703
00704 var $bind = false;
00705 var $databaseType = "db2";
00706 var $dataProvider = "db2";
00707 var $useFetchArray;
00708
00709 function ADORecordSet_db2($id,$mode=false)
00710 {
00711 if ($mode === false) {
00712 global $ADODB_FETCH_MODE;
00713 $mode = $ADODB_FETCH_MODE;
00714 }
00715 $this->fetchMode = $mode;
00716
00717 $this->_queryID = $id;
00718 }
00719
00720
00721
00722 function &FetchField($offset = -1)
00723 {
00724 $o= new ADOFieldObject();
00725 $o->name = @db2_field_name($this->_queryID,$offset);
00726 $o->type = @db2_field_type($this->_queryID,$offset);
00727 $o->max_length = db2_field_width($this->_queryID,$offset);
00728 if (ADODB_ASSOC_CASE == 0) $o->name = strtolower($o->name);
00729 else if (ADODB_ASSOC_CASE == 1) $o->name = strtoupper($o->name);
00730 return $o;
00731 }
00732
00733
00734 function Fields($colname)
00735 {
00736 if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];
00737 if (!$this->bind) {
00738 $this->bind = array();
00739 for ($i=0; $i < $this->_numOfFields; $i++) {
00740 $o = $this->FetchField($i);
00741 $this->bind[strtoupper($o->name)] = $i;
00742 }
00743 }
00744
00745 return $this->fields[$this->bind[strtoupper($colname)]];
00746 }
00747
00748
00749 function _initrs()
00750 {
00751 global $ADODB_COUNTRECS;
00752 $this->_numOfRows = ($ADODB_COUNTRECS) ? @db2_num_rows($this->_queryID) : -1;
00753 $this->_numOfFields = @db2_num_fields($this->_queryID);
00754
00755 if ($this->_numOfRows == 0) $this->_numOfRows = -1;
00756 }
00757
00758 function _seek($row)
00759 {
00760 return false;
00761 }
00762
00763
00764 function &GetArrayLimit($nrows,$offset=-1)
00765 {
00766 if ($offset <= 0) {
00767 $rs =& $this->GetArray($nrows);
00768 return $rs;
00769 }
00770 $savem = $this->fetchMode;
00771 $this->fetchMode = ADODB_FETCH_NUM;
00772 $this->Move($offset);
00773 $this->fetchMode = $savem;
00774
00775 if ($this->fetchMode & ADODB_FETCH_ASSOC) {
00776 $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
00777 }
00778
00779 $results = array();
00780 $cnt = 0;
00781 while (!$this->EOF && $nrows != $cnt) {
00782 $results[$cnt++] = $this->fields;
00783 $this->MoveNext();
00784 }
00785
00786 return $results;
00787 }
00788
00789
00790 function MoveNext()
00791 {
00792 if ($this->_numOfRows != 0 && !$this->EOF) {
00793 $this->_currentRow++;
00794
00795 $this->fields = @db2_fetch_array($this->_queryID);
00796 if ($this->fields) {
00797 if ($this->fetchMode & ADODB_FETCH_ASSOC) {
00798 $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
00799 }
00800 return true;
00801 }
00802 }
00803 $this->fields = false;
00804 $this->EOF = true;
00805 return false;
00806 }
00807
00808 function _fetch()
00809 {
00810
00811 $this->fields = db2_fetch_array($this->_queryID);
00812 if ($this->fields) {
00813 if ($this->fetchMode & ADODB_FETCH_ASSOC) {
00814 $this->fields =& $this->GetRowAssoc(ADODB_ASSOC_CASE);
00815 }
00816 return true;
00817 }
00818 $this->fields = false;
00819 return false;
00820 }
00821
00822 function _close()
00823 {
00824 return @db2_free_result($this->_queryID);
00825 }
00826
00827 }
00828 ?>