fix(sqlite): Standardize connection options and improve error handling
Changes to sqlite-init.ts: - Standardized connection options format between main and renderer processes - Added explicit mode: 'rwc' to force read-write-create mode - Added connection registration verification - Added detailed logging of actual file paths - Added journal mode verification to detect read-only state - Removed redundant PRAGMA settings (now handled in main process) - Added more detailed error reporting for connection failures Security: - Ensures consistent read-write permissions across processes - Verifies database is not opened in read-only mode - Maintains proper file permissions (644) and directory permissions (755) Testing: - Verified connection creation in both main and renderer processes - Confirmed journal mode is set correctly - Validated connection registration - Tested error handling for invalid states Author: Matthew Raymer
This commit is contained in:
@@ -680,20 +680,22 @@ export function setupSQLiteHandlers(): void {
|
|||||||
throw new Error('Database path not initialized');
|
throw new Error('Database path not initialized');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use same connection options format
|
// Clean up connection options to be consistent
|
||||||
const connectionOptions = {
|
const connectionOptions = {
|
||||||
...options,
|
|
||||||
database: 'timesafari', // Base name only
|
database: 'timesafari', // Base name only
|
||||||
readOnly: false,
|
version: 1,
|
||||||
mode: 'rwc',
|
readOnly: false, // Single source of truth for read-only state
|
||||||
|
mode: 'rwc', // Force read-write-create mode
|
||||||
encryption: 'no-encryption',
|
encryption: 'no-encryption',
|
||||||
useNative: true,
|
useNative: true,
|
||||||
location: 'default' // Let plugin handle path resolution
|
location: 'default' // Let plugin handle path resolution
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Log the actual options being used
|
||||||
logger.info('Creating database connection with options:', {
|
logger.info('Creating database connection with options:', {
|
||||||
...connectionOptions,
|
...connectionOptions,
|
||||||
expectedBehavior: 'Plugin will append SQLite suffix and handle path resolution'
|
expectedBehavior: 'Plugin will append SQLite suffix and handle path resolution',
|
||||||
|
actualPath: path.join(dbDir, 'timesafariSQLite.db')
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create connection (returns undefined but registers internally)
|
// Create connection (returns undefined but registers internally)
|
||||||
@@ -709,18 +711,21 @@ export function setupSQLiteHandlers(): void {
|
|||||||
|
|
||||||
debugLog('Connection registration check:', {
|
debugLog('Connection registration check:', {
|
||||||
isRegistered,
|
isRegistered,
|
||||||
database: connectionOptions.database
|
database: connectionOptions.database,
|
||||||
|
actualPath: path.join(dbDir, 'timesafariSQLite.db')
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!isRegistered) {
|
if (!isRegistered) {
|
||||||
throw new Error('Database not registered after createConnection');
|
throw new Error('Database not registered after createConnection');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return success object instead of undefined
|
// Return success object with more details
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
database: connectionOptions.database,
|
database: connectionOptions.database,
|
||||||
isRegistered: true
|
isRegistered: true,
|
||||||
|
actualPath: path.join(dbDir, 'timesafariSQLite.db'),
|
||||||
|
options: connectionOptions
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error('Error in sqlite-create-connection:', error);
|
logger.error('Error in sqlite-create-connection:', error);
|
||||||
|
|||||||
Reference in New Issue
Block a user