using SQLite; using System; using System.Collections.Generic; using System.IO; using System.Linq.Expressions; using ZeroLevel.Services.FileSystem; namespace ZeroLevel.SqLite { public abstract class BaseSqLiteDB : IDisposable where T : class, new() { protected SQLiteConnection _db; public BaseSqLiteDB(string name) { _db = new SQLiteConnection(PrepareDb(name)); } public int Append(T record) { return _db.Insert(record); } public CreateTableResult CreateTable() { return _db.CreateTable(); } public int DropTable() { return _db.DropTable(); } public IEnumerable SelectAll() { return _db.Table(); } public IEnumerable SelectBy(Expression> predicate) { return _db.Table().Where(predicate); } public T Single(Expression> predicate) { return _db.Table().FirstOrDefault(predicate); } public T Single(Expression> predicate, Expression> orderBy, bool desc = false) { if (desc) { return _db.Table().Where(predicate).OrderByDescending(orderBy).FirstOrDefault(); } return _db.Table().Where(predicate).OrderBy(orderBy).FirstOrDefault(); } public T Single(Expression> orderBy, bool desc = false) { if (desc) { return _db.Table().OrderByDescending(orderBy).FirstOrDefault(); } return _db.Table().OrderBy(orderBy).FirstOrDefault(); } public IEnumerable SelectBy(int N, Expression> predicate) { return _db.Table().Where(predicate).Take(N); } public long Count() { return _db.Table().Count(); } public long Count(Expression> predicate) { return _db.Table().Count(predicate); } public int Delete(Expression> predicate) { return _db.Table().Delete(predicate); } public int Update(T record) { return _db.Update(record); } protected static string PrepareDb(string path) { if (Path.IsPathRooted(path) == false) { path = Path.Combine(FSUtils.GetAppLocalDbDirectory(), path); } return Path.GetFullPath(path); } protected abstract void DisposeStorageData(); public void Dispose() { DisposeStorageData(); try { _db?.Close(); _db?.Dispose(); } catch (Exception ex) { Log.Error(ex, "[BaseSqLiteDB] Fault close db connection"); } } } }