Skip to content

Commit

Permalink
Finish rebuild process - will merge from master before finish
Browse files Browse the repository at this point in the history
  • Loading branch information
mbdavid committed Feb 13, 2024
1 parent d095f84 commit dfaeb93
Show file tree
Hide file tree
Showing 23 changed files with 719 additions and 342 deletions.
14 changes: 14 additions & 0 deletions ConsoleApp1/ConsoleApp1.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\LiteDB\LiteDB.csproj" />
</ItemGroup>

</Project>
39 changes: 39 additions & 0 deletions ConsoleApp1/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using LiteDB;
using LiteDB.Engine;

var password= "bzj2NplCbVH/bB8fxtjEC7u0unYdKHJVSmdmPgArRBwmmGw0+Wd2tE+b2zRMFcHAzoG71YIn/2Nq1EMqa5JKcQ==";
var original = "C:\\LiteDB\\Examples\\Original.db";
var path = $"C:\\LiteDB\\Examples\\TestCacheDb_{DateTime.Now.Ticks}.db";

File.Copy(original, path);

var settings = new EngineSettings
{
//AutoRebuild = true,
Filename = path,
Password = password
};

/*
var errors = new List<FileReaderError>();
using var reader = new FileReaderV8(settings, errors);
reader.Open();
var pragmas = reader.GetPragmas();
var cols = reader.GetCollections().ToArray();
var docs = reader.GetDocuments("hubData$AppOperations").ToArray();
*/

var db = new LiteEngine(settings);

db.Rebuild();



//var reader = db.Query("hubData$AppOperations", Query.All());
//var data = reader.ToList();

Console.ReadKey();
6 changes: 6 additions & 0 deletions LiteDB.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LiteDB.Benchmarks", "LiteDB
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LiteDB.Stress", "LiteDB.Stress\LiteDB.Stress.csproj", "{FFBC5669-DA32-4907-8793-7B414279DA3B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{E8763934-E46A-4AAF-A2B5-E812016DAF84}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -39,6 +41,10 @@ Global
{FFBC5669-DA32-4907-8793-7B414279DA3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FFBC5669-DA32-4907-8793-7B414279DA3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FFBC5669-DA32-4907-8793-7B414279DA3B}.Release|Any CPU.Build.0 = Release|Any CPU
{E8763934-E46A-4AAF-A2B5-E812016DAF84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E8763934-E46A-4AAF-A2B5-E812016DAF84}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E8763934-E46A-4AAF-A2B5-E812016DAF84}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E8763934-E46A-4AAF-A2B5-E812016DAF84}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
22 changes: 3 additions & 19 deletions LiteDB/Client/Shared/SharedEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,14 @@ public class SharedEngine : ILiteEngine
{
private readonly EngineSettings _settings;
private readonly Mutex _mutex;
private readonly LiteEngine _engine;
private LiteEngine _engine;
private int _stack = 0;

public bool IsOpen => _engine.IsOpen;

public SharedEngine(EngineSettings settings)
{
_settings = settings;

// kepp control over open/close engine
_settings.AutoOpen = false;

_engine = new LiteEngine(_settings);

var name = Path.GetFullPath(settings.Filename).ToLower().Sha1();

try
Expand Down Expand Up @@ -71,7 +65,7 @@ private void OpenDatabase()

try
{
_engine.Open();
_engine = new LiteEngine(_settings);
}
catch
{
Expand All @@ -95,23 +89,13 @@ private void CloseDatabase()
if (_stack == 0)
{
_engine.Close();
_engine = null;

_mutex.ReleaseMutex();
}
}
}

public bool Open()
{
return true; // controlled by OpenDatabase() - no external need
}

public bool Close()
{
return true; // controlled by CloseDatabase() - no external need
}


#region Transaction Operations

public bool BeginTrans()
Expand Down
2 changes: 1 addition & 1 deletion LiteDB/Document/Bson/BsonSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static BsonDocument Deserialize(byte[] buffer, bool utcDate = false, Hash

using (var reader = new BufferReader(buffer, utcDate))
{
return reader.ReadDocument(fields);
return reader.ReadDocument(fields).GetValue();
}
}
}
Expand Down
71 changes: 43 additions & 28 deletions LiteDB/Engine/Disk/Serializer/BufferReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -397,8 +397,8 @@ public BsonValue ReadIndexKey()
// Use +1 byte only for length
case BsonType.String: return this.ReadString(this.ReadByte());

