Skip to content

Commit

Permalink
Database editing improvements.
Browse files Browse the repository at this point in the history
  • Loading branch information
Wincent01 committed Jan 21, 2020
1 parent 94af2f8 commit b76324c
Show file tree
Hide file tree
Showing 166 changed files with 11,237 additions and 542 deletions.
224 changes: 29 additions & 195 deletions InfectedRose.Database/AccessDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,23 @@ namespace InfectedRose.Database
{
public class AccessDatabase : IList<Table>
{
public event Action<string> OnSql;

public DatabaseFile Source { get; private set; }

public AccessDatabase(DatabaseFile source)
{
Source = source;
}

public static async Task<AccessDatabase> OpenAsync(string file)
{
await using var stream = File.OpenRead(file);

using var reader = new BitReader(stream);

var source = new DatabaseFile();
public DatabaseFile Source { get; }

source.Deserialize(reader);
public Table this[string name]
{
get
{
foreach (var (info, data) in Source.TableHeader.Tables)
if (info.TableName == name)
return new Table(info, data, this);

return new AccessDatabase(source);
return default;
}
}

public IEnumerator<Table> GetEnumerator()
Expand Down Expand Up @@ -111,202 +108,39 @@ public void RemoveAt(int index)
Source.TableHeader.Tables = list.ToArray();
}

/*
public void FixRows()
public Table this[int index]
{
foreach (var table in this)
get
{
var current = 0;
var num = FdbRowBucket.NextPowerOf2(table.Count);
var list = new List<(int, List<int>)>();
foreach (var row in table.Data.RowHeader.RowInfos)
{
var ids = new List<int>();
var linked = row;
while (linked != default)
{
var key = linked.DataHeader.Data.Fields[0].value;
int index;
switch (key)
{
case int keyInt:
index = keyInt;
break;
case string val:
index = (int) Hash(val.Select(k => (byte) k).ToArray());
break;
case FdbString keyStr:
index = (int) Hash(keyStr.Value.Select(k => (byte) k).ToArray());
break;
case long lon:
index = (int) lon;
break;
case FdbBitInt bitInt:
index = (int) bitInt.Value;
break;
default:
throw new ArgumentException($"Invalid primary key: [{key.GetType()}] {key}");
}
ids.Add(index);
linked = linked.Linked;
current++;
}
list.Add((current, ids));
current = 0;
}
var max = 0;
foreach (var row in table)
{
var key = row[0].Value;
int index;
switch (key)
{
case int keyInt:
index = keyInt;
break;
case string val:
index = (int) Hash(val.Select(k => (byte) k).ToArray());
break;
case FdbString keyStr:
index = (int) Hash(keyStr.Value.Select(k => (byte) k).ToArray());
break;
case long lon:
index = (int) lon;
break;
case FdbBitInt bitInt:
index = (int) bitInt.Value;
break;
default:
throw new ArgumentException($"Invalid primary key: [{key.GetType()}] {key}");
}
index = (int) (index % num);
if (index > max)
{
max = index;
}
}
var count = table.Data.RowHeader.RowInfos.Length;
Console.WriteLine($"LEN: {list.Count} {FdbRowBucket.NextPowerOf2(max)}");
Console.ReadKey();
Console.WriteLine($"{table.Name} {num}");
for (var i = 0; i < num; i++)
{
var correct = 0;
var ids = new List<int>();
for (var j = 0; j < table.Count; j++)
{
var key = table[j][0].Value;
int index;
switch (key)
{
case int keyInt:
index = keyInt;
break;
case string keyStr:
index = (int) Hash(keyStr.Select(k => (byte) k).ToArray());
break;
default:
throw new ArgumentException($"Invalid primary key: {key}");
}
var og = index;
Console.Write($"INDEX {(index % count)}\n");
if (i % num == index % count)
{
correct++;
ids.Add(og);
}
}
if (list.Count > i + 1)
{
Console.Write($"{list[i].Item1} [{string.Join(";", list[i].Item2)}]");
Console.Write($" -> {correct} [{string.Join(";", ids)}]\n");
}
}
}
var (info, data) = Source.TableHeader.Tables[index];

Console.WriteLine("DONE");
return new Table(info, data, this);
}
set => Source.TableHeader.Tables[index] = (value.Info, value.Data);
}
*/

public async Task RecalculateRows()
public event Action<string> OnSql;

public static async Task<AccessDatabase> OpenAsync(string file)
{
var tasks = new Task[Count];
await using var stream = File.OpenRead(file);

var completed = 0;

for (var index = 0; index < Count; index++)
{
var savedIndex = index;

tasks[index] = Task.Run(async () =>
{
var table = this[savedIndex];

await table.RecalculateRows();

Console.WriteLine($"{table.Name} '{table.Count}' [{++completed}/{Count}]");
});
}
using var reader = new BitReader(stream);

await Task.WhenAll(tasks);
}
var source = new DatabaseFile();

public Table this[int index]
{
get
{
var (info, data) = Source.TableHeader.Tables[index];
source.Deserialize(reader);

return new Table(info, data, this);
}
set => Source.TableHeader.Tables[index] = (value.Info, value.Data);
return new AccessDatabase(source);
}

public Table this[string name]
public async Task SaveAsync(string file, Action<int> callback = null)
{
get
{
foreach (var (info, data) in Source.TableHeader.Tables)
{
if (info.TableName == name)
return new Table(info, data, this);
}
callback ??= i => { };

return default;
}
var bytes = Source.Compile(callback);

File.WriteAllBytes(file, bytes);
}

internal void RegisterSql(string sql)
Expand Down
Loading

0 comments on commit b76324c

Please sign in to comment.