示例#1
0
        public bool IsNew(string kind, IDictionary <string, object> data)
        {
            var key                   = _keyAccess.GetKey(kind, data);
            var autoIncrement         = _keyAccess.IsAutoIncrement(kind);
            var autoIncrementReplaced = _keyAccess.IsAutoIncrementReplaced();

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

            return(!autoIncrement ? !IsKnownKey(kind, key) : key == null);
        }
示例#2
0
        internal static string GetAutoIncrementName(this IKeyAccess keyAccess, string kind)
        {
            if (!keyAccess.IsAutoIncrement(kind))
            {
                return(null);
            }

            return(keyAccess.GetKeyNames(kind).First());
        }
示例#3
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);
        }