internal DataSet(Xid id, Variant variant) { Id = id; Variant = variant; Cache = Variant.Cache; // Check dataset is defined in database using (var query = new DatabaseQuery(DatabaseQueryString.Create("DataSetCheck")) { Type = CommandType.StoredProcedure }) { query.Bind("dataSetId", Id.ToGuid()); query.BindOutput("exists", SqlDbType.Int); query.Execute(); } }
public bool Equals(DatabaseQuery value) { return QueryString == value.QueryString; }
public Guid LogException(Exception ex, string environment, Xid requestingNodeId) { // Get session details var sessionId = new Xid(); string clientIp = null; if (null != HttpContext.Current) { if (null != HttpContext.Current.Session && !string.IsNullOrEmpty(HttpContext.Current.Session.SessionID)) { //Wrong SID sessionId = HttpContext.Current.Session.SessionID; } if (null != HttpContext.Current.Request) { clientIp = HttpContext.Current.Request.UserHostAddress; } } // Log inner exception Guid? innerExceptionId = null == ex.InnerException ? null : (Guid?)LogException(ex.InnerException, environment, requestingNodeId); using (var query = new DatabaseQuery(DatabaseQueryString.Create("ExceptionLog2")) { Type = System.Data.CommandType.StoredProcedure }) { query.Parameters.Add(new SqlParameter("dataSetId", DataSetId.ToGuid())); query.Parameters.Add(new SqlParameter("environment", environment ?? "<null>")); query.Parameters.Add(new SqlParameter("message", ex.Message.Substr(0, 1024))); var data = ""; if (null != ex.Data) { data = ex.Data.ToString().Substr(0, 1024); } query.Parameters.Add(new SqlParameter("data", data)); query.Parameters.Add(new SqlParameter("sourceSite", ex.Source)); query.Parameters.Add(new SqlParameter("stackTrace", ex.StackTrace.ToString())); if (null == innerExceptionId) { query.Parameters.Add(new SqlParameter("innerException", DBNull.Value)); } else { query.Parameters.Add(new SqlParameter("innerException", innerExceptionId)); } query.Parameters.Add(new SqlParameter("caught", false)); query.Parameters.Add(new SqlParameter("clientIp", clientIp ?? "<null>")); query.Parameters.Add(new SqlParameter("sessionId", sessionId.ToGuid())); query.Parameters.Add(new SqlParameter("requestingNodeId", requestingNodeId.ToGuid())); query.Parameters.Add(new SqlParameter("id", System.Data.SqlDbType.UniqueIdentifier) { Direction = System.Data.ParameterDirection.Output }); query.Execute(); return (Guid)query.Parameters["id"].Value; } }
public void ProcessRequest(HttpContext context) { if (null == context) { throw new ArgumentNullException("context"); } // Start timing var stopwatch = new Stopwatch(); stopwatch.Start(); try { ProcessRequestInner(context, context.Request, context.Response); } catch (ThreadAbortException) { } catch (Exception ex) { var id = LogException(ex, "ProcessRequest", Ids.System); context.Response.SendFailure(HttpStatusCode.InternalServerError, "Unexpected issue. Logged as " + id.ToString()); // Okay, this is pretty major, let it hit the surface. throw; } finally { // Stop timing stopwatch.Stop(); // Create session in database var sessionId = new Xid(); using (var query = new DatabaseQuery(DatabaseQueryString.Create("RequestLog")) { Type = System.Data.CommandType.StoredProcedure }) { query.Parameters.Add(new SqlParameter("dataSetId", DataSetId.ToGuid())); query.Parameters.Add(new SqlParameter("ip", context.Request.UserHostAddress ?? "")); query.Parameters.Add(new SqlParameter("referrer", null == context.Request.UrlReferrer ? "" : context.Request.UrlReferrer.AbsoluteUri)); query.Parameters.Add(new SqlParameter("userAgent", context.Request.UserAgent ?? "")); string langs = null; if (null != context.Request.UserLanguages) { langs = Json.Serialize(context.Request.UserLanguages); } if (null == langs) { langs = ""; } query.Parameters.Add(new SqlParameter("languages", langs)); query.Parameters.Add(new SqlParameter("path", null == context.Request.Path ? "" : context.Request.Path)); query.Parameters.Add(new SqlParameter("sessionId", sessionId.ToGuid())); query.Parameters.Add(new SqlParameter("processingTime", stopwatch.ElapsedMilliseconds)); query.Parameters.Add(new SqlParameter("id", System.Data.SqlDbType.UniqueIdentifier) { Direction = System.Data.ParameterDirection.Output }); query.Execute(); } } }
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 GenericNode SystemCreateNode(Xid domainId, Xid nodeTypeId, Xid requestingNodeId) { // Ask server to create node Xid nodeId; using (var query = new DatabaseQuery(DatabaseQueryString.Create("NodeCreate")) { Type = CommandType.StoredProcedure }) { query.Bind("domainId", domainId.ToGuid()); query.Bind("typeId", nodeTypeId.ToGuid()); query.Bind("requestingNodeId", requestingNodeId.ToGuid()); query.BindOutput("id", SqlDbType.UniqueIdentifier); query.Execute(); nodeId = new Xid((Guid)query.Parameters["id"].Value); } // Preseed cache - BONUS PERFORMANCE Variant.Cache.Set("node-" + Id.ToString(), new NRecordLoader(nodeId, domainId, nodeTypeId, Id), Variant.GetCacheStoragePolicy()); // Return node return GetNode(nodeId, requestingNodeId, MaxAge.Any); }
public Xid SystemCreateDomain(Xid requestingNodeId) { // Ask server to create node Xid domainId; using (var query = new DatabaseQuery(DatabaseQueryString.Create("DomainCreate")) { Type = CommandType.StoredProcedure }) { query.Bind("dataSetId", Id.ToGuid()); query.Bind("requestingNodeId", requestingNodeId.ToGuid()); query.BindOutput("id", SqlDbType.UniqueIdentifier); query.Execute(); domainId = new Xid((Guid)query.Parameters["id"].Value); } return domainId; }
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); }
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); }
internal static Session Create(HttpRequest request, Variant variant, IEnvelopeHandler envelopeHandler) { // Create session in database Xid id; using (var query = new DatabaseQuery(DatabaseQueryString.Create("SessionStartLog")) { Type = System.Data.CommandType.StoredProcedure }) { query.Parameters.Add(new SqlParameter("dataSetId", variant.DataSetId.ToGuid())); query.Parameters.Add(new SqlParameter("ip", request.UserHostAddress ?? "")); query.Parameters.Add(new SqlParameter("referrer", null == request.UrlReferrer ? "" : request.UrlReferrer.AbsoluteUri)); query.Parameters.Add(new SqlParameter("userAgent", request.UserAgent ?? "")); query.Parameters.Add(new SqlParameter("languages", null == request.UserLanguages ? "" : Json.Serialize(request.UserLanguages))); query.Parameters.Add(new SqlParameter("id", System.Data.SqlDbType.UniqueIdentifier) { Direction = System.Data.ParameterDirection.Output }); query.Execute(); id = (Xid)(Guid)query.Parameters["id"].Value; } return StoreDatabase[id] = new Session(id, variant, envelopeHandler); }