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"); } }
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(); } }
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)))); }