/** * tries to validate the query based on type * @param string query The query to verify * @param string dbType The DB type * @return string error Non-empty string on error */ function verifySqlStatement($query, $dbType, &$newTables) { $error = ''; logThis('verifying SQL statement'); $table = getTableFromQuery($query); switch (strtoupper(substr($query, 0, 10))) { // ignore DROPs case 'ALTER TABL': // get ddl $error = testQueryAlter($table, $dbType, strtoupper($query), $newTables); break; case 'CREATE TAB': $error = testQueryCreate($table, $dbType, $query, $newTables); break; case 'DELETE FRO': $error = testQueryDelete($table, $dbType, $query); break; case 'DROP TABLE': $error = testQueryDrop($table, $dbType, $query); break; case 'INSERT INT': $error = testQueryInsert($table, $dbType, $query); break; case strtoupper(substr($query, 0, 6)) == 'UPDATE': $error = testQueryUpdate($table, $dbType, $query); break; } return $error; }
function preflightCheckJsonSchemaCheck($persistence) { global $mod_strings; global $db; if (!isset($persistence['sql_check_done']) || $persistence['sql_check_done'] != true) { // must keep sql in order $completeLine = array_shift($persistence['sql_to_check']); $whatsLeft = count($persistence['sql_to_check']); // populate newTables array to prevent "getting sample data" from non-existent tables $newTables = array(); if (strtoupper(substr($completeLine, 1, 5)) == 'CREAT') { $newTables[] = getTableFromQuery($completeLine); } logThis('Verifying statement: ' . $completeLine); $bad = $db->verifySQLStatement($completeLine, $newTables); if (!empty($bad)) { logThis('*** ERROR: schema change script has errors: ' . $completeLine); logThis('*** ' . $bad); $persistence['sql_errors'][] = getFormattedError($bad, $completeLine); } $persistence = ajaxSqlProgress($persistence, $completeLine, 'sql_to_check'); } else { $persistence['sql_to_check'] = $persistence['sql_to_check_backup']; echo 'done'; } return $persistence; }
logThis('looking for schema script at: ' . $sqlScript); if (is_file($sqlScript)) { logThis('found schema upgrade script: ' . $sqlScript); logThis('schema preflight using MySQL'); $fp = fopen($sqlScript, 'r'); $contents = fread($fp, filesize($sqlScript)); if (rewind($fp)) { $completeLine = ''; while ($line = fgets($fp)) { if (strpos($line, '--') === false) { $completeLine .= " " . trim($line); if (strpos($line, ';') !== false) { $completeLine = str_replace(';', '', $completeLine); // populate newTables array to prevent "getting sample data" from non-existent tables if (strtoupper(substr($completeLine, 1, 5)) == 'CREAT') { $newTables[] = getTableFromQuery($completeLine); } $bad = verifySqlStatement(trim($completeLine), $db->dbType, $newTables); if (!empty($bad)) { logThis('*** ERROR: schema change script has errors - stopping execution'); $sqlErrors[] = $bad; } // reset for next SQL query $completeLine = ''; } } } } else { logThis('*** ERROR: could not read schema script: ' . $sqlScript); $sqlErrors[] = $mod_strings['ERR_UW_FILE_NOT_READABLE'] . '::' . $sqlScript; }