case BsonType.Document: return this.ReadDocument(null);
case BsonType.Array: return this.ReadArray();
case BsonType.Document: return this.ReadDocument(null).GetValue();
case BsonType.Array: return this.ReadArray().GetValue();

// Use +1 byte only for length
case BsonType.Binary: return this.ReadBytes(this.ReadByte());
Expand All @@ -422,51 +422,66 @@ public BsonValue ReadIndexKey()
/// <summary>
/// Read a BsonDocument from reader
/// </summary>
public BsonDocument ReadDocument(HashSet<string> fields = null)
public Result<BsonDocument> ReadDocument(HashSet<string> fields = null)
{
var length = this.ReadInt32();
var end = _position + length - 5;
var remaining = fields == null || fields.Count == 0 ? null : new HashSet<string>(fields, StringComparer.OrdinalIgnoreCase);

var doc = new BsonDocument();

while (_position < end && (remaining == null || remaining?.Count > 0))
try
{
var value = this.ReadElement(remaining, out string name);
var length = this.ReadInt32();
var end = _position + length - 5;
var remaining = fields == null || fields.Count == 0 ? null : new HashSet<string>(fields, StringComparer.OrdinalIgnoreCase);

// null value means are not selected field
if (value != null)
while (_position < end && (remaining == null || remaining?.Count > 0))
{
doc[name] = value;
var value = this.ReadElement(remaining, out string name);

// remove from remaining fields
remaining?.Remove(name);
// null value means are not selected field
if (value != null)
{
doc[name] = value;

// remove from remaining fields
remaining?.Remove(name);
}
}
}

this.MoveForward(1); // skip \0
this.MoveForward(1); // skip \0 ** can read disk here!

return doc;
return doc;
}
catch (Exception ex)
{
return new Result<BsonDocument>(doc, ex);
}
}

/// <summary>
/// Read an BsonArray from reader
/// </summary>
public BsonArray ReadArray()
public Result<BsonArray> ReadArray()
{
var length = this.ReadInt32();
var end = _position + length - 5;
var arr = new BsonArray();

while (_position < end)
try
{
var value = this.ReadElement(null, out string name);
arr.Add(value);
}
var length = this.ReadInt32();
var end = _position + length - 5;

while (_position < end)
{
var value = this.ReadElement(null, out string name);
arr.Add(value);
}

this.MoveForward(1); // skip \0
this.MoveForward(1); // skip \0

return arr;
return arr;
}
catch (Exception ex)
{
return new Result<BsonArray>(arr, ex);
}
}

