formatting

This commit is contained in:
Miles Lott 2001-09-28 21:27:40 +00:00
parent 4820ee5c02
commit ffcb54d88f
2 changed files with 1147 additions and 1056 deletions

View File

@ -12,21 +12,24 @@
* by the Free Software Foundation; either version 2.1 of the License, or * * by the Free Software Foundation; either version 2.1 of the License, or *
* any later version. * * any later version. *
\**************************************************************************/ \**************************************************************************/
/* $Id$ */ /* $Id$ */
class db { class db
var $Debug = false; {
var $Home = "/u01/app/oracle/product/8.0.4"; var $Debug = False;
var $Home = '/u01/app/oracle/product/8.0.4';
var $Remote = 1; var $Remote = 1;
/* Due to a strange error with Oracle 8.0.5, Apache and PHP3.0.6 /* Due to a strange error with Oracle 8.0.5, Apache and PHP3.0.6
you don't need to set the ENV - on my system Apache you don't need to set the ENV - on my system Apache
will change to a zombie, if I don't set this to FALSE! will change to a zombie, if I don't set this to FALSE!
If unsure try it out, if it works. */ If unsure try it out, if it works. */
/* Milosch - omg, you aren't using 3.0.6 are you? */
var $OraPutEnv = true; var $OraPutEnv = true;
var $Database = ""; var $Database = '';
var $User = ""; var $User = '';
var $Password = ""; var $Password = '';
var $Link_ID = 0; var $Link_ID = 0;
var $Query_ID = 0; var $Query_ID = 0;
@ -34,63 +37,74 @@ class db {
var $Row; var $Row;
var $Errno = 0; var $Errno = 0;
var $Error = ""; var $Error = '';
var $ora_no_next_fetch=false; var $ora_no_next_fetch = False;
/* copied from db_mysql for completeness */ /* copied from db_mysql for completeness */
/* public: identification constant. never change this. */ /* public: identification constant. never change this. */
var $type = "oracle"; var $type = 'oracle';
var $revision = "1.2"; var $revision = '1.2';
var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning) var $Halt_On_Error = 'yes'; ## 'yes' (halt with message), 'no' (ignore errors quietly), 'report' (ignore errror, but spit a warning)
/* public: constructor */ /* public: constructor */
function db($query = "") { function db($query = '')
{
$this->query($query); $this->query($query);
} }
/* public: some trivial reporting */ /* public: some trivial reporting */
function link_id() { function link_id()
{
return $this->Link_ID; return $this->Link_ID;
} }
function query_id() { function query_id()
{
return $this->Query_ID; return $this->Query_ID;
} }
function connect() { function connect()
{
## see above why we do this ## see above why we do this
if ($this->OraPutEnv) { if ($this->OraPutEnv)
{
PutEnv("ORACLE_SID=$this->Database"); PutEnv("ORACLE_SID=$this->Database");
PutEnv("ORACLE_HOME=$this->Home"); PutEnv("ORACLE_HOME=$this->Home");
} }
if ( 0 == $this->Link_ID ) { if ( 0 == $this->Link_ID )
if($this->Debug) { {
printf("<br>Connect()ing to $this->Database...<br>\n"); if($this->Debug)
{
printf('<br>Connecting to ' . $this->Database . "...<br>\n");
} }
if($this->Remote) { if($this->Remote)
if($this->Debug) { {
if($this->Debug)
{
printf("<br>connect() $this->User/******@$this->Database.world<br>\n"); printf("<br>connect() $this->User/******@$this->Database.world<br>\n");
} }
if($GLOBALS['phpgw_info']['server']['db_persistent']) if($GLOBALS['phpgw_info']['server']['db_persistent'])
{ {
$this->Link_ID=ora_plogon("$this->User/$this->Password@$this->Database",""); $this->Link_ID = ora_plogon("$this->User/$this->Password@$this->Database","");
/************** (comment by SSilk) /************** (comment by SSilk)
this dosn't work on my system: this dosn't work on my system:
$this->Link_ID=ora_plogon("$this->User@$this->Database.world","$this->Password"); $this->Link_ID = ora_plogon("$this->User@$this->Database.world","$this->Password");
***************/ ***************/
} }
else else
{ {
$this->Link_ID=ora_logon("$this->User/$this->Password@$this->Database",""); $this->Link_ID = ora_logon("$this->User/$this->Password@$this->Database","");
/************** (comment by SSilk) /************** (comment by SSilk)
this dosn't work on my system: this dosn't work on my system:
$this->Link_ID=ora_logon("$this->User@$this->Database.world","$this->Password"); $this->Link_ID=ora_logon("$this->User@$this->Database.world","$this->Password");
***************/ ***************/
} }
} else { }
if($this->Debug) { else
{
if($this->Debug)
{
printf("<br>connect() $this->User, $this->Password <br>\n"); printf("<br>connect() $this->User, $this->Password <br>\n");
} }
if($GLOBALS['phpgw_info']['server']['db_persistent']) if($GLOBALS['phpgw_info']['server']['db_persistent'])
@ -103,17 +117,22 @@ class db {
$this->Link_ID=ora_logon("$this->User","$this->Password"); $this->Link_ID=ora_logon("$this->User","$this->Password");
} }
} }
if($this->Debug) { if($this->Debug)
{
printf("<br>connect() Link_ID: $this->Link_ID<br>\n"); printf("<br>connect() Link_ID: $this->Link_ID<br>\n");
} }
if (!$this->Link_ID) { if (!$this->Link_ID)
$this->halt("connect() Link-ID == false " . {
"($this->Link_ID), ora_".($GLOBALS['phpgw_info']['server']['db_persistent']?'p':'')."logon failed"); $this->halt('connect() Link-ID == false '
} else { . "($this->Link_ID), ora_".($GLOBALS['phpgw_info']['server']['db_persistent']?'p':'').'logon failed');
//echo "commit on<p>"; }
else
{
//echo 'commit on<p>';
ora_commiton($this->Link_ID); ora_commiton($this->Link_ID);
} }
if($this->Debug) { if($this->Debug)
{
printf("<br>connect() Obtained the Link_ID: $this->Link_ID<br>\n"); printf("<br>connect() Obtained the Link_ID: $this->Link_ID<br>\n");
} }
} }
@ -129,32 +148,38 @@ class db {
## You can also make extensive use of ->disconnect()! ## You can also make extensive use of ->disconnect()!
## The unused QueryIDs will be recycled sometimes. ## The unused QueryIDs will be recycled sometimes.
function query($Query_String) { function query($Query_String)
{
/* No empty queries, please, since PHP4 chokes on them. */ /* No empty queries, please, since PHP4 chokes on them. */
if ($Query_String == "") if ($Query_String == '')
{
/* The empty query string is passed on from the constructor, /* The empty query string is passed on from the constructor,
* when calling the class without a query, e.g. in situations * when calling the class without a query, e.g. in situations
* like these: '$db = new DB_Sql_Subclass;' * like these: '$db = new DB_Sql_Subclass;'
*/ */
return 0; return 0;
}
$this->connect(); $this->connect();
$this->lastQuery=$Query_String; $this->lastQuery=$Query_String;
if (!$this->Query_ID) { if (!$this->Query_ID)
$this->Query_ID= ora_open($this->Link_ID); {
$this->Query_ID = ora_open($this->Link_ID);
} }
if($this->Debug) { if($this->Debug)
{
printf("Debug: query = %s<br>\n", $Query_String); printf("Debug: query = %s<br>\n", $Query_String);
printf("<br>Debug: Query_ID: %d<br>\n", $this->Query_ID); printf("<br>Debug: Query_ID: %d<br>\n", $this->Query_ID);
} }
if(!@ora_parse($this->Query_ID,$Query_String)) { if(!@ora_parse($this->Query_ID,$Query_String))
{
$this->Errno=ora_errorcode($this->Query_ID); $this->Errno=ora_errorcode($this->Query_ID);
$this->Error=ora_error($this->Query_ID); $this->Error=ora_error($this->Query_ID);
$this->halt("<BR>ora_parse() failed:<BR>$Query_String<BR><small>Snap & paste this to sqlplus!</SMALL>"); $this->halt("<BR>ora_parse() failed:<BR>$Query_String<BR><small>Snap & paste this to sqlplus!</SMALL>");
} elseif (!@ora_exec($this->Query_ID)) { }
elseif (!@ora_exec($this->Query_ID))
{
$this->Errno=ora_errorcode($this->Query_ID); $this->Errno=ora_errorcode($this->Query_ID);
$this->Error=ora_error($this->Query_ID); $this->Error=ora_error($this->Query_ID);
$this->halt("<BR>\n$Query_String\n<BR><small>Snap & paste this to sqlplus!</SMALL>"); $this->halt("<BR>\n$Query_String\n<BR><small>Snap & paste this to sqlplus!</SMALL>");
@ -162,82 +187,107 @@ class db {
$this->Row=0; $this->Row=0;
if(!$this->Query_ID) { if(!$this->Query_ID)
$this->halt("Invalid SQL: ".$Query_String); {
$this->halt('Invalid SQL: '.$Query_String);
} }
return $this->Query_ID; return $this->Query_ID;
} }
function next_record() { function next_record()
{
if (!$this->no_next_fetch && if (!$this->no_next_fetch &&
0 == ora_fetch($this->Query_ID)) { 0 == ora_fetch($this->Query_ID))
if ($this->Debug) { {
if ($this->Debug)
{
printf("<br>next_record(): ID: %d,Rows: %d<br>\n", printf("<br>next_record(): ID: %d,Rows: %d<br>\n",
$this->Query_ID,$this->num_rows()); $this->Query_ID,$this->num_rows());
} }
$this->Row +=1; $this->Row +=1;
$errno=ora_errorcode($this->Query_ID); $errno=ora_errorcode($this->Query_ID);
if(1403 == $errno) { # 1043 means no more records found if(1403 == $errno)
$this->Errno=0; { # 1043 means no more records found
$this->Error=""; $this->Errno = 0;
$this->Error = '';
$this->disconnect(); $this->disconnect();
$stat=0; $stat=0;
} else { }
else
{
$this->Error=ora_error($this->Query_ID); $this->Error=ora_error($this->Query_ID);
$this->Errno=$errno; $this->Errno=$errno;
if($this->Debug) { if($this->Debug)
printf("<br>%d Error: %s", {
printf('<br>%d Error: %s',
$this->Errno, $this->Errno,
$this->Error); $this->Error);
} }
$stat=0; $stat=0;
} }
} else { }
else
{
$this->no_next_fetch=false; $this->no_next_fetch=false;
for($ix=0;$ix<ora_numcols($this->Query_ID);$ix++) { for($ix=0;$ix<ora_numcols($this->Query_ID);$ix++)
{
$col=strtolower(ora_columnname($this->Query_ID,$ix)); $col=strtolower(ora_columnname($this->Query_ID,$ix));
$value=ora_getcolumn($this->Query_ID,$ix); $value=ora_getcolumn($this->Query_ID,$ix);
$this->Record[ "$col" ] = $value; $this->Record[ "$col" ] = $value;
# echo"<b>[$col]</b>: $value <br>\n"; # echo"<b>[$col]</b>: $value <br>\n";
} }
$stat=1; $stat=1;
} }
return $stat; return $stat;
} }
## seek() works only for $pos - 1 and $pos ## seek() works only for $pos - 1 and $pos
## Perhaps I make a own implementation, but my ## Perhaps I make a own implementation, but my
## opinion is, that this should be done by PHP3 ## opinion is, that this should be done by PHP3
function seek($pos) { function seek($pos)
if ($this->Row - 1 == $pos) { {
if($this->Row - 1 == $pos)
{
$this->no_next_fetch=true; $this->no_next_fetch=true;
} elseif ($this->Row == $pos ) { }
elseif ($this->Row == $pos )
{
## do nothing ## do nothing
} else { }
else
{
$this->halt("Invalid seek(): Position is cannot be handled by API.<BR>". $this->halt("Invalid seek(): Position is cannot be handled by API.<BR>".
"Difference too big. Wanted: $pos Current pos: $this->Row"); "Difference too big. Wanted: $pos Current pos: $this->Row");
} }
if ($Debug) echo "<BR>Debug: seek = $pos<BR>"; if($Debug)
{
echo "<BR>Debug: seek = $pos<BR>";
}
$this->Row=$pos; $this->Row=$pos;
} }
function lock($table, $mode = "write") { function lock($table, $mode = 'write')
if ($mode == "write") { {
if ($mode == 'write')
{
$result = ora_do($this->Link_ID, "lock table $table in row exclusive mode"); $result = ora_do($this->Link_ID, "lock table $table in row exclusive mode");
} else { }
else
{
$result = 1; $result = 1;
} }
return $result; return $result;
} }
function unlock() { function unlock()
return ora_do($this->Link_ID, "commit"); {
return ora_do($this->Link_ID, 'commit');
} }
function metadata($table,$full=false) { function metadata($table,$full=false)
{
$count = 0; $count = 0;
$id = 0; $id = 0;
$res = array(); $res = array();
@ -249,34 +299,34 @@ class db {
* *
* - full is false (default): * - full is false (default):
* $result[]: * $result[]:
* [0]["table"] table name * [0]['table'] table name
* [0]["name"] field name * [0]['name'] field name
* [0]["type"] field type * [0]['type'] field type
* [0]["len"] field length * [0]['len'] field length
* [0]["flags"] field flags ("NOT NULL", "INDEX") * [0]['flags'] field flags ('NOT NULL', 'INDEX')
* [0]["format"] precision and scale of number (eg. "10,2") or empty * [0]['format'] precision and scale of number (eg. '10,2') or empty
* [0]["index"] name of index (if has one) * [0]['index'] name of index (if has one)
* [0]["chars"] number of chars (if any char-type) * [0]['chars'] number of chars (if any char-type)
* *
* - full is true * - full is true
* $result[]: * $result[]:
* ["num_fields"] number of metadata records * ['num_fields'] number of metadata records
* [0]["table"] table name * [0]['table'] table name
* [0]["name"] field name * [0]['name'] field name
* [0]["type"] field type * [0]['type'] field type
* [0]["len"] field length * [0]['len'] field length
* [0]["flags"] field flags ("NOT NULL", "INDEX") * [0]['flags'] field flags ('NOT NULL', 'INDEX')
* [0]["format"] precision and scale of number (eg. "10,2") or empty * [0]['format'] precision and scale of number (eg. '10,2') or empty
* [0]["index"] name of index (if has one) * [0]['index'] name of index (if has one)
* [0]["chars"] number of chars (if any char-type) * [0]['chars'] number of chars (if any char-type)
* ["meta"][field name] index of field named "field name" * ['meta'][field name] index of field named 'field name'
* The last one is used, if you have a field name, but no index. * The last one is used, if you have a field name, but no index.
* Test: if (isset($result['meta']['myfield'])) {} ... * Test: if (isset($result['meta']['myfield'])) {} ...
*/ */
$this->connect(); $this->connect();
## This is a RIGHT OUTER JOIN: "(+)", if you want to see, what ## This is a RIGHT OUTER JOIN: '(+)', if you want to see, what
## this query results try the following: ## this query results try the following:
## $table = new Table; $db = new my_DB_Sql; # you have to make ## $table = new Table; $db = new my_DB_Sql; # you have to make
## # your own class ## # your own class
@ -291,34 +341,52 @@ class db {
" AND T.table_name=UPPER('$table') ORDER BY T.column_id"); " AND T.table_name=UPPER('$table') ORDER BY T.column_id");
$i=0; $i=0;
while ($this->next_record()) { while ($this->next_record())
$res[$i]["table"] = $this->Record[table_name]; {
$res[$i]["name"] = strtolower($this->Record[column_name]); $res[$i]['table'] = $this->Record[table_name];
$res[$i]["type"] = $this->Record[data_type]; $res[$i]['name'] = strtolower($this->Record[column_name]);
$res[$i]["len"] = $this->Record[data_length]; $res[$i]['type'] = $this->Record[data_type];
if ($this->Record[index_name]) $res[$i]["flags"] = "INDEX "; $res[$i]['len'] = $this->Record[data_length];
$res[$i]["flags"] .= ( $this->Record[nullable] == 'N') ? '' : 'NOT NULL'; if ($this->Record[index_name])
$res[$i]["format"]= (int)$this->Record[data_precision].",". {
(int)$this->Record[data_scale]; $res[$i]['flags'] = 'INDEX ';
if ("0,0"==$res[$i]["format"]) $res[$i]["format"]=''; }
$res[$i]["index"] = $this->Record[index_name]; $res[$i]['flags'] .= ( $this->Record['nullable'] == 'N') ? '' : 'NOT NULL';
$res[$i]["chars"] = $this->Record[char_col_decl_length]; $res[$i]['format']= (int)$this->Record['data_precision'].','.
if ($full) { (int)$this->Record[data_scale];
$j=$res[$i]["name"]; if ('0,0'==$res[$i]['format'])
$res["meta"][$j] = $i; {
$res["meta"][strtoupper($j)] = $i; $res[$i]['format']='';
}
$res[$i]['index'] = $this->Record[index_name];
$res[$i]['chars'] = $this->Record[char_col_decl_length];
if ($full)
{
$j=$res[$i]['name'];
$res['meta'][$j] = $i;
$res['meta'][strtoupper($j)] = $i;
}
if ($full)
{
$res['meta'][$res[$i]['name']] = $i;
} }
if ($full) $res["meta"][$res[$i]["name"]] = $i;
$i++; $i++;
} }
if ($full) $res["num_fields"]=$i; if ($full)
# $this->disconnect(); {
$res['num_fields']=$i;
}
# $this->disconnect();
return $res; return $res;
} }
## THIS FUNCTION IS UNSTESTED! ## THIS FUNCTION IS UNSTESTED!
function affected_rows() { function affected_rows()
if ($Debug) echo "<BR>Debug: affected_rows=". ora_numrows($this->Query_ID)."<BR>"; {
if ($Debug)
{
echo '<BR>Debug: affected_rows='. ora_numrows($this->Query_ID).'<BR>';
}
return ora_numrows($this->Query_ID); return ora_numrows($this->Query_ID);
} }
@ -328,45 +396,60 @@ class db {
## will work with it. ## will work with it.
## ##
## Also, for a qualified replacement you need to parse the ## Also, for a qualified replacement you need to parse the
## selection, cause this will fail: "SELECT id, from FROM ..."). ## selection, cause this will fail: 'SELECT id, from FROM ...').
## "FROM" is - as far as I know a keyword in Oracle, so it can ## 'FROM' is - as far as I know a keyword in Oracle, so it can
## only be used in this way. But you have been warned. ## only be used in this way. But you have been warned.
function num_rows() { function num_rows()
{
$curs=ora_open($this->Link_ID); $curs=ora_open($this->Link_ID);
## this is the important part and it is also the HACK! ## this is the important part and it is also the HACK!
if (eregi("^[[:space:]]*SELECT[[:space:]]",$this->lastQuery) ) { if (eregi("^[[:space:]]*SELECT[[:space:]]",$this->lastQuery) )
$from_pos = strpos(strtoupper($this->lastQuery),"FROM"); {
$q = "SELECT count(*) ". substr($this->lastQuery, $from_pos); $from_pos = strpos(strtoupper($this->lastQuery),'FROM');
$q = 'SELECT count(*) '. substr($this->lastQuery, $from_pos);
ORA_parse($curs,$q); ORA_parse($curs,$q);
ORA_exec($curs); ORA_exec($curs);
ORA_fetch($curs); ORA_fetch($curs);
if ($Debug) echo "<BR>Debug: num_rows=". ORA_getcolumn($curs,0)."<BR>"; if ($Debug)
{
echo '<BR>Debug: num_rows='. ORA_getcolumn($curs,0).'<BR>';
}
return(ORA_getcolumn($curs,0)); return(ORA_getcolumn($curs,0));
} else { }
else
{
$this->halt("Last Query was not a SELECT: $this->lastQuery"); $this->halt("Last Query was not a SELECT: $this->lastQuery");
} }
} }
function num_fields() { function num_fields()
if ($Debug) echo "<BR>Debug: num_fields=". ora_numcols($this->Query_ID) . "<BR>"; {
if ($Debug)
{
echo '<BR>Debug: num_fields='. ora_numcols($this->Query_ID) . '<BR>';
}
return ora_numcols($this->Query_ID); return ora_numcols($this->Query_ID);
} }
function nf() { function nf()
{
return $this->num_rows(); return $this->num_rows();
} }
function np() { function np()
{
print $this->num_rows(); print $this->num_rows();
} }
function f($Name) { function f($Name)
{
return $this->Record[$Name]; return $this->Record[$Name];
} }
function p($Name) { function p($Name)
{
print $this->Record[$Name]; print $this->Record[$Name];
} }
@ -381,74 +464,83 @@ class db {
if(!@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL")) if(!@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL"))
{ {
// There is no such sequence yet, then create it // There is no such sequence yet, then create it
if(!@ora_parse($Query_ID,"CREATE SEQUENCE $seq_name") if(!@ora_parse($Query_ID,"CREATE SEQUENCE $seq_name") ||
|| !@ora_exec($Query_ID))
!@ora_exec($Query_ID)
)
{ {
$this->halt("<BR> nextid() function - unable to create sequence"); $this->halt('<BR> nextid() function - unable to create sequence');
return 0; return 0;
} }
@ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL"); @ora_parse($Query_ID,"SELECT $seq_name.NEXTVAL FROM DUAL");
} }
if (!@ora_exec($Query_ID)) { if (!@ora_exec($Query_ID))
{
$this->halt("<BR>ora_exec() failed:<BR>nextID function"); $this->halt("<BR>ora_exec() failed:<BR>nextID function");
} }
if (@ora_fetch($Query_ID) ) { if (@ora_fetch($Query_ID) )
{
$next_id = ora_getcolumn($Query_ID, 0); $next_id = ora_getcolumn($Query_ID, 0);
} }
else { else
{
$next_id = 0; $next_id = 0;
} }
if ( Query_ID > 0 ) { if ( Query_ID > 0 )
{
ora_close(Query_ID); ora_close(Query_ID);
} }
return $next_id; return $next_id;
} }
function disconnect() { function disconnect()
if($this->Debug) { {
if($this->Debug)
{
echo "Debug: Disconnecting $this->Query_ID...<br>\n"; echo "Debug: Disconnecting $this->Query_ID...<br>\n";
} }
if ( $this->Query_ID < 1 ) { if ( $this->Query_ID < 1 )
{
echo "<B>Warning</B>: disconnect(): Cannot free ID $this->Query_ID\n"; echo "<B>Warning</B>: disconnect(): Cannot free ID $this->Query_ID\n";
# return(); # return();
} }
ora_close($this->Query_ID); ora_close($this->Query_ID);
$this->Query_ID=0; $this->Query_ID=0;
} }
/* private: error handling */ /* private: error handling */
function halt($msg) { function halt($msg)
if ($this->Halt_On_Error == "no") {
if ($this->Halt_On_Error == 'no')
{
return; return;
}
$this->haltmsg($msg); $this->haltmsg($msg);
if ($this->Halt_On_Error != "report") if ($this->Halt_On_Error != 'report')
die("Session halted."); {
die('Session halted.');
}
} }
function haltmsg($msg) { function haltmsg($msg)
{
printf("<b>Database error:</b> %s<br>\n", $msg); printf("<b>Database error:</b> %s<br>\n", $msg);
printf("<b>Oracle Error</b>: %s (%s)<br>\n", printf("<b>Oracle Error</b>: %s (%s)<br>\n",
$this->Errno, $this->Errno,
$this->Error); $this->Error);
} }
function table_names() { function table_names()
{
$this->connect(); $this->connect();
$this->query(" $this->query('SELECT table_name,tablespace_name FROM user_tables');
SELECT table_name,tablespace_name
FROM user_tables");
$i=0; $i=0;
while ($this->next_record()) while ($this->next_record())
{ {
$info[$i]["table_name"] =$this->Record["table_name"]; $info[$i]['table_name'] = $this->Record['table_name'];
$info[$i]["tablespace_name"]=$this->Record["tablespace_name"]; $info[$R]['tablespace_name'] = $this->Record['tablespace_name'];
$i++; $i++;
} }
return $info; return $info;
} }
} }

View File

@ -748,6 +748,5 @@
return lang('showing x',$total_records); return lang('showing x',$total_records);
} }
} }
} } // End of nextmatchs class
// End of nextmatchs class
?> ?>