} // END - if
// Load the extension and maybe found language and function files.
-function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0', $dry_run = false) {
+function loadExtension ($ext_name, $ext_mode, $ext_ver = '0.0.0', $dry_run = false) {
// Loading an extension in same mode, but not test/update, twice is not
// good, so is the extension $ext_name already loaded in mode $ext_mode?
if ((isset($GLOBALS['loaded_extension'][$ext_name][$ext_mode])) && (!in_array($ext_mode, array('update', 'test')))) {
setCurrentExtensionVersion($ext_ver);
} else {
// Set it to 0.0 by default
- setCurrentExtensionVersion('0.0');
+ setCurrentExtensionVersion('0.0.0');
// Is the extension installed?
if ((isExtensionInstalled($ext_name)) && ($ext_mode != 'register')) {
} // END - if
// In all but test-mode we need these messages to debug! Please report all (together, e.g.)
- if (($ext_mode != 'test') && (getCurrentExtensionVersion() == '0.0')) {
+ if (($ext_mode != 'test') && (getCurrentExtensionVersion() == '0.0.0')) {
// Abort here, this must now always be set!
debug_report_bug(__FUNCTION__, __LINE__, 'Extension version is empty, setting to 0.0. ext_name=' . $ext_name . ', ext_mode=' . $ext_mode . ', dry_run=' . intval($dry_run));
} // END - if
return true;
}
-// Registeres an extension and possible update depencies
+// Registers an extension and possible update dependencies
function registerExtension ($ext_name, $taskId, $dry_run = false) {
// Set current extension name
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',task_id=' . $taskId . ',dry_run=' . intval($dry_run) . ' - ENTERED!');
// Does this extension exists?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
- if (loadExtension(getCurrentExtensionName(), 'register', '0.0', isExtensionDryRun())) {
+ if (loadExtension(getCurrentExtensionName(), 'register', '0.0.0', isExtensionDryRun())) {
// Set current extension name again
setCurrentExtensionName($ext_name);
// Load extension in detected mode
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name[' . $ext_id . ']=' . getCurrentExtensionName() . ',load_mode=' . $load_mode);
- loadExtension(getCurrentExtensionName(), $load_mode, '0.0', false);
+ loadExtension(getCurrentExtensionName(), $load_mode, '0.0.0', false);
// Init these SQLs
initSqls();
// Check wether the given extension is installed
function isExtensionInstalled ($ext_name) {
// We don't like empty extension names here
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - ENTERED!');
if (empty($ext_name)) {
// Please fix them all
debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty.');
// Check if there is a cache entry
if (isset($GLOBALS['ext_is_installed'][$ext_name])) {
// Use cache built from below queries
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - CACHE!');
$isInstalled = $GLOBALS['ext_is_installed'][$ext_name];
} elseif (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) {
// Found!
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - FOUND!');
$isInstalled = true;
// Count cache hits
incrementStatsEntry('cache_hits');
} elseif ((isInstallationPhase())) {
// Extensions are all inactive/not installed during installation
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - installion phase');
} else {
// Look in database
$ext_id = getExtensionId($ext_name);
- // Log debug message
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Extension ' . $ext_name . ' has ext_id=' . $ext_id);
-
// Do we have a record?
$isInstalled = ($ext_id > 0);
+ // Log debug message
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_id=' . $ext_id . ',isInstalled=' . intval($isInstalled));
+
// Is it installed, then cache the entry
if ($isInstalled === true) {
// Dummy call (get is okay here)
}
// Return status
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',isInstalled=' . intval($isInstalled) . ' - EXIT!');
return $isInstalled;
}
if (SQL_NUMROWS($result) == 1) {
// Load entry
$data = SQL_FETCHARRAY($result);
+
+ // Set cache
+ $GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $data['ext_version'];
} elseif (isDebugModeEnabled()) {
- // Not found, please report all
- debug_report_bug(__FUNCTION__, __LINE__, sprintf(": Cannot find extension %s in database!", $ext_name));
+ // Not found, may happen while an extension is uninstalled
+ logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot find extension %s in database!", $ext_name));
}
// Free result
SQL_FREERESULT($result);
-
- // Set cache
- $GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $data['ext_version'];
}
// Extension version should not be invalid
// Updates a given extension with current extension version to latest version
function updateExtension ($ext_name, $ext_ver, $dry_run = false) {
// Only admins are allowed to update extensions
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_ver=' . $ext_ver . ',dry_run=' . intval($dry_run) . ' - ENTERED!');
if ((!isAdmin()) || (empty($ext_name))) {
- return false;
+ // Called as non-admin or empty extension
+ debug_report_bug(__FUNCTION__, __LINE__, 'Called as non-admin (isAdmin()=' . intval(isAdmin()) . '), or empty extension name. ext_name=' . $ext_name);
} // END - if
// Set current SQL name
setCurrentExtensionName($ext_name);
+ // Is this extension update already running?
+ if (isExtensionUpdateRunning($ext_name)) {
+ // This is fine but needs logging ATM
+ /* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - already in update phase, all fine.');
+ return true;
+ } // END - if
+
// Init arrays
initExtensionSqls();
initExtensionNotes();
initExtensionSqls();
// Check if version is updated
- //* DEBUG: */ debugOutput(getCurrentExtensionName() . '/' . $ext_name . ':' . getThisExtensionVersion() . '/' . $ext_ver . '/' . intval(is_array($history)));
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, getCurrentExtensionName() . '/' . $ext_name . ':' . getThisExtensionVersion() . '/' . $ext_ver . '/' . intval(is_array($history)));
if (((getThisExtensionVersion() != $ext_ver) || (isExtensionDryRun())) && (is_array($history))) {
- // Search for starting point
- $start = array_search($ext_ver, $history);
+ // Search for starting point (-1 for making 0.0 -> 0.0.0 switch work)
+ $start = -1;
+ if ($ext_ver != '0.0') {
+ $start = array_search($ext_ver, $history);
+ } // END - if
// And load SQL queries in order of version history
for ($idx = ($start + 1); $idx < count($history); $idx++) {
runFilterChain('extension_update', getCurrentExtensionName());
} // END - if
} // END - if
+
+ //* DEBUG: */logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_ver=' . $ext_ver . ',dry_run=' . intval($dry_run) . ' - EXIT!');
}
// Output verbose SQL table for extension
-function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false, $width = '100%') {
+function addExtensionVerboseSqlTable ($title = '{--ADMIN_SQLS_EXECUTED_ON_REMOVAL--}', $dashed = '', $switch = false, $width = '100%') {
// Empty title?
if (empty($title)) {
- // Then fix it to default
- $title = '{--ADMIN_SQLS_EXECUTED_ON_REMOVAL--}';
+ // Then abort here
+ debug_report_bug(__FUNCTION__, __LINE__, 'title is empty.');
} // END - if
// Init variables
incrementStatsEntry('cache_hits');
} else {
// Load from database
- $result = SQL_QUERY_ESC("SELECT `id` AS ext_id FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
+ $result = SQL_QUERY_ESC("SELECT `id` AS `ext_id` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
array($ext_name), __FUNCTION__, __LINE__);
// Is the entry there?
// Is do we have verbose output enabled?
if ((!isExtensionActive('sql_patches')) || (isVerboseSqlEnabled())) {
// Update notes found?
- if (isExtensionUpdateNoteSet($ext_ver)) {
+ if ((isExtensionUpdateNoteSet($ext_ver)) && ($ext_ver != '0.0.0')) {
// Update notes found
$content = array(
'ver' => $ext_ver,
// Reset them
setExtensionUpdateNotes('', $ext_ver);
- } elseif (in_array($ext_ver, array('0.0', '0.0.0'))) {
+ } elseif ($ext_ver == '0.0.0') {
// Is the extension productive?
if (isExtensionProductive(getCurrentExtensionName())) {
// Initial release
// Is it not yet added?
if ((isset($updateDepends, $GLOBALS['ext_running_updates'][getCurrentExtensionName()])) && (in_array($updateDepends, getExtensionUpdatesRunning()))) {
/*
- * Double-adding isn't fine, too. This may mean that
- * addExtensionDependency() was called outside the switch() command in
- * the extension's file which requires fixing.
+ * Double-adding happens when the extension and an update of the same
+ * extension requires the same other extension again.
*/
- debug_report_bug(__FUNCTION__, __LINE__, 'updateDepends=' . $updateDepends . ',extensionMode=' . getExtensionMode() . ',currentExtension=' . getCurrentExtensionName() . ' - CALLED TWICE!');
+ logDebugMessage(__FUNCTION__, __LINE__, 'updateDepends=' . $updateDepends . ',extensionMode=' . getExtensionMode() . ',currentExtension=' . getCurrentExtensionName() . ' - called twice.');
+ return;
} // END - if
// Add it to the list of extension update depencies map
// Walk through whole array
foreach ($GLOBALS['ext_running_updates'] as $ext1=>$depends) {
// Is it found?
- if (($ext1 == $ext_name) || ($isRunning === true)) {
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',depends=' . print_r($depends, true));
+ if (($ext1 == $ext_name) || (in_array($ext_name, $depends))) {
// Found
$isRunning = true;
- logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',isRunning=' . intval($isRunning));
+ //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',isRunning=' . intval($isRunning));
break;
} // END - if
} // END - foreach
} // END - if
}
} // END - foreach
+
+ // Remove from other caches as well
+ unset($GLOBALS['ext_is_installed'][$ext_name]);
+ unset($GLOBALS['loaded_extension'][$ext_name]);
}
// "Getter" for 'extension has a CSS file' (with same name, of course)
function getExtensionHasCss () {
- // Default is no CSS
- $hasCss = 'N';
-
- // Construct FQFN for check
- $FQFN = sprintf("%stheme/%s/css/%s.css",
- getPath(),
- getCurrentTheme(),
- getCurrentExtensionName()
- );
+ // Do we have cache?
+ if (!isset($GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()])) {
+ // Construct FQFN for check
+ $FQFN = sprintf("%stheme/%s/css/%s.css",
+ getPath(),
+ getCurrentTheme(),
+ getCurrentExtensionName()
+ );
- // Is it there?
- if (isFileReadable($FQFN)) {
- // Readable, so it is there...
- $hasCss = 'Y';
+ // Is it there?
+ $GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()] = convertBooleanToYesNo(isFileReadable($FQFN));
} // END - if
// Return it
- return $hasCss;
+ return $GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()];
}
// Checks wether the given extension has a language file
// Count cache hits
incrementStatsEntry('cache_hits');
} else {
- // Not readable is default
- $readable = 'N';
-
- // Is the language file readable for this extension?
- if (isLanguageIncludeReadable($ext_name)) {
- // Readable
- $readable = 'Y';
- } // END - if
-
- // Put it in cache
- $GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = $readable;
+ // Determine it and put it in cache
+ $GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = convertBooleanToYesNo(isLanguageIncludeReadable($ext_name));
}
// Return result
$funcsInclude = sprintf("inc/libs/%s_functions.php", $ext_name);
// Is this include there?
- if ((isFileReadable($funcsInclude)) && (!isExtensionLibraryLoaded($ext_name)) && (getExtensionMode() == 'test')) {
- // Cache it!
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=Y - FOUND!');
- $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'Y';
- } else {
- // Cache it!
- //* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=N - NOT FOUND!');
- $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'N';
- }
+ $isIncludeFound = ((isFileReadable($funcsInclude)) && (!isExtensionLibraryLoaded($ext_name)) && (getExtensionMode() == 'test'));
+
+ // And put in cache, converted
+ $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = convertBooleanToYesNo($isIncludeFound);
}
// Return result