2013-09-19 22:54:48 +02:00
< ? PHP
require_once ( 'Function/ChangeUser.php' );
require_once ( 'Function/Connect.php' );
require_once ( 'Function/ConnParam.php' );
require_once ( 'Function/ConnParamBool.php' );
require_once ( 'Function/CreateDB.php' );
require_once ( 'Function/DBQuery.php' );
require_once ( 'Function/DropDB.php' );
require_once ( 'Function/Error.php' );
require_once ( 'Function/EscapeString.php' );
require_once ( 'Function/FetchField.php' );
require_once ( 'Function/FieldFlags.php' );
require_once ( 'Function/FieldLen.php' );
require_once ( 'Function/FieldName.php' );
require_once ( 'Function/FieldTable.php' );
require_once ( 'Function/FieldType.php' );
require_once ( 'Function/FreeResult.php' );
require_once ( 'Function/Generic.php' );
require_once ( 'Function/GenericBoolean.php' );
require_once ( 'Function/ListDBs.php' );
require_once ( 'Function/ListFields.php' );
require_once ( 'Function/ListProcesses.php' );
require_once ( 'Function/ListTables.php' );
require_once ( 'Function/ParReversed.php' );
require_once ( 'Function/RealEscapeString.php' );
require_once ( 'Function/SelectDB.php' );
require_once ( 'Function/Tablename.php' );
require_once ( 'Function/UnbufferedQuery.php' );
/**
* ext / mysql -> ext / mysqli Converter
*
* @ category Converter
* @ package MySQLConverterTool
* @ author Andrey Hristov < andrey @ php . net > , Ulf Wendel < ulf . wendel @ phpdoc . de > , Saif Lacrimosa < cool2309 @ gmail . com >
* @ copyright 1997 - 2006 The PHP Group
* @ license http :// www . php . net / license / 3_0 . txt PHP License 3.0
* @ version CVS : $Id : $ , Release : @ package_version @
* @ link http :// www . mysql . com
* @ since Class available since Release 1.0
*/
class MySQLConverterTool_Converter {
//
// protected
//
/**
* Scanner state constant
*
* @ const
* @ access protected
*/
const STATE_NORMAL = 'normal_state' ;
/**
* Scanner state constant
*
* @ const
2016-12-30 02:42:49 +01:00
* @ access protected
2013-09-19 22:54:48 +02:00
*/
const STATE_FUNC_FOUND = 'func_found' ;
/**
* Scanner state constant
*
* @ const
* @ access protected
*/
const STATE_PARAM_LIST = 'parameter_list' ;
/**
* Converted ( = resulting ) source code
*
* @ var string
*/
protected $output = '' ;
/**
* List of errors which occured during the conversion
*
* @ var array
*/
protected $errors = array ();
/**
* List of PHP token
*
* @ var string
*/
protected $tokens = array ();
/**
* Mapping of ext / mysql -> ext / mysqli constants
*
*/
protected $mysql_ext_consts = array (
'MYSQL_CLIENT_COMPRESS' => 'MYSQLI_CLIENT_COMPRESS' ,
'MYSQL_CLIENT_IGNORE_SPACE' => 'MYSQLI_CLIENT_IGNORE_SPACE' ,
'MYSQL_CLIENT_INTERACTIVE' => 'MYSQLI_CLIENT_INTERACTIVE' ,
'MYSQL_CLIENT_SSL' => 'MYSQLI_CLIENT_SSL' ,
'MYSQL_ASSOC' => 'MYSQLI_ASSOC' ,
'MYSQL_BOTH' => 'MYSQLI_BOTH' ,
'MYSQL_NUM' => 'MYSQLI_NUM' ,
);
/**
* Number of functions found in the given source
*
* @ var int
*/
protected $funcs_found = 0 ;
/**
* Number of functions converted in the given source
*
* @ var int
*/
protected $funcs_converted = 0 ;
/**
* List of functions that are not supported
*
* @ var array
*/
protected $mysql_funcs_not_supported = array (
// rewrite the ugly mysql_result calls manually!
'mysql_result' => true ,
// whatever that function is...
'mysql_fetch_field2' => true ,
);
/**
* List of functions that can be converted
*
* Acts as kind of a function pointer list , but with objects
*
* @ var array
*/
protected $mysql_funcs = array ();
/**
* Flag : enable token debug output ?
*
* @ var bool
*/
protected $debug_dump_tokens = false ;
/**
* Flag : enable parameter parsing debug output ?
*
* @ var bool
*/
protected $debug_dump_params = false ;
/**
* Current line number during the parsing process
*
* @ var int
*/
protected $lineno = 0 ;
//
// public
//
/**
*
*
* @ param bool Turn on debug output of scanner token ?
* @ param bool Turn on debug output of function parameters ?
*/
public function __construct ( $debug_token = false , $debug_params = false ) {
if ( ! function_exists ( 'token_name' )) {
// HACK FIXME
die ( 'ext/tokenizer is needed!\n' );
}
if ( ! defined ( 'T_ML_COMMENT' ))
define ( 'T_ML_COMMENT' , T_COMMENT );
if ( ! defined ( 'T_DOC_COMMENT' ))
define ( 'T_DOC_COMMENT' , T_ML_COMMENT );
if ( ! defined ( 'T_SIMPLE_TOKEN' ))
define ( 'T_SIMPLE_TOKEN' , 32567 );
$this -> debug_dump_tokens = $debug_token ;
$this -> debug_dump_params = $debug_params ;
$this -> mysql_funcs =
array (
// PHP_FALIAS(mysql, mysql_db_query, NULL)
'mysql' => new MySQLConverterTool_Function_DBQuery (),
// in OO this is a property
'mysql_affected_rows' => new MySQLConverterTool_Function_ConnParam ( 'mysqli_affected_rows' ),
'mysql_change_user' => new MySQLConverterTool_Function_ChangeUser (),
'mysql_client_encoding' => new MySQLConverterTool_Function_ConnParam ( 'mysqli_character_set_name' ),
'mysql_close' => new MySQLConverterTool_Function_ConnParamBool ( 'mysqli_close' ),
// pconnect has less params but they are not significant for mysqli_connect
'mysql_connect' => new MySQLConverterTool_Function_Connect (),
// PHP_FALIAS(mysql_createdb, mysql_create_db, NULL)
'mysql_createdb' => new MySQLConverterTool_Function_CreateDB (),
'mysql_create_db' => new MySQLConverterTool_Function_CreateDB (),
'mysql_data_seek' => new MySQLConverterTool_Function_Generic ( 'mysqli_data_seek' ),
'mysql_dbname' => new MySQLConverterTool_Function_Tablename (),
'mysql_db_name' => new MySQLConverterTool_Function_Tablename (),
'mysql_db_query' => new MySQLConverterTool_Function_DBQuery (),
// PHP_FALIAS(mysql_dropdb, mysql_drop_db, NULL)
'mysql_dropdb' => new MySQLConverterTool_Function_DropDB (),
'mysql_drop_db' => new MySQLConverterTool_Function_DropDB (),
// in OO this is a property
'mysql_error' => new MySQLConverterTool_Function_Error ( 'mysqli_error' ),
// in OO this is a property
'mysql_errno' => new MySQLConverterTool_Function_Error ( 'mysqli_errno' ),
'mysql_escape_string' => new MySQLConverterTool_Function_EscapeString ( 'mysqli_real_escape_string' ),
'mysql_fetch_array' => new MySQLConverterTool_Function_Generic ( 'mysqli_fetch_array' ),
'mysql_fetch_assoc' => new MySQLConverterTool_Function_Generic ( 'mysqli_fetch_assoc' ),
'mysql_fetch_field' => new MySQLConverterTool_Function_FetchField (),
'mysql_fetch_lengths' => new MySQLConverterTool_Function_GenericBoolean ( 'mysqli_fetch_lengths' ),
'mysql_fetch_object' => new MySQLConverterTool_Function_Generic ( 'mysqli_fetch_object' ),
'mysql_fetch_row' => new MySQLConverterTool_Function_Generic ( 'mysqli_fetch_row' ),
// PHP_FALIAS(mysql_fieldflags, mysql_field_flags, NULL)
'mysql_fieldflags' => new MySQLConverterTool_Function_FieldFlags (),
'mysql_field_flags' => new MySQLConverterTool_Function_FieldFlags (),
// PHP_FALIAS(mysql_fieldlen, mysql_field_len, NULL)
'mysql_fieldlen' => new MySQLConverterTool_Function_FieldLen (),
'mysql_field_len' => new MySQLConverterTool_Function_FieldLen (),
// PHP_FALIAS(mysql_fieldname, mysql_field_name, NULL)
'mysql_fieldname' => new MySQLConverterTool_Function_FieldName (),
'mysql_field_name' => new MySQLConverterTool_Function_FieldName (),
'mysql_field_seek' => new MySQLConverterTool_Function_GenericBoolean ( 'mysqli_field_seek' ),
// PHP_FALIAS(mysql_fieldtable, mysql_field_table, NULL)
'mysql_fieldtable' => new MySQLConverterTool_Function_FieldTable (),
'mysql_field_table' => new MySQLConverterTool_Function_FieldTable (),
// PHP_FALIAS(mysql_fieldtype, mysql_field_type, NULL)
'mysql_fieldtype' => new MySQLConverterTool_Function_FieldType (),
'mysql_field_type' => new MySQLConverterTool_Function_FieldType (),
// PHP_FALIAS(mysql_freeresult, mysql_free_result, NULL)
'mysql_freeresult' => new MySQLConverterTool_Function_FreeResult (),
'mysql_free_result' => new MySQLConverterTool_Function_FreeResult (),
'mysql_get_client_info' => new MySQLConverterTool_Function_Generic ( 'mysqli_get_client_info' ),
// in OO this is a property
'mysql_get_host_info' => new MySQLConverterTool_Function_ConnParamBool ( 'mysqli_get_host_info' ),
// in OO this is a property
'mysql_get_proto_info' => new MySQLConverterTool_Function_ConnParamBool ( 'mysqli_get_proto_info' ),
// in OO this is a property
'mysql_get_server_info' => new MySQLConverterTool_Function_ConnParamBool ( 'mysqli_get_server_info' ),
'mysql_info' => new MySQLConverterTool_Function_ConnParam ( 'mysqli_info' ),
'mysql_insert_id' => new MySQLConverterTool_Function_ConnParamBool ( 'mysqli_insert_id' ),
// PHP_FALIAS(mysql_listdbs, mysql_list_dbs, NULL)
'mysql_listdbs' => new MySQLConverterTool_Function_ListDBs (),
'mysql_list_dbs' => new MySQLConverterTool_Function_ListDBs (),
// PHP_FALIAS(mysql_listfields, mysql_list_fields, NULL)
'mysql_listfields' => new MySQLConverterTool_Function_ListFields (),
'mysql_list_fields' => new MySQLConverterTool_Function_ListFields (),
'mysql_list_processes' => new MySQLConverterTool_Function_ListProcesses (),
// PHP_FALIAS(mysql_listtables, mysql_list_tables, NULL)
'mysql_listtables' => new MySQLConverterTool_Function_ListTables (),
'mysql_list_tables' => new MySQLConverterTool_Function_ListTables (),
// PHP_FALIAS(mysql_numfields, mysql_num_fields, NULL)
'mysql_numfields' => new MySQLConverterTool_Function_Generic ( 'mysqli_num_fields' ),
// in OO this is a property
'mysql_num_fields' => new MySQLConverterTool_Function_GenericBoolean ( 'mysqli_num_fields' ),
// PHP_FALIAS(mysql_numrows, mysql_num_rows, NULL)
'mysql_numrows' => new MySQLConverterTool_Function_Generic ( 'mysqli_num_rows' ),
// in OO this is a property
'mysql_num_rows' => new MySQLConverterTool_Function_Generic ( 'mysqli_num_rows' ),
// pconnect has less params but they are not significant for mysqli_connect
'mysql_pconnect' => new MySQLConverterTool_Function_Connect (),
'mysql_ping' => new MySQLConverterTool_Function_ConnParam ( 'mysqli_ping' ),
'mysql_query' => new MySQLConverterTool_Function_ParReversed ( 'mysqli_query' ),
'mysql_real_escape_string' => new MySQLConverterTool_Function_RealEscapeString ( 'mysqli_real_escape_string' ),
// mysql_result -- Get result data
// PHP_FALIAS(mysql_selectdb, mysql_select_db, NULL)
'mysql_selectdb' => new MySQLConverterTool_Function_SelectDB (),
'mysql_select_db' => new MySQLConverterTool_Function_SelectDB (),
'mysql_stat' => new MySQLConverterTool_Function_ConnParam ( 'mysqli_stat' ),
'mysql_tablename' => new MySQLConverterTool_Function_Tablename (),
'mysql_table_name' => new MySQLConverterTool_Function_Tablename (),
'mysql_thread_id' => new MySQLConverterTool_Function_ConnParam ( 'mysqli_thread_id' ),
'mysql_unbuffered_query' => new MySQLConverterTool_Function_UnbufferedQuery (),
);
} // end func __construct
/**
* Converts the given source code
*
* @ param string Source code to be converted
* @ return array Converted source code and status information
*/
public function convertString ( $source ) {
$this -> lineno = 0 ;
$this -> output = '' ;
$this -> tokens = token_get_all ( $source );
$this -> errors = array ();
$this -> lineno = 1 ;
$this -> funcs_found = 0 ;
$this -> funcs_converted = 0 ;
$this -> scanner ( 0 );
return array (
'output' => $this -> output ,
'found' => $this -> funcs_found ,
'converted' => $this -> funcs_converted ,
'errors' => $this -> errors ,
);
} // end func convertString
/**
* Reads a file and returns the converted source code
*
* @ param strng filename
* @ param array Converted source and status information
*/
public function convertFile ( $filename ) {
if ( ! file_exists ( $filename ) || ! is_readable ( $filename ) || ! is_file ( $filename )) {
$ret = $this -> convertString ( '' );
$ret [ 'errors' ][] = array ( 'line' => - 1 , 'msg' => 'Cannot open file "' . $filename . '".' );
return $ret ;
}
return $this -> convertString ( file_get_contents ( $filename ));
}
/**
* Returns all files of a directory that have a certain name
*
*
*/
public function getFilesOfDirectory ( $dir , $file_pattern = '*' , Array $files = array ()) {
if ( ! is_dir ( $dir ) || ! is_readable ( $dir ))
return $files ;
$patterns = $this -> buildRegularExpression ( $file_pattern );
if ( empty ( $patterns ))
return $files ;
$dh = opendir ( $dir );
if ( ! $dh )
return $files ;
while ( $file = readdir ( $dh )) {
if ( '.' == $file || '..' == $file )
continue ;
$ffile = $dir . '/' . $file ;
if ( is_dir ( $ffile ))
$files = $this -> getFilesOfDirectory ( $ffile , $file_pattern , $files );
if ( ! is_file ( $ffile ))
continue ;
$accept = false ;
foreach ( $patterns as $k => $pattern ) {
if ( preg_match ( '@' . $pattern . '$@i' , $file )) {
$accept = true ;
break ;
}
}
if ( $accept )
$files [] = $ffile ;
}
closedir ( $dh );
return $files ;
}
/**
* Unsets the variable which stores the global ( default ) connection of ext / mysql
*
* This is a hack required by the test framework .
*
*/
public function unsetGlobalConnection () {
$obj = new MySQLConverterTool_Function_Generic ( 'mysqli_query' );
eval ( sprintf ( '@mysqli_close(%s);' , $obj -> ston_name ));
eval ( sprintf ( 'if (isset(%s)) unset(%s);' , $obj -> ston_name , $obj -> ston_name ));
}
/**
* Returns a list of functions that can be converted automatically
*
* @ return array
*/
public function getSupportedFunctions () {
$ret = array_keys ( $this -> mysql_funcs );
sort ( $ret );
return $ret ;
}
/**
* Returns a list of functions that cannot be converted automatically
*
* @ return array
*/
public function getUnsupportedFunctions () {
$ret = array_keys ( $this -> mysql_funcs_not_supported );
sort ( $ret );
return $ret ;
}
//
// protected
//
/**
* Scans the source and rebuilds a converted version of it
*
* @ param int
*/
protected function scanner ( $level ) {
// current parser state
$state = self :: STATE_NORMAL ;
// list of function parameters
$func_params = array ();
// current parameter value
$curr_param = '' ;
// current bracket nesting level
$bracket_level = 0 ;
// name of the currently processed function
$func_name = '' ;
// flag: does the currently parameter contain variables or constants?
$param_dynamic = false ;
// flag for something that looks like a mysql_func call but is not followed by parameters
$expect_param_brace_open = false ;
while ( list ( , $token ) = each ( $this -> tokens )) {
if ( is_string ( $token )) {
$id = T_SIMPLE_TOKEN ;
$token_name = 'T_SIMPLE_TOKEN' ;
$text = $token ;
} else {
list ( $id , $text ) = $token ;
$token_name = token_name ( $id );
}
// remember the current line number
$lineno = $this -> lineno ;
$this -> lineno += $this -> countLines ( $text );
if ( $this -> debug_dump_tokens ) {
$this -> debug_print ( 'dump token' ,
sprintf ( " [%-05d - %10s - %d - %-10s - %03d - %05d] %s " ,
$lineno ,
$token_name ,
$expect_param_brace_open ,
$state ,
$bracket_level ,
strlen ( $text ),
htmlspecialchars ( $text ))
);
}
switch ( $id ) {
case T_COMMENT :
case T_ML_COMMENT :
case T_DOC_COMMENT :
switch ( $state ) {
case self :: STATE_NORMAL :
$this -> output .= $text ;
break ;
case self :: STATE_FUNC_FOUND :
// comment between func_name and comma
break ;
case self :: STATE_PARAM_LIST :
$curr_param .= $text ;
break ;
}
break ;
case T_SIMPLE_TOKEN :
switch ( $state ) {
case self :: STATE_NORMAL :
$this -> output .= $text ;
break ;
case self :: STATE_FUNC_FOUND :
switch ( $text ) {
case '(' :
$state = self :: STATE_PARAM_LIST ;
$func_params = array ();
$curr_param = NULL ;
$param_dynamic = false ;
$expect_param_brace_open = false ;
break ;
case ')' :
default :
if ( $expect_param_brace_open ) {
// something that looks like <mysql_func[...]> is not followed by an opening brace for <mysql_func([...]>
$state = self :: STATE_NORMAL ;
$this -> funcs_found -- ;
$expect_param_brace_open = 0 ;
$steps = 0 ;
$tmp = '' ;
while (( $token = prev ( $this -> tokens )) && ( $tmp != $func_name )) {
if ( is_array ( $token )) {
$tmp = $token [ 1 ];
} else {
$tmp = $token ;
}
$steps ++ ;
}
while ( $steps -- > 1 ) {
$token = next ( $this -> tokens );
if ( is_array ( $token ))
$tmp = $token [ 1 ];
else
$tmp = $token ;
$this -> output .= $tmp ;
}
next ( $this -> tokens );
break 3 ;
}
break ;
}
break ;
case self :: STATE_PARAM_LIST :
switch ( $text ) {
case ',' :
if ( $bracket_level == 1 ) {
$func_params [] = array ( 'value' => $curr_param , 'dynamic' => $param_dynamic );
$curr_param = '' ;
$param_dynamic = false ;
} else {
$curr_param .= $text ;
}
// don't add to the curr_param
break ( 2 );
case '(' :
$bracket_level ++ ;
break ;
case ')' :
$bracket_level -- ;
if ( $bracket_level == 0 ) {
// end of the parameter specification
if ( ! is_null ( $curr_param ))
$func_params [] = array ( 'value' => $curr_param , 'dynamic' => $param_dynamic );
$curr_param = NULL ;
$param_dynamic = false ;
$state = self :: STATE_NORMAL ;
if ( $this -> debug_dump_params ) {
$this -> debug_print (
'params' ,
array ( 'name' => $func_name , 'params' => $func_params )
);
}
if ( ! $level ) {
list ( $handler_warning , $handler_code ) = $this -> mysql_funcs [ $func_name ] -> handle ( $func_params );
if ( ! is_null ( $handler_warning ))
$this -> errors [] = array ( 'line' => $lineno , 'msg' => sprintf ( '[Line %d] %s' , $lineno , $handler_warning ));
if ( is_null ( $handler_code )) {
$this -> output .= $this -> rebuildFunctionCode ( $func_name , $func_params , $handler_warning );
} else {
$this -> funcs_converted ++ ;
$this -> output .= $handler_code ;
}
} else {
// we are in recursive call - return
list ( $handler_warning , $handler_code ) = $this -> mysql_funcs [ $func_name ] -> handle ( $func_params );
if ( ! is_null ( $handler_warning ))
$this -> errors [] = array ( 'line' => $lineno , 'msg' => sprintf ( '[Line %d] %s' , $lineno , $handler_warning ));
if ( is_null ( $handler_code )) {
return $this -> rebuildFunctionCode ( $func_name , $func_params , $handler_warning );
} else {
$this -> funcs_converted ++ ;
return $handler_code ;
}
}
}
break ;
case '.' :
case '&' :
case '^' :
case '|' :
case '&&' :
case '||' :
case 'and' :
case 'or' :
case 'xor' :
case '<<' :
case '>>' :
case '<' :
case '<=' :
case '>' :
case '>=' :
case '=' :
case '*' :
case '/' :
case '%' :
case '+' :
case '-' :
case '++' :
case '--' :
case '!' :
case '~' :
case '=' :
case '+=' :
case '-=' :
case '*=' :
case '/=' :
case '.=' :
case '%=' :
case '&=' :
case '|=' :
case '^=' :
case '<<=' :
case '>>=' :
case '?' :
case '==' :
case '!=' :
case '===' :
case '!==' :
case '(' :
case 'new' :
// forget it - this parameter value is build dynamically
// we won't try to guess it's value using static code analysis
// this needs to be checked manually
$param_dynamic = true ;
if ( $this -> debug_dump_params ) {
$this -> debug_print (
'params' ,
'Operator found in parameter. Assuming that the paramter value will be dynamic and cannot be foreseen.'
);
}
break ;
}
$curr_param .= $text ;
break ;
}
break ;
case T_STRING :
if ( isset ( $this -> mysql_ext_consts [ $text ])) {
$text = $this -> mysql_ext_consts [ $text ];
} else {
switch ( $state ) {
case self :: STATE_PARAM_LIST :
// maybe a function call or constant as part of a parameter value?
if ( isset ( $this -> mysql_funcs_not_supported [ $text ])) {
$this -> errors [] = array ( 'line' => $lineno , 'msg' => sprintf ( '[Line %d] Function "%s" is not supported for conversion! You must rewrite the converted code. The conversion is not complete. Consider rewriting your code first and rerunning the conversion tool"' , $lineno , $text ));
}
if ( isset ( $this -> mysql_funcs [ $text ])) {
// return the current token and reparse it
prev ( $this -> tokens );
// in the default of the outter switch add this to $curr_param
$text = $this -> scanner ( $level + 1 );
$param_dynamic = true ;
}
// fall to default
break ;
case self :: STATE_FUNC_FOUND :
$this -> errors [] = array ( 'line' => $lineno , 'msg' => sprintf ( '[Line %d] We found a string between the function name "%s" and the parameter list. Looks like a syntax error in the source file. Please check!' , $lineno , $func_name ));
break ;
case self :: STATE_NORMAL :
default :
if ( isset ( $this -> mysql_funcs_not_supported [ $text ])) {
$this -> errors [] = array ( 'line' => $lineno , 'msg' => sprintf ( '[Line %d] Function "%s" is not supported for conversion! You must rewrite the converted code code. The conversion is not complete. Consider rewriting your code first and rerunning the conversion tool."' , $lineno , $text ));
}
if ( isset ( $this -> mysql_funcs [ $text ])) {
$state = self :: STATE_FUNC_FOUND ;
$func_name = $text ;
$bracket_level = 1 ;
$this -> funcs_found ++ ;
$expect_param_brace_open = true ;
break ( 2 );
}
if ( $text == 'is_resource' ) {
$this -> errors [] = array ( 'line' => $lineno , 'msg' => sprintf ( '[Line %d] You are using is_resource(). Make sure that you do not use it to test for the return value of mysql_query(). mysql_query() returns a resource or a boolean value. mysqli_query() returns an object or a boolean value. If you check the return value of mysql_query like < if (is_resource($res = mysql_query())) [...] > the converted code will fail, because $res will be an object in ext/mysqli."' , $lineno , $text ));
}
// here we fall-through
}
}
default :
if ( $id === T_CONSTANT_ENCAPSED_STRING ) {
/* try to detect function_exists('some_mysql_func'); */
$prev_steps = 0 ;
if ( isset ( $this -> mysql_funcs [ substr ( $text , 1 , - 1 )]) &&
$this -> mysql_funcs [ substr ( $text , 1 , - 1 )] -> new_name ) {
// strip quotes
// move back because now 'some_mysql_func' will be returned by prev()
$prev_steps = 1 ;
$tmp_token = prev ( $this -> tokens );
do {
$tmp_token = prev ( $this -> tokens );
$prev_steps ++ ;
} while ( $tmp_token [ 0 ] === T_WHITESPACE );
if ( $tmp_token === '(' ) {
$tmp_token = prev ( $this -> tokens );
$prev_steps ++ ;
if ( $tmp_token [ 0 ] === T_STRING &&
$tmp_token [ 1 ] === 'function_exists' ) {
$text = $text [ 0 ] . $this -> mysql_funcs [ substr ( $text , 1 , - 1 )] -> new_name . $text [ 0 ];
}
}
while ( $prev_steps -- )
each ( $this -> tokens );
}
}
switch ( $state ) {
case self :: STATE_PARAM_LIST :
switch ( $id ) {
case T_VARIABLE :
case T_FUNCTION :
case T_CONST :
// this is a variable, we cannot guess value of the parameter
// using this static conversion approach
if ( $this -> debug_dump_params ) {
$this -> debug_print (
'params' ,
" Adding variable ' $text ' to current parameter. "
);
}
$param_dynamic = true ;
$curr_param .= $text ;
break ;
case T_WHITESPACE :
default :
if ( $this -> debug_dump_params ) {
$this -> debug_print (
'params' ,
" Adding ' $text ' to current parameter. "
);
}
$curr_param .= $text ;
break ;
}
break ;
case self :: STATE_FUNC_FOUND :
$this -> errors [] = array ( 'line' => $lineno , 'msg' => sprintf ( '[Line %d] Please check your code for parse errors, we failed to parse "%s". Conversion will be incomplete!".' , $lineno , $text ));
break ;
default :
case self :: STATE_NORMAL :
$this -> output .= $text ;
break ;
}
break ;
}
}
}
/**
* Print a debug message
*
* @ param string Message prefix
* @ param mixed Array or literal to print
*/
protected function debug_print ( $prefix , $var ) {
if ( is_scalar ( $var )) {
printf ( " [%s/%s] %s \n " ,
get_class ( $this ),
$prefix ,
$var );
} else {
printf ( " [%s/%s] " , get_class ( $this ), $prefix );
var_dump ( $var );
printf ( " \n " );
}
} // end func debug_print
/**
* Returns the number of lines of a string
*
* @ param string
* @ return int
*/
protected function countLines ( $text ) {
$last_pos = 0 ;
$lines = 0 ;
while (( $pos = strpos ( $text , " \n " , $last_pos )) !== FALSE ) {
$last_pos = $pos + 1 ;
$lines ++ ;
}
return $lines ;
}
/**
* Rebuilds the original function code based on function name and parameters and adds a comment with a warning after the last parameter
*
* @ param string
* @ param array
* @ param string
*/
protected function rebuildFunctionCode ( $name , $params , $warning ) {
$ret = $name . '(' ;
if ( count ( $params ) > 0 ) {
foreach ( $params as $k => $param )
$ret .= $param [ 'value' ] . ', ' ;
$ret = substr ( $ret , 0 , - 2 );
}
$ret .= ')' ;
// $ret .= ' /* [MySQLConverterTool] ' . $warning . '*/)';
return $ret ;
}
/**
* Expands a user specified file pattern with * as the only pattern to a regular expression
*
* @ param string
* @ return array
*/
protected function buildRegularExpression ( $file_pattern ) {
$parts = explode ( ',' , $file_pattern );
if ( empty ( $parts ))
return array ();
$ret = array ();
foreach ( $parts as $k => $v )
$ret [] = str_replace ( '\*' , '.*' , preg_quote ( $v , '@' ));
return $ret ;
}
}
2016-12-30 02:42:49 +01:00
?>