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\RequeueExceptionStrategy.cs" />
|
||||
<Compile Include="Default\TypeNameRoutingKeyStrategy.cs" />
|
||||
<Compile Include="Helpers\ConnectionstringParser.cs" />
|
||||
<Compile Include="Helpers\ConsoleHelper.cs" />
|
||||
<Compile Include="Helpers\MiddlewareHelper.cs" />
|
||||
<Compile Include="Helpers\TaskTypeHelper.cs" />
|
||||
|
Loading…
Reference in New Issue
Block a user