0) {
// Try to register the extension
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ':ext_update=' . $ext_update . ',taskId=' . $task);
$test = registerExtension($ext_update, $task, getExtensionDryRun(), false);
// Reset extension name
setCurrentExtensionName($ext_name);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
//* DEBUG: */ print getCurrentExtensionName().':
' . print_r($test, true) . '
';
} // 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, getExtensionDryRun());
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());
//* DEBUG: */ print getCurrentExtensionName().':' . print_r($test, true) . '
';
$test = (($test === true) && (getExtensionReportsFailure() === false));
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
//* DEBUG: */ print getCurrentExtensionName().':' . print_r($test, true) . '
';
// Does everthing before wents ok?
if ($test === true) {
// "Dry-run-mode" activated?
if ((getExtensionDryRun() === false) && (!isExtensionOnRemovalList())) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName());
// Init SQLs and transfer ext->generic
initSqls();
setSqlsArray(getExtensionSqls());
// Run installation pre-installation filters
runFilterChain('pre_extension_installed', array('dry_run' => getExtensionDryRun()));
// Register extension
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'insert=' . getCurrentExtensionName() . '/' . getCurrentExtensionVersion() . ' - INSERT!');
if (isExtensionInstalledAndNewer('sql_patches', '0.0.6')) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion() . 'ext_css=' . getExtensionHasCss());
// New way, with CSS
SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`,`ext_has_css`) VALUES ('%s','%s','%s','%s')",
array(
getCurrentExtensionName(),
getExtensionAlwaysActive(),
getCurrentExtensionVersion(),
getExtensionHasCss()
), __FUNCTION__, __LINE__);
} else {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',always_active=' . getExtensionAlwaysActive() . ', ext_ver=' . getCurrentExtensionVersion());
// Old way, no CSS
SQL_QUERY_ESC("INSERT INTO `{?_MYSQL_PREFIX?}_extensions` (`ext_name`, `ext_active`, `ext_version`) VALUES ('%s','%s','%s')",
array(
getCurrentExtensionName(),
getExtensionAlwaysActive(),
getCurrentExtensionVersion()
), __FUNCTION__, __LINE__);
}
// Remove cache file(s) if extension is active
runFilterChain('post_extension_installed', array(
'pool' => 'extension',
'ext_name' => getCurrentExtensionName(),
'task_id' => $task_id
));
// Re-init queries and notes
initExtensionSqls(true);
initExtensionNotes();
// Mark it as installed
$GLOBALS['ext_is_installed'][getCurrentExtensionName()] = true;
// In normal mode return a true on success
$ret = true;
} elseif (getExtensionDryRun() === true) {
// In "dry-run" mode return array with all SQL commands
$ret = getExtensionSqls();
// Re-init queries and notes
initExtensionSqls(true);
initExtensionNotes();
} 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 (($task_id > 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($task_id)), __FUNCTION__, __LINE__);
}
// Is this the sql_patches?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . '/' . getExtensionMode());
if ((getCurrentExtensionName() == 'sql_patches') && ((getExtensionMode() == 'register') || (getExtensionMode() == 'remove')) && (!getExtensionDryRun()) && ($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 . ' - EXIT!');
//* DEBUG: */ print getCurrentExtensionName().':'.print_r($ret, true).'
';
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();
// By default no SQL has been executed
$sqlRan = false;
// Load extension in detected mode
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ":ext_name[{$ext_id}]=".getCurrentExtensionName()."");
loadExtension(getCurrentExtensionName(), $load_mode, '', false);
// Init these SQLs
initSqls();
setSqlsArray(getExtensionSqls());
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, ":SQLs::count=".countSqls()."");
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_AFFECTEDROWS() == 1)) || ($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__.': 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);
// 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) {
// Extensions are all inactive during installation
if ((isInstallationPhase()) || (empty($ext_name))) 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 (isset($GLOBALS['ext_loaded'][$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__ . ': 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'])) || (getOutputMode() != 0)) {
// 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__, ": ret={$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;
// Set current SQL name
setCurrentExtensionName($ext_name);
// Init arrays
initExtensionSqls();
initExtensionNotes();
initIncludePool('extension');
// Load extension in test mode
loadExtension($ext_name, 'test', $ext_ver, getExtensionDryRun());
// Save version history
$history = getExtensionVersionHistory();
// Remove old SQLs array to prevent possible bugs
initExtensionSqls();
// Check if version is updated
//* DEBUG: */ print getCurrentExtensionName().'/'.$ext_name.':'.getThisExtensionVersion().'/'.$ext_ver.'/'.intval(is_array($history)).'
';
if (((getThisExtensionVersion() != $ext_ver) || (getExtensionDryRun())) && (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()], getExtensionDryRun());
// 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), getExtensionDryRun());
} else {
// Register new extension
$test = registerExtension($ext_depend, 0, getExtensionDryRun(), 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 (getExtensionDryRun() === 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' => getExtensionDryRun()));
if (getExtensionDryRun() === 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 = getMessage('ADMIN_SQLS_EXECUTED_ON_REMOVAL');
} // END - if
// Init variables
$OUT = '';
// Do we have queries?
if ((isExtensionInstalledAndNewer('sql_patches', '0.0.7')) && (getConfig('verbose_sql') == 'Y')) {
// Init switch color
$SW = 2;
// Get all SQLs
foreach (getExtensionSqls() as $sqls) {
// New array format is recursive
foreach ($sqls as $idx => $sql) {
// Trim out spaces
$sql = trim($sql);
// Output command if set
if (!empty($sql)) {
// Prepare output for template
$content = array(
'sw' => $SW,
'i' => ($idx+1),
'sql' => $sql
);
// Load row template
$OUT .= loadTemplate('admin_ext_sql_row', true, $content);
// Switch color
$SW = 3 - $SW;
} // 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_ext_sql_table', true, $content);
} elseif ((isExtensionInstalledAndNewer('sql_patches', '0.0.7')) && (getConfig('verbose_sql') == 'Y')) {
// No addional SQL commands to run
$OUT = loadTemplate('admin_settings_saved', true, getMessage('ADMIN_NO_ADDITIONAL_SQLS'));
} // 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__ . ': 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) {
// 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__);
// Extension has been activated?
if (SQL_AFFECTEDROWS() == 1) {
// Then run all queries
doExtensionSqls(getExtensionId($ext_name), 'activate');
} // END - if
}
// Deactivate given extension
function doDeactivateExtension($ext_name) {
// 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__);
// Extension has been activated?
if (SQL_AFFECTEDROWS() == 1) {
// Then run all queries
doExtensionSqls(getExtensionId($ext_name), 'deactivate');
// Create new task
createExtensionDeactivationTask($ext_name);
// Notify the admin
sendAdminNotification(
getMessage('ADMIN_SUBJECT_EXTENSION_DEACTIVATED'),
'admin_ext_deactivated',
array('ext_name' => $ext_name)
);
} // END - if
}
// 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_SUBJ--}';
// Is the extension there?
if (isExtensionInstalled($ext_name)) {
// Check if task is not there
if (determineTaskIdBySubject($subject) == '0') {
// Create extension update-task
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));
}
}
// Creates a new task for newly installed extension
function createNewExtensionTask ($adminId, $subject, $ext) {
// Not installed and do we have created a task for the admin?
if ((determineTaskIdBySubject($subject) == '0') && (!isExtensionInstalled($ext))) {
// Set default message if ext-foo is missing
$message = getMaskedMessage('ADMIN_EXTENSION_TEXT_FILE_MISSING', $ext);
// Template file
$tpl = sprintf("%stemplates/%s/html/ext/ext_%s.tpl",
getConfig('PATH'),
getLanguage(),
$ext
);
// Load text for task if found
if (isFileReadable($tpl)) {
// Load extension's own text template (HTML!)
$message = loadTemplate('ext_' . $ext, true);
} 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!
createNewTask($subject, $message, 'EXTENSION', 0, $adminId, false);
} // END - if
}
// Creates a task for automatically deactivated (deprecated) extension
function createExtensionDeactivationTask ($ext) {
// Create subject line
$subject = sprintf("[%s:] %s", $ext, getMessage('TASK_SUBJ_EXTENSION_DEACTIVATED'));
// Not installed and do we have created a task for the admin?
if ((determineTaskIdBySubject($subject) == '0') && (isExtensionInstalled($ext))) {
// Task not created so add it
createNewTask($subject, SQL_ESCAPE(loadTemplate('task_EXTENSION_deactivated', true, $ext)), 'EXTENSION_DEACTIVATION');
} // END - if
}
// Checks if the module has a menu
function ifModuleHasMenu ($mod, $forceDb = false) {
// All is false by default
$ret = false;
// Extension installed and newer than or has version 0.1.2?
if (isExtensionInstalledAndNewer('cache', '0.1.2')) {
// Cache version is okay, so let's check the cache!
if (isset($GLOBALS['cache_array']['modules']['has_menu'][$mod])) {
// Check module cache and count hit
$ret = ($GLOBALS['cache_array']['modules']['has_menu'][$mod] == 'Y');
incrementStatsEntry('cache_hits');
} elseif (isset($GLOBALS['cache_array']['extension']['ext_menu'][$mod])) {
// Check cache and count hit
$ret = ($GLOBALS['cache_array']['extension']['ext_menu'][$mod] == 'Y');
incrementStatsEntry('cache_hits');
} else {
// Admin/guest/member/sponsor modules have always a menu!
$ret = in_array($mod, array('admin', 'index', 'login', 'sponsor'));
}
} elseif ((isExtensionInstalledAndNewer('sql_patches', '0.3.6')) && ((!isExtensionActive('cache')) || ($forceDb === true))) {
// Check database for entry
$result = SQL_QUERY_ESC("SELECT `has_menu` FROM `{?_MYSQL_PREFIX?}_mod_reg` WHERE `module`='%s' LIMIT 1",
array($mod), __FUNCTION__, __LINE__);
// Entry found?
if (SQL_NUMROWS($result) == 1) {
// Load "has_menu" column
$data = SQL_FETCHARRAY($result);
// Fake cache... ;-)
$GLOBALS['cache_array']['extension']['ext_menu'][$mod] = $data['has_menu'];
// Does it have a menu?
$ret = ($data['has_menu'] == 'Y');
} // END - if
// Free memory
SQL_FREERESULT($result);
} elseif (!isExtensionInstalled('sql_patches')) {
// No sql_patches installed, so maybe in admin/guest/member/sponsor area or no admin registered?
$ret = in_array($mod, array('admin', 'index', 'login', 'sponsor')); // Then there is a menu!
} else {
// Unsupported state!
logDebugMessage(__FUNCTION__, __LINE__, 'This should never be reached.');
}
// Return status
return $ret;
}
// 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 ($ver) {
// Init notes/content
$out = ''; $content = array();
// Is do we have verbose output enabled?
if ((!isExtensionActive('sql_patches')) || (getConfig('verbose_sql') == 'Y')) {
// Update notes found?
if (isExtensionUpdateNoteSet($ver)) {
// Update notes found
$content = array(
'ver' => $ver,
'notes' => getExtensionUpdateNotes($ver)
);
// Reset them
setExtensionUpdateNotes('', $ver);
} elseif (($ver == '0.0') || ($ver == '0.0.0')) {
// Initial release
$content = array(
'ver' => $ver,
'notes' => getMessage('INITIAL_RELEASE')
);
} else {
// No update notes found!
$content = array(
'ver' => $ver,
'notes' => getMessage('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 getExtensionAlwaysActive () {
return $GLOBALS['ext_always_active'][getCurrentExtensionName()];
}
// Checks wether the current extension is always active
function isExtensionAlwaysActive () {
return (getExtensionAlwaysActive() == 'Y');
}
// Setter for EXT_VERSION flag
function setThisExtensionVersion ($version) {
$GLOBALS['ext_version'][getCurrentExtensionName()] = (string) $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 addExtensionUpdateDependency ($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?
/* DEBUG:
if ((isset($updateDepends, $GLOBALS['ext_running_updates'][getCurrentExtensionName()])) && (in_array($updateDepends, getExtensionUpdatesRunning()))) {
// Double-adding isn't fine, too
debug_report_bug(__FUNCTION__ . '() 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__ . '() 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__ . '() 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 removeExtensionUpdateDependency ($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 ($verHistory) {
$GLOBALS['ext_ver_history'][getCurrentExtensionName()] = (array) $verHistory;
}
// Getter for EXT_VER_HISTORY array
function getExtensionVersionHistory () {
return $GLOBALS['ext_ver_history'][getCurrentExtensionName()];
}
// Setter for EXT_UPDATE_NOTES
function setExtensionUpdateNotes ($updateNotes, $ver='') {
// . '/' . getCurrentExtensionVersion()
//* DEBUG: */ debug_report_bug(__FUNCTION__.':' . getCurrentExtensionName() . '/' . getExtensionMode() . '/' . $ver . '=' . $updateNotes);
if (empty($ver)) {
$GLOBALS['ext_update_notes'][getCurrentExtensionName()][getCurrentExtensionVersion()] = (string) $updateNotes;
} else {
$GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ver] = (string) $updateNotes;
}
}
// Getter for EXT_UPDATE_NOTES
function getExtensionUpdateNotes ($ver) {
return $GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ver];
}
// Checks if ext_update_notes is set
function isExtensionUpdateNoteSet ($ver) {
return isset($GLOBALS['ext_update_notes'][getCurrentExtensionName()][$ver]);
}
// Init extension notice
function initExtensionNotes () {
$GLOBALS['ext_notes'][getCurrentExtensionName()] = '';
}
// Append extension notice
function appendExtensionNotes ($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'])) {
return $GLOBALS['curr_EXTENSION_name'];
} // END - if
// Not set!
debug_report_bug(__FUNCTION__.": curr_EXTENSION_name not initialized. Please execute initExtensionSqls() before calling this function.");
}
// Init SQLs array for current extension
function initExtensionSqls ($force = false) {
// Auto-init the array or if forced
if ((!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()])) || ($force === true)) {
// 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
$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()];
}
// 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 */ print __FUNCTION__.': ENTRY!
';
if (isset($GLOBALS['cache_array']['extension']['ext_name'])) {
// Load all found extensions if found
//* DEBUG */ print __FUNCTION__.': CACHE - START!
';
foreach ($GLOBALS['cache_array']['extension']['ext_name'] as $key => $ext_name) {
// Load it
//* DEBUG */ print __FUNCTION__.': '.$ext_name.' - START
';
loadExtension($ext_name, 'init', getExtensionVersion($ext_name));
//* DEBUG */ print __FUNCTION__.': '.$ext_name.' - END
';
} // END - foreach
//* DEBUG */ print __FUNCTION__.': CACHE - END!
';
} // END - if
//* DEBUG */ print __FUNCTION__.': 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: */ print __FUNCTION__.': '.getCurrentExtensionName().'='.intval($dry_run).'
';
$GLOBALS['ext_dry_run'] = (bool) $dry_run;
}
// Getter for dry-run
function getExtensionDryRun () {
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",
getConfig('PATH'),
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) {
// Default is no language file
$hasLanguage = false;
// Do we have cache?
if (isset($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name])) {
// Then use it
$hasLanguage = ($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] == 'Y');
// 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] = 'Y';
}
// 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) {
if (isset($GLOBALS['cache_array']['extension']['ext_func'][$ext_name])) {
// Just count cache hits
incrementStatsEntry('cache_hits');
} else {
// Construct FQFN for functions file
$funcsInclude = sprintf("inc/libs/%s_functions.php", $ext_name);
// Is this include there?
if ((isFileReadable($funcsInclude)) && (!isset($GLOBALS['ext_loaded']['funcs'][$ext_name])) && (getExtensionMode() == 'test')) {
// Cache it!
$GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'Y';
} else {
// Cache it!
$GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = 'N';
}
}
// Return result
return ($GLOBALS['cache_array']['extension']['ext_func'][$ext_name] == 'Y');
}
// 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 detected.", $action, $what));
}
}
// 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 detected.", $action, $what));
}
}
// 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 detected.", $action, $what));
}
}
// 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 detected.", $action, $what));
}
}
// Enables/disables productive mode for current extension (used only while
// registration).
function enableExtensionProductive ($isProductive = true) {
$GLOBALS['ext_productive'][getCurrentExtensionName()] = (bool) $isProductive;
}
// Checks wether the extension is in productive phase. If not set, development
// phase (=false) is assumed.
function isExtensionProductive () {
return ((isset($GLOBALS['ext_productive'][getCurrentExtensionName()])) && ($GLOBALS['ext_productive'][getCurrentExtensionName()] === true));
}
// [EOF]
?>