SQL fix
[mailer.git] / inc / db / lib-mysql3.php
index 7f1d99dc8a7b760c1391a6ec449ff9c300e53a44..7a33983a1ec2d59cb71e9ae08a518dc84280d4c5 100644 (file)
@@ -16,7 +16,7 @@
  * $Author::                                                          $ *
  * -------------------------------------------------------------------- *
  * Copyright (c) 2003 - 2009 by Roland Haeder                           *
- * Copyright (c) 2009, 2010 by Mailer Developer Team                    *
+ * Copyright (c) 2009 - 2011 by Mailer Developer Team                   *
  * For more information visit: http://www.mxchange.org                  *
  *                                                                      *
  * This program is free software; you can redistribute it and/or modify *
@@ -42,36 +42,47 @@ if (!defined('__SECURITY')) {
 
 // SQL queries
 function SQL_QUERY ($sqlString, $F, $L, $enableCodes = true) {
-       // Trim SQL string
-       $sqlString = trim($sqlString);
+       // Do we have cache?
+       if (!isset($GLOBALS[__FUNCTION__][$sqlString])) {
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Called: ' . $sqlString);
+
+               // Trim SQL string
+               $sqlStringModified = trim($sqlString);
+
+               // Empty query string or link is not up?
+               if (empty($sqlStringModified)) {
+                       // Empty SQL string!
+                       debug_report_bug(__FUNCTION__, __LINE__, sprintf("SQL string is empty. Please fix this. file=%s, line=%s",
+                               basename($F),
+                               $L
+                       ));
+               } elseif (!SQL_IS_LINK_UP()) {
+                       // We should not quietly ignore this
+                       debug_report_bug(__FUNCTION__, __LINE__, sprintf("Cannot query database: sqlString=%s,file=%s,line=%s",
+                               $sqlStringModified,
+                               basename($F),
+                               $L
+                       ));
+               }
 
-       // Link is up?
-       if (!SQL_IS_LINK_UP()) {
-               // We should not quietly ignore this!
-               debug_report_bug(__FUNCTION__, __LINE__, sprintf("Cannot query database: sqlString=%s,file=%s,line=%s",
-                       $sqlString,
-                       basename($F),
-                       $L
-               ));
+               // Remove \t, \n and \r from queries they may confuse some MySQL versions
+               $sqlStringModified = str_replace("\t", ' ', str_replace("\n", ' ', str_replace("\r", ' ', $sqlStringModified)));
 
-               // Return 'false' because it has failed
-               return false;
-       } elseif (empty($sqlString)) {
-               // Empty SQL string!
-               debug_report_bug(__FUNCTION__, __LINE__, sprintf("SQL string is empty. Please fix this. file=%s, line=%s",
-                       basename($F),
-                       $L
-               ));
+               // Compile config entries out
+               $sqlStringModified = SQL_PREPARE_SQL_STRING($sqlStringModified, $enableCodes);
 
-               // This is invalid, of course
-               return false;
-       }
+               // Cache it and remember as last SQL query
+               $GLOBALS[__FUNCTION__][$sqlString] = $sqlStringModified;
+               $GLOBALS['last_sql'] = $sqlStringModified;
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Stored cache: ' . $sqlStringModified);
+       }  else {
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cache used: ' . $sqlString);
 
-       // Remove \t, \n and \r from queries they may confuse some MySQL versions
-       $sqlString = str_replace("\t", ' ', str_replace("\n", ' ', str_replace("\r", ' ', $sqlString)));
+               // Use cache (to save a lot function calls
+               $GLOBALS['last_sql'] = $GLOBALS[__FUNCTION__][$sqlString];
 
-       // Compile config entries out
-       $GLOBALS['last_sql'] = SQL_PREPARE_SQL_STRING($sqlString, $enableCodes);
+               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Cache is: ' . $sqlString);
+       }
 
        // Starting time
        $querytimeBefore = microtime(true);
@@ -209,9 +220,6 @@ function SQL_CONNECT ($host, $login, $password, $F, $L) {
 
        // Set the link resource
        SQL_SET_LINK($linkResource);
-
-       // Destroy cache
-       unset($GLOBALS['is_sql_link_up']);
 }
 
 // SQL select database
@@ -237,9 +245,6 @@ function SQL_CLOSE ($F, $L) {
        // Close link
        SQL_SET_LINK(null);
 
-       // Destroy cache
-       unset($GLOBALS['is_sql_link_up']);
-
        // Return the result
        return $close;
 }
@@ -419,7 +424,7 @@ function SQL_ALTER_TABLE ($sql, $F, $L, $enableCodes = true) {
                                logDebugMessage(__FUNCTION__, __LINE__, 'Possible problem: ' . $sql . ',hasZeroNums=' . intval(SQL_HASZERONUMS($result)) . '');
                        }
                } // END - foreach
-       } elseif ((getConfig('_TABLE_TYPE') == 'InnoDB') && (strpos($sql, 'FULLTEXT') !== false)) {
+       } elseif ((getTableType() == 'InnoDB') && (strpos($sql, 'FULLTEXT') !== false)) {
                // Skip this query silently
                //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Skipped FULLTEXT: sql=%s,tableName=%s,hasZeroNums=%d,file=%s,line=%s", $sql, $tableName, intval((is_bool($result)) ? 0 : SQL_HASZERONUMS($result)), $F, $L));
        } elseif ($noIndex === false) {
@@ -445,41 +450,8 @@ function SQL_ALTER_TABLE ($sql, $F, $L, $enableCodes = true) {
                        } // END while
                } // END - if
 
