0) || (isInstallationPhase())) {
// Try to register the extension
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_update=' . $ext_update . ',updateTaskId=' . $updateTaskId . ',isExtensionDryRun()=' . intval(isExtensionDryRun()));
$processResult = registerExtension($ext_update, $updateTaskId, isExtensionDryRun(), TRUE, $ext_name);
// Reset extension name
setCurrentExtensionName($ext_name);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',ext_update=' . $ext_update . ',processResult=' . intval($processResult));
} // 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!
$processResult = TRUE;
} else {
// Nothing to register / update before...
$processResult = TRUE;
}
} else {
// Required file for update does not exists!
$processResult = 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!
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',processResult=true,countExtensionUpdateDependencies()=0 - Test passed!');
$processResult = TRUE;
} // END - if
// Switch back to register mode
setExtensionMode('register');
// Remains true if extension registration reports no failures
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',processResult=' . intval($processResult));
$processResult = (($processResult === TRUE) && (isExtensionReportingFailure() === FALSE));
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . ',processResult=' . intval($processResult));
// Does everthing before wents ok?
if ($processResult === 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() != '')) {
// Remove task from system when id and extension's name is valid
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_task_system` WHERE `id`=%s AND `status`='NEW' LIMIT 1",
array(bigintval($taskId)), __FUNCTION__, __LINE__);
}
// @TODO This redirect is still needed to register sql_patches! Please try to avoid it
if (($ret === TRUE) && ($isDryRun === FALSE) && ($ext_name == 'sql_patches') && (!isInstallationPhase())) {
/*
* This is a really dirty hack to prevent an error about a missing
* configuration entry which should be there after registration of
* ext-sql_patches.
*/
redirectToRequestUri();
} // END - if
// Return status code
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',currName=' . getCurrentExtensionName() . ',processResult=' . intval($processResult) . ',ret=' . intval($ret) . ' - 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 but installation phase is okay
if ((!isAdmin()) && (!isInstallationPhase())) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_id=' . $ext_id. ',load_mode=' . $load_mode . ',isAdmin()=' . intval(isAdmin()) . ',isInstallationPhase()=' . intval(isInstallationPhase()) . ' - ABORT!');
return FALSE;
} // END - if
// 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.0', FALSE);
// Init these SQLs
initSqls();
setSqlsArray(getExtensionSqls());
// Debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'SQLs::count=' . countSqls());
// Are there 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 whether the given extension is installed
function isExtensionInstalled ($ext_name) {
// We don't like empty extension names here
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - ENTERED!');
if (empty($ext_name)) {
// Please fix them all
reportBug(__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
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - CACHE!');
$isInstalled = $GLOBALS['ext_is_installed'][$ext_name];
} elseif (isset($GLOBALS['cache_array']['extension']['ext_id'][$ext_name])) {
// Found!
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - FOUND!');
$isInstalled = TRUE;
// Count cache hits
incrementStatsEntry('cache_hits');
} elseif (isInstallationPhase()) {
// Extensions are all inactive/not installed during installation
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - installation phase detected.');
} else {
// Look in database
$ext_id = getExtensionId($ext_name);
// Is there a record?
$isInstalled = ($ext_id > 0);
// Log debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_id=' . $ext_id . ',isInstalled=' . intval($isInstalled));
// Is it installed, then cache the entry
if ($isInstalled === TRUE) {
// Dummy call (get is okay here)
getExtensionId($ext_name, TRUE);
} // END - if
// Remember the status
$GLOBALS['ext_is_installed'][$ext_name] = $isInstalled;
}
// Return status
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',isInstalled=' . intval($isInstalled) . ' - EXIT!');
return $isInstalled;
}
// Check if given extension is active
function isExtensionActive ($ext_name) {
if (isInstallationPhase()) {
// Extensions are all inactive during installation
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Extensions are always inactive while installation phase. ext_name=' . $ext_name);
return FALSE;
} elseif (empty($ext_name)) {
// Empty extension names must befixed
reportBug(__FUNCTION__, __LINE__, 'Empty extension name provided.');
} elseif (!isExtensionInstalled($ext_name)) {
// Not installed extensions are always inactive
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Not installed extensions are always inactive. ext_name=' . $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 (isExtensionLoaded($ext_name)) {
// @TODO Extension is loaded, what next?
reportBug(__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
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - ENTERED!');
$data['ext_version'] = 'false';
// Empty extension name should be fixed!
if (empty($ext_name)) {
// Please report this bug!
reportBug(__FUNCTION__, __LINE__, 'ext_name is empty which is not allowed here.');
} // END - if
// Extensions are all inactive during installation
if (isInstallationPhase()) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',force=' . intval($force) . ' - Installation phase detected, returning empty version.');
return '';
} // END - if
// Is the cache written?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - Checking cache ...');
if (isset($GLOBALS['cache_array']['extension']['ext_version'][$ext_name])) {
// Load data from cache
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $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=' . $ext_name . ': DB - '.SQL_NUMROWS($result).'');
// Is the extension there?
if (SQL_NUMROWS($result) == 1) {
// Load entry
$data = SQL_FETCHARRAY($result);
// Set cache
$GLOBALS['cache_array']['extension']['ext_version'][$ext_name] = $data['ext_version'];
} elseif (isDebugModeEnabled()) {
// Not found, may happen while an extension is uninstalled
logDebugMessage(__FUNCTION__, __LINE__, sprintf("Cannot find extension %s in database!", $ext_name));
}
// Free result
SQL_FREERESULT($result);
}
// Extension version should not be invalid
if (($data['ext_version'] == 'false') && ($force === FALSE)) {
// Please report this trouble
reportBug(__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, $isDryRun = FALSE, $ignoreDependencies = FALSE) {
// Only admins are allowed to update extensions
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_ver=' . $ext_ver . ',isDryRun=' . intval($isDryRun) . ',ignoreDependencies=' . intval($ignoreDependencies) . ' - ENTERED!');
if ((!isAdmin()) || (empty($ext_name))) {
// Called as non-admin or empty extension
reportBug(__FUNCTION__, __LINE__, 'Called as non-admin (isAdmin()=' . intval(isAdmin()) . '), or empty extension name. ext_name=' . $ext_name);
} // END - if
// Set current SQL name
setCurrentExtensionName($ext_name);
// Is this extension update already running?
if ((isExtensionUpdateRunning($ext_name, $ignoreDependencies)) && ($isDryRun === FALSE)) {
// This is fine but needs logging ATM
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - already in update phase, all fine.');
//* BUG: */ reportBug(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - already in update phase, please investigate!');
return TRUE;
} // END - if
// 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: */ logDebugMessage(__FUNCTION__, __LINE__, getCurrentExtensionName() . '/' . $ext_name . ':' . getThisExtensionVersion() . '/' . $ext_ver . '/' . intval(is_array($history)));
if (((getThisExtensionVersion() != $ext_ver) || (isExtensionDryRun())) && (is_array($history))) {
// Search for starting point (-1 for making 0.0 -> 0.0.0 switch work)
$start = -1;
if ($ext_ver != '0.0') {
$start = array_search($ext_ver, $history);
} // END - if
// And load SQL queries in order of version history
for ($idx = ($start + 1); $idx < count($history); $idx++) {
// 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!
$processResult = updateExtension($ext_depend, getExtensionVersion($ext_depend), isExtensionDryRun(), TRUE);
} else {
// Register new extension
$processResult = registerExtension($ext_depend, NULL, isExtensionDryRun());
}
} // END - if
} // END - foreach
// Set name back
setCurrentExtensionName($ext_name);
// Set extension version here
setCurrentExtensionVersion($ext_ver);
} // 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
//* DEBUG: */logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_ver=' . $ext_ver . ',isDryRun=' . intval($isDryRun) . ',ignoreDependencies=' . intval($ignoreDependencies) . ' - EXIT!');
}
// Output verbose SQL table for extension
function addExtensionVerboseSqlTable ($title = '{--ADMIN_SQLS_EXECUTED_ON_REMOVAL--}') {
// Empty title?
if (empty($title)) {
// Then abort here
reportBug(__FUNCTION__, __LINE__, 'title is empty.');
} // END - if
// Init variables
$OUT = '';
// Is there queries?
if (isVerboseSqlEnabled()) {
// Are there 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(array('{', '}'), array('{', '}'), 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(
'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_EXTENSION_VERBOSE_SQLS_404--}', 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!
reportBug(__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';
// Is there 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 whether the given extension name is valid
function isExtensionNameValid ($ext_name) {
// Is there 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 whether 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
reportBug(__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, $inRebuild = FALSE) {
// Is the extension installed?
if (!isExtensionInstalled($ext_name)) {
// Non-installed extensions cannot be activated
reportBug(__FUNCTION__, __LINE__, 'Tried to deactivate non-installed extension ' . $ext_name . ',getExtensionMode()=' . getExtensionMode());
} // 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);
// Do not rebuild cache if it is already been rebuild
if ($inRebuild === FALSE) {
// Rebuild cache
rebuildCache('extension', 'extension');
} // END - if
// Notify the admin
sendAdminNotification(
'{--ADMIN_EXTENSION_DEACTIVATED_SUBJECT--}',
'admin_extension_deactivated',
array('ext_name' => $ext_name)
);
}
// 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! :-(
reportBug(__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?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',taskId[' . gettype($taskId) . ']=' . $taskId);
if (((is_null($taskId)) || ($taskId == '0')) && (!isExtensionInstalled($ext_name))) {
// Set default message if ext-foo is missing
$message = '{%message,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?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',taskId[' . gettype($taskId) . ']=' . $taskId);
if (((is_null($taskId)) || ($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) {
// Is it installation phase and table task_system is not found?
if ((isInstallationPhase()) && (!ifSqlTableExists('task_system'))) {
// Then return NULL (not found)
return NULL;
} // END - if
// Default is not found
$data['task_id'] = NULL;
// 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)) && ($ext_ver != '0.0.0')) {
// Update notes found
$content = array(
'ver' => $ext_ver,
'notes' => getExtensionUpdateNotes($ext_ver)
);
// Reset them
setExtensionUpdateNotes('', $ext_ver);
} elseif ($ext_ver == '0.0.0') {
// Is the extension productive?
if (isExtensionProductive(getCurrentExtensionName())) {
// Initial release
$content = array(
'ver' => $ext_ver,
'notes' => '{--ADMIN_EXTENSION_INITIAL_RELEASE--}'
);
} else {
// Not productive
$content = array(
'ver' => $ext_ver,
'notes' => '{--ADMIN_EXTENSION_DEVELOPER_RELEASE--}'
);
}
} else {
// No update notes found
$content = array(
'ver' => $ext_ver,
'notes' => '{--ADMIN_EXTENSION_UPDATE_NOTICES_404--}'
);
}
// 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
array_push($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 whether 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 ($ext_name = NULL) {
// Default is from current (NULL) extension
$isDeprecated = ($GLOBALS['ext_deprecated'][getCurrentExtensionName()] == 'Y');
// Is ext_name set?
if (!is_null($ext_name)) {
// Then use it instead
$isDeprecated = ((isset($GLOBALS['ext_deprecated'][$ext_name])) && ($GLOBALS['ext_deprecated'][$ext_name] == 'Y'));
} // END - if
// Return it
return $isDeprecated;
}
// Setter for EXT_UPDATE_DEPENDS flag
function addExtensionDependency ($updateDepends) {
// Is the update depency empty? (NEED TO BE FIXED!)
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ',extensionMode=' . getExtensionMode() . ' - ENTERED!');
if (empty($updateDepends)) {
// Please report this bug!
reportBug(__FUNCTION__, __LINE__, 'updateDepends is empty: currentExtension=' . getCurrentExtensionName());
} // END - if
// Is it not yet added?
if ((isset($updateDepends, $GLOBALS['ext_running_updates'][getCurrentExtensionName()])) && (in_array($updateDepends, getExtensionUpdatesRunning()))) {
/*
* Double-adding happens when the extension and an update of the same
* extension requires the same other extension again.
*/
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'updateDepends=' . $updateDepends . ',extensionMode=' . getExtensionMode() . ',currentExtension=' . getCurrentExtensionName() . ' - called twice.');
return;
} // END - if
// Add it to the list of extension update depencies map
array_push($GLOBALS['ext_update_depends'][getCurrentExtensionName()], $updateDepends);
// Init array
if ((!isset($GLOBALS['ext_running_updates'][getCurrentExtensionName()])) || (!is_array($GLOBALS['ext_running_updates'][getCurrentExtensionName()]))) {
$GLOBALS['ext_running_updates'][getCurrentExtensionName()] = array();
} // END - if
// Remember it in the list of running updates
array_push($GLOBALS['ext_running_updates'][getCurrentExtensionName()], $updateDepends);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName() . '/' . $updateDepends . ',extensionMode=' . getExtensionMode() . ' - EXIT!');
}
// Getter for running updates
function getExtensionUpdatesRunning () {
return $GLOBALS['ext_running_updates'][getCurrentExtensionName()];
}
// Checks whether 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...
reportBug(__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
reportBug(__FUNCTION__, __LINE__, '() already called! ext_name=' . $ext_name);
} // END - if
// Then add it!
array_push($GLOBALS['ext_register_running'], $ext_name);
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'Registration in progress: ext_name=' . $ext_name . ' - EXIT!');
}
// Checks whether EXT_UPDATE_DEPENDS is initialized
function isExtensionUpdateDependenciesInitialized () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currName=' . getCurrentExtensionName());
return (isset($GLOBALS['ext_update_depends'][getCurrentExtensionName()]));
}
// Checks whether an update is already running for given extension
function isExtensionUpdateRunning ($ext_name, $ignoreDependencies = FALSE) {
// Current and given extensions means whole array
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',ignoreDependencies=' . intval($ignoreDependencies) . ' - ENTERED!');
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?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',depends=' . print_r($depends, TRUE));
if (($ext1 == $ext_name) || ((in_array($ext_name, $depends)) && ($ignoreDependencies === FALSE))) {
// Found
$isRunning = TRUE;
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext1=' . $ext1 . ',ext_name=' . $ext_name . ',isRunning=true - FOUND!');
break;
} // END - if
} // END - foreach
// Return result
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'currentExtension=' . getCurrentExtensionName() . ',ext_name=' . $ext_name . ',ignoreDependencies=' . intval($ignoreDependencies) . ', isRunning=' . intval($isRunning) . ' - ALT-EXIT!');
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 . ',ignoreDependencies=' . intval($ignoreDependencies) . ', isRunning=' . intval($isRunning) . ' - EXIT!');
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() . '=' . count($GLOBALS['ext_update_depends'][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());
// Debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',key[' . gettype($key) . ']=' . $key);
// 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()])) {
// Initialize update iterator
initExtensionUpdateIterator();
} // END - if
// 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 enableExtensionReportingFailure ($reportsFailure = FALSE) {
$GLOBALS['ext_reports_failure'] = (bool) $reportsFailure;
}
// Getter for EXT_REPORTS_FAILURE flag
function isExtensionReportingFailure () {
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 () {
// Is it set?
if (!isset($GLOBALS['ext_ver_history'][getCurrentExtensionName()])) {
// Then abort here to a avoid an ugly "Undefined index" error
reportBug(__FUNCTION__, __LINE__, 'Extension ext-' . getCurrentExtensionName() . ' has no history set! Is this extension empty?');
} // END - if
// Return the history
return $GLOBALS['ext_ver_history'][getCurrentExtensionName()];
}
// Setter for EXT_UPDATE_NOTICES
function setExtensionUpdateNotes ($updateNotes, $ext_ver = '') {
//
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()=' . getCurrentExtensionName() . ',getExtensionMode()=' . getExtensionMode() . ',ext_ver=' . $ext_ver . '/' . getCurrentExtensionVersion() . ',updateNotes(length)=' . 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_NOTICES
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
reportBug(__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(length)=' . 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!
reportBug(__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) {
// Is is the array there?
if ((!isset($GLOBALS['ext_sqls'][getCurrentExtensionName()][getCurrentExtensionVersion()])) || (!is_array($GLOBALS['ext_sqls'][getCurrentExtensionName()][getCurrentExtensionVersion()]))) {
// Init array
$GLOBALS['ext_sqls'][getCurrentExtensionName()][getCurrentExtensionVersion()] = array();
} // END - if
// Is the SQL statement empty?
if (empty($sql)) {
/*
* Abort here as this may happen if getExtensionMode() is 'activate' or
* 'deactivate'. This means that for 'mode' are no SQL statements
* specified.
*/
return;
} // END - if
// Add it
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',ext_version=' . getCurrentExtensionVersion() . ',sql=' . $sql);
array_push($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
reportBug(__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
reportBug(__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 whether 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
array_push($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 () {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ENTERED!');
// Init notification pool
initIncludePool('notify');
// Are there some entries?
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
// Run any notifications
runFilterChain('load_includes', 'notify');
//* 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 ($isDryRun = TRUE) {
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'getCurrentExtensionName()='.getCurrentExtensionName().',isDryRun='.intval($isDryRun));
$GLOBALS['ext_isDryRun'] = (bool) $isDryRun;
}
// Getter for dry-run
function isExtensionDryRun () {
return $GLOBALS['ext_isDryRun'];
}
// 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
reportBug(__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
// Remove from other caches as well
unset($GLOBALS['ext_is_installed'][$ext_name]);
unset($GLOBALS['loaded_extension'][$ext_name]);
}
// "Getter" for 'extension has a CSS file' (with same name, of course)
function getExtensionHasCss () {
// Is there cache?
if (!isset($GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()])) {
// Construct FQFN for check
$FQFN = sprintf("%stheme/%s/css/%s.css",
getPath(),
getCurrentTheme(),
getCurrentExtensionName()
);
// Is it there?
$GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()] = convertBooleanToYesNo(isFileReadable($FQFN));
} // END - if
// Return it
return $GLOBALS[__FUNCTION__][getCurrentExtensionName()][getCurrentTheme()];
}
// Checks whether the given extension has a language file
function ifExtensionHasLanguageFile ($ext_name) {
// Is there cache?
if (isset($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name])) {
// Count cache hits
incrementStatsEntry('cache_hits');
} else {
// Determine it and put it in cache
$GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] = convertBooleanToYesNo(isLanguageIncludeReadable($ext_name));
}
// Return result
return ($GLOBALS['cache_array']['extension']['ext_lang'][$ext_name] == 'Y');
}
// Load current extension's include file
function loadCurrentExtensionInclude () {
// Is it readable?
if (!isExtensionIncludeReadable()) {
// Not readable
reportBug(__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 whether an extension is readable
function isExtensionIncludeReadable ($ext_name = '') {
// If empty, use current
if (empty($ext_name)) {
$ext_name = getCurrentExtensionName();
} // END - if
// 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?
$isIncludeFound = ((isFileReadable($funcsInclude)) && (!isExtensionLibraryLoaded($ext_name)) && (getExtensionMode() == 'test'));
// And put in cache, converted
$GLOBALS['cache_array']['extension']['ext_func'][$ext_name] = convertBooleanToYesNo($isIncludeFound);
}
// Return result
//* 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, $comment) {
// Is the table not there?
if (!ifSqlTableExists($tableName)) {
// Is not found, so add it
addExtensionSql('CREATE TABLE
`{?_MYSQL_PREFIX?}_' . $tableName . '` (' . $sql . ')
ENGINE = {?_TABLE_TYPE?}
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT ' . chr(39) . $comment . chr(39));
} else {
// Is already there
logDebugMessage(__FUNCTION__, __LINE__, 'The table ' . $tableName . ' is already created.');
}
}
// Adds a DROP TABLE statement if the requested tabled is there
function addDropTableSql ($tableName) {
// Is the table there?
if (ifSqlTableExists($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['ifSqlTableExists'][$tableName] = FALSE;
} // END - if
}
// Adds a RENAME TABLE stament if 'from' table exist and 'to' table not
function addRenameTableSql ($fromTable, $toTable) {
// Make sure both are not the same
assert($fromTable != $toTable);
// Is renaming required?
if ((ifSqlTableExists($fromTable)) && (!ifSqlTableExists($toTable))) {
// Add it
addExtensionSql('RENAME TABLE `{?_MYSQL_PREFIX?}_' . $fromTable . '` TO `{?_MYSQL_PREFIX?}_' . $toTable . '`');
// Mark both tables
$GLOBALS['ifSqlTableExists'][$fromTable] = FALSE;
$GLOBALS['ifSqlTableExists'][$toTable] = TRUE;
} // 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, $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','N','Y',%s)",
$action,
$title,
bigintval($sort)
);
} else {
// Add sub menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_guest_menu` (`action`, `what`, `title`, `visible`, `locked`, `sort`) VALUES ('%s','%s','%s','N','Y',%s)",
$action,
$what,
$title,
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 detected.", $action, $what, $title));
}
}
// Adds a member menu to the SQL queue if the menu entry is not found
function addMemberMenuSql ($action, $what, $title, $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','N','Y',%s)",
$action,
$title,
bigintval($sort)
);
} else {
// Add sub menu
$sql = sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_member_menu` (`action`, `what`, `title`, `visible`, `locked`, `sort`) VALUES ('%s','%s','%s','N','Y',%s)",
$action,
$what,
$title,
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 detected.", $action, $what, $title));
}
}
// 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 ALTER TABLE `foo` ADD sql if not found
function addExtensionAddTableColumnSql ($tableName, $columnName, $columnSql) {
// Is the column there?
if (!ifSqlTableColumnExists('{?_MYSQL_PREFIX?}_' . $tableName, $columnName)) {
// Then add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` ADD `' . $columnName . '` ' . $columnSql);
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'tableName=' . $tableName . ',columnName=' . $columnName . ',columnSql=' . $columnSql . ': does already exist.');
}
}
// Add ALTER TABLE `foo` ADD INDEX sql if not found
function addExtensionAddTableIndexSql ($tableName, $indexName, $columnSql) {
// Is the column there?
if (!ifSqlTableIndexExist('{?_MYSQL_PREFIX?}_' . $tableName, $indexName)) {
// Then add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` ADD INDEX `' . $indexName . '` ' . $columnSql);
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'tableName=' . $tableName . ',indexName=' . $indexName . ',columnSql=' . $columnSql . ': does already exist.');
}
}
// Add ALTER TABLE `foo` ADD UNIQUE INDEX sql if not found
function addExtensionAddTableUniqueSql ($tableName, $indexName, $columnSql) {
// Is the column there?
if (!ifSqlTableIndexExist('{?_MYSQL_PREFIX?}_' . $tableName, $indexName)) {
// Then add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` ADD UNIQUE INDEX `' . $indexName . '` ' . $columnSql);
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'tableName=' . $tableName . ',indexName=' . $indexName . ',columnSql=' . $columnSql . ': does already exist.');
}
}
// Add ALTER TABLE `foo` ADD FULLTEXT sql if not found
function addExtensionAddTableFulltextSql ($tableName, $indexName, $columnSql) {
// Is the column there?
if (!ifSqlTableIndexExist('{?_MYSQL_PREFIX?}_' . $tableName, $indexName)) {
// Then add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` ADD FULLTEXT `' . $indexName . '` ' . $columnSql);
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'tableName=' . $tableName . ',indexName=' . $indexName . ',columnSql=' . $columnSql . ': does already exist.');
}
}
// Add ALTER TABLE `foo` CHANGE sql if not found
function addExtensionChangeTableColumnSql ($tableName, $fromColumnName, $toColumnName, $columnSql) {
// Is the column there?
if ((ifSqlTableColumnExists('{?_MYSQL_PREFIX?}_' . $tableName, $fromColumnName)) && (($fromColumnName == $toColumnName) || (!ifSqlTableColumnExists('{?_MYSQL_PREFIX?}_' . $tableName, $toColumnName)))) {
// Then add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` CHANGE `' . $fromColumnName . '` `' . $toColumnName . '` ' . $columnSql);
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'tableName=' . $tableName . ',fromColumnName=' . $fromColumnName . ',toColumnName=' . $toColumnName . ',columnSql=' . $columnSql . ': Cannot be changed.');
}
}
// Add ALTER TABLE `foo` DROP sql if not found
function addExtensionDropTableColumnSql ($tableName, $columnName) {
// Is the column there?
if (ifSqlTableColumnExists('{?_MYSQL_PREFIX?}_' . $tableName, $columnName)) {
// Then add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` DROP `' . $columnName . '`');
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'tableName=' . $tableName . ',columnName=' . $columnName . ': does not exist.');
}
}
// Add ALTER TABLE `foo` DROP INDEX sql if not found
function addExtensionDropTableIndexSql ($tableName, $indexName) {
// Is the column there?
if (ifSqlTableColumnExists('{?_MYSQL_PREFIX?}_' . $tableName, $indexName)) {
// Then add it
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_' . $tableName . '` DROP INDEX `' . $indexName . '`');
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'tableName=' . $tableName . ',indexName=' . $indexName . ': does not exist.');
}
}
// Add configuration entry if not found for actual extension
function addConfigAddSql ($columnName, $columnSql) {
// Is the column there?
if (!ifSqlTableColumnExists('{?_MYSQL_PREFIX?}_config', $columnName)) {
// Not found, so add it
addExtensionAddTableColumnSql('config', $columnName, $columnSql);
} elseif (isDebugModeEnabled()) {
// Add debug line
logDebugMessage(__FUNCTION__, __LINE__, 'Configuration entry ' . $columnName . ' already created. columnSql=' . $columnSql);
}
}
// Drop configuration entry if found for actual extension
function addConfigDropSql ($columnName) {
// Is the column there?
if (ifSqlTableColumnExists('{?_MYSQL_PREFIX?}_config', $columnName)) {
// Found, so add it
addExtensionDropTableColumnSql('config', $columnName);
} elseif (isDebugModeEnabled()) {
// Add debug line, reportBug() would cause some extenion updates fail
logDebugMessage(__FUNCTION__, __LINE__, 'Configuration entry ' . $columnName . ' not found.');
}
}
// Change configuration entry for actual extension
function addConfigChangeSql ($oldColumnName, $newColumnName, $columnSql) {
// Add the SQL statement
addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_config` CHANGE `' . $oldColumnName . '` `' . $newColumnName . '` ' . $columnSql);
}
/**
* Checks if given subject is found and if not, adds an SQL query to the
* extension registration queue.
*/
function registerExtensionPointsData ($subject, $columnName, $lockedMode, $paymentMethod) {
// Default is old extension version
$add = '';
// Is the extension equal or newer 0.8.9?
if (((isInstallationPhase()) && ((getExtensionMode() == 'register') || (getExtensionMode() == 'update'))) || (isExtensionInstalledAndNewer('sql_patches', '0.8.9'))) {
// Then add provider
$add = " AND `account_provider`='EXTENSION'";
} // END - if
// Is the 'subject' there?
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ifSqlTableExists(points_data)=' . ifSqlTableExists('points_data') . ',getExtensionMode()=' . getExtensionMode() . ',add=' . $add);
if (((!ifSqlTableExists('points_data')) && ((getExtensionMode() == 'register') || (getExtensionMode() == 'update'))) || (countSumTotalData($subject, 'points_data', 'id', 'subject', TRUE, $add) == 0)) {
// Not found so:
if ((isset($GLOBALS['previous_extension'][getCurrentExtensionName()])) && (!ifSqlTableExists('points_data'))) {
$dummy = $GLOBALS['previous_extension'][getCurrentExtensionName()];
reportBug(__FUNCTION__, __LINE__, 'previous_extension[' . gettype($dummy) . ']=' . $dummy . ',getCurrentExtensionName()=' . getCurrentExtensionName() . ' - Under development, please report this!');
} // END - if
// ... add an SQL query
addExtensionSql(sprintf("INSERT INTO `{?_MYSQL_PREFIX?}_points_data` (`subject`, `column_name`, `locked_mode`, `payment_method`) VALUES ('%s','%s','%s','%s')",
$subject,
$columnName,
$lockedMode,
$paymentMethod
));
} // END - if
}
/**
* Checks if given subject is found and if so, adds an SQL query to the
* extension unregistration queue.
*/
function unregisterExtensionPointsData ($subject) {
// Default is old extension version
$add = '';
// Is the extension equal or newer 0.8.9?
if (isExtensionInstalledAndNewer('sql_patches', '0.8.9')) {
// Then add provider
$add = " AND `account_provider`='EXTENSION'";
} // END - if
// Is the 'subject' there?
if (countSumTotalData($subject, 'points_data', 'id', 'subject', TRUE, $add) == 1) {
// Found one or more, so add an SQL query
addExtensionSql(sprintf("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_points_data` WHERE `subject`='%s'" . $add . " LIMIT 1",
$subject
));
} // END - if
}
// Enables/disables productive mode for current extension (used only while
// registration).
// @TODO This should be rewrittten to allow, more development states, e.g. 'planing','alpha','beta','beta2','stable'
function enableExtensionProductive ($isProductive = TRUE) {
// Log debug message
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . getCurrentExtensionName() . ',isProductive=', intval($isProductive));
// Set it
$GLOBALS['ext_productive'][getCurrentExtensionName()] = (bool) $isProductive;
}
// Checks whether 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
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ' - ENTERED!');
// Is there 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
// Return result
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',isProductive=', intval($GLOBALS[__FUNCTION__][$ext_name]) . ' - EXIT!');
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
reportBug(__FUNCTION__, __LINE__, 'Extension ' . $ext_name . ' is already marked as loaded!');
} // END - if
// Mark it
//* DEBUG: */ logDebugMessage(__FUNCTION__, __LINE__, 'ext_name=' . $ext_name . ',ext_loaded=true');
$GLOBALS['ext_loaded']['ext_name'][$ext_name] = TRUE;
}
// Determine whether 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
reportBug(__FUNCTION__, __LINE__, 'Extension library ' . $ext_name . ' is already marked as loaded!');
} // END - if
// Mark it
$GLOBALS['ext_loaded']['library'][$ext_name] = TRUE;
}
// Determine whether 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]
?>