예제 #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;
        }
예제 #2
0
        public GenericAsset SystemCreateAsset(Stream inputStream, string fileName, string contentType, Xid domainId, Xid requestingNodeId, Xid? derivedFromId = null)
        {
            // Generate key
            var key = Token.Generate().ToString();

            // Ask server to create asset
            Xid assetId;
            using (var query = new DatabaseQuery(DatabaseQueryString.Create("AssetCreate")) { Type = CommandType.StoredProcedure }) {
                query.Bind("domainId", domainId.ToGuid());
                query.Bind("fileName", fileName);
                query.Bind("contentType", contentType);
                query.Bind("length", inputStream.Length);
                if (derivedFromId.HasValue) {
                    query.Bind("derivedFrom", derivedFromId.Value.ToGuid());
                } else {
                    query.Bind("derivedFrom", DBNull.Value);
                }
                query.Bind("key", key);
                query.Bind("requestingNodeId", requestingNodeId.ToGuid());
                query.BindOutput("id", SqlDbType.UniqueIdentifier);
                query.Execute();
                assetId = new Xid((Guid)query.Parameters["id"].Value);
            }

            // Create arecord
            var record = new ARecordLoader(assetId, domainId, fileName, contentType, inputStream.Length, derivedFromId, key);

            // Upload blob
            Variant.BlobContainer.Get(record.Key).Put(inputStream, fileName, contentType, -1);

            // Preseed cache - BONUS PERFORMANCE
            Variant.Cache.Set("asset-" + Id.ToString(), record, Variant.GetCacheStoragePolicy());

            return GetAsset(assetId, requestingNodeId, MaxAge.Any);
        }