예제 #1
0
 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
                                                                   ));
            }
        }