Example #1
0
        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();
            }
        }
Example #2
0
 public bool Equals(DatabaseQuery value)
 {
     return QueryString == value.QueryString;
 }
Example #3
0
        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;
            }
        }
Example #4
0
        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();
                }
            }
        }
Example #5
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;
        }
Example #6
0
        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);
        }
Example #7
0
 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;
 }
Example #8
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);
        }
Example #9
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);
        }
Example #10
0
 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);
 }