-               // Show indexes
-               $result = SQL_QUERY_ESC("SHOW INDEX FROM `%s`", array($tableName), __FUNCTION__, __LINE__);
-
-               // Non-skipping is default for ADD
-               $skip = false;
-
-               // But should we DROP?
-               if ($tableArray[3] == 'DROP') {
-                       // Then skip if nothing found!
-                       $skip = true;
-                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Going to drop key ' . $keyName);
-               } // END - if
-
-               // Walk through all
-               while ($content = SQL_FETCHARRAY($result)) {
-                       // Is it found?
-                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'columnName='.$keyName.',content=<pre>' . print_r($content, true) . '</pre>');
-                       if (($content['Key_name'] == $keyName) && ($tableArray[3] == 'ADD')) {
-                               // Skip this query!
-                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("ADD: Skiped: %s", $sql));
-                               $skip = true;
-                               break;
-                       } elseif (($content['Key_name'] == $keyName) && ($tableArray[3] == 'DROP')) {
-                               // Don't skip this!
-                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("DROP: Not skiped: %s", $sql));
-                               $skip = false;
-                               break;
-                       }
-               } // END - while
-
-               // Free result
-               SQL_FREERESULT($result);
-
                // Shall we run it?
-               if ($skip === false) {
+               if (!isSqlTableIndexAdded($tableName, $tableArray[3])) {
                        // Send it to the SQL_QUERY() function
                        //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $sql);
                        $result = SQL_QUERY($sql, $F, $L, $enableCodes);
@@ -520,11 +492,14 @@ function SQL_SET_LINK ($link) {
                return;
        } elseif ((!is_resource($link)) && (!is_null($link))) {
                // This should never happen!
-               debug_report_bug(__FUNCTION__, __LINE__, sprintf("link is not resource or null. Type: %s", gettype($link)));
+               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
@@ -576,5 +551,63 @@ function SQL_PREPARE_SQL_STRING ($sqlString, $enableCodes = true) {
        return $GLOBALS['sql_strings'][$sqlString];
 }
 
+// Check if there is a SQL table created
+function isSqlTableCreated ($table) {
+       // Do we have cache?
+       if (!isset($GLOBALS[__FUNCTION__][$table])) {
+               // Check if the table is there
+               $result = SQL_QUERY_ESC("SHOW TABLES FROM `{?__DB_NAME?}` WHERE `Tables_in_{?__DB_NAME?}`='{?_MYSQL_PREFIX?}_%s'",
+                       array($table), __FILE__, __LINE__);
+
+               // Is there an entry?
+               $GLOBALS[__FUNCTION__][$table] = (SQL_NUMROWS($result) == 1);
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__][$table];
+}
+
+// Checks depending on the mode if the table is there
+function isSqlTableIndexAdded ($tableName, $mode) {
+       // Do we have cache?
+       if (!isset($GLOBALS[__FUNCTION__][$tableName][$mode])) {
+               // Show indexes
+               $result = SQL_QUERY_ESC("SHOW INDEX FROM `%s`", array($tableName), __FUNCTION__, __LINE__);
+
+               // Non-skipping is default for ADD
+               $GLOBALS[__FUNCTION__][$tableName][$mode] = false;
+
+               // But should we DROP?
+               if ($mode == 'DROP') {
+                       // Then skip if nothing found
+                       $GLOBALS[__FUNCTION__][$tableName][$mode] = true;
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Going to drop key ' . $keyName);
+               } // END - if
+
+               // Walk through all
+               while ($content = SQL_FETCHARRAY($result)) {
+                       // Is it found?
+                       //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'columnName='.$keyName.',content=<pre>' . print_r($content, true) . '</pre>');
+                       if (($content['Key_name'] == $keyName) && ($mode == 'ADD')) {
+                               // Skip this query!
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("ADD: Skiped: %s", $sql));
+                               $GLOBALS[__FUNCTION__][$tableName][$mode] = true;
+                               break;
+                       } elseif (($content['Key_name'] == $keyName) && ($mode == 'DROP')) {
+                               // Don't skip this!
+                               //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("DROP: Not skiped: %s", $sql));
+                               $GLOBALS[__FUNCTION__][$tableName][$mode] = false;
+                               break;
+                       }
+               } // END - while
+
+               // Free result
+               SQL_FREERESULT($result);
+       } // END - if
+
+       // Return cache
+       return $GLOBALS[__FUNCTION__][$tableName][$mode];
+}
+
 // [EOF]
 ?>