0) {
// Try to register the extension
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ':ext_update=' . $ext_update . ',taskId=' . $task);
$test = registerExtension($ext_update, $task, isExtensionDryRun(), false);
// Reset extension name
setCurrentExtensionName($ext_name);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
} // END - if
} elseif ($ext_ver != getCurrentExtensionVersion()) {
// Ok, update this extension now
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',currVer=' . getCurrentExtensionVersion());
$GLOBALS['ext_backup_name'][$ext_update][$ext_ver] = getCurrentExtensionName();
$GLOBALS['ext_backup_ver'][$ext_update][$ext_ver] = getCurrentExtensionVersion();
updateExtension($ext_update, $ext_ver, isExtensionDryRun());
setCurrentExtensionName($GLOBALS['ext_backup_name'][$ext_update][$ext_ver]);
setCurrentExtensionVersion($GLOBALS['ext_backup_ver'][$ext_update][$ext_ver]);
unset($GLOBALS['ext_backup_name'][$ext_update][$ext_ver]);
unset($GLOBALS['ext_backup_ver'][$ext_update][$ext_ver]);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',currVer=' . getCurrentExtensionVersion());
// All okay!
$test = true;
} else {
// Nothing to register / update before...
$test = true;
}
} else {
// Required file for update does not exists!
$test = true;
// But this is fine for the first time...
}
// Restore the current extension name
setCurrentExtensionName($ext_name);
} // END - for
// Is there no update?
if (countExtensionUpdateDependencies(getCurrentExtensionName()) == 0) {
// Then test is passed!
$test = true;
} // END - if
// Switch back to register mode
setExtensionMode('register');
// Remains true if extension registration reports no failures
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
$test = (($test === true) && (getExtensionReportsFailure() === false));
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',test=' . intval($test));
// Does everthing before wents ok?
if ($test === true) {
// "Dry-run-mode" activated?
if ((isExtensionDryRun() === false) && (!isExtensionOnRemovalList())) {
// Init SQLs and transfer ext->generic
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName());
initSqls();
setSqlsArray(getExtensionSqls());
// Run installation pre-installation filters
runFilterChain('pre_extension_installed', array('dry_run' => isExtensionDryRun(), 'enable_codes' => false));
// Register extension
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'insert=' . getCurrentExtensionName() . '/' . getCurrentExtensionVersion() . ' - INSERT!');
if (isExtensionInstalledAndNewer('sql_patches', '0.0.6')) {
// New way, with CSS
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getThisExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion() . 'ext_css=' . getExtensionHasCss());
SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`,`ext_has_css`) VALUES ('%s','%s','%s','%s')",
array(
getCurrentExtensionName(),
getThisExtensionAlwaysActive(),
getCurrentExtensionVersion(),
getExtensionHasCss()
), __FUNCTION__, __LINE__);
} else {
// Old way, no CSS
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getThisExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion());
SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`) VALUES ('%s','%s','%s')",
array(
getCurrentExtensionName(),
getThisExtensionAlwaysActive(),
getCurrentExtensionVersion()
), __FUNCTION__, __LINE__);
}
// Use the insert id as extension id and cache it for early usage
$GLOBALS['cache_array']['extension']['ext_id'][getCurrentExtensionName()] = SQL_INSERTID();
$GLOBALS['cache_array']['extension']['ext_name'][SQL_INSERTID()] = getCurrentExtensionName();
// Mark it as installed
$GLOBALS['ext_is_installed'][getCurrentExtensionName()] = true;
// Remove cache file(s) if extension is active
runFilterChain('post_extension_installed', array(
'pool' => 'extension',
'ext_name' => getCurrentExtensionName(),
'task_id' => $taskId
));
// Re-init queries and notes
initExtensionSqls(true);
initExtensionNotes(true);
// In normal mode return a true on success
$ret = true;
} elseif (isExtensionDryRun() === true) {
// In "dry-run" mode do always return a true
$ret = true;
} else {
// Extension has been removed for updates, so all is fine!
$ret = true;
}
} else {
// No, an error occurs while registering extension :-(
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName());
$ret = false;
}
} elseif (($taskId > 0) && (getCurrentExtensionName() != '')) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
// Remove task from system when id and extension's name is valid
SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `id`=%s AND `status`='NEW' LIMIT 1",
array(bigintval($taskId)), __FUNCTION__, __LINE__);
}
// Is this the sql_patches?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . '/' . getExtensionMode());
if ((getCurrentExtensionName() == 'sql_patches') && ((getExtensionMode() == 'register') || (getExtensionMode() == 'remove')) && (!isExtensionDryRun()) && ($test)) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ': LOAD!');
if ($logout === true) {
// Then redirect to logout
redirectToUrl('modules.php?module=admin&logout=1&' . getExtensionMode() . '=sql_patches');
} else {
// Add temporary filter
registerFilter('shutdown', 'REDIRECT_TO_LOGOUT_SQL_PATCHES', true, true);
$GLOBALS['ext_load_mode'] = getExtensionMode();
}
} // END - if
// Return status code
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',test=' . intval($test) . ' - EXIT!');
return $ret;
}
// Run SQL queries for given extension id
// @TODO Change from ext_id to ext_name (not just even the variable! ;-) )
function doExtensionSqls ($ext_id, $load_mode) {
// This shall never do a non-admin user!
if (!isAdmin()) return false;
// Get extension's name
$ext_name = getExtensionName($ext_id);
// Set current SQL name
setCurrentExtensionName($ext_name);
// Init EXT_UPDATE_DEPENDS
if (!isExtensionUpdateDependenciesInitialized()) {
// Init here...
initExtensionUpdateDependencies();
} // END - if
// Init array
initExtensionSqls(true);
// By default no SQL has been executed
$sqlRan = false;
// 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);
// Init these SQLs
initSqls();
setSqlsArray(getExtensionSqls());
// Debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'SQLs::count=' . countSqls());
// Do we have entries?
if (isSqlsValid()) {
// Run SQL commands...
runFilterChain('run_sqls');
} // END - if
// Run any filters depending on the action here
runFilterChain('extension_' . $load_mode);
// Remove cache file(s) if extension is active
if (((isExtensionActive('cache')) && ((!SQL_HASZEROAFFECTED())) || ($sqlRan === true) || ($load_mode == 'activate') || ($load_mode == 'deactivate'))) {
// Run filters
runFilterChain('post_extension_run_sql', getCurrentExtensionName());
} // END - if
// Is this the sql_patches?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'id=' . $ext_id . ',currName=' . getCurrentExtensionName() . ',loadMode=' . $load_mode);
if ((getCurrentExtensionName() == 'sql_patches') && (($load_mode == 'register') || ($load_mode == 'remove'))) {
// Then redirect to logout
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ': LOAD!');
redirectToUrl('modules.php?module=admin&logout=1&' . $load_mode . '=sql_patches');
} // END - if
}
// Check wether the given extension is installed
function isExtensionInstalled ($ext_name) {
// We don't like empty extension names here
if (empty($ext_name)) {
// Please fix them all
debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty.');
} // END - if
// By default non is installed
$isInstalled = false;
// Check if there is a cache entry
if (isset($GLOBALS['ext_is_installed'][$ext_name])) {
// Use cache built from below queries
$isInstalled = $GLOBALS['ext_is_installed'][$ext_name];
} elseif (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) {
// Found!
$isInstalled = true;
// Count cache hits
incrementStatsEntry('cache_hits');
} elseif ((isInstallationPhase())) {
// Extensions are all inactive/not installed during installation
} 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);
// Is it installed, then cache the entry
if ($isInstalled === true) {
// Dummy call (get is okay here)
getExtensionId($ext_name, true);
} // END - if
// Remember the status
$GLOBALS['ext_is_installed'][$ext_name] = $isInstalled;
}
// Return status
return $isInstalled;
}
// Check if given extension is active
function isExtensionActive ($ext_name) {
if (isInstallationPhase()) {
// Extensions are all inactive during installation
return false;
} elseif (empty($ext_name)) {
// Empty extension names must befixed
debug_report_bug(__FUNCTION__, __LINE__, 'Empty extension name provided.');
} elseif (!isExtensionInstalled($ext_name)) {
// Not installed extensions are always inactive
return false;
}
// Not active is the default
$data['ext_active'] = 'N';
// Check cache
if (isset($GLOBALS['cache_array']['extension']['ext_active'][$ext_name])) {
// Load from cache
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'CACHE! ext_name=' . $ext_name);
$data['ext_active'] = $GLOBALS['cache_array']['extension']['ext_active'][$ext_name];
// Count cache hits
incrementStatsEntry('cache_hits');
} elseif (isExtensionLoaded($ext_name)) {
// @TODO Extension is loaded, what next?
debug_report_bug(__FUNCTION__, __LINE__, 'LOADED:' . $ext_name);
} elseif (($ext_name == 'cache') || (!isExtensionInstalled('cache'))) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'DB! ext_name=' . $ext_name);
// Load from database
$result = SQL_QUERY_ESC("SELECT `ext_active` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
array($ext_name), __FUNCTION__, __LINE__);
// Entry found?
if (SQL_NUMROWS($result) == 1) {
// Load entry
$data = SQL_FETCHARRAY($result);
} // END - if
// Free result
SQL_FREERESULT($result);
// Write cache array
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . '[DB]: ' . $data['ext_active']);
$GLOBALS['cache_array']['extension']['ext_active'][$ext_name] = $data['ext_active'];
} else {
// Extension not active!
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ': Not active!');
$GLOBALS['cache_array']['extension']['ext_active'][$ext_name] = 'N';
}
// Debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',active=' . $data['ext_active']);
// Is this extension activated? (For admins we always have active extensions...)
return ($data['ext_active'] == 'Y');
}
// Get version from extensions
function getExtensionVersion ($ext_name, $force = false) {
// By default no extension is found
$data['ext_version'] = 'false';
// Empty extension name should be fixed!
if (empty($ext_name)) {
// Please report this bug!
debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty which is not allowed here.');
} // END - if
// Extensions are all inactive during installation
if (isInstallationPhase()) return '';
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name);
// Is the cache written?
if (isset($GLOBALS['cache_array']['extension']['ext_version'][$ext_name])) {
// Load data from cache
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $ext_name . ': CACHE!');
$data['ext_version'] = $GLOBALS['cache_array']['extension']['ext_version'][$ext_name];
// Count cache hits
incrementStatsEntry('cache_hits');
} elseif ((!isCacheInstanceValid()) || (isset($GLOBALS['cache_array']['extension'])) || (!isHtmlOutputMode())) {
// Load from database
$result = SQL_QUERY_ESC("SELECT `ext_version` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `ext_name`='%s' LIMIT 1",
array($ext_name), __FUNCTION__, __LINE__);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, $ext_name . ': DB - '.SQL_NUMROWS($result).'');
// Is the extension there?
if (SQL_NUMROWS($result) == 1) {
// Load entry
$data = SQL_FETCHARRAY($result);
} elseif (isDebugModeEnabled()) {
// Not found, please report all
debug_report_bug(__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
if (($data['ext_version'] == 'false') && ($force === false)) {
// Please report this trouble
debug_report_bug(__FUNCTION__, __LINE__, sprintf("Extension %s has empty version!", $ext_name));
} // END - if
// Return result
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_version=' . $data['ext_version']);
return $data['ext_version'];
}
// 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
if ((!isAdmin()) || (empty($ext_name))) {
return false;
} // END - if
// Set current SQL name
setCurrentExtensionName($ext_name);
// Init arrays
initExtensionSqls();
initExtensionNotes();
initIncludePool('extension');
// Load extension in test mode
loadExtension($ext_name, 'test', $ext_ver, isExtensionDryRun());
// Save version history
$history = getExtensionVersionHistory();
// Remove old SQLs array to prevent possible bugs
initExtensionSqls();
// Check if version is updated
//* DEBUG: */ debugOutput(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);
// And load SQL queries in order of version history
for ($idx = ($start + 1); $idx < count($history); $idx++) {
// Set extension version
$GLOBALS['update_ver'][getCurrentExtensionName()] = $history[$idx];
// Load again...
loadExtension(getCurrentExtensionName(), 'update', $GLOBALS['update_ver'][getCurrentExtensionName()], isExtensionDryRun());
// Get all depencies
$depencies = getExtensionUpdateDependencies();
// Nothing to apply?
if (count($depencies) > 0) {
// Apply all extension depencies
foreach ($depencies as $ext_depend) {
// Did we already update/register this?
if (!isset($GLOBALS['ext_updated'][$ext_depend])) {
// Set it as current
setCurrentExtensionName($ext_depend);
// Mark it as already updated before we update it
$GLOBALS['ext_updated'][$ext_depend] = true;
// Is the extension there?
if (isExtensionInstalled($ext_depend)) {
// Update another extension first!
$test = updateExtension($ext_depend, getExtensionVersion($ext_depend), isExtensionDryRun());
} else {
// Register new extension
$test = registerExtension($ext_depend, 0, isExtensionDryRun(), false);
}
} // END - if
} // END - foreach
// Set extension version here
setCurrentExtensionVersion($ext_ver);
// Set name back
setCurrentExtensionName($ext_name);
} // END - if
// Add notes
addExtensionNotes($history[$idx]);
} // END - for
// In real-mode execute any existing includes
if (isExtensionDryRun() === false) {
$GLOBALS['ext_inc_pool'][getCurrentExtensionName()] = getIncludePool('extension');
runFilterChain('load_includes', 'extension');
setIncludePool('extension', $GLOBALS['ext_inc_pool'][getCurrentExtensionName()]);
unset($GLOBALS['ext_inc_pool'][getCurrentExtensionName()]);
} // END - if
// Init these SQLs
initSqls();
setSqlsArray(getExtensionSqls());
// Run SQLs
runFilterChain('run_sqls', array('dry_run' => isExtensionDryRun(), 'enable_codes' => false));
if (isExtensionDryRun() === false) {
// Run filters on success extension update
runFilterChain('extension_update', getCurrentExtensionName());
} // END - if
} // END - if
}
// Output verbose SQL table for extension
function addExtensionVerboseSqlTable ($title = '', $dashed = '', $switch = false, $width = '100%') {
// Empty title?
if (empty($title)) {
// Then fix it to default
$title = '{--ADMIN_SQLS_EXECUTED_ON_REMOVAL--}';
} // END - if
// Init variables
$OUT = '';
// Do we have queries?
if (isVerboseSqlEnabled()) {
// Do we have entries?
if (countExtensionSqls() > 0) {
// Init counter
$idx = 0;
// Get all SQLs
foreach (getExtensionSqls() as $sqls) {
// New array format is recursive
foreach ($sqls as $sql) {
// Trim out spaces
$sql = trim($sql);
// Output command if set
if (!empty($sql)) {
// Prepare output for template
$content = array(
'i' => ($idx + 1),
'sql' => str_replace('{', '{', str_replace('}', '}', encodeEntities($sql)))
);
// Load row template
$OUT .= loadTemplate('admin_extension_sql_row', true, $content);
// Count up
$idx++;
} // END - if
} // END - foreach
} // END - foreach
// Prepare content for template
$content = array(
'width' => $width,
'dashed' => $dashed,
'title' => $title,
'rows' => $OUT
);
// Load main template
$OUT = loadTemplate('admin_extension_sql_table', true, $content);
} else {
// No addional SQL commands to run
$OUT = displayMessage('{--ADMIN_NO_ADDITIONAL_SQLS--}', true);
}
} // END - if
// Return output
return $OUT;
}
// Get extension name from id
function getExtensionName ($ext_id) {
// Init extension name
$data['ext_name'] = '';
// Is cache there?
if (isset($GLOBALS['cache_array']['extension']['ext_name'][$ext_id])) {
// Load from cache
$data['ext_name'] = $GLOBALS['cache_array']['extension']['ext_name'][$ext_id];
// Count cache hits
incrementStatsEntry('cache_hits');
} elseif (!isExtensionActive('cache')) {
// Load from database
$result = SQL_QUERY_ESC("SELECT `ext_name` FROM `{?_MYSQL_PREFIX?}_extensions` WHERE `id`=%s LIMIT 1",
array(bigintval($ext_id)), __FUNCTION__, __LINE__);
// Is the entry there?
if (SQL_NUMROWS($result) == 1) {
// Get the extension's name from database
$data = SQL_FETCHARRAY($result);
} // END - if
// Free result
SQL_FREERESULT($result);
}
// Did we find some extension?
if (empty($data['ext_name'])) {
// We should fix these all!
debug_report_bug(__FUNCTION__, __LINE__, 'ext_name is empty. ext_id=' . $ext_id);
} // END - if
// Return the extension name
return $data['ext_name'];
}
// Get extension id from name
function getExtensionId ($ext_name) {
// Init id number
$data['ext_id'] = '0';
// Do we have cache?
if (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) {
// Load from cache
$data['ext_id'] = $GLOBALS['cache_array']['extension']['ext_id'][$ext_name];
// Count cache hits
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",
array($ext_name), __FUNCTION__, __LINE__);
// Is the entry there?
if (SQL_NUMROWS($result) == 1) {
// Get the extension's id from database
$data = SQL_FETCHARRAY($result);
} // END - if
// Free result
SQL_FREERESULT($result);
// Cache it
$GLOBALS['cache_array']['extension']['ext_id'][$ext_name] = $data['ext_id'];
}
// Return value
return $data['ext_id'];
}
// Determines wether the given extension name is valid
function isExtensionNameValid ($ext_name) {
// Do we have cache?
if (!isset($GLOBALS['ext_name_valid'][$ext_name])) {
// Generate include file name
$INC = sprintf("inc/extensions/ext-%s.php", $ext_name);
// Is there a file in inc/extensions/ ?
$GLOBALS['ext_name_valid'][$ext_name] = isIncludeReadable($INC);
} // END - if
// Return result
return $GLOBALS['ext_name_valid'][$ext_name];
}
// Determines wether the given extension id is valid
function isExtensionIdValid ($ext_id) {
// Default is nothing valid
$isValid = false;
// Check in cache then in database
if (isset($GLOBALS['cache_array']['extension']['ext_name'][$ext_id])) {
// Valid!
$isValid = true;
// Count cache hits
incrementStatsEntry('cache_hits');
} else {
// Query database
$isValid = (countSumTotalData($ext_id, 'extensions', 'id', 'id', true) == 1);
}
// Return result
return $isValid;
}
// Activate given extension
function doActivateExtension ($ext_name) {
// Is the extension installed?
if (!isExtensionInstalled($ext_name)) {
// Non-installed extensions cannot be activated
debug_report_bug(__FUNCTION__, __LINE__, 'Tried to activate non-installed extension ' . $ext_name);
} // END - if
// Activate the extension
SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_extensions` SET `ext_active`='Y' WHERE `ext_name`='%s' LIMIT 1",
array($ext_name), __FUNCTION__, __LINE__);
// Then run all queries
doExtensionSqls(getExtensionId($ext_name), 'activate');
}
// Deactivate given extension
function doDeactivateExtension ($ext_name) {
// Is the extension installed?
if (!isExtensionInstalled($ext_name)) {
// Non-installed extensions cannot be activated
debug_report_bug(__FUNCTION__, __LINE__, 'Tried to deactivate non-installed extension ' . $ext_name);
} // END - if
// Activate the extension
SQL_QUERY_ESC("UPDATE `{?_MYSQL_PREFIX?}_extensions` SET `ext_active`='N' WHERE `ext_name`='%s' LIMIT 1",
array($ext_name), __FUNCTION__, __LINE__);
// Then run all queries
doExtensionSqls(getExtensionId($ext_name), 'deactivate');
// Create new task (we ignore the task id here)
createExtensionDeactivationTask($ext_name);
// Notify the admin
sendAdminNotification(
'{--ADMIN_EXTENSION_DEACTIVATED_SUBJECT--}',
'admin_extension_deactivated',
array('ext_name' => $ext_name)
);
}
// Checks wether the extension is older than given
function isExtensionOlder ($ext_name, $ext_ver) {
// Get current extension version
$currVersion = getExtensionVersion($ext_name);
// Remove all dots from both versions
$currVersion = str_replace('.', '', $currVersion);
$ext_ver = str_replace('.', '', $ext_ver);
// Now compare both and return the result
return ($currVersion < $ext_ver);
}
// Creates a new task for updated extension
function createExtensionUpdateTask ($adminId, $ext_name, $ext_ver, $notes) {
// Create subject line
$subject = '[UPDATE-' . $ext_name . '-' . $ext_ver . ':] {--ADMIN_UPDATE_EXTENSION_SUBJECT--}';
// Get task id
$taskId = determineTaskIdBySubject($subject);
// Is the extension there?
if (isExtensionInstalled($ext_name)) {
// Check if task is not there
if ($taskId == '0') {
// Create extension update-task
$taskId = createNewTask($subject, $notes, 'EXTENSION_UPDATE', 0, $adminId);
} // END - if
} else {
// Extension not there! :-(
debug_report_bug(__FUNCTION__, __LINE__, sprintf("Extension %s not found but should be updated?", $ext_name));
}
// Return task id
return $taskId;
}
// Creates a new task for newly installed extension
function createNewExtensionTask ($ext_name) {
// Generate subject line
$subject = sprintf("[%s:]", $ext_name);
// Get task id
$taskId = determineTaskIdBySubject($subject);
// Not installed and do we have created a task for the admin?
if (($taskId == '0') && (!isExtensionInstalled($ext_name))) {
// Set default message if ext-foo is missing
$message = getMaskedMessage('ADMIN_EXTENSION_TEXT_FILE_MISSING', $ext_name);
// Template file
$FQFN = sprintf("%stemplates/%s/html/ext/ext_%s.tpl",
getPath(),
getLanguage(),
$ext_name
);
// Load text for task if found
if (isFileReadable($FQFN)) {
// Load extension's description template (but do not compile the code)
$message = loadTemplate('ext_' . $ext_name, true, array(), false);
} else {
// Write this in debug.log as well
logDebugMessage(__FUNCTION__, __LINE__, $message);
}
// Task not created so it's a brand-new extension which we need to register and create a task for!
$taskId = createNewTask($subject, $message, 'EXTENSION', 0, getCurrentAdminId(), false);
} // END - if
// Return task id
return $taskId;
}
// Creates a task for automatically deactivated (deprecated) extension
function createExtensionDeactivationTask ($ext_name) {
// Create subject line
$subject = sprintf("[%s:] %s", $ext_name, '{--ADMIN_TASK_EXTENSION_DEACTIVATED_SUBJECT--}');
// Get task id
$taskId = determineTaskIdBySubject($subject);
// Not installed and do we have created a task for the admin?
if (($taskId == '0') && (isExtensionInstalled($ext_name))) {
// Task not created so add it
$taskId = createNewTask($subject, SQL_ESCAPE(loadTemplate('task_EXTENSION_deactivated', true, $ext_name)), 'EXTENSION_DEACTIVATION');
} // END - if
// Return task id
return $taskId;
}
// Determines the task id for given extension
function determineExtensionTaskId ($ext_name) {
// Default is not found
$data['task_id'] = '0';
// Search for extension task's id
$result = SQL_QUERY_ESC("SELECT `id` AS task_id FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `task_type`='EXTENSION' AND `subject`='[%s:]' LIMIT 1",
array($ext_name), __FUNCTION__, __LINE__);
// Entry found?
if (SQL_NUMROWS($result) == 1) {
// Task found so load task's id and register extension...
$data = SQL_FETCHARRAY($result);
} // END - if
// Free result
SQL_FREERESULT($result);
// Return it
return $data['task_id'];
}
// Determines the task id for given subject
function determineTaskIdBySubject ($subject) {
// Default is not found
$data['task_id'] = '0';
// Search for task id
$result = SQL_QUERY_ESC("SELECT `id` AS task_id FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `subject` LIKE '%s%%' LIMIT 1",
array($subject), __FUNCTION__, __LINE__);
// Entry found?
if (SQL_NUMROWS($result) == 1) {
// Task found so load task's id and register extension...
$data = SQL_FETCHARRAY($result);
} // END - if
// Free result
SQL_FREERESULT($result);
// Return it
return $data['task_id'];
}
// Add updates notes for given version
function addExtensionNotes ($ext_ver) {
// Init notes/content
$out = '';
$content = array();
// Is do we have verbose output enabled?
if ((!isExtensionActive('sql_patches')) || (isVerboseSqlEnabled())) {
// Update notes found?
if (isExtensionUpdateNoteSet($ext_ver)) {
// Update notes found
$content = array(
'ver' => $ext_ver,
'notes' => getExtensionUpdateNotes($ext_ver)
);
// Reset them
setExtensionUpdateNotes('', $ext_ver);
} elseif (in_array($ext_ver, array('0.0', '0.0.0'))) {
// Initial release
$content = array(
'ver' => $ext_ver,
'notes' => '{--INITIAL_RELEASE--}'
);
} else {
// No update notes found
$content = array(
'ver' => $ext_ver,
'notes' => '{--NO_UPDATE_NOTES--}'
);
}
// Load template
$out = loadTemplate('admin_extension_notes', true, $content);
} // END - if
// Add the notes
appendExtensionNotes($out);
}
// Getter for CSS files array
function getExtensionCssFiles () {
// By default no additional CSS files are found
$cssFiles = array();
// Is the array there?
if (isset($GLOBALS['css_files'])) {
// Then use it
$cssFiles = $GLOBALS['css_files'];
} // END - if
// Return array
return $cssFiles;
}
// Init CSS files array
function initExtensionCssFiles () {
// Simply init it
$GLOBALS['css_files'] = array();
}
// Add new entry
function addExtensionCssFile ($file) {
// Is the array there?
if (!isset($GLOBALS['css_files'])) {
// Then auto-init them
initExtensionCssFiles();
} // END - if
// Add the entry
$GLOBALS['css_files'][] = $file;
}
// Setter for EXT_ALWAYS_ACTIVE flag
function setExtensionAlwaysActive ($active) {
$GLOBALS['ext_always_active'][getCurrentExtensionName()] = (string) $active;
}
// Getter for EXT_ALWAYS_ACTIVE flag
function getThisExtensionAlwaysActive () {
return $GLOBALS['ext_always_active'][getCurrentExtensionName()];
}
// Checks wether the current extension is always active
function isThisExtensionAlwaysActive () {
return (getThisExtensionAlwaysActive() == 'Y');
}
// Setter for EXT_VERSION flag
function setThisExtensionVersion ($ext_version) {
$GLOBALS['ext_version'][getCurrentExtensionName()] = (string) $ext_version;
}
// Getter for EXT_VERSION flag
function getThisExtensionVersion () {
return $GLOBALS['ext_version'][getCurrentExtensionName()];
}
// Setter for EXT_DEPRECATED flag
function setExtensionDeprecated ($deprecated) {
$GLOBALS['ext_deprecated'][getCurrentExtensionName()] = (string) $deprecated;
}
// Getter for EXT_DEPRECATED flag
function isExtensionDeprecated () {
return ($GLOBALS['ext_deprecated'][getCurrentExtensionName()] == 'Y');
}
// Setter for EXT_UPDATE_DEPENDS flag
function addExtensionDependency ($updateDepends) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ' - ENTERED!');
// Is the update depency empty? (NEED TO BE FIXED!)
if (empty($updateDepends)) {
// Please report this bug!
debug_report_bug(__FUNCTION__, __LINE__, 'updateDepends is empty: currentExtension=' . getCurrentExtensionName());
} // END - if
// Is it not yet added?
/* Only for debugging!
if ((isset($updateDepends, $GLOBALS['ext_running_updates'][getCurrentExtensionName()])) && (in_array($updateDepends, getExtensionUpdatesRunning()))) {
// Double-adding isn't fine, too
debug_report_bug(__FUNCTION__, __LINE__, '() called twice: updateDepends=' . $updateDepends . ',currentExtension=' . getCurrentExtensionName());
} // END - if
*/
// Add it to the list of extension update depencies map
$GLOBALS['ext_update_depends'][getCurrentExtensionName()][] = (string) $updateDepends;
// Remember it in the list of running updates
$GLOBALS['ext_running_updates'][getCurrentExtensionName()][] = $updateDepends;
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ' - EXIT!');
}
// Getter for running updates
function getExtensionUpdatesRunning () {
return $GLOBALS['ext_running_updates'][getCurrentExtensionName()];
}
// Checks wether the given extension registration is in progress
function isExtensionRegistrationRunning ($ext_name) {
// Simply check it
$isRunning = ((isset($GLOBALS['ext_register_running'])) && (in_array($ext_name, $GLOBALS['ext_register_running'])));
// Return it
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
return $isRunning;
}
// Init EXT_UPDATE_DEPENDS flag
function initExtensionUpdateDependencies () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ' - ENTERED!');
// Init update depency map automatically if not found
if (isExtensionUpdateDependenciesInitialized()) {
// We need these bug reports as well...
debug_report_bug(__FUNCTION__, __LINE__, '() is called twice: currName=' . getCurrentExtensionName());
} // END - if
$GLOBALS['ext_update_depends'][getCurrentExtensionName()] = array();
// Init running updates array
initExtensionRuningUpdates();
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ' - EXIT!');
}
// Adds an extension as "registration in progress"
function addExtensionRunningRegistration ($ext_name) {
// Is it running?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Registration in progress: ext_name=' . $ext_name . ' - ENTERED!');
if (isExtensionRegistrationRunning($ext_name)) {
// This is really bad and should not be quietly ignored
debug_report_bug(__FUNCTION__, __LINE__, '() already called! ext_name=' . $ext_name);
} // END - if
// Then add it!
$GLOBALS['ext_register_running'][] = $ext_name;
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Registration in progress: ext_name=' . $ext_name . ' - EXIT!');
}
// Checks wether EXT_UPDATE_DEPENDS is initialized
function isExtensionUpdateDependenciesInitialized () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
return (isset($GLOBALS['ext_update_depends'][getCurrentExtensionName()]));
}
// Checks wether an update is already running for given extension
function isExtensionUpdateRunning ($ext_name) {
// Current and given extensions means whole array
if ($ext_name == getCurrentExtensionName()) {
// Default is not found
$isRunning = false;
// Walk through whole array
foreach ($GLOBALS['ext_running_updates'] as $ext1=>$depends) {
// Is it found?
if (($ext1 == $ext_name) || ($isRunning === true)) {
// found
logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',isRunning=' . intval($isRunning));
$isRunning = true;
break;
} // END - if
} // END - foreach
// Return result
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
return $isRunning;
} // END - if
// Simply check it
$isRunning = ((isExtensionUpdateDependenciesInitialized()) && (in_array($ext_name, getExtensionRunningUpdates())));
// Return it
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ', isRunning=' . intval($isRunning));
return $isRunning;
}
// Initializes the list of running updates
function initExtensionRuningUpdates () {
// Auto-init ext_running_updates
if (!isset($GLOBALS['ext_running_updates'])) {
$GLOBALS['ext_running_updates'] = array();
$GLOBALS['ext_register_running'] = array();
} // END - if
}
// Getter for EXT_UPDATE_DEPENDS flag
function getExtensionUpdateDependencies () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
return $GLOBALS['ext_update_depends'][getCurrentExtensionName()];
}
// Getter for next iterator depency
function getExtensionUpdateDependenciesIterator () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
return ($GLOBALS['ext_update_depends'][getCurrentExtensionName()][getExtensionUpdateIterator()]);
}
// Counter for extension update depencies
function countExtensionUpdateDependencies () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
return count($GLOBALS['ext_update_depends'][getCurrentExtensionName()]);
}
// Removes given extension from update denpency list
function removeExtensionDependency ($ext_name) {
// Look it up
$key = array_search($ext_name, getExtensionUpdateDependencies());
// Is it valid?
if ($key !== false) {
// Then remove it
unset($GLOBALS['ext_update_depends'][getCurrentExtensionName()][$key]);
// And sort the array
ksort($GLOBALS['ext_update_depends'][getCurrentExtensionName()]);
} // END - if
}
// Init iterator for update depencies
function initExtensionUpdateIterator () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
$GLOBALS['ext_depend_iterator'][getCurrentExtensionName()] = '0';
}
// Getter for depency iterator
function getExtensionUpdateIterator () {
// Auto-init iterator
if (!isset($GLOBALS['ext_depend_iterator'][getCurrentExtensionName()])) initExtensionUpdateIterator();
// Return it
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName().'/'.$GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]);
return $GLOBALS['ext_depend_iterator'][getCurrentExtensionName()];
}
// Increments the update iterator
function incrementExtensionUpdateIterator () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, "currName=".getCurrentExtensionName());
$GLOBALS['ext_depend_iterator'][getCurrentExtensionName()]++;
}
// Setter for EXT_REPORTS_FAILURE flag
function setExtensionReportsFailure ($reportsFailure) {
$GLOBALS['ext_reports_failure'] = (bool) $reportsFailure;
}
// Getter for EXT_REPORTS_FAILURE flag
function getExtensionReportsFailure () {
return $GLOBALS['ext_reports_failure'];
}
// Setter for EXT_VER_HISTORY flag
function setExtensionVersionHistory ($versionHistory) {
$GLOBALS['ext_ver_history'][getCurrentExtensionName()] = (array) $versionHistory;
}
// Getter for EXT_VER_HISTORY array
function getExtensionVersionHistory () {
return $GLOBALS['ext_ver_history'][getCurrentExtensionName()];
}
// Setter for EXT_UPDATE_NOTES
function setExtensionUpdateNotes ($updateNotes, $ext_ver = '') {
// . '/' . getCurrentExtensionVersion()
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()=' . getCurrentExtensionName() . ',getExtensionMode()=' . getExtensionMode() . ',ext_ver=' . $ext_ver . ',updateNotes()=' . strlen($updateNotes));
if (empty($ext_ver)) {
$GLOBALS['ext_update_notes'][getCurrentExtensionName()][getCurrentExtensionVersion()] = (string) $updateNotes;
} else {
$GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ext_ver] = (string) $updateNotes;
}
}
// Getter for EXT_UPDATE_NOTES
function getExtensionUpdateNotes ($ext_ver) {
return $GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ext_ver];
}
// Checks if ext_update_notes is set
function isExtensionUpdateNoteSet ($ext_ver) {
return isset($GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ext_ver]);
}
// Init extension notice
function initExtensionNotes ($force = false) {
// Is it already initialized?
if (($force === false) && (isset($GLOBALS['ext_notes'][getCurrentExtensionName()]))) {
// This is mostly not wanted, so please report it
debug_report_bug(__FUNCTION__, __LINE__, 'ext_notes already set for extension ' . getCurrentExtensionName());
} // END - if
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()=' . getCurrentExtensionName());
$GLOBALS['ext_notes'][getCurrentExtensionName()] = '';
}
// Append extension notice
function appendExtensionNotes ($notes) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()=' . getCurrentExtensionName() . ', notes()=' . strlen($notes));
$GLOBALS['ext_notes'][getCurrentExtensionName()] .= (string) trim($notes);
}
// Getter for extension notes
function getExtensionNotes () {
return $GLOBALS['ext_notes'][getCurrentExtensionName()];
}
// Setter for current extension name
function setCurrentExtensionName ($ext_name) {
$GLOBALS['curr_extension_name'] = (string) trim($ext_name);
}
// Getter for current extension name
function getCurrentExtensionName () {
if (!isset($GLOBALS['curr_extension_name'])) {
// Not set!
debug_report_bug(__FUNCTION__, __LINE__, 'curr_extension_name not initialized. Please execute initExtensionSqls() before calling this function.');
} // END - if
// Return it
return $GLOBALS['curr_extension_name'];
}
// Init SQLs array for current extension
function initExtensionSqls ($force = false) {
// Auto-init the array or if forced
if (($force === true) || (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()]))) {
// Set the array
$GLOBALS['ext_sqls'][getCurrentExtensionName()] = array();
// Initialize the generic array
initSqls();
} // END - if
}
// Adds SQLs to the SQLs array but "assigns" it with current extension name
function addExtensionSql ($sql) {
// Add it
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',ext_version=' . getCurrentExtensionVersion() . ',sql=' . $sql);
$GLOBALS['ext_sqls'][getCurrentExtensionName()][getCurrentExtensionVersion()][] = $sql;
}
// Getter for SQLs array for current extension
function getExtensionSqls () {
// Output debug backtrace if not found (SHOULD NOT HAPPEN!)
if (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) {
// Not found, should not happen
debug_report_bug(__FUNCTION__, __LINE__, sprintf("ext_sqls is empty, current extension: %s",
getCurrentExtensionName()
));
} // END - if
// Return the array
return $GLOBALS['ext_sqls'][getCurrentExtensionName()];
}
// Count SQLs for current extension
function countExtensionSqls () {
// Output debug backtrace if not found (SHOULD NOT HAPPEN!)
if (!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) {
// Not found, should not happen
debug_report_bug(__FUNCTION__, __LINE__, sprintf("ext_sqls is empty, current extension: %s",
getCurrentExtensionName()
));
} // END - if
// Count them all
return count($GLOBALS['ext_sqls'][getCurrentExtensionName()]);
}
// Removes SQLs for current extension
function unsetExtensionSqls () {
unset($GLOBALS['ext_sqls'][getCurrentExtensionName()]);
}
// Auto-initializes the removal list
function initExtensionRemovalList () {
// Is the remove list there?
if (!isset($GLOBALS['ext_update_remove'])) {
// Then create it
$GLOBALS['ext_update_remove'] = array();
} // END - if
}
// Checks wether the current extension is on the removal list
function isExtensionOnRemovalList () {
// Init removal list
initExtensionRemovalList();
// Is it there?
return (in_array(getCurrentExtensionName(), $GLOBALS['ext_update_remove']));
}
// Adds the current extension to the removal list
function addCurrentExtensionToRemovalList () {
// Simply add it
$GLOBALS['ext_update_remove'][] = getCurrentExtensionName();
}
// Getter for removal list
function getExtensionRemovalList () {
// Return the removal list
return $GLOBALS['ext_update_remove'];
}
// Redirects if the provided extension is not installed
function redirectOnUninstalledExtension ($ext_name) {
// So is the extension there?
if ((!isExtensionInstalled($ext_name)) || (!isExtensionActive($ext_name))) {
// Redirect to index
redirectToUrl('modules.php?module=index&code=' . getCode('EXTENSION_PROBLEM') . '&ext=' . $ext_name);
} // END - if
}
// Filter for initialization of all extensions by loading them in 'init' mode
function FILTER_INIT_EXTENSIONS () {
// Do we have some entries?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ENTRY!');
if (isset($GLOBALS['cache_array']['extension']['ext_name'])) {
// Load all found extensions if found
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'CACHE - START!');
foreach ($GLOBALS['cache_array']['extension']['ext_name'] as $key => $ext_name) {
// Load it
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name='.$ext_name.' - START');
loadExtension($ext_name, 'init', getExtensionVersion($ext_name));
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name='.$ext_name.' - END');
} // END - foreach
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'CACHE - END!');
} // END - if
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'EXIT!');
}
// Setter for extension mode
function setExtensionMode ($ext_mode) {
$GLOBALS['ext_mode'] = (string) $ext_mode;
}
// Getter for extension mode
function getExtensionMode () {
return $GLOBALS['ext_mode'];
}
// Setter for dry-run
function enableExtensionDryRun ($dry_run = true) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()='.getCurrentExtensionName().',dry='.intval($dry_run));
$GLOBALS['ext_dry_run'] = (bool) $dry_run;
}
// Getter for dry-run
function isExtensionDryRun () {
return $GLOBALS['ext_dry_run'];
}
// Setter for current extension version
function setCurrentExtensionVersion ($ext_ver) {
// ext_ver should never be empty in other modes than 'test'
if ((empty($ext_ver)) && (getExtensionMode() != 'test')) {
// Please report all these messages
debug_report_bug(__FUNCTION__, __LINE__, 'ext_ver is empty. Current extension name: ' . getCurrentExtensionName() . ', mode=' . getExtensionMode());
} // END - if
// Add version
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ', ext_ver[' . gettype($ext_ver) . ']=' . $ext_ver);
$GLOBALS['ext_current_version'][getCurrentExtensionName()] = (string) $ext_ver;
}
// Getter for current extension version
function getCurrentExtensionVersion () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ', ext_ver=' . $GLOBALS['ext_current_version'][getCurrentExtensionName()]);
return $GLOBALS['ext_current_version'][getCurrentExtensionName()];
}
// Remove the extension from cache array
function removeExtensionFromArray () {
// "Cache" this name
$ext_name = getCurrentExtensionName();
// Now loop through the whole cache
foreach ($GLOBALS['cache_array']['extension'] as $cacheName => $cacheArray) {
// Is it an element?
if (isset($cacheArray[$ext_name])) {
// Array element
unset($cacheArray[$ext_name]);
$GLOBALS['cache_array']['extension'][$cacheName] = $cacheArray;
} else {
// Maybe in array?
$key = array_search($ext_name, $cacheArray);
// Is it there?
if ($key !== false) {
// Found, so remove it
unset($cacheArray[$key]);
$GLOBALS['cache_array']['extension'][$cacheName] = $cacheArray;
} // END - if
}
} // END - foreach
}
// "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()
);
// Is it there?
if (isFileReadable($FQFN)) {
// Readable, so it is there...
$hasCss = 'Y';
} // END - if
// Return it
return $hasCss;
}
// Checks wether the given extension has a language file
function ifExtensionHasLanguageFile ($ext_name) {
// Do we have cache?
if (isset($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name])) {
// 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;
}
// Return result
return ($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] == 'Y');
}
// Load an extension's include file
function loadExtensionInclude () {
// Is it readable?
if (!isExtensionIncludeReadable()) {
// Not readable
debug_report_bug(__FUNCTION__, __LINE__, 'Extension ' . getCurrentExtensionName() . ' should be loaded, but is not readable.');
} // END - if
// Generate INC name
$INC = sprintf("inc/extensions/ext-%s.php", getCurrentExtensionName());
// Load it
loadInclude($INC);
}
// Checks wether an extension is readable
function isExtensionIncludeReadable ($ext_name = '') {
// If empty, use current
if (empty($ext_name)) $ext_name = getCurrentExtensionName();
// Array found?
if (!isset($GLOBALS['ext_inc_readable'][$ext_name])) {
// Generate INC name
$INC = sprintf("inc/extensions/ext-%s.php", getCurrentExtensionName());
// Is it readable?
$GLOBALS['ext_inc_readable'][$ext_name] = isIncludeReadable($INC);
} // END - if
// Return result
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',realable='.intval($GLOBALS['ext_inc_readable'][$ext_name]));
return $GLOBALS['ext_inc_readable'][$ext_name];
}
// Checks if an extension's function file is readable
function isExtensionFunctionFileReadable ($ext_name) {
// Is cache there?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name);
if (isset($GLOBALS['cache_array']['extension']['ext_func'][$ext_name])) {
// Just count cache hits
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=' . $GLOBALS['cache_array']['extension']['ext_func'][$ext_name] .' - CACHE!');
incrementStatsEntry('cache_hits');
} else {
// Construct IFN for functions file
$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';
}
}
// Return result
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_func=' . $GLOBALS['cache_array']['extension']['ext_func'][$ext_name]);
return ($GLOBALS['cache_array']['extension']['ext_func'][$ext_name] == 'Y');
}
// Adds a CREATE TABLE statement if the requested table is not there
function addCreateTableSql ($tableName, $sql) {
// Is the table not there?
if (!isSqlTableCreated($tableName)) {
// Is not found, so add it
addExtensionSql('CREATE TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` ' . $sql);
} else {
// Is already there, which should not happen
debug_report_bug(__FUNCTION__, __LINE__, 'The table ' . $tableName . ' is already created which should not happen.');
}
}
// Adds a DROP TABLE statement if the requested tabled is there
function addDropTableSql ($tableName) {
// Is the table there?
if (isSqlTableCreated($tableName)) {
// Then add it, non-existing tables can be ignored because it will
// happen with every newly installed extension.
addExtensionSql('DROP TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '`');
// Mark it as gone
$GLOBALS['isSqlTableCreated'][$tableName] = false;
} // END - if
}
// Adds an admin menu to the SQL queue of the menu entry is not found
function addAdminMenuSql ($action, $what, $title, $descr, $sort) {
// Now check if this menu is there
if (!isMenuActionValid('admin', $action, $what)) {
// Is what null?
if (is_null($what)) {
// Add main menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES('%s',NULL,'%s','%s',%s)",
$action,
$title,
$descr,
bigintval($sort)
);
} else {
// Add sub menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_admin_menu` (`action`,`what`,`title`,`descr`,`sort`) VALUES('%s','%s','%s','%s',%s)",
$action,
$what,
$title,
$descr,
bigintval($sort)
);
}
// Add it to the queue
addExtensionSql($sql);
} elseif (isDebugModeEnabled()) {
// Double menus should be located and fixed!
logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double admin menu action=%s,what=%s,title=%s detected.", $action, $what, $title));
}
}
// Adds a guest menu to the SQL queue if the menu entry is not found
function addGuestMenuSql ($action, $what, $title, $visible, $locked, $sort) {
// Now check if this menu is there
if (!isMenuActionValid('guest', $action, $what)) {
// Is what null?
if (is_null($what)) {
// Add main menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s',NULL,'%s','%s','%s',%s)",
$action,
$title,
$visible,
$locked,
bigintval($sort)
);
} else {
// Add sub menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s','%s','%s','%s','%s',%s)",
$action,
$what,
$title,
$visible,
$locked,
bigintval($sort)
);
}
// Add it to the queue
addExtensionSql($sql);
} elseif (isDebugModeEnabled()) {
// Double menus should be located and fixed!
logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double guest menu action=%s,what=%s,title=%s,locked=%s,visible=%s detected.", $action, $what, $title, $locked, $visible));
}
}
// Adds a member menu to the SQL queue if the menu entry is not found
function addMemberMenuSql ($action, $what, $title, $visible, $locked, $sort) {
// Now check if this menu is there
if (!isMenuActionValid('member', $action, $what)) {
// Is what null?
if (is_null($what)) {
// Add main menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s',NULL,'%s','%s','%s',%s)",
$action,
$title,
$visible,
$locked,
bigintval($sort)
);
} else {
// Add sub menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`,`what`,`title`,`visible`,`locked`,`sort`) VALUES('%s','%s','%s','%s','%s',%s)",
$action,
$what,
$title,
$visible,
$locked,
bigintval($sort)
);
}
// Add it to the queue
addExtensionSql($sql);
} elseif (isDebugModeEnabled()) {
// Double menus should be located and fixed!
logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double member menu action=%s,what=%s,title=%s,visivle=%s,locked=%s detected.", $action, $what, $title, $visible, $locked));
}
}
// Adds a sponsor menu to the SQL queue if the menu entry is not found
function addSponsorMenuSql ($action, $what, $title, $active, $sort) {
// Now check if this menu is there, if no ext-sponsor is installed all is not yet added
if ((!isExtensionInstalled('sponsor')) || (!isMenuActionValid('sponsor', $action, $what))) {
// Is what null?
if (is_null($what)) {
// Add main menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES('%s',NULL,'%s','%s',%s)",
$action,
$title,
$active,
bigintval($sort)
);
} else {
// Add sub menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_sponsor_menu` (`action`,`what`,`title`,`active`,`sort`) VALUES('%s','%s','%s','%s',%s)",
$action,
$what,
$title,
$active,
bigintval($sort)
);
}
// Add it to the queue
addExtensionSql($sql);
} elseif (isDebugModeEnabled()) {
// Double menus should be located and fixed!
logDebugMessage(__FUNCTION__, __LINE__, sprintf("Double sponsor menu action=%s,what=%s,title=%s,active=%s detected.", $action, $what, $title, $active));
}
}
// Add configuration entry if not found for actual extension
function addConfigAddSql ($columnName, $columnSql) {
// Is the column there?
if (!isSqlTableColumnFound('{?_MYSQL_PREFIX?}_config', $columnName)) {
// Not found, so add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_config` ADD `' . $columnName . '` ' . $columnSql);
} else {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'Configuration entry ' . $columnName . ' already created. columnSql=' . $columnSql);
}
}
// Enables/disables productive mode for current extension (used only while
// registration).
function enableExtensionProductive ($isProductive = true) {
// Log debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("ext_name=%s,isProductive=%d", getCurrentExtensionName(), intval($isProductive)));
// Set it
$GLOBALS['ext_productive'][getCurrentExtensionName()] = (bool) $isProductive;
}
// Checks wether the extension is in productive phase. If not set, development
// phase (=false) is assumed.
function isExtensionProductive ($ext_name = '') {
// Is the extension name empty? Then use current
if (empty($ext_name)) {
// Get current extension name
$ext_name = getCurrentExtensionName();
} // END - if
// Do we have cache?
if (!isset($GLOBALS[__FUNCTION__][$ext_name])) {
// Load extension only if not yet loaded
if (!isset($GLOBALS['ext_productive'][$ext_name])) {
// Load extension in test mode
loadExtension($ext_name, 'test');
} // END - if
// Determine it
$GLOBALS[__FUNCTION__][$ext_name] = ((isset($GLOBALS['ext_productive'][$ext_name])) && ($GLOBALS['ext_productive'][$ext_name] === true));
} // END - if
// Log debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, sprintf("ext_name=%s,isProductive=%s", $ext_name, intval($GLOBALS[__FUNCTION__][$ext_name])));
// Return result
return $GLOBALS[__FUNCTION__][$ext_name];
}
// Mark extension file as loaded
function markExtensionAsLoaded ($ext_name) {
// Is it already loaded?
if (isExtensionLoaded($ext_name)) {
// Then abort here
debug_report_bug(__FUNCTION__, __LINE__, 'Extension ' . $ext_name . ' is already marked as loaded!');
} // END - if
// Mark it
$GLOBALS['ext_loaded']['ext_name'][$ext_name] = true;
}
// Determine wether the given extension is already loaded
function isExtensionLoaded ($ext_name) {
// Is it there?
return ((isset($GLOBALS['ext_loaded']['ext_name'][$ext_name])) && ($GLOBALS['ext_loaded']['ext_name'][$ext_name] === true));
}
// Mark extension's library file as loaded
function markExtensionLibraryAsLoaded ($ext_name) {
// Is it already loaded?
if (isExtensionLibraryLoaded($ext_name)) {
// Then abort here
debug_report_bug(__FUNCTION__, __LINE__, 'Extension library ' . $ext_name . ' is already marked as loaded!');
} // END - if
// Mark it
$GLOBALS['ext_loaded']['library'][$ext_name] = true;
}
// Determine wether the given extension's library is already loaded
function isExtensionLibraryLoaded ($ext_name) {
// Is it there?
return ((isset($GLOBALS['ext_loaded']['library'][$ext_name])) && ($GLOBALS['ext_loaded']['library'][$ext_name] === true));
}
// [EOF]
?>