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; }
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); }