jakekoekemoer Posted March 10, 2014 Share Posted March 10, 2014 Hi everybody. This script is not only for people who want to contribute. The company I work for recently embarked on writing a php script to convert from mssql to mysql. I want to share it because NO ONE online has ever posted such a script. So currently the script is very basic , and i will update it as much as possible. This script does the following: Convert Datatypes Checks and fixes IF statements Converts parameters Changes getdate() to NOW() Changes select into Changes ISNULL Changes Top n rows to LIMIT n if any one can improve or add something please feel free to do so. This code is intended as freeware <?php ini_set('max_execution_time', 120); // 120 2 minutes // 180 3 minutes // 240 4 minutes // 300 5 minutes function convert_variable($data_size, $data_type) { if (strtolower($data_type) == 'identity') { $data_type == 'auto_incriment'; } if (strtolower($data_type) == 'smalldatetime') { $data_type == 'datetime'; } if (strtolower($data_type) == 'money') { $data_type == 'decimal(19,4)'; } if (strtolower($data_type) == 'small money') { $data_type == 'decimal(10,4)'; } if (strtolower($data_type) == 'uniqueidentifier') { $data_type == 'binary(16)'; } if (strtolower($data_type) == 'sysname') { $data_type == 'char(256)'; } if ($data_size !== '0') { if (strtolower($data_type) == "nvarchar") { if (intval($data_size) >= 255 || strtolower($data_size) == 'max') { return "text"; } elseif (intval($data_size) <= 254) { return "varchar($data_size)"; } } if (strtolower($data_type) == "varchar") { if (intval($data_size) >= 255 || strtolower($data_size) == 'max') { return "text"; } } } else { return false; } } function get_size_from_variable($var) { $open_bracket_pos = strpos($var, "("); $close_bracket_pos = strpos($var, ")"); // if it wasnt found then no size was spesified if ($open_bracket_pos == false || $close_bracket_pos == false ) { return array('0', $var); } else { // return the size $size = substr($var, $open_bracket_pos + 1, $close_bracket_pos - $open_bracket_pos - 1); $data_type = substr($var, 0, $open_bracket_pos); return array($size, $data_type); } } function contains($haystack, $needle, $matchcase = false) { if (!$matchcase) { if (stripos($haystack, $needle) !== false) { return true; } else { return false; } } if ($matchcase) { if (strpos($haystack, $needle) !== false) { return true; } else { return false; } } } $query = array(); $parameter_default_values = array(); if (isset($_GET['output'])) { $output = $_GET['output']; } else { $output = "none"; } if (isset($_GET['mode'])) { $mode = $_GET['mode']; } else { $mode = "debug"; } if (isset($_GET['techinfo'])) { $techinfo = $_GET['techinfo']; } else { $techinfo = "show"; } /* $output = "none"; $mode = "debug"; $techinfo = "show"; */ echo " /*<br> MODE = $mode <br> OUTPUT = $output <br> SHOW TECHNICAL INFORMATION = $techinfo <br> */ <br> <br> <br> <br> <br>"; $blank = ""; $instring = false; $needsbegin = false; // count of all if statements found $ifcount = 0; // count of all begins after an if has been found $ifsbegin = 0; $file = fopen('files/sp.sql', "r"); while (!feof($file)) { $line = fgets($file); if ($output == 'html') { array_push($query, trim($line) . "<br>"); } else { array_push($query, trim($line)); } } fclose($file); $codelines = count($query) - 1; $currentline = 0; if ($mode == 'debug') { echo "DELIMITER /// <br>"; } else { echo "DELIMITER /// \r\n"; } while ($currentline <= $codelines) { // get query line // SHOULD ALWAYS BE FIRST LINE IN WHILE $codeline = $query[$currentline]; // do prelim weird character replacements $arrsearch = array( "1" => "''", "2" => "=", "3" => " ", ); $arrreplacement = array( "1" => "┴", "2" => " = ", "3" => " ", ); $codeline = str_ireplace($arrsearch, $arrreplacement, $codeline); if ($currentline >= 1) { $prevcodeline = trim($query[$currentline - 1]); } else { $prevcodeline = ''; } if ($currentline < $codelines) { $nextcodeline = trim($query[$currentline + 1]); } else { $nextcodeline = ''; } //$codeline = str_ireplace("''", "┴", $codeline); $codeline = str_ireplace(" ", " ", $codeline); // break down line $characters = str_split($codeline); $words = explode(" ", $codeline); $prevlinecharacters = str_split($prevcodeline); $prevlinewords = explode(" ", $prevcodeline); $nextlinecharacters = str_split($nextcodeline); $nextlinewords = explode(" ", $nextcodeline); // sized of break down $lastcharacter = count($characters) - 1; $lastword = count($words) - 1; $prevlastcharacter = count($prevlinecharacters); $prevlastword = count($prevlinewords) - 1; $nextlastcharacter = count($nextlinecharacters); $nextlastword = count($nextlinewords) - 1; /******************************************************************* * GET COMMENT *******************************************************************/ // checks if the line is a comment. If the whole line is commented out from the begining the line should be skipped if (strlen($codeline) >= 2) { if ($characters[0] . $characters[1] == '--') { $iscomment = true; if (isset($characters[2])) { if ($characters[2] !== " ") { $characters[1] .= " "; $words[0] = str_ireplace('--', '-- ', $words[0]); } } } else { $iscomment = false; } } /******************************************************************* * REPLACE NOCOUNT WITH COMMENT *******************************************************************/ if (stripos($codeline, "SET NOCOUNT ON") !== false) { //$codeline = str_ireplace("SET NOCOUNT ON","-- SET NOCOUNT ON",$codeline); $words[0] = "-- " . $words[0]; $iscomment = true; } // if it is a comment do nothing if (!$iscomment) { // add ')' to end of store proc declarations if (strtolower($codeline) == 'as begin' || (strtolower($codeline) == 'as' && strtolower($query[$currentline + 1]) == 'begin')) { $words[$lastword] = ') '; // . $words[$lastword]; $startparameters = false; $needsbegin = true; } /******************************************************************* * CHANGE ALTER TO CREATE *******************************************************************/ // checks for th words ALTER PROCEDURE or ALTER FUNCTION if (strtolower($words[0]) == 'alter' && (strtolower($words[1]) == 'procedure' || strtolower($words[1]) == 'function') ) { $words[0] = 'CREATE'; $words[$lastword] .= '('; $startparameters = true; } /******************************************************************* * DECLARE OF VARIABLES *******************************************************************/ // check if variable is being declared if (strtolower($words[0]) == 'declare') { // word 3 should be the data type // THE FIRST PART IS FOR IN SP VARIABLE DECLARAIONS $data_type = $words[2]; $data_size = get_size_from_variable($data_type); $in_var_declare = true; // if the data size is like VARCHAR(MAX) then the function will return datatype and size. else size will be 0 $size_return = get_size_from_variable($data_type); $data_size = $size_return[0]; $data_type = $size_return[1]; $converted_var = convert_variable($data_size, $data_type); if ($converted_var !== false) { $words[2] = convert_variable($data_size, $data_type); } if ($converted_var == false && $mode == 'debug') { //echo "<b>/* VARIABLE IS NOT CONVERTED */ </b>"; } // this statement will be true if the first character is a comma OR // declare has been called or its the start of the parameters } elseif ( ( // if first or last character is a comma ($characters[0] == ',' || $characters[$lastcharacter] == ',') || // or if the first and last character from this line isnt a comma but the last one IS // then return true ( ($characters[0] !== ',' || $characters[$lastcharacter] !== ',') && (substr($prevcodeline, strlen($prevcodeline) - 1, 1) == ',') ) ) && ($in_var_declare || $startparameters) ) { // word 2 should now be the data type // THE SECOND PART IS FOR IN SP PARAMETER DECLARATIONS $data_type = $words[1]; // if the data size is like VARCHAR(MAX) then the function will return datatype and size. else size will be 0 $size_return = get_size_from_variable($data_type); $data_size = $size_return[0]; $data_type = $size_return[1]; $converted_var = convert_variable($data_size, $data_type); if ($converted_var !== false) { $words[1] = convert_variable($data_size, $data_type); } } else { // its no longer declaring variables. // there isn't a declare or a comma after the declaration. $in_var_declare = false; } // variable declaration /******************************************************************* * CHECK IN STRING *******************************************************************/ if (stripos($codeline, "'") !== false && $instring == false ) { // check if string doenst also end in this line $charcount = stripos($codeline, "'"); // its in a string $instring = true; if ($mode == "debug" && $techinfo == "show") { echo "<b>instring set to true;</b>"; } // if another ' is found in the same line it will be unset from being in a string while ($charcount <= $lastcharacter && $charcount !== $lastcharacter) { if ($characters[$charcount] == "'") { $instring = false; if ($mode == "debug" && $techinfo == "show") { echo "<b>instring set to false;</b>"; } } $charcount++; } } elseif ($instring == true && stripos($codeline, "'")) { // check if string doenst also end in this line $charcount = stripos($codeline, "'"); // its in a string $instring = false; // if another ' is found in the same line it will be unset from being in a string. while ($charcount <= $lastcharacter) { if ($characters[$charcount] == "'") { $instring = true; } $charcount++; } } /******************************************************************* * ADD SEMI COLON ( *******************************************************************/ // LEAVE THIS DECLARATION HERE. LAST WORD IS REPLACED BY THE DATATYPE. // Add semi colon after declaration if (strtolower($nextlinewords[0]) == 'declare' && strlen($codeline) !== 0 && ($characters[0] = ',' || $prevlinecharacters[$prevlastcharacters] == ',') && $instring == false ) { $words[$lastword] .= ';'; } // Add semi colon after declaration if (strtolower($nextlinewords[0]) !== 'declare' && strtolower($prevlinewords[0]) == 'declare' && strlen($codeline) !== 0 && $instring == false ) { $words[$lastword] .= ';'; } /******************************************************************* * GET ALL IF's IN STATEMENT *******************************************************************/ if (stripos($codeline, 'if') !== false) { $wordcounter = 0; $ifwords = array(); while ($wordcounter <= $lastword) { if (strtolower($words[$wordcounter]) == 'if') { $ifcount++; } if ($ifcount >= 1 && strtolower($words[$wordcounter]) == 'begin') { $ifsbegin++; array_push($ifwords, $wordcounter); } $wordcounter++; } if (count($ifwords >= 1)) { foreach ($ifwords as $wordpos) { $words[$wordpos] = 'then'; } } unset($ifwords); } /******************************************************************* * ADD THEN AFTER IF *******************************************************************/ if (stripos($codeline, 'begin') !== false && $ifcount >= 1) { $wordcounter = 0; while ($wordcounter <= $lastword) { if (strtolower($words[$wordcounter]) == 'begin') { $words[$wordcounter] = 'then'; } $wordcounter++; } } if (stripos($codeline, 'begin') !== false && $ifcount >= 1 && $instring == false ) { $wordcounter = 0; while ($wordcounter <= $lastword) { if (strtolower($words[$wordcounter]) == 'begin') { $words[$wordcounter] = "then"; } $wordcounter++; } } /******************************************************************* * GET PARAMETER DEFAULT VALUES *******************************************************************/ if (stripos($codeline, 'begin') !== false && $needsbegin == true ) { // loop through all parameter default values $alldefaults = ""; if ($startparameters == false) { foreach ($parameter_default_values as $defaultvalue) { if ($mode = "debug") { $alldefaults .= "<br> if " . $defaultvalue['var'] . " = NULL then <br> " . $defaultvalue['statement'] . "<br> end if; <br>"; } else { $alldefaults .= "\r\n if " . $defaultvalue['var'] . " = NULL then \r\n " . $defaultvalue['statement'] . "\r\n end if; \r\n"; } } $words[$lastword] .= $alldefaults; } $needsbegin = false; } /******************************************************************* * ADD END IF; IF THERE IS AN IF *******************************************************************/ if (stripos($codeline, 'end') !== false && $ifcount >= 1 && $instring == false ) { $wordcounter = 0; while ($wordcounter <= $lastword && $ifcount >= 1) { if (strtolower($words[$wordcounter]) == 'end') { if ($wordcounter == $lastword && strtolower($nextlinewords[0]) !== 'else') { $words[$wordcounter] = $words[$wordcounter] . " if;"; $ifcount--; } elseif ($wordcounter < $lastword && strtolower($words[$wordcounter + 1]) !== 'else') { $words[$wordcounter] = $words[$wordcounter] . " if;"; $ifcount--; } } $wordcounter++; } } /******************************************************************* * CLEAR DEFAULT VALUES FROM PARAMETER DECLARATION *******************************************************************/ if ($startparameters == true && strpos($codeline, "=") !== false) { // add to list of default parameters if ($characters[$lastcharacter] == ',') { $codeline = substr($codeline, 0, strlen($codeline) - 1); } array_push($parameter_default_values, array("var" => $words[0], "statement" => "set $codeline;")); // remove default value from declaration // init loop variables $equalfound = false; $wordcounter = 0; while ($wordcounter <= $lastword) { if ($words[$wordcounter] == '=') { $equalfound = true; } if ($equalfound) { if (strpos($words[$wordcounter], ',') !== false) $words[$wordcounter] = ','; else $words[$wordcounter] = ''; } $wordcounter++; } } /******************************************************************* * REPLACE TOP n ROWS WITH limit n *******************************************************************/ if (isset($limitofquery)) { if (contains($codeline, "order by")) { if ($characters[$lastcharacter] !== ',' || $nextlinecharacters[0] !== ',') { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } elseif (contains($codeline, "group by") && contains($nextcodeline, "order by") == false) { if ($characters[$lastcharacter] !== ',' || $nextlinecharacters[0] !== ',') { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } elseif (contains($codeline, "where") && contains($nextcodeline, "order by") == false && contains($nextcodeline, "group by") == false ) { if ( (strtolower($words[$lastword]) !== 'and' && strtolower($words[$lastword]) !== 'or' ) && (strtolower($nextlinewords[0]) !== 'and' && strtolower($nextlinewords[0]) !== 'or' ) ) { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } elseif ( ( strtolower($prevlinewords[$prevlastword]) == 'and' || strtolower($prevlinewords[$prevlastword]) == 'or' || strtolower($words[0]) == 'and' || strtolower($words[0]) == 'or' ) && strtolower($words[$lastword]) !== 'and' && strtolower($words[$lastword]) !== 'or' && strtolower($nextlinewords[0]) !== 'and' && strtolower($nextlinewords[0]) !== 'or' && contains($nextcodeline, "order by") == false && contains($nextcodeline, "group by") == false ) { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } elseif (contains($codeline, "from") && contains($nextcodeline, "where") == false) { if ($characters[$lastcharacter] !== ',' || $nextlinecharacters[0] !== ',') { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } } /******************************************************************* * REPLACE ISNULL WITH IFNULL * REPLACE SELECT INTO WITH SELECT *******************************************************************/ $wordcounter = 0; while ($wordcounter <= $lastword) { // isnull(a,b) if (stripos($words[$wordcounter], 'ISNULL(') !== false) { $words[$wordcounter] = str_ireplace("ISNULL(", "ifnull(", $words[$wordcounter]); } // select into var = string if (strtolower($words[$wordcounter]) == 'select' && strtolower($words[$wordcounter + 1]) == 'into') { $words[$wordcounter + 1] = ''; } // getdate() if (stripos($words[$wordcounter], 'getdate()') !== false) { $words[$wordcounter] = str_ireplace("getdate()", "now()", $words[$wordcounter]); } // top n rows if (stripos($words[$wordcounter], 'top') !== false) { $words[$wordcounter] = ''; $limitofquery = $words[$wordcounter + 1]; $words[$wordcounter + 1] = ''; } $wordcounter++; } } // not is comment // create final output string $finalline = ''; foreach ($words as $word) { $finalline .= $word . " "; } // do final weird character replacements $arrsearch = array( "1" => "[dbo].[", "2" => "]", "3" => "┴", ); $arrreplacement = array( "1" => "dbo.", "2" => $blank, "3" => "''", ); $finalline = str_ireplace($arrsearch, $arrreplacement, $finalline); // final processing before output $query[$currentline] = $finalline; $codeline = $finalline; if ($mode == 'debug') echo $codeline . "<br>"; // increment current line $currentline++; } if ($mode == 'debug') { echo "/// <br> DELIMITER ;"; } else { echo "/// \r\n DELIMITER ;"; } Quote Link to comment Share on other sites More sharing options...
jakekoekemoer Posted March 11, 2014 Author Share Posted March 11, 2014 (edited) Script as updated: 11/03/2014 Added: Better inline function. Added: Start of string Concat Added: Some extra string manipulation functions <?php ini_set('max_execution_time', 120); // 120 2 minutes // 180 3 minutes // 240 4 minutes // 300 5 minutes function convert_variable($data_size, $data_type) { if (strtolower($data_type) == 'identity') { $data_type == 'auto_incriment'; } if (strtolower($data_type) == 'smalldatetime') { $data_type == 'datetime'; } if (strtolower($data_type) == 'money') { $data_type == 'decimal(19,4)'; } if (strtolower($data_type) == 'small money') { $data_type == 'decimal(10,4)'; } if (strtolower($data_type) == 'uniqueidentifier') { $data_type == 'binary(16)'; } if (strtolower($data_type) == 'sysname') { $data_type == 'char(256)'; } if ($data_size !== '0') { if (strtolower($data_type) == "nvarchar") { if (intval($data_size) >= 255 || strtolower($data_size) == 'max') { return "text"; } elseif (intval($data_size) <= 254) { return "varchar($data_size)"; } } if (strtolower($data_type) == "varchar") { if (intval($data_size) >= 255 || strtolower($data_size) == 'max') { return "text"; } } } else { return false; } } function get_size_from_variable($var) { $open_bracket_pos = strpos($var, "("); $close_bracket_pos = strpos($var, ")"); // if it wasnt found then no size was spesified if ($open_bracket_pos == false || $close_bracket_pos == false ) { return array('0', $var); } else { // return the size $size = substr($var, $open_bracket_pos + 1, $close_bracket_pos - $open_bracket_pos - 1); $data_type = substr($var, 0, $open_bracket_pos); return array($size, $data_type); } } function contains($haystack, $needle, $matchcase = false) { if (!$matchcase) { if (stripos($haystack, $needle) !== false) { return true; } else { return false; } } if ($matchcase) { if (strpos($haystack, $needle) !== false) { return true; } else { return false; } } } function build_code_line_from_words($words) { $codeline = ''; foreach ($words as $word) { $codeline .= $word . " "; } return $codeline; } function break_code_line_to_words($codeline) { $words = explode(" ", $codeline); return $words; } function build_code_line_from_characters($characters) { $codeline = ''; foreach ($characters as $character) { $codeline .= $character; } return $codeline; } /**************************************************** *START THE ACTUAL CODE ***************************************************/ if (isset($_GET['output'])) { $output = $_GET['output']; } else { $output = "none"; } if (isset($_GET['mode'])) { $mode = $_GET['mode']; } else { $mode = "debug"; } if (isset($_GET['techinfo'])) { $techinfo = $_GET['techinfo']; } else { $techinfo = "show"; } echo " /*<br> MODE = $mode <br> OUTPUT = $output <br> SHOW TECHNICAL INFORMATION = $techinfo<br> */<br>"; $blank = ""; $instring = false; $needsbegin = false; $execute_found = false; $query = array(); $parameter_default_values = array(); // count of all if statements found $ifcount = 0; // count of all begins after an if has been found $ifsbegin = 0; $file = fopen('files/sp.sql', "r"); while (!feof($file)) { $line = fgets($file); if ($output == 'html') { array_push($query, trim($line) . "<br>"); } else { array_push($query, trim($line)); } } fclose($file); $codelines = count($query) - 1; $currentline = 0; if ($mode == 'debug') { echo "DELIMITER /// <br>"; } else { echo "DELIMITER /// \r\n"; } while ($currentline <= $codelines) { // get query line // SHOULD ALWAYS BE FIRST LINE IN WHILE $codeline = $query[$currentline]; // do prelim weird character replacements $arrsearch = array( "1" => "''", "2" => "=", "3" => " ", ); $arrreplacement = array( "1" => "┴", "2" => " = ", "3" => " ", ); $codeline = str_ireplace($arrsearch, $arrreplacement, $codeline); if ($currentline >= 1) { $prevcodeline = trim($query[$currentline - 1]); } else { $prevcodeline = ''; } if ($currentline < $codelines) { $nextcodeline = trim($query[$currentline + 1]); } else { $nextcodeline = ''; } //$codeline = str_ireplace("''", "┴", $codeline); $codeline = str_ireplace(" ", " ", $codeline); // break down line $characters = str_split($codeline); $words = break_code_line_to_words($codeline); $prevlinecharacters = str_split($prevcodeline); $prevlinewords = break_code_line_to_words($prevcodeline); $nextlinecharacters = str_split($nextcodeline); $nextlinewords = break_code_line_to_words($nextcodeline); // sized of break down $lastcharacter = count($characters) - 1; $lastword = count($words) - 1; $prevlastcharacter = count($prevlinecharacters) - 1; $prevlastword = count($prevlinewords) - 1; $nextlastcharacter = count($nextlinecharacters) - 1; $nextlastword = count($nextlinewords) - 1; /******************************************************************* * GET COMMENT *******************************************************************/ // checks if the line is a comment. If the whole line is commented out from the begining the line should be skipped if (strlen($codeline) >= 2) { if ($characters[0] . $characters[1] == '--') { $iscomment = true; if (isset($characters[2])) { if ($characters[2] !== " ") { $characters[1] .= " "; $words[0] = str_ireplace('--', '-- ', $words[0]); } } } else { $iscomment = false; } } /******************************************************************* * REPLACE NOCOUNT WITH COMMENT *******************************************************************/ if (stripos($codeline, "SET NOCOUNT ON") !== false) { //$codeline = str_ireplace("SET NOCOUNT ON","-- SET NOCOUNT ON",$codeline); $words[0] = "-- " . $words[0]; $iscomment = true; } // if it is a comment do nothing if (!$iscomment) { // add ')' to end of store proc declarations if (strtolower($codeline) == 'as begin' || (strtolower($codeline) == 'as' && strtolower($query[$currentline + 1]) == 'begin')) { $words[$lastword] = ') '; // . $words[$lastword]; $startparameters = false; $needsbegin = true; } /******************************************************************* * CHANGE ALTER TO CREATE *******************************************************************/ // checks for th words ALTER PROCEDURE or ALTER FUNCTION if (strtolower($words[0]) == 'alter' && (strtolower($words[1]) == 'procedure' || strtolower($words[1]) == 'function') ) { $words[0] = 'CREATE'; $words[$lastword] .= '('; $startparameters = true; } /******************************************************************* * DECLARE OF VARIABLES *******************************************************************/ // check if variable is being declared if (strtolower($words[0]) == 'declare') { // word 3 should be the data type // THE FIRST PART IS FOR IN SP VARIABLE DECLARAIONS $data_type = $words[2]; $data_size = get_size_from_variable($data_type); $in_var_declare = true; // if the data size is like VARCHAR(MAX) then the function will return datatype and size. else size will be 0 $size_return = get_size_from_variable($data_type); $data_size = $size_return[0]; $data_type = $size_return[1]; $converted_var = convert_variable($data_size, $data_type); if ($converted_var !== false) { $words[2] = convert_variable($data_size, $data_type); } if ($converted_var == false && $mode == 'debug') { //echo "<b>/* VARIABLE IS NOT CONVERTED */ </b>"; } // this statement will be true if the first character is a comma OR // declare has been called or its the start of the parameters } elseif ( ( // if first or last character is a comma ($characters[0] == ',' || $characters[$lastcharacter] == ',') || // or if the first and last character from this line isnt a comma but the last one IS // then return true ( ($characters[0] !== ',' || $characters[$lastcharacter] !== ',') && (substr($prevcodeline, strlen($prevcodeline) - 1, 1) == ',') ) ) && ($in_var_declare || $startparameters) ) { // word 2 should now be the data type // THE SECOND PART IS FOR IN SP PARAMETER DECLARATIONS $data_type = $words[1]; // if the data size is like VARCHAR(MAX) then the function will return datatype and size. else size will be 0 $size_return = get_size_from_variable($data_type); $data_size = $size_return[0]; $data_type = $size_return[1]; $converted_var = convert_variable($data_size, $data_type); if ($converted_var !== false) { $words[1] = convert_variable($data_size, $data_type); } } else { // its no longer declaring variables. // there isn't a declare or a comma after the declaration. $in_var_declare = false; } // variable declaration /******************************************************************* * CHECK IN STRING *******************************************************************/ if (contains($codeline, "'" && !$instring) ) { $quote_count = substr_count($codeline, "'"); if ($quote_count % 2 == 0) { // quote count is even. THERE FOR string does not carry over to another line $instring == false; } else { // quote count is not even there for string carries on to another line $instring == true; } }elseif (contains($codeline, "'" && $instring) ) { $quote_count = substr_count($codeline, "'"); if ($quote_count % 2 == 0) { $instring == true; } else { $instring == false; } } /******************************************************************* * ADD SEMI COLON ( *******************************************************************/ // LEAVE THIS DECLARATION HERE. LAST WORD IS REPLACED BY THE DATATYPE. // Add semi colon after declaration if (strtolower($nextlinewords[0]) == 'declare' && strlen($codeline) !== 0 && ($characters[0] == ',' || $prevlinecharacters[$prevlastcharacter] == ',') && !$instring ) { $words[$lastword] .= ';'; } // Add semi colon after declaration if (strtolower($nextlinewords[0]) !== 'declare' && strtolower($prevlinewords[0]) == 'declare' && strlen($codeline) !== 0 && $instring == false ) { $words[$lastword] .= ';'; } /******************************************************************* * GET ALL IF's IN STATEMENT *******************************************************************/ if (stripos($codeline, 'if') !== false) { $wordcounter = 0; $ifwords = array(); while ($wordcounter <= $lastword) { if (strtolower($words[$wordcounter]) == 'if') { $ifcount++; } if ($ifcount >= 1 && strtolower($words[$wordcounter]) == 'begin') { $ifsbegin++; array_push($ifwords, $wordcounter); } $wordcounter++; } if (count($ifwords >= 1)) { foreach ($ifwords as $wordpos) { $words[$wordpos] = 'then'; } } unset($ifwords); } /******************************************************************* * ADD THEN AFTER IF *******************************************************************/ if (stripos($codeline, 'begin') !== false && $ifcount >= 1) { $wordcounter = 0; while ($wordcounter <= $lastword) { if (strtolower($words[$wordcounter]) == 'begin') { $words[$wordcounter] = 'then'; } $wordcounter++; } } if (stripos($codeline, 'begin') !== false && $ifcount >= 1 && $instring == false ) { $wordcounter = 0; while ($wordcounter <= $lastword) { if (strtolower($words[$wordcounter]) == 'begin') { $words[$wordcounter] = "then"; } $wordcounter++; } } /******************************************************************* * GET PARAMETER DEFAULT VALUES *******************************************************************/ if (stripos($codeline, 'begin') !== false && $needsbegin == true ) { // loop through all parameter default values $alldefaults = ""; if ($startparameters == false) { foreach ($parameter_default_values as $defaultvalue) { if ($mode = "debug") { $alldefaults .= "<br> if " . $defaultvalue['var'] . " = NULL then <br> " . $defaultvalue['statement'] . "<br> end if; <br>"; } else { $alldefaults .= "\r\n if " . $defaultvalue['var'] . " = NULL then \r\n " . $defaultvalue['statement'] . "\r\n end if; \r\n"; } } $words[$lastword] .= $alldefaults; } $needsbegin = false; } /******************************************************************* * ADD END IF; IF THERE IS AN IF *******************************************************************/ if (stripos($codeline, 'end') !== false && $ifcount >= 1 && $instring == false ) { $wordcounter = 0; while ($wordcounter <= $lastword && $ifcount >= 1) { if (strtolower($words[$wordcounter]) == 'end') { if ($wordcounter == $lastword && strtolower($nextlinewords[0]) !== 'else') { $words[$wordcounter] = $words[$wordcounter] . " if;"; $ifcount--; } elseif ($wordcounter < $lastword && strtolower($words[$wordcounter + 1]) !== 'else') { $words[$wordcounter] = $words[$wordcounter] . " if;"; $ifcount--; } } $wordcounter++; } } /******************************************************************* * CLEAR DEFAULT VALUES FROM PARAMETER DECLARATION *******************************************************************/ if ($startparameters == true && strpos($codeline, "=") !== false) { // add to list of default parameters if ($characters[$lastcharacter] == ',') { $codeline = substr($codeline, 0, strlen($codeline) - 1); } array_push($parameter_default_values, array("var" => $words[0], "statement" => "set $codeline;")); // remove default value from declaration // init loop variables $equalfound = false; $wordcounter = 0; while ($wordcounter <= $lastword) { if ($words[$wordcounter] == '=') { $equalfound = true; } if ($equalfound) { if (strpos($words[$wordcounter], ',') !== false) $words[$wordcounter] = ','; else $words[$wordcounter] = ''; } $wordcounter++; } } /******************************************************************* * REPLACE TOP n ROWS WITH limit n *******************************************************************/ if (isset($limitofquery)) { if (contains($codeline, "order by")) { if ($characters[$lastcharacter] !== ',' || $nextlinecharacters[0] !== ',') { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } elseif (contains($codeline, "group by") && contains($nextcodeline, "order by") == false) { if ($characters[$lastcharacter] !== ',' || $nextlinecharacters[0] !== ',') { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } elseif (contains($codeline, "where") && contains($nextcodeline, "order by") == false && contains($nextcodeline, "group by") == false ) { if ( (strtolower($words[$lastword]) !== 'and' && strtolower($words[$lastword]) !== 'or' ) && (strtolower($nextlinewords[0]) !== 'and' && strtolower($nextlinewords[0]) !== 'or' ) ) { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } elseif ( ( strtolower($prevlinewords[$prevlastword]) == 'and' || strtolower($prevlinewords[$prevlastword]) == 'or' || strtolower($words[0]) == 'and' || strtolower($words[0]) == 'or' ) && strtolower($words[$lastword]) !== 'and' && strtolower($words[$lastword]) !== 'or' && strtolower($nextlinewords[0]) !== 'and' && strtolower($nextlinewords[0]) !== 'or' && contains($nextcodeline, "order by") == false && contains($nextcodeline, "group by") == false ) { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } elseif (contains($codeline, "from") && contains($nextcodeline, "where") == false) { if ($characters[$lastcharacter] !== ',' || $nextlinecharacters[0] !== ',') { $words[$lastword] .= ' limit ' . $limitofquery; unset($limitofquery); } } } /******************************************************************* * REPLACE ISNULL WITH IFNULL * REPLACE SELECT INTO WITH SELECT *******************************************************************/ $wordcounter = 0; while ($wordcounter <= $lastword) { // isnull(a,b) if (stripos($words[$wordcounter], 'ISNULL(') !== false) { $words[$wordcounter] = str_ireplace("ISNULL(", "ifnull(", $words[$wordcounter]); } // select into var = string if (strtolower($words[$wordcounter]) == 'select' && strtolower($words[$wordcounter + 1]) == 'into') { $words[$wordcounter + 1] = ''; } // getdate() if (stripos($words[$wordcounter], 'getdate()') !== false) { $words[$wordcounter] = str_ireplace("getdate()", "now()", $words[$wordcounter]); } // top n rows if (stripos($words[$wordcounter], 'top') !== false) { $words[$wordcounter] = ''; $limitofquery = $words[$wordcounter + 1]; $words[$wordcounter + 1] = ''; } $wordcounter++; } /******************************************************************* * PROCESS DYNAMIC SQL WITH [NO OUTPUT] *******************************************************************/ if (contains($codeline, "sp_executesql")) { $execute_found = true; } if ( ( strlen($nextcodeline) == 0 || $nextcodeline[0] == " " ) && $execute_found == true ) { } /******************************************************************* * PROCESS STRING CONCATENATION *******************************************************************/ if ($instring) { } } // not is comment // create final output string $finalline = build_code_line_from_words($words); // do final weird character replacements $arrsearch = array( "1" => "[dbo].[", "2" => "]", "3" => "┴", ); $arrreplacement = array( "1" => "dbo.", "2" => $blank, "3" => "''", ); $finalline = str_ireplace($arrsearch, $arrreplacement, $finalline); // final processing before output $query[$currentline] = $finalline; $codeline = $finalline; if ($mode == 'debug') echo $codeline . "<br>"; // increment current line $currentline++; } if ($mode == 'debug') { echo "/// <br> DELIMITER ;"; } else { echo "/// \r\n DELIMITER ;"; } Edited March 11, 2014 by jakekoekemoer Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.