mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-05-10 08:45:42 -04:00
* fix: Catch mysqli_sql_exception in DB fallback handlers for fresh Docker installs On a fresh Docker install with an empty database, the ospos_sessions table doesn't exist yet. The CSRF filter triggers session initialization before the login/migration page can be reached. The existing code in Session.php, OSPOS.php, and MY_Migration.php catches DatabaseException, but the MySQLi driver throws mysqli_sql_exception (which extends RuntimeException, not DatabaseException) when the table doesn't exist. This causes an unhandled exception resulting in HTTP 500. Fix: Change all three catch blocks from to so that mysqli_sql_exception and any other unexpected database errors are caught, allowing the app to fall back gracefully: - Session.php: Falls back to FileHandler so sessions work without DB - OSPOS.php: Falls back to empty settings so config loads work - MY_Migration.php: Falls back to version 0 / false so the migration check passes gracefully This allows the login page with migration UI to be served on first access, so the initial schema migration can run. Fixes #4524 --------- Co-authored-by: Ollama <ollama@steganos.dev>
65 lines
2.0 KiB
PHP
65 lines
2.0 KiB
PHP
<?php
|
|
|
|
namespace Config;
|
|
|
|
use App\Models\Appconfig;
|
|
use CodeIgniter\Cache\CacheInterface;
|
|
use CodeIgniter\Config\BaseConfig;
|
|
|
|
/**
|
|
* This class holds the configuration options stored from the database so that on launch those settings can be cached
|
|
* once in memory. The settings are referenced frequently, so there is a significant performance hit to not storing
|
|
* them.
|
|
*/
|
|
class OSPOS extends BaseConfig
|
|
{
|
|
public array $settings;
|
|
public string $commit_sha1 = 'dev'; // TODO: Travis scripts need to be updated to replace this with the commit hash on build
|
|
private CacheInterface $cache;
|
|
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
$this->cache = Services::cache();
|
|
$this->set_settings();
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
public function set_settings(): void
|
|
{
|
|
$cache = $this->cache->get('settings');
|
|
|
|
if ($cache) {
|
|
$this->settings = decode_array($cache);
|
|
} else {
|
|
try {
|
|
$appconfig = model(Appconfig::class);
|
|
foreach ($appconfig->get_all()->getResult() as $app_config) {
|
|
$this->settings[$app_config->key] = $app_config->value;
|
|
}
|
|
$this->cache->save('settings', encode_array($this->settings));
|
|
} catch (\Exception $e) {
|
|
// Database table doesn't exist yet (migrations haven't run)
|
|
// or database connection failed. Return empty settings to
|
|
// allow migration page to display. Catches mysqli_sql_exception
|
|
// which is not a subclass of DatabaseException.
|
|
$this->settings = [
|
|
'language' => 'english',
|
|
'language_code' => 'en',
|
|
'company' => 'Home'
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return void
|
|
*/
|
|
public function update_settings(): void
|
|
{
|
|
$this->cache->delete('settings');
|
|
$this->set_settings();
|
|
}
|
|
} |