public async Task IncrementDomain(string domain, bool link)
{
try
{
uint links = 0;
uint comments = 0;
uint hash = (uint)domain.GetHashCode();
var keyspace = GenerateDomainHashKeyspace(hash);
using (var dbCursor = await _domainStatisticsDB.SeekAsync(_domainStatisticsDB.GetKeys()[0], keyspace, DBReadFlags.AutoLock | DBReadFlags.WaitOnLock))
{
if (_terminateSource.IsCancellationRequested)
return;
if (dbCursor != null)
{
// Decode cursor
var record = dbCursor.Get();
links = BitConverter.ToUInt32(record.Skip(DomainHashKeySpaceSize).Take(4).ToArray(), 0);
comments = BitConverter.ToUInt32(record.Skip(DomainHashKeySpaceSize + 4).Take(4).ToArray(), 0);
// Increment variable
if (link)
links++;
else
comments++;
// Update record
var combinedSpace = GenerateCombinedDomainKeyspace(hash, links, comments);
await dbCursor.UpdateAsync(combinedSpace);
}
else
{
links = (uint)(link ? 1 : 0);
comments = (uint)(link ? 0 : 1);
if (link)
links++;
else
comments++;
// Insert a fresh, zero'd record
var combinedSpace = GenerateCombinedDomainKeyspace(hash, links, comments);
await _domainStatisticsDB.InsertAsync(combinedSpace);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(DBError.TranslateError((uint)ex.HResult));
}
}