Build a connectionstring parser, needs integration and testing
This commit is contained in:
parent
80ac032f18
commit
451bedd4e0
125
Tapeti/Helpers/ConnectionstringParser.cs
Normal file
125
Tapeti/Helpers/ConnectionstringParser.cs
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Tapeti.Helpers
|
||||||
|
{
|
||||||
|
public class ConnectionstringParser
|
||||||
|
{
|
||||||
|
readonly TapetiConnectionParams result = new TapetiConnectionParams();
|
||||||
|
|
||||||
|
readonly string connectionstring;
|
||||||
|
int pos = -1;
|
||||||
|
char current = '\0';
|
||||||
|
|
||||||
|
public static TapetiConnectionParams Parse(string connectionstring)
|
||||||
|
{
|
||||||
|
return new ConnectionstringParser(connectionstring).result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConnectionstringParser(string connectionstring)
|
||||||
|
{
|
||||||
|
this.connectionstring = connectionstring;
|
||||||
|
|
||||||
|
while (MoveNext())
|
||||||
|
{
|
||||||
|
ParseKV();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ParseKV()
|
||||||
|
{
|
||||||
|
var key = ParseKey();
|
||||||
|
|
||||||
|
if (current == '=')
|
||||||
|
{
|
||||||
|
MoveNext();
|
||||||
|
var value = ParseValue();
|
||||||
|
SetValue(key, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EnableKey(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string ParseKey()
|
||||||
|
{
|
||||||
|
var keyBuilder = new StringBuilder();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
switch (current)
|
||||||
|
{
|
||||||
|
case '=':
|
||||||
|
case ';':
|
||||||
|
return keyBuilder.ToString();
|
||||||
|
case '"':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
keyBuilder.Append(current);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (MoveNext());
|
||||||
|
|
||||||
|
return keyBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string ParseValue()
|
||||||
|
{
|
||||||
|
var valueBuilder = new StringBuilder();
|
||||||
|
if (current == '"')
|
||||||
|
{
|
||||||
|
while (current == '"') // support two double quotes to be an escaped quote
|
||||||
|
{
|
||||||
|
while (MoveNext() && current != '"')
|
||||||
|
{
|
||||||
|
valueBuilder.Append(current);
|
||||||
|
}
|
||||||
|
MoveNext(); // consume the trailing double quote
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (current != ';')
|
||||||
|
valueBuilder.Append(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always leave the ';' to be consumed by the caller
|
||||||
|
return valueBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool MoveNext()
|
||||||
|
{
|
||||||
|
var n = pos + 1;
|
||||||
|
if (n < connectionstring.Length)
|
||||||
|
{
|
||||||
|
pos = n;
|
||||||
|
current = connectionstring[pos];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
pos = connectionstring.Length;
|
||||||
|
current = '\0';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnableKey(string key)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetValue(string key, string value)
|
||||||
|
{
|
||||||
|
switch (key.ToLowerInvariant()) {
|
||||||
|
case "HostName": result.HostName = value; break;
|
||||||
|
case "Port": result.Port = int.Parse(value); break;
|
||||||
|
case "VirtualHost": result.VirtualHost = value; break;
|
||||||
|
case "Username": result.Username = value; break;
|
||||||
|
case "Password": result.Password = value; break;
|
||||||
|
case "PrefetchCount": result.PrefetchCount = ushort.Parse(value); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -68,6 +68,7 @@
|
|||||||
<Compile Include="Default\NamespaceMatchExchangeStrategy.cs" />
|
<Compile Include="Default\NamespaceMatchExchangeStrategy.cs" />
|
||||||
<Compile Include="Default\RequeueExceptionStrategy.cs" />
|
<Compile Include="Default\RequeueExceptionStrategy.cs" />
|
||||||
<Compile Include="Default\TypeNameRoutingKeyStrategy.cs" />
|
<Compile Include="Default\TypeNameRoutingKeyStrategy.cs" />
|
||||||
|
<Compile Include="Helpers\ConnectionstringParser.cs" />
|
||||||
<Compile Include="Helpers\ConsoleHelper.cs" />
|
<Compile Include="Helpers\ConsoleHelper.cs" />
|
||||||
<Compile Include="Helpers\MiddlewareHelper.cs" />
|
<Compile Include="Helpers\MiddlewareHelper.cs" />
|
||||||
<Compile Include="Helpers\TaskTypeHelper.cs" />
|
<Compile Include="Helpers\TaskTypeHelper.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user