public BansheeModelCache(HyenaSqliteConnection connection, string uuid, ICacheableDatabaseModel model, SqliteModelProvider <T> provider) : base(connection, uuid, model, provider) { }
public SqliteModelCache(HyenaSqliteConnection connection, string uuid, ICacheableDatabaseModel model, SqliteModelProvider <T> provider) : base(model) { this.connection = connection; this.model = model; this.provider = provider; CheckCacheTable(); if (model.SelectAggregates != null) { if (model.CachesJoinTableEntries) { count_command = new HyenaSqliteCommand(String.Format(@" SELECT count(*), {0} FROM {1}{2} j WHERE j.{4} IN (SELECT ItemID FROM {3} WHERE ModelID = ?) AND {5} = j.{6}", model.SelectAggregates, // eg sum(FileSize), sum(Duration) provider.TableName, // eg CoreTracks model.JoinFragment, // eg , CorePlaylistEntries CacheTableName, // eg CoreCache model.JoinPrimaryKey, // eg EntryID provider.PrimaryKey, // eg CoreTracks.TrackID model.JoinColumn // eg TrackID )); } else { count_command = new HyenaSqliteCommand(String.Format( "SELECT count(*), {0} FROM {1} WHERE {2} IN (SELECT ItemID FROM {3} WHERE ModelID = ?)", model.SelectAggregates, provider.TableName, provider.PrimaryKey, CacheTableName )); } } else { count_command = new HyenaSqliteCommand(String.Format( "SELECT COUNT(*) FROM {0} WHERE ModelID = ?", CacheTableName )); } uid = FindOrCreateCacheModelId(String.Format("{0}-{1}", uuid, typeof(T).Name)); if (model.Selection != null) { selection_uid = FindOrCreateCacheModelId(String.Format("{0}-{1}-Selection", uuid, typeof(T).Name)); } if (model.CachesJoinTableEntries) { select_str = String.Format( @"SELECT {0} {10}, OrderID, {5}.ItemID FROM {1} INNER JOIN {2} ON {3} = {2}.{4} INNER JOIN {5} ON {2}.{6} = {5}.ItemID {11} WHERE {5}.ModelID = {7} {8} {9}", provider.Select, provider.From, model.JoinTable, provider.PrimaryKey, model.JoinColumn, CacheTableName, model.JoinPrimaryKey, uid, String.IsNullOrEmpty(provider.Where) ? null : "AND", provider.Where, "{0}", "{1}" ); reload_sql = String.Format(@" DELETE FROM {0} WHERE ModelID = {1}; INSERT INTO {0} (ModelID, ItemID) SELECT {1}, {2} ", CacheTableName, uid, model.JoinPrimaryKey ); } else if (model.CachesValues) { // The duplication of OrderID/ItemID in the select below is intentional! // The first is used construct the QueryFilterInfo value, the last internally // to this class select_str = String.Format( @"SELECT OrderID, ItemID {2}, OrderID, ItemID FROM {0} {3} WHERE {0}.ModelID = {1}", CacheTableName, uid, "{0}", "{1}" ); reload_sql = String.Format(@" DELETE FROM {0} WHERE ModelID = {1}; INSERT INTO {0} (ModelID, ItemID) SELECT DISTINCT {1}, {2} ", CacheTableName, uid, provider.Select ); } else { select_str = String.Format( @"SELECT {0} {7}, OrderID, {2}.ItemID FROM {1} INNER JOIN {2} ON {3} = {2}.ItemID {8} WHERE {2}.ModelID = {4} {5} {6}", provider.Select, provider.From, CacheTableName, provider.PrimaryKey, uid, String.IsNullOrEmpty(provider.Where) ? String.Empty : "AND", provider.Where, "{0}", "{1}" ); reload_sql = String.Format(@" DELETE FROM {0} WHERE ModelID = {1}; INSERT INTO {0} (ModelID, ItemID) SELECT {1}, {2} ", CacheTableName, uid, provider.PrimaryKey ); } select_single_command = new HyenaSqliteCommand( String.Format(@" SELECT OrderID FROM {0} WHERE ModelID = {1} AND ItemID = ?", CacheTableName, uid ) ); select_range_command = new HyenaSqliteCommand( String.Format(String.Format("{0} {1}", select_str, "LIMIT ?, ?"), null, null) ); select_first_command = new HyenaSqliteCommand( String.Format( "SELECT OrderID FROM {0} WHERE ModelID = {1} LIMIT 1", CacheTableName, uid ) ); if (model.Selection != null) { delete_selection_command = new HyenaSqliteCommand(String.Format( "DELETE FROM {0} WHERE ModelID = {1}", CacheTableName, selection_uid )); save_selection_command = new HyenaSqliteCommand(String.Format( "INSERT INTO {0} (ModelID, ItemID) SELECT {1}, ItemID FROM {0} WHERE ModelID = {2} LIMIT ?, ?", CacheTableName, selection_uid, uid )); get_selection_command = new HyenaSqliteCommand(String.Format( "SELECT OrderID FROM {0} WHERE ModelID = {1} AND ItemID IN (SELECT ItemID FROM {0} WHERE ModelID = {2})", CacheTableName, uid, selection_uid )); } }