Ejemplo n.º 1
0
        /// <summary>
        /// Gets a FileInfo for a given filename and revision. Considers only 'completed' uploads.
        /// </summary>
        /// <param name="revision">-1: The most recent revision. -2: The second most recent revision. -3: The third most recent revision. 0: The original stored file. 1: The first revision. 2: The second revision. etc...</param>
        /// <param name="bucket"><see cref="Bucket"/></param>
        /// <param name="cancelToken"><see cref="CancellationToken"/></param>
        /// <param name="filename">The filename</param>
        public static async Task <FileInfo> GetFileInfoByNameAsync(this Bucket bucket, string filename, int revision = -1,
                                                                   CancellationToken cancelToken = default)
        {
            filename = filename.SafePath();

            var index = new { index = bucket.fileIndex };

            var between = bucket.fileTable
                          .Between(R.Array(Status.Completed, filename, R.Minval()), R.Array(Status.Completed, filename, R.Maxval()))[index];

            var sort = revision >= 0 ? R.Asc(bucket.fileIndex) : R.Desc(bucket.fileIndex) as ReqlExpr;

            revision = revision >= 0 ? revision : (revision * -1) - 1;

            var selection = await between.OrderBy()[new { index = sort }]
                            .Skip(revision).Limit(1) // so the driver doesn't throw an error when a file isn't found.
                            .RunResultAsync <List <FileInfo> >(bucket.conn, cancelToken)
                            .ConfigureAwait(false);

            var fileinfo = selection.FirstOrDefault();

            if (fileinfo == null)
            {
                throw new FileNotFoundException(filename, revision);
            }

            return(fileinfo);
        }
        public override NexusExtDBBaseService OrderBy(string body)
        {
            OrderBy();

            string[] order    = body.Split(' ');
            bool     useIndex = order[0].StartsWith("index:");
            string   column   = useIndex ? order[0].Substring(6) : order[0];
            string   dir      = order.Count() > 1 ? order[1].ToLower() : "asc";

            switch (dir)
            {
            case "asc": {
                query = useIndex ? query.OrderBy().OptArg("index", r.Asc(column)) : query.OrderBy(r.Asc(column));
                break;
            }

            case "desc": {
                query = useIndex ? query.OrderBy().OptArg("index", r.Desc(column)) :  query.OrderBy(r.Desc(column));
                break;
            }
            }

            return(this);
        }