/// <summary>
Expand Down Expand Up @@ -513,11 +528,11 @@ private BsonValue ReadElement(HashSet<string> remaining, out string name)
}
else if (type == 0x03) // Document
{
return this.ReadDocument();
return this.ReadDocument().GetValue();
}
else if (type == 0x04) // Array
{
return this.ReadArray();
return this.ReadArray().GetValue();
}
else if (type == 0x05) // Binary
{
Expand Down
2 changes: 1 addition & 1 deletion LiteDB/Engine/Engine/Index.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public bool EnsureIndex(string collection, string name, BsonExpression expressio
{
using (var reader = new BufferReader(data.Read(pkNode.DataBlock)))
{
var doc = reader.ReadDocument(expression.Fields);
var doc = reader.ReadDocument(expression.Fields).GetValue();

// first/last node in this document that will be added
IndexNode last = null;
Expand Down
22 changes: 19 additions & 3 deletions LiteDB/Engine/Engine/Rebuild.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ namespace LiteDB.Engine
public partial class LiteEngine
{
/// <summary>
/// Implement a full database export/import. Database should be closed before Rebuild
/// Implement a full rebuild database. A backup copy will be created with -backup extention. All data will be readed and re created in another database
/// </summary>
public long Rebuild(RebuildOptions options)
{
if (_isOpen) throw LiteException.InvalidEngineState(false, "REBUILD");
this.Close();

// run build service
var rebuilder = new RebuildService(_settings);
Expand All @@ -23,7 +23,23 @@ public long Rebuild(RebuildOptions options)
options.Errors.Clear();

// return how many bytes of diference from original/rebuild version
return rebuilder.Rebuild(options);
var diff = rebuilder.Rebuild(options);

// re-open database
this.Open();

return diff;
}

/// <summary>
/// Implement a full rebuild database. A backup copy will be created with -backup extention. All data will be readed and re created in another database
/// </summary>
public long Rebuild()
{
var collation = new Collation(this.Pragma(Pragmas.COLLATION));
var password = _settings.Password;

return this.Rebuild(new RebuildOptions { Password = password, Collation = collation });
}

/// <summary>
Expand Down
8 changes: 4 additions & 4 deletions LiteDB/Engine/Engine/Transaction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public partial class LiteEngine
/// </summary>
public bool BeginTrans()
{
if (!_isOpen) throw LiteException.InvalidEngineState(true, "TRANSACTION");
if (_disposed) throw LiteException.InvalidEngineState(true, "TRANSACTION");

var transacion = _monitor.GetTransaction(true, false, out var isNew);

Expand All @@ -32,7 +32,7 @@ public bool BeginTrans()
/// </summary>
public bool Commit()
{
if (!_isOpen) throw LiteException.InvalidEngineState(true, "TRANSACTION");
if (_disposed) throw LiteException.InvalidEngineState(true, "TRANSACTION");

var transaction = _monitor.GetTransaction(false, false, out _);

Expand All @@ -57,7 +57,7 @@ public bool Commit()
/// </summary>
public bool Rollback()
{
if (!_isOpen) throw LiteException.InvalidEngineState(true, "TRANSACTION");
if (_disposed) throw LiteException.InvalidEngineState(true, "TRANSACTION");

var transaction = _monitor.GetTransaction(false, false, out _);

Expand All @@ -78,7 +78,7 @@ public bool Rollback()
/// </summary>
private T AutoTransaction<T>(Func<TransactionService, T> fn)
{
if (!_isOpen) throw LiteException.InvalidEngineState(true, "TRANSACTION");
if (_disposed) throw LiteException.InvalidEngineState(true, "TRANSACTION");

var transaction = _monitor.GetTransaction(true, false, out var isNew);

Expand Down
5 changes: 0 additions & 5 deletions LiteDB/Engine/EngineSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,6 @@ public class EngineSettings
/// </summary>
public bool ReadOnly { get; set; } = false;

/// <summary>
/// Call Open() method in LiteEngine in class constructor
/// </summary>
public bool AutoOpen { get; set; } = true;

/// <summary>
/// After a Close with exception do a database rebuild
/// </summary>
Expand Down
5 changes: 2 additions & 3 deletions LiteDB/Engine/FileReader/FileReaderError.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,13 @@ namespace LiteDB.Engine
{
/// <summary>
/// </summary>
public class FileReaderError
internal class FileReaderError
{
public DateTime Created { get; } = DateTime.Now;
public FileOrigin Origin { get; set; }
public long Position { get; set; }
public uint? PageID { get; set; }
public int Code { get; set; }
public string Field { get; set; }
public PageType PageType { get; set; }
public string Message { get; set; }
public Exception Exception { get; set; }
}
Expand Down
Loading

0 comments on commit dfaeb93

Please sign in to comment.