2010-12-02 23:34:41 +00:00
< ? php
/**
* class . database_mysql . php
*
* ProcessMaker Open Source Edition
* Copyright ( C ) 2004 - 2008 Colosa Inc .
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
*
* For more information , contact Colosa Inc , 2566 Le Jeune Rd . ,
* Coral Gables , FL , 33134 , USA , or email info @ colosa . com .
*
*/
G :: LoadSystem ( 'database_base' );
class database extends database_base {
public $iFetchType = MYSQL_ASSOC ;
/**
* class database constructor
* @ param $sType adapter type
* @ param $sServer server
* @ param $sUser db user
* @ param $sPass db user password
* @ param $sDataBase Database name
*/
public function __construct ( $sType = DB_ADAPTER , $sServer = DB_HOST , $sUser = DB_USER , $sPass = DB_PASS , $sDataBase = DB_NAME ) {
$this -> sType = $sType ;
$this -> sServer = $sServer ;
$this -> sUser = $sUser ;
$this -> sPass = $sPass ;
$this -> sDataBase = $sDataBase ;
$this -> oConnection = @ mysql_connect ( $sServer , $sUser , $sPass ) || null ;
$this -> sQuoteCharacter = '`' ;
}
/**
* generate the sql sentence to create a table
* @ param $sTable table name
* @ param $aColumns array of columns
* @ return $sSql the sql sentence
*/
public function generateCreateTableSQL ( $sTable , $aColumns ) {
$sKeys = '' ;
$sSQL = 'CREATE TABLE IF NOT EXISTS ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . '(' ;
foreach ( $aColumns as $sColumnName => $aParameters ) {
if ( $sColumnName != 'INDEXES' ) {
if ( $sColumnName != '' && isset ( $aParameters [ 'Type' ]) && $aParameters [ 'Type' ] != '' ){
$sSQL .= $this -> sQuoteCharacter . $sColumnName . $this -> sQuoteCharacter . ' ' . $aParameters [ 'Type' ];
if ( isset ( $aParameters [ 'Null' ]) && $aParameters [ 'Null' ] == 'YES' ) {
$sSQL .= ' NULL' ;
} else {
$sSQL .= ' NOT NULL' ;
}
if ( isset ( $aParameters [ 'Key' ]) && $aParameters [ 'Key' ] == 'PRI' ) {
$sKeys .= $this -> sQuoteCharacter . $sColumnName . $this -> sQuoteCharacter . ',' ;
}
if ( isset ( $aParameters [ 'Default' ]) && $aParameters [ 'Default' ] != '' ) {
$sSQL .= " DEFAULT ' " . $aParameters [ 'Default' ] . " ' " ;
}
$sSQL .= ',' ;
}
}
}
$sSQL = substr ( $sSQL , 0 , - 1 );
if ( $sKeys != '' ) {
$sSQL .= ',PRIMARY KEY(' . substr ( $sKeys , 0 , - 1 ) . ')' ;
}
$sSQL .= ')' . $this -> sEndLine ;
return $sSQL ;
}
/**
* generate a drop table sentence
* @ param $sTable table name
* @ return sql sentence string
*/
public function generateDropTableSQL ( $sTable ) {
return 'DROP TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . $this -> sEndLine ;
}
/**
* generate drop column sentence
* @ param $sTable table name
* @ param $sColumn column name
* @ return $sSql sql sentence
*/
public function generateDropColumnSQL ( $sTable , $sColumn ) {
$sSQL = 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter .
' DROP COLUMN ' . $this -> sQuoteCharacter . $sColumn . $this -> sQuoteCharacter . $this -> sEndLine ;
return $sSQL ;
}
/**
* generate an add column sentence
* @ param $sTable table name
* @ param $sColumn column name
* @ param $aParameters parameters of field like typo or if it can be null
* @ return $sSql sql sentence
*/
public function generateAddColumnSQL ( $sTable , $sColumn , $aParameters ) {
if ( isset ( $aParameters [ 'Type' ]) && isset ( $aParameters [ 'Null' ]) ) {
$sSQL = 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter .
' ADD COLUMN ' . $this -> sQuoteCharacter . $sColumn . $this -> sQuoteCharacter .
' ' . $aParameters [ 'Type' ];
if ( $aParameters [ 'Null' ] == 'YES' ) {
$sSQL .= ' NULL' ;
}
else {
$sSQL .= ' NOT NULL' ;
}
}
/* if ( $aParameters [ 'Key' ] == 'PRI' ) {
$sKeys .= 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter .
' ADD PRIMARY KEY (' . $this -> sQuoteCharacter . $sColumn . $this -> sQuoteCharacter . ')' . $this -> sEndLine ;
} */
if ( isset ( $aParameters [ 'AI' ])) {
if ( $aParameters [ 'AI' ] == 1 ) {
$sSQL .= ' AUTO_INCREMENT' ;
}
else {
if ( $aParameters [ 'Default' ] != '' ) {
$sSQL .= " DEFAULT ' " . $aParameters [ 'Default' ] . " ' " ;
}
}
}
else {
if ( isset ( $aParameters [ 'Default' ]) && $aParameters [ 'Default' ] != '' ) {
$sSQL .= " DEFAULT ' " . $aParameters [ 'Default' ] . " ' " ;
}
}
$sSQL .= $this -> sEndLine ;
return $sSQL ;
}
/**
* generate a change column sentence
* @ param $sTable table name
* @ param $sColumn column name
* @ param $aParameters parameters of field like typo or if it can be null
* @ param $sColumnNewName column new name
* @ return $sSql sql sentence
*/
public function generateChangeColumnSQL ( $sTable , $sColumn , $aParameters , $sColumnNewName = '' ) {
$sSQL = 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter .
' CHANGE COLUMN ' . $this -> sQuoteCharacter . ( $sColumnNewName != '' ? $sColumnNewName : $sColumn ) . $this -> sQuoteCharacter .
' ' . $this -> sQuoteCharacter . $sColumn . $this -> sQuoteCharacter ;
if ( isset ( $aParameters [ 'Type' ])) {
$sSQL .= ' ' . $aParameters [ 'Type' ];
}
if ( isset ( $aParameters [ 'Null' ])) {
if ( $aParameters [ 'Null' ] == 'YES' ) {
$sSQL .= ' NULL' ;
}
else {
$sSQL .= ' NOT NULL' ;
}
}
//if (isset($aParameters['AI'])) {
// if ($aParameters['AI'] == 1) {
// $sSQL .= ' AUTO_INCREMENT';
// }
// else {
// if (isset($aParameters['Default'])) {
// if ($aParameters['Default'] != '') {
// $sSQL .= " DEFAULT '" . $aParameters['Default'] . "'";
// }
// }
// }
//}
//else {
if ( isset ( $aParameters [ 'Default' ])) {
if ( trim ( $aParameters [ 'Default' ] == '' ) && $aParameters [ 'Type' ] == 'datetime' ) {
//do nothing
}
else
$sSQL .= " DEFAULT ' " . $aParameters [ 'Default' ] . " ' " ;
//}
}
if ( ! isset ( $aParameters [ 'Default' ]) && isset ( $aParameters [ 'Null' ]) && $aParameters [ 'Null' ] == 'YES' ) {
$sSQL .= " DEFAULT NULL " ;
}
//}
$sSQL .= $this -> sEndLine ;
return $sSQL ;
}
/**
* Generate and get the primary key in a sentence
* @ param $sTable table name
* @ return $sSql sql sentence
*/
public function generateGetPrimaryKeysSQL ( $sTable ) {
try {
if ( $sTable == '' ) {
throw new Exception ( 'The table name cannot be empty!' );
}
return 'SHOW INDEX FROM ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . ' WHERE Seq_in_index = 1' . $this -> sEndLine ;
}
catch ( Exception $oException ) {
throw $oException ;
}
}
/**
* generate a sentence to drop the primary key
* @ param $sTable table name
* @ return sql sentence
*/
public function generateDropPrimaryKeysSQL ( $sTable ) {
try {
if ( $sTable == '' ) {
throw new Exception ( 'The table name cannot be empty!' );
}
return 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . ' DROP PRIMARY KEY' . $this -> sEndLine ;
}
catch ( Exception $oException ) {
throw $oException ;
}
}
/**
* generate a sentence to add multiple primary keys
* @ param $sTable table name
* @ param $aPrimaryKeys array of primary keys
* @ return sql sentence
*/
public function generateAddPrimaryKeysSQL ( $sTable , $aPrimaryKeys ) {
try {
if ( $sTable == '' ) {
throw new Exception ( 'The table name cannot be empty!' );
}
$sSQL = 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter .
' ADD PRIMARY KEY (' ;
foreach ( $aPrimaryKeys as $sKey ) {
$sSQL .= $this -> sQuoteCharacter . $sKey . $this -> sQuoteCharacter . ',' ;
}
$sSQL = substr ( $sSQL , 0 , - 1 ) . ')' . $this -> sEndLine ;
return $sSQL ;
}
catch ( Exception $oException ) {
throw $oException ;
}
}
/**
* generate a sentence to drop an index
* @ param $sTable table name
* @ param $sIndexName index name
* @ return sql sentence
*/
public function generateDropKeySQL ( $sTable , $sIndexName ) {
try {
if ( $sTable == '' ) {
throw new Exception ( 'The table name cannot be empty!' );
}
if ( $sIndexName == '' ) {
throw new Exception ( 'The column name cannot be empty!' );
}
return 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . ' DROP INDEX ' . $this -> sQuoteCharacter . $sIndexName . $this -> sQuoteCharacter . $this -> sEndLine ;
}
catch ( Exception $oException ) {
throw $oException ;
}
}
/**
* generate a sentence to add indexes or primary keys
* @ param $sTable table name
* @ param $indexName index name
* @ param $aKeys array of keys
* @ return sql sentence
*/
2010-12-06 15:12:37 +00:00
2010-12-02 23:34:41 +00:00
public function generateAddKeysSQL ( $sTable , $indexName , $aKeys ) {
try {
$indexType = 'INDEX' ;
if ( $indexName == 'primaryKey' || $indexName == 'PRIMARY' ) {
$indexType = 'PRIMARY' ;
$indexName = 'KEY' ;
}
$sSQL = 'ALTER TABLE ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . ' ADD ' . $indexType . ' ' . $indexName . ' (' ;
foreach ( $aKeys as $sKey ) {
$sSQL .= $this -> sQuoteCharacter . $sKey . $this -> sQuoteCharacter . ', ' ;
}
$sSQL = substr ( $sSQL , 0 , - 2 );
$sSQL .= ')' . $this -> sEndLine ;
return $sSQL ;
}
catch ( Exception $oException ) {
throw $oException ;
}
}
/**
* generate a sentence to show the tables
* @ return sql sentence
*/
public function generateShowTablesSQL () {
return 'SHOW TABLES' . $this -> sEndLine ;
}
/**
* generate a sentence to show the tables with a like sentence
* @ return sql sentence
*/
public function generateShowTablesLikeSQL ( $sTable ) {
return " SHOW TABLES LIKE ' " . $sTable . " ' " . $this -> sEndLine ;
}
/**
* generate a sentence to show the tables with a like sentence
* @ param $sTable table name
* @ return sql sentence
*/
public function generateDescTableSQL ( $sTable ) {
try {
if ( $sTable == '' ) {
throw new Exception ( 'The table name cannot be empty!' );
}
return 'DESC ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . $this -> sEndLine ;
}
catch ( Exception $oException ) {
throw $oException ;
}
}
/**
* generate a sentence to show some table indexes
* @ param $sTable table name
* @ return sql sentence
*/
public function generateTableIndexSQL ( $sTable ) {
return 'SHOW INDEX FROM ' . $this -> sQuoteCharacter . $sTable . $this -> sQuoteCharacter . " " . $this -> sEndLine ;
//return 'SHOW INDEX FROM ' . $this->sQuoteCharacter . $sTable . $this->sQuoteCharacter . " WHERE Key_name <> 'PRIMARY'" . $this->sEndLine;
}
/**
* execute a sentence to check if there is connection
* @ return void
*/
public function isConnected () {
if ( ! $this -> oConnection )
return false ;
return $this -> executeQuery ( 'USE ' . $this -> sDataBase );
}
/**
* generate a sentence to show the tables with a like sentence
* @ param $sQuery sql query string
* @ return void
*/
public function logQuery ( $sQuery ) {
try {
$found = false ;
if ( substr ( $sQuery , 0 , 6 ) == 'SELECT' ) $found = true ;
if ( substr ( $sQuery , 0 , 4 ) == 'SHOW' ) $found = true ;
if ( substr ( $sQuery , 0 , 4 ) == 'DESC' ) $found = true ;
if ( substr ( $sQuery , 0 , 4 ) == 'USE ' ) $found = true ;
if ( ! $found ) {
$logFile = PATH_DATA . 'log' . PATH_SEP . 'query.log' ;
$fp = fopen ( $logFile , 'a+' );
fwrite ( $fp , date ( " Y-m-d H:i:s " ) . " " . $this -> sDataBase . " " . $sQuery . " \n " );
fclose ( $fp );
}
}
catch ( Exception $oException ) {
}
}
/**
* execute a sql query
* @ param $sQuery table name
* @ return void
*/
public function executeQuery ( $sQuery ) {
$this -> logQuery ( $sQuery );
try {
if ( $this -> oConnection ) {
@ mysql_select_db ( $this -> sDataBase );
return @ mysql_query ( $sQuery );
}
else {
throw new Exception ( 'invalid connection to database ' . $this -> sDataBase );
}
}
catch ( Exception $oException ) {
$this -> logQuery ( $oException -> getMessage () );
throw $oException ;
}
}
/**
* count the rows of a dataset
* @ param $oDataset
* @ return the number of rows
*/
public function countResults ( $oDataset ) {
return @ mysql_num_rows ( $oDataset );
}
/**
* count an array of the registry from a dataset
* @ param $oDataset
* @ return the registry
*/
public function getRegistry ( $oDataset ) {
return @ mysql_fetch_array ( $oDataset , $this -> iFetchType );
}
/**
* close the current connection
* @ return void
*/
public function close () {
@ mysql_close ( $this -> oConnection );
}
/*=================================================================================================*/
/**
* concatString
* Generates a string equivalent to the chosen database .
*
* @ author Hector Cortez < hector @ gmail . com >
* @ date 2010 - 08 - 04
*
* @ return string $sConcat
*/
function concatString ()
{
$nums = func_num_args ();
$vars = func_get_args ();
$sConcat = " CONCAT( " ;
for ( $i = 0 ; $i < $nums ; $i ++ ) {
if ( isset ( $vars [ $i ])) {
$sConcat .= $vars [ $i ];
if (( $i + 1 ) < $nums )
$sConcat .= " , " ;
}
}
$sConcat .= " ) " ;
return $sConcat ;
}
/*
* query functions for class class . case . php
*
*/
/**
* concatString
* Generates a string equivalent to the case when
*
* @ author Hector Cortez < hector @ gmail . com >
* @ date 2010 - 08 - 04
*
* @ return string $sCompare
*/
function getCaseWhen ( $compareValue , $trueResult , $falseResult )
{
$sCompare = " IF( " . $compareValue . " , " . $trueResult . " , " . $falseResult . " ) " ;
return $sCompare ;
}
/**
* Generates a string equivalent to create table ObjectPermission
*
* class . case . php
* function verifyTable ()
*
* @ return string $sql
*/
function createTableObjectPermission ()
{
$sql = " CREATE TABLE IF NOT EXISTS `OBJECT_PERMISSION` (
`OP_UID` varchar ( 32 ) NOT NULL ,
`PRO_UID` varchar ( 32 ) NOT NULL ,
`TAS_UID` varchar ( 32 ) NOT NULL ,
`USR_UID` varchar ( 32 ) NOT NULL ,
`OP_USER_RELATION` int ( 1 ) NOT NULL default '1' ,
`OP_TASK_SOURCE` varchar ( 32 ) NOT NULL ,
`OP_PARTICIPATE` int ( 1 ) NOT NULL default '1' ,
`OP_OBJ_TYPE` varchar ( 15 ) NOT NULL default 'ANY' ,
`OP_OBJ_UID` varchar ( 32 ) NOT NULL ,
`OP_ACTION` varchar ( 10 ) NOT NULL default 'VIEW' ,
KEY `PRO_UID` ( `PRO_UID` , `TAS_UID` , `USR_UID` , `OP_TASK_SOURCE` , `OP_OBJ_UID` )
) ENGINE = MyISAM DEFAULT CHARSET = latin1 ; " ;
return $sql ;
}
/*
* query functions for class class . report . php
*
*/
/**
* Generates a string query
*
* class . report . php
* function generatedReport4 ()
*
* @ return string $sql
*/
function getSelectReport4 ()
{
$sqlConcat = " CONCAT(U.USR_LASTNAME,' ',USR_FIRSTNAME) AS USER " ;
$sqlGroupBy = " USER " ;
$sql = " SELECT " . $sqlConcat . " , " .
" COUNT(*) AS CANTCASES,
MIN ( AD . DEL_DURATION ) AS MIN ,
MAX ( AD . DEL_DURATION ) AS MAX ,
SUM ( AD . DEL_DURATION ) AS TOTALDUR ,
AVG ( AD . DEL_DURATION ) AS PROMEDIO
FROM APPLICATION AS A
LEFT JOIN APP_DELEGATION AS AD ON ( A . APP_UID = AD . APP_UID AND AD . DEL_INDEX = 1 )
LEFT JOIN USERS AS U ON ( U . USR_UID = A . APP_INIT_USER )
WHERE A . APP_UID <> ''
GROUP BY " . $sqlGroupBy ;
return $sql ;
}
/**
* Generates a string query
*
* class . report . php
* function generatedReport4_filter ()
*
* @ return string $sql
*/
function getSelectReport4Filter ( $var )
{
$sqlConcat = " CONCAT(U.USR_LASTNAME,' ',USR_FIRSTNAME) AS USER " ;
$sqlGroupBy = " USER " ;
$sql = " SELECT " . $sqlConcat . " , " .
" COUNT(*) AS CANTCASES,
MIN ( AD . DEL_DURATION ) AS MIN ,
MAX ( AD . DEL_DURATION ) AS MAX ,
SUM ( AD . DEL_DURATION ) AS TOTALDUR ,
AVG ( AD . DEL_DURATION ) AS PROMEDIO
FROM APPLICATION AS A
LEFT JOIN APP_DELEGATION AS AD ON ( A . APP_UID = AD . APP_UID AND AD . DEL_INDEX = 1 )
LEFT JOIN USERS AS U ON ( U . USR_UID = A . APP_INIT_USER )
" . $var . "
GROUP BY " . $sqlGroupBy ;
return $sql ;
}
/**
* Generates a string query
*
* class . report . php
* function generatedReport5 ()
*
* @ return string $sql
*/
function getSelectReport5 ()
{
$sqlConcat = " CONCAT(U.USR_LASTNAME,' ',USR_FIRSTNAME) AS USER " ;
$sqlGroupBy = " USER " ;
$sql = " SELECT " . $sqlConcat . " , " .
" COUNT(*) AS CANTCASES,
MIN ( AD . DEL_DURATION ) AS MIN ,
MAX ( AD . DEL_DURATION ) AS MAX ,
SUM ( AD . DEL_DURATION ) AS TOTALDUR ,
AVG ( AD . DEL_DURATION ) AS PROMEDIO
FROM APP_DELEGATION AS AD
LEFT JOIN PROCESS AS P ON ( P . PRO_UID = AD . PRO_UID )
LEFT JOIN USERS AS U ON ( U . USR_UID = AD . USR_UID )
WHERE AD . APP_UID <> '' AND AD . DEL_FINISH_DATE IS NULL
GROUP BY " . $sqlGroupBy ;
return $sql ;
}
/**
* Generates a string query
*
* class . report . php
* function generatedReport5_filter ()
*
* @ return string $sql
*/
function getSelectReport5Filter ( $var )
{
$sqlConcat = " CONCAT(U.USR_LASTNAME,' ',USR_FIRSTNAME) AS USER " ;
$sqlGroupBy = " USER " ;
$sql = " SELECT " . $sqlConcat . " , " .
" COUNT(*) AS CANTCASES,
MIN ( AD . DEL_DURATION ) AS MIN ,
MAX ( AD . DEL_DURATION ) AS MAX ,
SUM ( AD . DEL_DURATION ) AS TOTALDUR ,
AVG ( AD . DEL_DURATION ) AS PROMEDIO
FROM APP_DELEGATION AS AD
LEFT JOIN PROCESS AS P ON ( P . PRO_UID = AD . PRO_UID )
LEFT JOIN USERS AS U ON ( U . USR_UID = AD . USR_UID )
" . $var . "
GROUP BY " . $sqlGroupBy ;
return $sql ;
}
/*
* query functions for class class . net . php
*
*/
function getServerVersion ( $driver , $dbIP , $dbPort , $dbUser , $dbPasswd , $dbSourcename )
{
if ( $link = @ mysql_connect ( $dbIP , $dbUser , $dbPasswd )){
$v = @ mysql_get_server_info ();
} else {
throw new Exception ( @ mysql_error ( $link ));
}
return ( isset ( $v )) ? $v : 'none' ;
}
/*
* query functions for class class . net . php , class . reportTables . php
*
*/
function getDropTable ( $sTableName )
{
$sql = 'DROP TABLE IF EXISTS `' . $sTableName . '`' ;
return $sql ;
}
function getTableDescription ( $sTableName )
{
$sql = " DESC " . $sTableName ;
return $sql ;
}
function getFieldNull ()
{
$fieldName = " Null " ;
return $fieldName ;
}
function getValidate ( $validate )
{
$oValidate = $validate ;
return $oValidate ;
}
/**
* Determines whether a table exists
* It is part of class . reportTables . php
*/
function reportTableExist ()
{
$bExists = true ;
$oConnection = mysql_connect ( DB_HOST , DB_USER , DB_PASS );
mysql_select_db ( DB_NAME );
$oDataset = mysql_query ( 'SELECT COUNT(*) FROM REPORT_TABLE' ) || ( $bExists = false );
return $bExists ;
}
/**
* It is part of class . pagedTable . php
*
*/
function getLimitRenderTable ( $nCurrentPage , $nRowsPerPage )
{
$sql = ' LIMIT ' . (( $nCurrentPage - 1 ) * $nRowsPerPage ) . ', ' . $nRowsPerPage ;
return $sql ;
}
}