-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDataRepository.cs
121 lines (105 loc) · 3.49 KB
/
DataRepository.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System;
using System.IO;
using System.Text;
using BerkeleyDB;
using GettingStarted.DataWriting;
using Microsoft.Extensions.Logging;
namespace GettingStarted.Access.Recno
{
public abstract class Repository : IDisposable
{
protected string path;
protected RecnoDatabase db;
protected ILogger logger;
protected Repository(string databaseName, uint tableSize, ILoggerFactory loggerService)
{
logger = loggerService.CreateLogger(databaseName);
path = Environment.GetEnvironmentVariable("DATA_DIR");
var cfg = new RecnoDatabaseConfig
{
Creation = CreatePolicy.IF_NEEDED,
CacheSize = new CacheInfo(1, 0, 1),
ErrorFeedback = (prefix, message) =>
{
logger.LogCritical($"{prefix}: {message}");
},
ErrorPrefix = databaseName,
// Not a required Recno setting like it is for Queue
//Length =500,
BackingFile = Path.Combine(path,databaseName + ".txt"),
//Duplicates = DuplicatesPolicy.UNSORTED,
//TableSize = tableSize
};
if (!File.Exists(Path.Combine(path,databaseName + ".txt")))
{
using (var f = File.Create(Path.Combine(path, databaseName + ".txt")))
{
f.Close();
}
}
//null file name loads the databse in memory and uses the backing file for data
db = RecnoDatabase.Open(null, cfg);
}
~Repository()
{
Dispose(false);
}
protected void AddToDb(string keyval, byte[] dataval)
{
var key = new DatabaseEntry(Encoding.UTF8.GetBytes(keyval));
var data = new DatabaseEntry(dataval);
//This is the data insertion method for Queue/Recno databases.
db.Append(data);
//...not this one
//db.Put(key, data);
}
public void Sync()
{
logger.LogInformation("I'm syncing!");
db.Sync();
}
private void Dispose(bool disposing)
{
if (!disposing) return;
db?.Close(true);
db?.Dispose();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
/// <summary>
/// The data repository for our Vendor database.
/// </summary>
public class VendorRepository : Repository, IVendorRepository
{
private int i;
public VendorRepository(ILoggerFactory logger) : base("vendor",8,logger)
{
}
public void AddVendor(Vendor v)
{
i++;
v.VendorId = i;
AddToDb(i.ToString(),v.ToByteArray());
}
public void Save()
{
Sync();
}
}
/// <summary>
/// The repository for our inventory database.
/// </summary>
public class InventoryRepository : Repository, IInventoryRepository
{
public InventoryRepository(ILoggerFactory logger) : base("inventory",5, logger) { }
public void AddInventory(string sku, Inventory inv) { AddToDb(sku, inv.ToByteArray()); }
public void Save()
{
Sync();
}
}
}