提交 2fe6f382 编写于 作者: H Heejae Chang

PR feedbacks

上级 c2cde38d
......@@ -23,7 +23,7 @@ internal enum OpenFlags
// SQLITE_OPEN_SUBJOURNAL = 0x00002000, /* VFS only */
// SQLITE_OPEN_MASTER_JOURNAL = 0x00004000, /* VFS only */
// SQLITE_OPEN_NOMUTEX = 0x00008000, /* Ok for sqlite3_open_v2() */
SQLITE_OPEN_FULLMUTEX = 0x00010000, /* Ok for sqlite3_open_v2() */
// SQLITE_OPEN_FULLMUTEX = 0x00010000, /* Ok for sqlite3_open_v2() */
SQLITE_OPEN_SHAREDCACHE = 0x00020000, /* Ok for sqlite3_open_v2() */
// SQLITE_OPEN_PRIVATECACHE = 0x00040000, /* Ok for sqlite3_open_v2() */
// SQLITE_OPEN_WAL = 0x00080000, /* VFS only */
......
......@@ -51,10 +51,9 @@ public static SqlConnection Create(IPersistentStorageFaultInjector faultInjector
{
faultInjector?.OnNewConnection();
// Explicitly set for Serialized mode to be safe.
// Also, enable shared cache so that multiple connections inside of same process share cache
// Enable shared cache so that multiple connections inside of same process share cache
// see https://sqlite.org/threadsafe.html for more detail
var flags = OpenFlags.SQLITE_OPEN_CREATE | OpenFlags.SQLITE_OPEN_READWRITE | OpenFlags.SQLITE_OPEN_FULLMUTEX | OpenFlags.SQLITE_OPEN_SHAREDCACHE;
var flags = OpenFlags.SQLITE_OPEN_CREATE | OpenFlags.SQLITE_OPEN_READWRITE | OpenFlags.SQLITE_OPEN_SHAREDCACHE;
var result = (Result)raw.sqlite3_open_v2(databasePath, out var handle, (int)flags, vfs: null);
if (result != Result.OK)
......
......@@ -37,13 +37,22 @@ protected override string GetDatabaseFilePath(string workingFolderPath)
return Path.Combine(workingFolderPath, StorageExtension, PersistentStorageFileName);
}
protected override AbstractPersistentStorage OpenDatabase(Solution solution, string workingFolderPath, string databaseFilePath)
protected override bool TryOpenDatabase(
Solution solution, string workingFolderPath, string databaseFilePath, out AbstractPersistentStorage storage)
{
storage = null;
// try to get db ownership lock. if someone else already has the lock. it will throw
var dbOwnershipLock = TryGetDatabaseOwnership(databaseFilePath);
if (dbOwnershipLock == null)
{
return false;
}
return new SQLitePersistentStorage(
storage = new SQLitePersistentStorage(
OptionService, workingFolderPath, solution.FilePath, databaseFilePath, this.Release, dbOwnershipLock, _faultInjectorOpt);
return true;
}
private static IDisposable TryGetDatabaseOwnership(string databaseFilePath)
......@@ -57,9 +66,9 @@ private static IDisposable TryGetDatabaseOwnership(string databaseFilePath)
Path.Combine(Path.GetDirectoryName(databaseFilePath), LockFile),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
}
catch (Exception ex)
catch (Exception)
{
throw new InvalidOperationException("can't get the ownership", ex);
return null;
}
}
......@@ -76,12 +85,6 @@ private static void EnsureDirectory(string databaseFilePath)
protected override bool ShouldDeleteDatabase(Exception exception)
{
if (exception is InvalidOperationException)
{
// db is owned by another process
return false;
}
// Error occurred when trying to open this DB. Try to remove it so we can create a good dB.
return true;
}
......
......@@ -54,7 +54,7 @@ protected AbstractPersistentStorageService(IOptionService optionService, bool te
}
protected abstract string GetDatabaseFilePath(string workingFolderPath);
protected abstract AbstractPersistentStorage OpenDatabase(Solution solution, string workingFolderPath, string databaseFilePath);
protected abstract bool TryOpenDatabase(Solution solution, string workingFolderPath, string databaseFilePath, out AbstractPersistentStorage storage);
protected abstract bool ShouldDeleteDatabase(Exception exception);
public IPersistentStorage GetStorage(Solution solution)
......@@ -235,7 +235,11 @@ private AbstractPersistentStorage TryCreatePersistentStorage(Solution solution,
var databaseFilePath = GetDatabaseFilePath(workingFolderPath);
try
{
database = OpenDatabase(solution, workingFolderPath, databaseFilePath);
if (!TryOpenDatabase(solution, workingFolderPath, databaseFilePath, out database))
{
return false;
}
database.Initialize(solution);
persistentStorage = database;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册