Esempio n. 1
0
        internal static IEnumerable<ARecord> GetFromDatabase(Variant variant, IEnumerable<Xid> ids)
        {
            if (null == ids) {
                throw new ArgumentNullException("ids");
            }
            if (ids.Count() == 0) {
                return new List<ARecord>();
            }

            var output = new List<ARecord>();

            // Build queries
            var sqlObject = new StringBuilder("SELECT [Id],[DomainId],[FileName],[ContentType],[Length],[DerivedFrom],[Key] FROM [A3Asset] WHERE [Id] IN (");
            var first = true;
            foreach (var id in ids) {
                var idString = id.ToString(XidFormat.Hex32Hyphens);
                if (first) {
                    first = false;
                } else {
                    sqlObject.Append(",");
                }
                sqlObject.Append("'");
                sqlObject.Append(idString);
                sqlObject.Append("'");
            }
            sqlObject.Append(")");

            // Prepare response
            var nrecords = new Dictionary<Xid, ARecordLoader>();

            // Fetch basics
            using (var query = new DatabaseQuery(DatabaseQueryString.Create(sqlObject.ToString()))) {
                using (var rdr = query.ExecuteReader()) {
                    while (rdr.Read()) {
                        var id = new Xid((Guid)rdr[0]);
                        if (rdr[5] is DBNull) {
                            nrecords[id] = new ARecordLoader(id, (Guid)rdr[1], (string)rdr[2], (string)rdr[3], (long)rdr[4], null, (string)rdr[6]);
                        } else {
                            nrecords[id] = new ARecordLoader(id, (Guid)rdr[1], (string)rdr[2], (string)rdr[3], (long)rdr[4], (Guid)rdr[5], (string)rdr[6]);
                        }
                        if (ids.Contains(id)) {
                            output.Add(nrecords[id]);
                        }
                    }
                }
            }

            return output;
        }
Esempio n. 2
0
        public ResultantNodes SearchNodes(Where where, Xid requestingNodeId, MaxAge maxAgeQuery, MaxAge maxAgeObjects)
        {
            if (null == where) {
                throw new ArgumentNullException("where");
            }

            // Get SQL string
            var sql = where.ToString();
            var sqlHash = SHA1.HashAsHexString(sql);

            // If cache is allowed - look it up
            if (maxAgeQuery > 0 || maxAgeQuery == MaxAge.Any) {
                // Calculate the oldest time this could be
                var oldestTime = DateTime.Now.AddMinutes(-(int)maxAgeQuery);

                // Load relevant query from cache
                lock (Cache) {
                    var cacheOutput = Cache.Get("query-" + sqlHash) as ResultantNodeIds;

                    // Check for cache hit
                    if (null != cacheOutput && cacheOutput.AsAt >= oldestTime || maxAgeQuery == MaxAge.Any) {
                        // Hit - return result
                        return GetNodes(cacheOutput.NodeIds, requestingNodeId, maxAgeObjects);
                    }
                }
            }

            // Open database
            var ids = new List<Xid>();

            // Fetch Ids
            using (var query = new DatabaseQuery(DatabaseQueryString.Create(where.ToString()))) {
                using(var rdr = query.ExecuteReader()){
                    while (rdr.Read()) {
                        ids.Add(new Xid((Guid)rdr[0]));
                    }
                }
            }

            // Create ID result
            var resultIds = new ResultantNodeIds(ids, maxAgeQuery);

            // Add items to cache
            lock (Cache) {
                Cache.Set("query-" + sqlHash, resultIds, Variant.GetCacheStoragePolicy());
            }

            return GetNodes(resultIds.NodeIds, requestingNodeId, maxAgeObjects);
        }