예제 #1
0
 public static void Set <T>(Tx tx, byte[] key, T dto)
 {
     using (var mem = new MemoryStream()) {
         Serializer.Serialize(mem, dto);
         tx.Put(key, mem.ToArray());
     }
 }
예제 #2
0
 public static bool Exists(Tx tx, byte[] key)
 {
     using (var cursor = tx.CreateCursor()) {
         var exists = cursor.MoveTo(key);
         return(exists);
     }
 }
예제 #3
0
 public static IEnumerable <KeyValuePair <TKey, ulong> > ScanUInt64 <TKey>(Tx tx, byte[] key,
                                                                           Func <IFdbTuple, TKey> keygen, string traceName, int skip = 0)
 {
     return(InternalScan(tx, key, (slice, bytes) => {
         var value = Slice.Create(bytes).ToUInt64();
         var k = keygen(FdbTuple.Unpack(slice));
         return new KeyValuePair <TKey, ulong>(k, value);
     }, traceName, skip));
 }
예제 #4
0
        public static long GetValueAsInt64(Tx tx, byte[] key, long defaultValue = 0)
        {
            var data = tx.Get(key);

            if (data == null)
            {
                return(defaultValue);
            }
            return(Slice.Create(data).ToInt64());
        }
예제 #5
0
 public static IEnumerable <KeyValuePair <TKey, TValue> > Scan <TKey, TValue>(Tx tx, byte[] key,
                                                                              Func <IFdbTuple, TKey> keygen, string traceName, int skip = 0)
 {
     return(InternalScan(tx, key, (slice, bytes) => {
         using (var mem = new MemoryStream(bytes)) {
             var value = Serializer.Deserialize <TValue>(mem);
             var k = keygen(FdbTuple.Unpack(slice));
             return new KeyValuePair <TKey, TValue>(k, value);
         }
     }, traceName, skip));
 }
예제 #6
0
        public static T GetOrDefault <T>(Tx tx, byte[] key, T defaultValue = default(T))
        {
            var data = tx.Get(key);

            if (data == null)
            {
                return(defaultValue);
            }

            using (var mem = new MemoryStream(data)) {
                return(Serializer.Deserialize <T>(mem));
            }
        }
예제 #7
0
        static IEnumerable <TOut> InternalScan <TOut>(Tx tx, byte[] key,
                                                      Func <Slice, byte[], TOut> convert, string traceName, int skip = 0)
        {
            tx.TraceStart(traceName);

            ushort x     = 0;
            var    slice = Slice.Create(key);
            var    range = FdbKeyRange.StartsWith(slice);

            using (var c = tx.CreateCursor()) {
                if (!c.MoveToFirstAfter(key))
                {
                    tx.TraceStop(traceName, x);
                    yield break;
                }

                var pair = c.Current;

                for (var i = 0; i < int.MaxValue; i++)
                {
                    var current = Slice.Create(pair.Key);
                    if (!range.Contains(current))
                    {
                        tx.TraceStop(traceName, x);
                        break;
                    }
                    if (i >= skip)
                    {
                        x += 1;
                        yield return(convert(current, pair.Value));
                    }

                    if (!c.MoveNext())
                    {
                        tx.TraceStop(traceName, x);
                        break;
                    }
                    pair = c.Current;
                }
            }
        }
예제 #8
0
        public static void DeleteRange(Tx tx, byte[] key, string traceName)
        {
            tx.TraceStart(traceName);
            ushort x     = 0;
            var    slice = Slice.Create(key);
            var    range = FdbKeyRange.StartsWith(slice);

            using (var c = tx.CreateCursor()) {
                if (!c.MoveToFirstAfter(key))
                {
                    tx.TraceStop(traceName, x);
                    return;
                }

                var pair = c.Current;

                for (var i = 0; i < int.MaxValue; i++)
                {
                    var current = Slice.Create(pair.Key);
                    if (!range.Contains(current))
                    {
                        tx.TraceStop(traceName, x);
                        break;
                    }

                    x += 1;
                    tx.Delete(pair.Key);

                    if (!c.MoveNext())
                    {
                        tx.TraceStop(traceName, x);
                        break;
                    }
                    pair = c.Current;
                }
            }


            tx.TraceStop(traceName);
        }
예제 #9
0
 public Tx Read()
 {
     return(Tx.StartRead(_env, _db));
 }
예제 #10
0
 public Tx Write()
 {
     return(Tx.StartWrite(_env, _db));
 }
예제 #11
0
 public static IEnumerable <TKey> ScanKeys <TKey>(Tx tx, byte[] key, Func <IFdbTuple, TKey> keygen,
                                                  string traceName, int skip = 0)
 {
     return(InternalScan(tx, key, (slice, bytes) => keygen(FdbTuple.Unpack(slice)), traceName, skip));
 }
예제 #12
0
 public static void SetEmpty(Tx tx, byte[] key)
 {
     tx.Put(key, EmptyBuffer);
 }
예제 #13
0
 public static void SetValue(Tx tx, byte[] key, long value)
 {
     tx.Put(key, Slice.FromInt64(value).GetBytes());
 }
예제 #14
0
 public static void Delete(Tx tx, byte[] key)
 {
     tx.TraceStart("Delete");
     tx.Delete(key);
     tx.TraceStop("Delete");
 }