mirror of
https://github.com/VTECRM/vtenext.git
synced 2026-02-26 16:18:47 +00:00
926 lines
29 KiB
PHP
926 lines
29 KiB
PHP
<?php
|
|
/*************************************
|
|
* SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. <info@vtenext.com>
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
************************************/
|
|
/* crmv@94084 crmv@115378 crmv@145781 crmv@170248 */
|
|
|
|
require_once('include/BaseClasses.php');
|
|
require_once('include/utils/Cache/CacheStorage.php');
|
|
|
|
/**
|
|
* This class handles a basic key-value store with various configuration options for VTE.
|
|
* For better performances, it uses a duble cache (file and request)
|
|
*/
|
|
class VTEProperties extends VTEUniqueClass {
|
|
|
|
public $table_name_prop = '';
|
|
|
|
public $use_cache = true;
|
|
public $cache_mode = 'session'; // file | session
|
|
public $cache_file = 'cache/sys/vteprops.json'; // for file mode
|
|
public $cache_format = 'json'; // for file mode
|
|
public $cache_key = 'vteprops'; // for session mode
|
|
|
|
protected $rcache;
|
|
protected $fcache;
|
|
protected $scache;
|
|
|
|
protected $rcache_initialized = false;
|
|
protected $fcache_initialized = false;
|
|
protected $scache_initialized = false;
|
|
|
|
// overrides valid only during request
|
|
protected $req_overrides = array();
|
|
|
|
// values to save during install
|
|
protected $default_values = array(
|
|
|
|
'smtp_editable' => 1,
|
|
|
|
/* old performance.config values */
|
|
|
|
// Enable log4php debugging only if requried
|
|
'performance.log4php_debug' => 0,
|
|
|
|
// Should the caller information be captured in SQL Logging?
|
|
// It adds little overhead for performance but will be useful to debug
|
|
'performance.sql_log_include_caller' => 0,
|
|
|
|
// crmv@47905 write timing into table tbl_s_logtime
|
|
// log sql timing
|
|
'performance.sql_log_timing' => 0,
|
|
|
|
// log app timing
|
|
'performance.app_log_timing' => 0,
|
|
|
|
// include backtrace while timing
|
|
'performance.backtrace_log_timing' => 0,
|
|
// crmv@47905e
|
|
|
|
// If database default charset is UTF-8, set this to true
|
|
// This avoids executing the SET NAMES SQL for each query!
|
|
'performance.db_default_charset_utf8' => 1,
|
|
|
|
// Compute record change indication for each record shown on listview
|
|
'performance.listview_record_change_indicator' => 0,
|
|
|
|
// Turn-off default sorting in ListView, could eat up time as data grows
|
|
'performance.listview_default_sorting' => 1,
|
|
|
|
// Control DetailView Record Navigation
|
|
'performance.detailview_record_navigation' => 0,
|
|
|
|
// To control the Email Notifications being sent to the Owner
|
|
// By default it is set to true, if it is set to false, then notifications will not be sent
|
|
'performance.notify_owner_emails' => 1,
|
|
|
|
// reduce number of ajax requests on home page, reduce this value if home page widget dont show value
|
|
'performance.home_page_widget_group_size' => 12,
|
|
|
|
// take backup legacy style, whenever an admin user logs out.
|
|
'performance.logout_backup' => 1,
|
|
|
|
// true to use the standard pagination view in the listview, false to skip the count query and show only the next/prev page
|
|
'performance.list_count' => 1, // crmv@137476
|
|
|
|
// Show the record count in the related lists
|
|
'performance.related_list_count' => 1, //crmv@25809
|
|
|
|
// Limit above which the massedits will be done in background
|
|
'performance.listview_mass_check_with_workflow' => 100, //crmv@27096
|
|
|
|
// Check the notifications every this number of seconds
|
|
'performance.notification_interval_time' => 240000, //crmv@35676
|
|
|
|
// crmv@47905bis
|
|
// Enable global VTE Cache
|
|
'performance.cache' => 1,
|
|
|
|
// Type of cache ('session' or 'file')
|
|
'performance.cache_type' => 'session',
|
|
// crmv@47905bise
|
|
|
|
// crmv@181165
|
|
'performance.global_cache' => 'best', // possible values: 0, 'best', 'apcu', 'memcached'
|
|
'performance.global_cache_keys' => array('vte_languages', 'tabdata', 'tablecache'), // vte_languages, sdk, or the specific name of the cache crmv@193294
|
|
'performance.global_cache_config' => '', // not used yet
|
|
// crmv@181165e
|
|
|
|
'performance.add_relation_in_full_page' => 1, //crmv@54245
|
|
|
|
// True if the crmentity table is partitioned by setype
|
|
'performance.crmentity_partitioned' => 0, //crmv@64325
|
|
|
|
// If true, when popup is opened, the first module is automatically selected
|
|
'performance.popup_autoselect_module' => 0, //crmv@65506
|
|
|
|
// set to false to disable almost all temporary tables, good for db replication
|
|
// if you change this from true to false, remember to recalculate the privileges
|
|
'performance.use_temp_tables' => 0, // crmv@63349
|
|
|
|
// set to true to enable logging of Javascript errors. For the log to be written,
|
|
// you also have to activate the LOG4PHP_DEBUG
|
|
'performance.js_debug' => 0, // crmv@92034
|
|
|
|
// crmv@96019
|
|
// set to 'enable' to enable imap actions when pressing update button
|
|
// set to 'disable' to reload messages list and waiting for cron update
|
|
// set to 'fast_sync' to enable imap actions with interval INTERVAL_IMAP_FAST_SYNC
|
|
'performance.messages_update_icon_perform_imap_actions' => 'enable',
|
|
'performance.interval_imap_fast_sync' => '1 days',
|
|
// crmv@96019e
|
|
|
|
//crmv@94125 // crmv@140887
|
|
// if true, resources (js, css, images) will be versioned
|
|
'performance.version_resources' => 1,
|
|
// how to create the versioned file ('link': symbolic link or 'copy')
|
|
'performance.version_resources_method' => 'link',
|
|
// if true, versioned files will be checked automatically for changes
|
|
// note: may degrade performances due to many stat calls
|
|
'performance.version_resources_autorefresh' => 0,
|
|
// the remote server used to load js, css, images (without final "/")
|
|
// you also have to change the remote server in themes/THEME_NAME/scss/vars/_mixins.scss
|
|
'performance.version_resources_cdn' => '',
|
|
//crmv@94125e // crmv@140887e
|
|
|
|
// set to 0 to disable ajax editing from detail view
|
|
'performance.detailview_ajax_edit' => 1,
|
|
|
|
// set to 1 to enable show_query and show_stats, you need also to activate them with request parameters
|
|
'performance.show_query_stats' => 0,
|
|
|
|
//crmv@118551
|
|
'layout.default_detail_view' => '', // (empty string) / summary
|
|
'layout.enable_switch_detail_view' => 0,
|
|
'layout.old_style' => 0,
|
|
'layout.tb_relations_order' => 'num_of_records', // num_of_records / layout_editor
|
|
'layout.enable_always_mandatory_css' => 0, // use css class dvtCellInfoM also in edit view and other views
|
|
//crmv@118551e
|
|
|
|
'layout.template_editor' => 'grapesjs', //crmv@197575 - alternative: ckeditor
|
|
'layout.record_title_inline' => 0, // crmv@199229
|
|
'layout.hide_update_info' => 1, // crmv@199229
|
|
|
|
'layout.singlepane_view' => 1, // crmv@204438
|
|
|
|
'settings.process_manager.show_logs_button' => 0, //crmv@121416
|
|
|
|
// crmv@152713
|
|
'theme.cycle_login_background' => true, // Enable login background change
|
|
'theme.current_login_background_color' => '#4C92DA', // Default login background color
|
|
'theme.current_login_background_image' => '', // Default login background image
|
|
'theme.login_background_image_strategy' => 'sequential', // Default strategy (sequential, random)
|
|
'theme.primary_colors' => array(), // Default primary colors of the installed themes. They are automatically calculated by scss files. // crmv@202705
|
|
// crmv@152713e
|
|
|
|
'outlook_sdk' => 1, // enable advanced features and SDK for outlook plugin
|
|
|
|
// crmv@181231
|
|
'session.handler' => '', // type of the session handler ('' = default, 'apc', 'apcu', 'memcached', 'redis', 'db')
|
|
'session.handler.params' => array(), // parameters for the handler, see in include/utils/SessionHandlers/*
|
|
// crmv@181231e
|
|
|
|
//crmv@171832
|
|
'performance.editview_changelog' => 1,
|
|
'performance.editview_changelog_clean_interval' => 86400,
|
|
'performance.editview_changelog_force_writable_uitypes' => '[220,5,6,23]', // crmv@180825
|
|
//crmv@171832e
|
|
|
|
//crmv@173186
|
|
'performance.log_globalconfig' => array(
|
|
'type' => array(
|
|
'label' => 'LBL_TYPE',
|
|
'value' => 'file', // file / db
|
|
'ui' => 'picklist', // TODO add other ui (ex. string, checkbox, etc)
|
|
'ui_prop' => array(
|
|
'picklist_values' => array('file'=>'File','db'=>'Database'),
|
|
'picklist_width' => '150px'
|
|
),
|
|
'db' => array(
|
|
'external' => false, // if false use vte db, if true use the following configuration
|
|
'server' => '',
|
|
'port' => '',
|
|
'username' => '',
|
|
'password' => '',
|
|
'name' => '',
|
|
'type' => '',
|
|
'charset' => '',
|
|
)
|
|
)
|
|
),
|
|
'performance.log_config' => array(
|
|
'processes' => array(
|
|
'label' => 'LBL_PROCESSES_LOG',
|
|
'file' => 'logs/ProcessEngine/ProcessEngine.log',
|
|
'rotate_maxsize' => 5, // MB
|
|
'table' => '_log_processengine',
|
|
'level' => 4, // default log level, from 1 = fatal to 5 = debug, default = 4
|
|
'enabled' => 1,
|
|
),
|
|
'webservices' => array(
|
|
'label' => 'LBL_WEBSERVICE_LOG',
|
|
'file' => 'logs/webservices/webservices.log',
|
|
'rotate_maxsize' => 5,
|
|
'table' => '_log_webservices',
|
|
'level' => 4,
|
|
'enabled' => 0,
|
|
),
|
|
'restapi' => array(
|
|
'label' => 'LBL_RESTAPI_LOG',
|
|
'file' => 'logs/restapi/restapi.log',
|
|
'rotate_maxsize' => 5,
|
|
'table' => '_log_restapi',
|
|
'level' => 4,
|
|
'enabled' => 0,
|
|
),
|
|
'mailscanner' => array(
|
|
'label' => 'LBL_MAIL_SCANNER',
|
|
'file' => 'logs/MailScanner/MailScanner.log',
|
|
'rotate_maxsize' => 5,
|
|
'table' => '_log_mailscanner',
|
|
'level' => 4,
|
|
'enabled' => 0,
|
|
),
|
|
// crmv@172616
|
|
'workflow' => array(
|
|
'label' => 'Workflow',
|
|
'file' => 'logs/Workflow/Workflow.log',
|
|
'rotate_maxsize' => 5,
|
|
'table' => '_log_workflow',
|
|
'level' => 4,
|
|
'enabled' => 0,
|
|
),
|
|
// crmv@172616e
|
|
),
|
|
//crmv@173186e
|
|
|
|
//crmv@179773
|
|
'performance.modcomments_parent_perm' => false,
|
|
'performance.modcomments_parent_perm_users' => array('all'=>true,'users'=>array(),'groups'=>array(),'roles'=>array()),
|
|
//crmv@179773e
|
|
|
|
'performance.modules_without_crmentity' => array('Messages','Processes'), //crmv@185647
|
|
|
|
//crmv@185894: view the TT-185894 for all the activation instructions
|
|
'performance.slave_handler' => false,
|
|
'performance.slave_functions' => array('Area','UnifiedSearch','ModNotificationsCount','ListViewCount','BadgeCount','TurboliftCount','Export','Reports'),
|
|
'performance.slave_connection' => array(
|
|
'db_server' => '',
|
|
'db_port' => ':3306',
|
|
'db_username' => '',
|
|
'db_password' => '',
|
|
'db_name' => '',
|
|
'db_name_cache' => 'slave_cache',
|
|
'db_type' => 'mysqli',
|
|
'db_status' => 'true',
|
|
'db_charset' => 'utf8',
|
|
'db_dieOnError' => false,
|
|
),
|
|
//crmv@185894e
|
|
|
|
//crmv@186476 crmv@189362
|
|
'calendar_tracking.enabled' => true,
|
|
'calendar_tracking.detailview_modules' => array('Accounts', 'Contacts', 'HelpDesk', 'ProjectTask'),
|
|
'calendar_tracking.turbolift_modules' => array('Messages', 'Emails'),
|
|
'calendar_tracking.status_fields' => array(),
|
|
'calendar_tracking.status_values' => array(),
|
|
//crmv@186476e crmv@189362e
|
|
|
|
//crmv@186709
|
|
'modules.messages.list_max_entries_first_page' => 50,
|
|
'modules.messages.list_max_entries_per_page' => 10,
|
|
'modules.messages.messages_by_schedule' => 20,
|
|
'modules.messages.messages_by_schedule_inbox' => 20,
|
|
'modules.messages.interval_schedulation' => '15 days',
|
|
'modules.messages.max_message_cron_uid_attempts' => 3,
|
|
'modules.messages.interval_storage' => '',
|
|
'modules.messages.messages_cleaned_by_schedule' => 500,
|
|
'modules.messages.preserve_search_results_date' => '-1 day', // crmv@200243
|
|
'modules.messages.fetchBodyInCron' => 'yes',
|
|
'modules.messages.IMAPDebug' => false,
|
|
'modules.messages.view_related_messages_recipients' => false,
|
|
'modules.messages.view_related_messages_drafts' => false,
|
|
'modules.messages.interval_inline_cache' => '1 month',
|
|
'modules.messages.force_index_querygenerator' => false,
|
|
//crmv@186709e
|
|
// crmv@206145
|
|
'modules.messages.oauth2.credentials' => [
|
|
'Microsoft' => [
|
|
'clientId' => '',
|
|
'clientSecret' => '',
|
|
'redirectUri' => '',
|
|
]
|
|
],
|
|
// crmv@206145e
|
|
//crmv@186709
|
|
'modules.emails.max_attachment_size' => 25,
|
|
'modules.emails.max_message_size' => 10240000,
|
|
'modules.emails.max_emails_send_queue_attempts' => 5,
|
|
//crmv@186709e
|
|
'modules.emails.send_mail_queue' => false, // crmv@129149
|
|
'modules.emails.save_unknown_contacts' => true, // crmv@191584
|
|
'modules.emails.auto_append_servers' => array('gmail','office365'), // crmv@202172
|
|
|
|
// crmv@200009
|
|
'modules.import.immediate_import_limit' => 200,
|
|
'modules.import.import_batch_Limit' => 250,
|
|
|
|
'modules.pdfmaker.enable_rtf' => false, // crmv@195354
|
|
|
|
'loadrelations.limit' => 100,
|
|
// crmv@200009e
|
|
|
|
'masscreate.limit' => 50, // crmv@202577
|
|
|
|
// crmv@171524 crmv@196871
|
|
'performance.mq_rabbitmq_enabled' => false,
|
|
'performance.mq_rabbitmq_connection' => array(
|
|
'host' => '', // host - host name where the RabbitMQ server is runing. ex. ex. 192.168.1.160
|
|
'port' => 5672, // port - port number of the service, 5672 is the default
|
|
'user' => 'nexi', // user - username to connect to server
|
|
'password' => '', // password. use $encryption->encrypt()
|
|
'queue_name' => '', // queue name. ex. processhandler
|
|
'freeze_topic_name' => '', // topic for freeze records. ex. freeze
|
|
'defreeze_topic_name' => '', // topic for defreeze records. ex. defreeze
|
|
'max_trigger_attempts' => 50,
|
|
'keep_history' => false, // crmv@199641 move row from table _trigger_queue to _trigger_queue_history when all is ok
|
|
),
|
|
'performance.mq_webstomp_enabled' => false,
|
|
'performance.mq_webstomp_connection' => array(
|
|
'host' => '', // websocket host. ex. http://192.168.1.160:15674/stomp
|
|
'user' => '', // websocket user. ex. stomp
|
|
'password' => '', // websocket password. use $encryption->encrypt()
|
|
'virtual_host' => '/', // websocket virtual host
|
|
),
|
|
// crmv@171524e crmv@196871e
|
|
|
|
'performance.cf_prefix_length' => 3, // crmv@195213
|
|
|
|
'performance.recalc_privileges_limit' => 50, // crmv@199834 Limit of users beyond which the share recalculation will be performed in the background
|
|
|
|
'security.csrf.enabled' => true, // crmv@171581
|
|
|
|
'security.smtp.validate_certs' => true, // crmv@180739
|
|
// 'security.imap.validate_certs' => true, // not implemented yet, but reserve the name
|
|
|
|
// crmv@202301
|
|
'security.audit.enabled' => true, // enable audit trail
|
|
'security.audit.log_retention_time' => 3, // how long to keep audit records, in months, 0 to disable
|
|
// crmv@202301e
|
|
|
|
);
|
|
|
|
/**
|
|
* These values are needed before the connection to the DB,
|
|
* so they need a special handling in case the filecache is not available.
|
|
* If you need such a variable, you have to add it here and in the array above
|
|
*/
|
|
protected $nodb_values = array(
|
|
'performance.log4php_debug',
|
|
'performance.sql_log_timing',
|
|
'performance.db_default_charset_utf8',
|
|
'performance.cache_query_result'
|
|
);
|
|
|
|
public function __construct() {
|
|
global $table_prefix;
|
|
|
|
$this->table_name_prop = $table_prefix.'_vteprop';
|
|
|
|
// initializes the caches
|
|
if ($this->use_cache) {
|
|
$this->rcache = new CacheStorageVar();
|
|
if ($this->cache_mode == 'file') {
|
|
$this->fcache = new CacheStorageFile($this->cache_file, $this->cache_format);
|
|
$this->fcache_initialized = !$this->fcache->isFileEmpty();
|
|
} elseif ($this->cache_mode == 'session') {
|
|
$this->scache = new CacheStorageSession();
|
|
$scache = $this->scache->get($this->cache_key);
|
|
$this->scache_initialized = (!empty($scache));
|
|
if (!$this->scache_initialized) {
|
|
$this->initSCache();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected function isDBConnected() {
|
|
global $adb;
|
|
return ($adb && $adb->database && $adb->database->IsConnected());
|
|
}
|
|
|
|
protected function isInstallRunning() {
|
|
return (basename($_SERVER['PHP_SELF']) == 'install.php');
|
|
}
|
|
|
|
public function initSCache() {
|
|
if ($this->use_cache && $this->cache_mode == 'session' && !$this->scache_initialized) {
|
|
$this->rebuildCache();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Initialize default values (used during install)
|
|
*/
|
|
public function initDefaultProperties($checkExisting = true) { // crmv@148789
|
|
// set properties if not already set
|
|
foreach ($this->default_values as $prop=>$value) {
|
|
$oldVal = $checkExisting ? $this->getProperty($prop, true) : null; // crmv@148789
|
|
if ($oldVal === null) $this->setProperty($prop, $value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Rename a property, taking care to update all the involved caches
|
|
*/
|
|
public function renameProperty($oldKey, $newKey) {
|
|
global $adb;
|
|
|
|
// database
|
|
$r = $adb->pquery("UPDATE {$this->table_name_prop} SET property = ? WHERE property = ?", array($newKey, $oldKey));
|
|
|
|
// req overrides
|
|
if (isset($this->req_overrides[$oldKey])) {
|
|
$this->req_overrides[$newKey] = $this->req_overrides[$oldKey];
|
|
unset($this->req_overrides[$oldKey]);
|
|
}
|
|
|
|
if ($this->use_cache) {
|
|
if ($this->rcache_initialized) {
|
|
$oldval = $this->rcache->get($oldKey);
|
|
if ($oldval !== null) {
|
|
$this->rcache->set($newKey, $oldval);
|
|
$this->rcache->clear($oldKey);
|
|
}
|
|
}
|
|
if ($this->scache_initialized) {
|
|
$oldval = $this->scache->get($oldKey);
|
|
if ($oldval !== null) {
|
|
$this->scache->setArray(array($this->cache_key, $newKey), $oldval);
|
|
$this->scache->clearArray(array($this->cache_key, $oldKey));
|
|
}
|
|
}
|
|
if ($this->cache_mode == 'session') {
|
|
$cache = Cache::getInstance($this->cache_key);
|
|
$cache->clear();
|
|
}
|
|
if ($this->fcache_initialized) {
|
|
$oldval = $this->fcache->get($oldKey);
|
|
if ($oldval !== null) {
|
|
$this->fcache->set($newKey, $oldval);
|
|
$this->fcache->clear($oldKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Alias for getProperty
|
|
*/
|
|
public function get($property, $noCache = false, $noOverride = false) {
|
|
return $this->getProperty($property, $noCache, $noOverride);
|
|
}
|
|
|
|
/**
|
|
* Get all properties
|
|
*/
|
|
public function getAll($noCache = false, $noOverride = false) {
|
|
// if skipping the override, skip the cache also (the cache stores only the overridden values)
|
|
if ($noOverride) $noCache = true;
|
|
|
|
if ($noCache || !$this->use_cache) {
|
|
$values = $this->getAllPropertiesFromDB($noOverride);
|
|
} elseif ($this->rcache_initialized) {
|
|
$values = $this->rcache->getAll();
|
|
} elseif ($this->scache_initialized) {
|
|
$values = $this->scache->get($this->cache_key);
|
|
if ($this->use_cache) $this->rebuildRCache(); // rebuild the request cache also
|
|
} elseif ($this->fcache_initialized) {
|
|
$values = $this->fcache->getAll();
|
|
if ($this->use_cache) $this->rebuildRCache(); // rebuild the request cache also
|
|
} else {
|
|
$values = $this->getAllPropertiesFromDB($noOverride);
|
|
}
|
|
|
|
return $values;
|
|
}
|
|
|
|
/**
|
|
* Return a stored value
|
|
*/
|
|
public function getProperty($property, $noCache = false, $noOverride = false) {
|
|
|
|
// if skipping the override, skip the cache also (the cache stores only the overridden values)
|
|
if ($noOverride) $noCache = true;
|
|
|
|
if ($noCache || !$this->use_cache) {
|
|
$value = $this->getPropertyFromDB($property, $noOverride);
|
|
} elseif ($this->rcache_initialized) {
|
|
$value = $this->rcache->get($property);
|
|
} elseif ($this->scache_initialized) {
|
|
$value = $this->scache->getArray(array($this->cache_key, $property));
|
|
if ($this->use_cache) $this->rebuildRCache(); // rebuild the request cache also
|
|
} elseif ($this->fcache_initialized) {
|
|
$value = $this->fcache->get($property);
|
|
if ($this->use_cache) $this->rebuildRCache(); // rebuild the request cache also
|
|
} else {
|
|
$value = $this->getPropertyFromDB($property, $noOverride);
|
|
}
|
|
|
|
return $value;
|
|
}
|
|
|
|
protected function getPropertyFromDB($property, $noOverride = false) {
|
|
global $adb;
|
|
|
|
// check if db connection is valid
|
|
if (!$this->isDBConnected() || $this->isInstallRunning() || in_array($property, $this->nodb_values)) {
|
|
return $this->getInstallValue($property);
|
|
}
|
|
|
|
$r = $adb->pquery("SELECT value, override_value FROM {$this->table_name_prop} WHERE property = ?", array($property));
|
|
if ($r && $adb->num_rows($r) > 0) {
|
|
$value = $adb->query_result_no_html($r, 0, 'value');
|
|
$ovalue = $adb->query_result_no_html($r, 0, 'override_value');
|
|
if (!$noOverride && $ovalue !== '' && !is_null($ovalue)) {
|
|
$value = $ovalue;
|
|
}
|
|
$value = $this->decodeDBValue($value); // crmv@139789
|
|
return $value;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
// crmv@139789
|
|
protected function decodeDBValue($value) {
|
|
if (is_string($value) && strlen($value) && ($value[0] === '[' || $value[0] === '{')) {
|
|
$decoded = json_decode($value, true);
|
|
if ($decoded !== null) {
|
|
$value = $decoded;
|
|
}
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
protected function encodeDBValue($value) {
|
|
if ($value === false) {
|
|
$value = '0';
|
|
} elseif ($value === true) {
|
|
$value = '1';
|
|
} elseif (is_array($value)) {
|
|
$value = json_encode($value);
|
|
}
|
|
return $value;
|
|
}
|
|
// crmv@139789e
|
|
|
|
protected function getAllPropertiesFromDB($noOverride = false) {
|
|
global $adb;
|
|
|
|
// check if db connection is valid
|
|
if (!$this->isDBConnected() || $this->isInstallRunning()) {
|
|
return $this->getAllInstallValues();
|
|
}
|
|
|
|
$values = array();
|
|
$r = $adb->query("SELECT property, value, override_value FROM {$this->table_name_prop}");
|
|
if ($r) {
|
|
while ($row = $adb->fetchByAssoc($r, -1, false)) {
|
|
$value = ($noOverride ? $row['value'] : ($row['override_value'] ?: $row['value']));
|
|
$value = $this->decodeDBValue($value); // crmv@139789
|
|
$values[$row['property']] = $value;
|
|
}
|
|
}
|
|
return $values;
|
|
}
|
|
|
|
protected function getInstallValue($property) {
|
|
if (isset($this->default_values[$property])) {
|
|
return $this->default_values[$property];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
protected function getAllInstallValues() {
|
|
return $this->default_values;
|
|
}
|
|
|
|
/**
|
|
* Alias for setProperty
|
|
*/
|
|
public function set($property, $value) {
|
|
return $this->setProperty($property, $value);
|
|
}
|
|
|
|
/**
|
|
* Set or update a property
|
|
*/
|
|
public function setProperty($property, $value) {
|
|
global $adb;
|
|
|
|
$r = $adb->pquery("SELECT property FROM {$this->table_name_prop} WHERE property = ?", array($property));
|
|
if ($r) {
|
|
$dbValue = $this->encodeDBValue($value); // crmv@139789
|
|
if ($adb->num_rows($r) > 0) {
|
|
// update
|
|
$r = $adb->pquery("UPDATE {$this->table_name_prop} SET value = ? WHERE property = ?", array($dbValue, $property));
|
|
} else {
|
|
// insert
|
|
$r = $adb->pquery("INSERT INTO {$this->table_name_prop} (property, value) VALUES (?,?)", array($property, $dbValue));
|
|
}
|
|
if ($this->use_cache) {
|
|
$this->rcache->set($property, $value);
|
|
if ($this->scache_initialized) {
|
|
$this->scache->setArray(array($this->cache_key,$property), $value);
|
|
}
|
|
if ($this->cache_mode == 'session') {
|
|
$cache = Cache::getInstance($this->cache_key);
|
|
$cache->clear();
|
|
}
|
|
// crmv@164465
|
|
if ($this->fcache_initialized) {
|
|
$this->fcache->set($property, $value);
|
|
}
|
|
// crmv@164465e
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieve the overriden value, or null if not overridden
|
|
*/
|
|
public function getOverride($property) {
|
|
global $adb;
|
|
|
|
// if it was a request override, we have it here
|
|
if (isset($this->req_overrides[$property])) {
|
|
return $this->req_overrides[$property];
|
|
}
|
|
|
|
// otherwise check the db (in the file cache i don't know if it was the original value or not)
|
|
$r = $adb->pquery("SELECT override_value FROM {$this->table_name_prop} WHERE property = ?", array($property));
|
|
if ($r && $adb->num_rows($r) > 0) {
|
|
$ovalue = $adb->query_result_no_html($r, 0, 'override_value');
|
|
if ($ovalue !== '' && !is_null($ovalue)) {
|
|
$ovalue = $this->decodeDBValue($ovalue); // crmv@139789
|
|
return $ovalue;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Set an override for a property. The persistence is either "request" or "db"
|
|
*/
|
|
public function setOverride($property, $value, $persistence = 'db') {
|
|
global $adb;
|
|
|
|
if ($persistence == 'request') {
|
|
$this->req_overrides[$property] = $value;
|
|
if ($this->use_cache) {
|
|
$this->rcache->set($property, $value);
|
|
}
|
|
return;
|
|
}
|
|
|
|
$r = $adb->pquery("SELECT value FROM {$this->table_name_prop} WHERE property = ?", array($property));
|
|
if ($r) {
|
|
$dbValue = $this->encodeDBValue($value); // crmv@139789
|
|
if ($adb->num_rows($r) > 0) {
|
|
// update
|
|
$r = $adb->pquery("UPDATE {$this->table_name_prop} SET override_value = ? WHERE property = ?", array($dbValue, $property));
|
|
} else {
|
|
// insert
|
|
$r = $adb->pquery("INSERT INTO {$this->table_name_prop} (property, value, override_value) VALUES (?,?,?)", array($property, $dbValue, $dbValue));
|
|
}
|
|
if ($this->use_cache) {
|
|
$this->rcache->set($property, $value);
|
|
if ($this->scache_initialized) {
|
|
$this->scache->setArray(array($this->cache_key,$property), $value);
|
|
}
|
|
if ($this->cache_mode == 'session') {
|
|
$cache = Cache::getInstance($this->cache_key);
|
|
$cache->clear();
|
|
}
|
|
// crmv@164465
|
|
if ($this->fcache_initialized) {
|
|
$this->fcache->set($property, $value);
|
|
}
|
|
// crmv@164465e
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove the override
|
|
*/
|
|
public function unsetOverride($property, $persistence = 'db') {
|
|
global $adb;
|
|
|
|
// get original value
|
|
$value = $this->getPropertyFromDB($property, true);
|
|
|
|
// remove it from req
|
|
unset($this->req_overrides[$property]);
|
|
|
|
if ($persistence == 'request') {
|
|
if ($this->use_cache) {
|
|
$this->rcache->set($property, $value);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// unset it from the db
|
|
$r = $adb->pquery("UPDATE {$this->table_name_prop} SET override_value = NULL WHERE property = ?", array($property));
|
|
|
|
// restore caches
|
|
if ($this->use_cache) {
|
|
$this->rcache->set($property, $value);
|
|
if ($this->scache_initialized) {
|
|
$this->scache->setArray(array($this->cache_key,$property), $value);
|
|
}
|
|
if ($this->cache_mode == 'session') {
|
|
$cache = Cache::getInstance($this->cache_key);
|
|
$cache->clear();
|
|
}
|
|
// crmv@164465
|
|
if ($this->fcache_initialized) {
|
|
$this->fcache->set($property, $value);
|
|
}
|
|
// crmv@164465e
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove all overrides
|
|
*/
|
|
public function unsetAllOverrides($persistence = 'db') {
|
|
global $adb;
|
|
|
|
// remove it from req
|
|
$this->req_overrides = array();
|
|
|
|
if ($persistence == 'request') {
|
|
if ($this->use_cache) {
|
|
$this->clearRCache();
|
|
}
|
|
return;
|
|
}
|
|
|
|
// unset it from the db
|
|
$r = $adb->query("UPDATE {$this->table_name_prop} SET override_value = NULL");
|
|
|
|
// clear caches
|
|
if ($this->use_cache) {
|
|
$this->clearCache();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove a property
|
|
*/
|
|
public function deleteProperty($property) {
|
|
global $adb;
|
|
$r = $adb->pquery("DELETE FROM {$this->table_name_prop} WHERE property = ?", array($property));
|
|
unset($this->req_overrides[$property]);
|
|
if ($this->use_cache) {
|
|
$this->rcache->clear($property);
|
|
if ($this->scache_initialized) {
|
|
$this->scache->clearArray(array($this->cache_key,$property));
|
|
}
|
|
if ($this->cache_mode == 'session') {
|
|
$cache = Cache::getInstance($this->cache_key);
|
|
$cache->clear();
|
|
}
|
|
// crmv@164465
|
|
if ($this->fcache_initialized) {
|
|
$this->fcache->clear($property);
|
|
}
|
|
// crmv@164465e
|
|
}
|
|
}
|
|
|
|
public function clearCache() {
|
|
$this->clearRCache();
|
|
$this->clearSCache();
|
|
$this->clearFCache();
|
|
}
|
|
|
|
protected function clearRCache() {
|
|
if ($this->rcache_initialized) {
|
|
$this->rcache->clearAll();
|
|
$this->rcache_initialized = false;
|
|
}
|
|
}
|
|
|
|
protected function clearSCache() {
|
|
if ($this->scache_initialized) {
|
|
$this->scache->clear($this->cache_key);
|
|
$this->scache_initialized = false;
|
|
}
|
|
}
|
|
|
|
protected function clearFCache() {
|
|
if ($this->fcache_initialized) {
|
|
$this->fcache->clearAll();
|
|
$this->fcache_initialized = false;
|
|
}
|
|
}
|
|
|
|
public function rebuildCache() {
|
|
if ($this->cache_mode == 'file') {
|
|
$this->rebuildFCache();
|
|
} elseif ($this->cache_mode == 'session') {
|
|
$this->rebuildSCache();
|
|
}
|
|
$this->rebuildRCache();
|
|
}
|
|
|
|
protected function rebuildRCache() {
|
|
|
|
// not using any cache if the DB is not ready!
|
|
if (!$this->isDBConnected()) return;
|
|
|
|
$this->rcache->clearAll();
|
|
$this->rcache_initialized = false;
|
|
|
|
// get the values from the session or the file cache
|
|
if ($this->scache_initialized) {
|
|
$cache = $this->scache->get($this->cache_key);
|
|
} elseif ($this->fcache_initialized) {
|
|
$cache = $this->fcache->getAll();
|
|
} else {
|
|
$cache = $this->getAllPropertiesFromDB();
|
|
}
|
|
// apply request overrides
|
|
if (is_array($this->req_overrides)) {
|
|
$cache = array_merge($cache, $this->req_overrides);
|
|
}
|
|
$this->rcache->setMulti($cache);
|
|
$this->rcache_initialized = true;
|
|
|
|
}
|
|
|
|
protected function rebuildSCache($cache = null) {
|
|
|
|
// not using any cache if the DB is not ready!
|
|
if (!$this->isDBConnected()) return;
|
|
|
|
$this->scache->clear($this->cache_key);
|
|
$this->scache_initialized = false;
|
|
|
|
if (!$cache) {
|
|
$cache = $this->getAllPropertiesFromDB();
|
|
}
|
|
|
|
$this->scache->set($this->cache_key,$cache);
|
|
$this->scache_initialized = true;
|
|
|
|
}
|
|
|
|
protected function rebuildFCache($cache = null) {
|
|
|
|
// not using any cache if the DB is not ready!
|
|
if (!$this->isDBConnected()) return;
|
|
|
|
$this->fcache->clearAll();
|
|
$this->fcache_initialized = false;
|
|
|
|
if (!$cache) {
|
|
$cache = $this->getAllPropertiesFromDB();
|
|
}
|
|
|
|
$this->fcache->setMulti($cache);
|
|
$this->fcache_initialized = true;
|
|
|
|
}
|
|
|
|
// crmv@164465
|
|
/**
|
|
* Check if cache file is valid
|
|
*/
|
|
public function checkCacheValidity() {
|
|
if (!$this->use_cache) return true;
|
|
if ($this->cache_mode != 'file') return true; // check only for file
|
|
|
|
// check if exists and not empty
|
|
if (!file_exists($this->cache_file) || filesize($this->cache_file) == 0) return false;
|
|
|
|
// invalid file
|
|
if (!$this->fcache || !$this->fcache_initialized) return false;
|
|
|
|
// check if enough values
|
|
$cacheData = $this->fcache->getAll();
|
|
$savedData = $this->getAllPropertiesFromDB();
|
|
if (count($cacheData) != count($savedData)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
// crmv@164465e
|
|
|
|
} |