示例#1
0
        public object Store(string kind, IDictionary <string, object> data, ICollection <string> dirtyNames)
        {
            var key = _keyAccess.GetKey(kind, data);

            if (key == null)
            {
                key = _autoId++;
                _keyAccess.SetKey(kind, data, key);
            }
            else
            {
                Trash(kind, key);
            }

            _storage.Add(data);
            return(key);
        }
示例#2
0
        public object Store(string kind, IDictionary <string, object> data, ICollection <string> dirtyNames)
        {
            var key           = _keyAccess.GetKey(kind, data);
            var autoIncrement = _keyAccess.IsAutoIncrement(kind);

            if (!autoIncrement && key == null)
            {
                throw new InvalidOperationException("Missing key value");
            }

            var isNew = !autoIncrement ? !IsKnownKey(kind, key) : key == null;

            if (!isNew && key != null)
            {
                data = new Dictionary <string, object>(data);
                _keyAccess.SetKey(kind, data, null);
            }

            data = data
                   .Where(e => dirtyNames == null || dirtyNames.Contains(e.Key))
                   .ToDictionary(e => e.Key, e => ConvertValue(e.Value));

            if (_isFluidMode)
            {
                data = DropNulls(kind, data);
                CheckSchema(kind, data);
            }

            if (isNew)
            {
                var insertResult = _details.ExecInsert(_db, kind, _keyAccess.GetAutoIncrementName(kind), data);
                if (autoIncrement)
                {
                    return(insertResult);
                }
            }
            else if (data.Count > 0)
            {
                ExecUpdate(kind, key, data);
            }

            return(key);
        }
示例#3
0
 internal void SetKey(IKeyAccess access, object key)
 {
     access.SetKey(_kind, _props, key);
 }