Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 41 additions & 3 deletions LiteDB.Tests/Database/ConnectionString_Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ public void ConnectionString_Parser()

// file with spaces with " and ;
var full = new ConnectionString(
@"filename=""c:\only;file\""d\""emo.db"";
@"filename=""c:\only;file\""d\""e=mo.db"";
password = ""john-doe "" ;
initial size = 10 MB ;
readONLY = TRUE;");

full.Filename.Should().Be(@"c:\only;file""d""emo.db");
full.Filename.Should().Be(@"c:\only;file""d""e=mo.db");
full.Password.Should().Be("john-doe ");
full.ReadOnly.Should().BeTrue();
full.InitialSize.Should().Be(10 * 1024 * 1024);
Expand All @@ -47,5 +47,43 @@ public void ConnectionString_Very_Long()
cn.Password.Length.Should().Be(512);

}

[Fact]
public void ConnectionString_ToString()
{
var empty = new ConnectionString();

empty.ToString().Should().BeEmpty();

var onlyfile = new ConnectionString
{
Filename = @"c:\only file\demo.db",
};

onlyfile.ToString().Should().Be(@"c:\only file\demo.db");

// filename with =
var fileWithSpecials = new ConnectionString
{
Filename = @"c:\only file\d""e=mo.db",
};

fileWithSpecials.ToString().Should().Be(@"Filename=""c:\only file\d\""e=mo.db""");

// file with spaces with " and ;
var full = new ConnectionString
{
Filename = @"c:\only;file""d""emo.db",
Password = "john-doe ",
ReadOnly = true,
InitialSize = 10_485_760,
};

full.ToString().Should().Be(@"Filename=""c:\only;file\""d\""emo.db"";Password=""john-doe "";Initial Size=10485760;ReadOnly=True");

// ToString/Parse round trips
var parsed = new ConnectionString(full.ToString());
parsed.Should().BeEquivalentTo(full);
}
}
}
}
118 changes: 116 additions & 2 deletions LiteDB/Client/Structures/ConnectionString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using static LiteDB.Constants;
using System.Text;

namespace LiteDB
{
Expand Down Expand Up @@ -136,5 +136,119 @@ internal ILiteEngine CreateEngine(Action<EngineSettings> engineSettingsAction =
throw new NotImplementedException();
}
}

/// <inheritdoc />
public override string ToString()
{
if (string.IsNullOrEmpty(Filename))
{
return string.Empty;
}

var bld = new StringBuilder("Filename=");
AppendQuotedString(bld, Filename);
bld.Append(';');

var fileNameLength = bld.Length;

if (Connection != ConnectionType.Direct)
{
bld.Append("Connection=")
.Append(Connection)
.Append(';');
}

if (Password != null)
{
bld.Append("Password=");
AppendQuotedString(bld, Password);
bld.Append(';');
}

if (InitialSize != 0)
{
bld.Append("Initial Size=")
.AppendFormat(CultureInfo.InvariantCulture, "{0:D}", InitialSize)
.Append(';');
}

if (ReadOnly)
{
bld.Append("ReadOnly=")
.Append(ReadOnly)
.Append(';');
}

if (Collation != null)
{
bld.Append("Collation=")
.Append(Collation.Culture.Name)
.Append('/');

foreach (CompareOptions option in Enum.GetValues(typeof(CompareOptions)))
{
if (option != CompareOptions.None && Collation.SortOptions.HasFlag(option))
{
bld.Append(option)
.Append(',');
}
}

if (bld[bld.Length - 1] == '/')
{
bld.Append("None");
}
else
{
bld.Length--; //,
}

bld.Append(';');
}

if (Upgrade)
{
bld.Append("Upgrade=")
.Append(Upgrade)
.Append(';');
}

if (AutoRebuild)
{
bld.Append("Auto-Rebuild=")
.Append(AutoRebuild)
.Append(';');
}

if (bld.Length == fileNameLength && !Filename.Contains("="))
{
return Filename;
}

bld.Length--; // ;
return bld.ToString();
}

private static void AppendQuotedString(StringBuilder target, string str)
{
if (string.IsNullOrEmpty(str))
{
return;
}

target.Append('"');

foreach (var chr in str)
{
if (chr is '"')
{
target.Append('\\');
}

target.Append(chr);
}

target.Append('"');
}
}
}
}
Loading