+function SQL_ALTER_TABLE ($sql, $F, $L, $enableCodes = true) {
+ // Abort if link is down
+ if (!SQL_IS_LINK_UP()) return false;
+
+ // This is the default result...
+ $result = false;
+
+ // Determine index/fulltext/unique word
+ $noIndex = (
+ (
+ strpos($sql, 'INDEX') === false
+ ) && (
+ strpos($sql, 'KEY') === false
+ ) && (
+ strpos($sql, 'FULLTEXT') === false
+ ) && (
+ strpos($sql, 'UNIQUE') === false
+ )
+ );
+
+ // Extract table name
+ $tableArray = explode(' ', $sql);
+ $tableName = str_replace('`', '', $tableArray[2]);
+
+ // Debug log
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'sql=' . $sql . ',tableName=' . $tableName);
+
+ // Shall we add/drop?
+ if (((strpos($sql, 'ADD') !== false) || (strpos($sql, 'DROP') !== false) || (strpos($sql, 'CHANGE') !== false)) && ($noIndex === true)) {
+ // Try two columns, one should fix
+ foreach (array(4,5) as $idx) {
+ // If an entry is not set, abort here
+ if (!isset($tableArray[$idx])) {
+ // Debug log this
+ logDebugMessage(__FUNCTION__, __LINE__, 'columnName=' . $columnName . ',idx=' . $idx . ',sql=' . $sql . ' is missing!');
+ break;
+ } // END - if
+
+ // And column name as well
+ $columnName = $tableArray[$idx];
+
+ // Debug log
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'columnName=' . $columnName . ',idx=' . $idx . ',sql=' . $sql . ',hasZeroNums=' . intval(isSqlTableColumnFound($tableName, $columnName)));
+
+ // Do we have no entry on ADD or an entry on DROP/CHANGE?
+ // 123 4 43 3 4 4 32 23 4 43 3 4 4 32 23 4 43 3 4 4 3 3 3 3 4 4321
+ if (((!isSqlTableColumnFound($tableName, $columnName)) && (strpos($sql, 'ADD') !== false)) || ((isSqlTableColumnFound($tableName, $columnName)) && (strpos($sql, 'DROP') !== false)) || ((isSqlTableColumnFound($tableName, $columnName)) && (strpos($sql, 'CHANGE') !== false) && ($idx == 4) && (!isSqlTableColumnFound($tableName, $tableArray[5])))) {
+ // Do the query
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Executing: ' . $sql);
+ $result = SQL_QUERY($sql, $F, $L, false);
+
+ // Skip further attempt(s)
+ break;
+ // 1234 5 54 4 5 5 43 34 5 54 4 5 5 43 3 4 4 32 2 21
+ } elseif ((((isSqlTableColumnFound($tableName, $columnName)) && (strpos($sql, 'ADD') !== false)) || ((isSqlTableColumnFound($tableName, $columnName)) && (strpos($sql, 'DROP') !== false)) || (strpos($sql, 'CHANGE') !== false)) && ($columnName != 'KEY')) {
+ // Abort here because it is alreay there
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Skipped: sql=' . $sql . ',columnName=' . $columnName . ',idx=' . $idx);
+ break;
+ } elseif ((!isSqlTableColumnFound($tableName, $columnName)) && (strpos($sql, 'DROP') !== false)) {
+ // Abort here because we tried to drop a column which is not there (never created maybe)
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'No drop: ' . $sql);
+ break;
+ } elseif ($columnName != 'KEY') {
+ // Something didn't fit, we better log it
+ logDebugMessage(__FUNCTION__, __LINE__, 'Possible problem: ' . $sql . ',hasZeroNums=' . intval(isSqlTableColumnFound($tableName, $columnName)) . '');
+ }
+ } // END - foreach
+ } elseif ((getTableType() == 'InnoDB') && (strpos($sql, 'FULLTEXT') !== false)) {
+ // Skip this query silently because InnoDB does not understand fulltext indexes
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Skipped FULLTEXT: sql=%s,tableName=%s,hasZeroNums=%d,file=%s,line=%s", $sql, $tableName, intval((is_bool($result)) ? 0 : isSqlTableColumnFound($columnName)), $F, $L));
+ } elseif ($noIndex === false) {
+ // And column name as well
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'tableArray=<pre>' . print_r($tableArray, true) . '</pre>');
+ $keyName = str_replace('`', '', $tableArray[5]);
+
+ // Is this "UNIQUE" or so? FULLTEXT has been handled the elseif() block above
+ if (in_array(strtoupper($keyName), array('INDEX', 'UNIQUE', 'KEY', 'FULLTEXT'))) {
+ // Init loop
+ $begin = 1; $keyName = ',';
+ while (strpos($keyName, ',') !== false) {
+ // Use last
+ $keyName = str_replace('`', '', $tableArray[count($tableArray) - $begin]);
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $keyName . '----------------' . $begin);
+
+ // Remove brackes
+ $keyName = str_replace('(', '', str_replace(')', '', $keyName));
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $keyName . '----------------' . $begin);
+
+ // Continue
+ $begin++;
+ } // END while
+ } // END - if
+
+ // Shall we run it?
+ if (!isSqlTableIndexAdded($tableName, $tableArray[3], $keyName)) {
+ // Send it to the SQL_QUERY() function
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $sql);
+ $result = SQL_QUERY($sql, $F, $L, $enableCodes);
+ } else {
+ // Not executed
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Not executed: ' . $sql);
+ }
+ } else {
+ // Other ALTER TABLE query
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $sql);
+ $result = SQL_QUERY($sql, $F, $L, $enableCodes);
+ }
+
+ // Return result
+ return $result;
+}
+
+// Getter for SQL link
+function SQL_GET_LINK () {
+ // Init link
+ $link = null;
+
+ // Is it in the globals?
+ if (isset($GLOBALS['sql_link'])) {
+ // Then take it
+ $link = $GLOBALS['sql_link'];
+ } // END - if
+
+ // Return it
+ return $link;
+}
+
+// Setter for link
+function SQL_SET_LINK ($link) {
+ // Is this a resource or null?
+ if ((ifFatalErrorsDetected()) && (isInstallationPhase())) {
+ // This may happen in installation phase
+ return;
+ } elseif ((!is_resource($link)) && (!is_null($link))) {
+ // This should never happen!
+ debug_report_bug(__FUNCTION__, __LINE__, sprintf("Type of link is not resource or null, type=%s", gettype($link)));
+ } // END - if
+
+ // Set it
+ $GLOBALS['sql_link'] = $link;
+
+ // Re-init cache
+ $GLOBALS['is_sql_link_up'] = is_resource($link);
+}
+
+// Checks if the link is up
+function SQL_IS_LINK_UP () {
+ // Default is not up
+ $linkUp = false;
+
+ // Do we have cached this?
+ if (isset($GLOBALS['is_sql_link_up'])) {
+ // Then use this
+ $linkUp = $GLOBALS['is_sql_link_up'];
+ } else {
+ // Get it
+ $linkUp = is_resource(SQL_GET_LINK());
+
+ // And cache it
+ $GLOBALS['is_sql_link_up'] = $linkUp;
+ }
+
+ // Return the result
+ return $linkUp;
+}