public string WriteRow(IList <Tuple <string, string> > keys, IDictionary <string, object> data, string eTag)
        {
            if (keys.Count > numKeyLayers)
            {
                var error = string.Format("Wrong number of keys supplied -- Expected count = {0} Received = {1}", numKeyLayers, keys.Count);
                Trace.TraceError(error);
                throw new ArgumentOutOfRangeException("keys", keys.Count, error);
            }

            lock (lockable)
            {
                var storedData = GetDataStore(keys);

                foreach (var kv in data)
                {
                    storedData[kv.Key] = kv.Value;
                }

                Etag = NewEtag();
#if DEBUG
                var storeContents = DumpData(false);
                Trace.TraceInformation("WriteRow: Keys={0} Data={1} Store contents after = {2} New Etag = {3}",
                                       StorageProviderUtils.PrintKeys(keys),
                                       StorageProviderUtils.PrintData(data),
                                       storeContents, Etag);
#endif
                return(Etag);
            }
        }
        public bool DeleteRow(IList <Tuple <string, string> > keys, string eTag)
        {
            if (keys.Count > numKeyLayers)
            {
                throw new ArgumentOutOfRangeException("keys", keys.Count,
                                                      string.Format("Not enough keys supplied -- Expected count = {0} Received = {1}", numKeyLayers, keys.Count));
            }

            string keyStr = MakeStoreKey(keys);

            bool removedEntry = false;

            lock (lockable)
            {
                IDictionary <string, object> data;
                if (dataTable.TryGetValue(keyStr, out data))
                {
                    var kv = new KeyValuePair <string, IDictionary <string, object> >(keyStr, data);
                    dataTable.Remove(kv);
                    removedEntry = true;
                }

                // No change to Etag
#if DEBUG
                Trace.TraceInformation("DeleteRow: Keys={0} Removed={1} Data={2} Etag={3}",
                                       StorageProviderUtils.PrintKeys(keys),
                                       StorageProviderUtils.PrintData(data),
                                       removedEntry, Etag);
#endif
                return(removedEntry);
            }
        }
        public string DumpData(bool printDump = true)
        {
            var sb = new StringBuilder();

            lock (lockable)
            {
                foreach (var kv in dataTable)
                {
                    sb.AppendFormat("{0} => {1}", kv.Key, StorageProviderUtils.PrintData(kv.Value)).AppendLine();
                }
            }
#if !DEBUG
            if (printDump)
#endif
            {
                Trace.TraceInformation("Dump {0} Etag={1} Data= {2}", GetType(), Etag, sb);
            }
            return(sb.ToString());
        }
        public IDictionary <string, object> ReadRow(IList <Tuple <string, string> > keys)
        {
            if (keys.Count > numKeyLayers)
            {
                var error = string.Format("Not enough keys supplied -- Expected count = {0} Received = {1}", numKeyLayers, keys.Count);
                Trace.TraceError(error);
                throw new ArgumentOutOfRangeException("keys", keys.Count, error);
            }

            lock (lockable)
            {
                IDictionary <string, object> data = GetDataStore(keys);

#if DEBUG
                Trace.TraceInformation("ReadMultiRow: Keys={0} returning Data={1}",
                                       StorageProviderUtils.PrintKeys(keys), StorageProviderUtils.PrintData(data));
#endif
                return(data);
            }
        }
        public string DumpData(bool printDump = true)
        {
            var sb = new StringBuilder();

            lock (lockable)
            {
                string[] keys = dataTable.Keys.ToArray();
                foreach (var key in keys)
                {
                    var data = dataTable[key];
                    sb.AppendFormat("{0} => {1}", key, StorageProviderUtils.PrintData(data)).AppendLine();
                }
            }
#if !DEBUG
            if (printDump)
#endif
            {
                Trace.TraceInformation("Dump {0} Etag={1} Data= {2}", GetType(), Etag, sb);
            }
            return(sb.ToString());
        }
        public bool DeleteRow(IList <Tuple <string, string> > keys, string eTag)
        {
            if (keys.Count > numKeyLayers)
            {
                throw new ArgumentOutOfRangeException("keys", keys.Count,
                                                      string.Format("Not enough keys supplied -- Expected count = {0} Received = {1}", numKeyLayers, keys.Count));
            }

            string keyStr = MakeStoreKey(keys);

            lock (lockable)
            {
                // No change to Etag
#if DEBUG
                var removedEntry = dataTable.TryGetValue(keyStr, out var data);
                Trace.TraceInformation("DeleteRow: Keys={0} Removed={2} Data={1} Etag={3}",
                                       StorageProviderUtils.PrintKeys(keys),
                                       StorageProviderUtils.PrintData(data),
                                       removedEntry, Etag);
#endif
                return(dataTable.Remove(keyStr));
            }
        }
Exemple #7
0
        internal static Func <IDictionary <string, object>, bool> GetComparer <T>(string rangeParamName, T fromValue, T toValue) where T : IComparable
        {
            Comparer comparer    = Comparer.DefaultInvariant;
            bool     sameRange   = comparer.Compare(fromValue, toValue) == 0; // FromValue == ToValue
            bool     insideRange = comparer.Compare(fromValue, toValue) < 0;  // FromValue < ToValue
            Func <IDictionary <string, object>, bool> compareClause;

            if (sameRange)
            {
                compareClause = data =>
                {
                    if (data == null || data.Count <= 0)
                    {
                        return(false);
                    }

                    if (!data.ContainsKey(rangeParamName))
                    {
                        var error = string.Format("Cannot find column '{0}' for range query from {1} to {2} in Data={3}",
                                                  rangeParamName, fromValue, toValue, StorageProviderUtils.PrintData(data));
                        throw new KeyNotFoundException(error);
                    }
                    T obj = (T)data[rangeParamName];
                    return(comparer.Compare(obj, fromValue) == 0);
                };
            }
            else if (insideRange)
            {
                compareClause = data =>
                {
                    if (data == null || data.Count <= 0)
                    {
                        return(false);
                    }

                    if (!data.ContainsKey(rangeParamName))
                    {
                        var error = string.Format("Cannot find column '{0}' for range query from {1} to {2} in Data={3}",
                                                  rangeParamName, fromValue, toValue, StorageProviderUtils.PrintData(data));
                        throw new KeyNotFoundException(error);
                    }
                    T obj = (T)data[rangeParamName];
                    return(comparer.Compare(obj, fromValue) >= 0 && comparer.Compare(obj, toValue) <= 0);
                };
            }
            else
            {
                compareClause = data =>
                {
                    if (data == null || data.Count <= 0)
                    {
                        return(false);
                    }

                    if (!data.ContainsKey(rangeParamName))
                    {
                        var error = string.Format("Cannot find column '{0}' for range query from {1} to {2} in Data={3}",
                                                  rangeParamName, fromValue, toValue, StorageProviderUtils.PrintData(data));
                        throw new KeyNotFoundException(error);
                    }
                    T obj = (T)data[rangeParamName];
                    return(comparer.Compare(obj, fromValue) >= 0 || comparer.Compare(obj, toValue) <= 0);
                };
            }
            return(compareClause);
        }