Beispiel #1
0
        internal static JValue FromBson(BsonTypes bsonType, byte[] buffer, ref int offset)
        {
            switch (bsonType)
            {
            case BsonTypes.BsonBoolean:
                return(new JValue(buffer[offset++] != 0 ? true : false));

            case BsonTypes.BsonDateTime:
                var dt = (DateTime)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.DateTime);
                return(new JValue(dt));

            case BsonTypes.BsonDouble:
                var dbl = (double)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Double);
                return(new JValue(dbl));

            case BsonTypes.BsonInt32:
                var i32 = (Int32)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int32);
                return(new JValue(i32));

            case BsonTypes.BsonInt64:
                var i64 = (Int64)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int64);
                return(new JValue(i64));

            case BsonTypes.BsonString:
                var str = (string)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.String);
                return(new JValue(str));

            default:
                throw new Exception("Unsupported type");
            }
        }
Beispiel #2
0
        protected FileBasedLiteDbRepository(string directoryPath, string fileName, bool shrink = true, bool isShared = false, bool isReadonly = false, bool requireUpgrade = true)
        {
            DbFileName      = fileName ?? throw new ArgumentNullException(nameof(fileName));
            DbDirectoryPath = directoryPath ?? throw new ArgumentNullException(nameof(directoryPath));
            var idType = typeof(TId);

            // ReSharper disable once VirtualMemberCallInConstructor
            if (IsBson || BsonTypes.Contains(idType))
            {
                ToBson   = id => new BsonValue(id);
                FromBson = bson => (TId)bson.RawValue;
            }
            else
            {
                ToBson   = id => BsonMapper.Global.ToDocument(id);
                FromBson = bson => BsonMapper.Global.ToObject <TId>(bson.AsDocument);
            }

            if (!Directory.Exists(DbDirectoryPath))
            {
                Directory.CreateDirectory(DbDirectoryPath);
            }

            var filePath = Path.Combine(DbDirectoryPath, $"{DbFileName}{DbFileExtension}");

            Db = new LiteDatabase(
                $"filename={filePath};upgrade={requireUpgrade.ToString(CultureInfo.InvariantCulture)};readonly={isReadonly.ToString(CultureInfo.InvariantCulture)};connection={(isShared ? "shared" : "direct")}");
            if (shrink)
            {
                Db.Rebuild();
            }
        }
Beispiel #3
0
        internal static JArray FromBson(byte[] buffer, ref int offset, InstanceFactory factory = null)
        {
            BsonTypes elementType = (BsonTypes)0;

            int startingOffset = offset;
            int len            = (Int32)SerializationUtilities.Unmarshall(buffer, ref offset, TypeCode.Int32);

            var list = new ArrayList();
            int idx  = 0;

            while (offset < startingOffset + len - 1)
            {
                // get the element type
                var bsonType = (BsonTypes)buffer[offset++];
                if (elementType == (BsonTypes)0)
                {
                    elementType = bsonType;
                }
                if (bsonType != elementType)
                {
                    throw new Exception("all array elements must be of the same type");
                }

                // get the element name
                var idxNul = JToken.FindNul(buffer, offset);
                if (idxNul == -1)
                {
                    throw new Exception("Missing ename terminator");
                }
                var ename   = JToken.ConvertToString(buffer, offset, idxNul - offset);
                var elemIdx = int.Parse(ename);
                if (elemIdx != idx)
                {
                    throw new Exception("sparse arrays are not supported");
                }
                ++idx;

                offset = idxNul + 1;

                JToken item = null;
                switch (bsonType)
                {
                case BsonTypes.BsonArray:
                    item = JArray.FromBson(buffer, ref offset, factory);
                    break;

                case BsonTypes.BsonDocument:
                    item = JObject.FromBson(buffer, ref offset, factory);
                    break;

                case BsonTypes.BsonNull:
                    item = new JValue();
                    break;

                case BsonTypes.BsonBoolean:
                case BsonTypes.BsonDateTime:
                case BsonTypes.BsonDouble:
                case BsonTypes.BsonInt32:
                case BsonTypes.BsonInt64:
                case BsonTypes.BsonString:
                    item = JValue.FromBson(bsonType, buffer, ref offset);
                    break;
                }
                list.Add(item);
            }
            if (buffer[offset++] != 0)
            {
                throw new Exception("bad format - missing trailing null on bson document");
            }
            return(new JArray((JToken[])list.ToArray(typeof(JToken))));
        }