支持mdb打包

仅通过简单测试
This commit is contained in:
Chenx221 2024-10-18 02:14:24 +08:00
parent 96b93a722c
commit d558f9e2b4
2 changed files with 67 additions and 19 deletions

View File

@ -96,7 +96,7 @@ namespace EscudeTools
offset += 8;
}
uint columnSizes = 0;
for(int i = 0; i < sheet.cols; i++)
for (int i = 0; i < sheet.cols; i++)
{
columnSizes += sheet.col[i].size;
}
@ -264,8 +264,10 @@ namespace EscudeTools
}
uint structSize = 8 + 8 * colsNum;
bw.Write(structSize);//结构体大小
uint textOffset = 1;
List<string> text = [];
uint textOffset = 0;
bool flag = true; //只有sheetname和columnname需要text表
bool flag2 = true; //第一行是空的吗
List<string> text = []; //只能放不重复
List<string> textMulti = []; //允许重复字符串
ushort[] types = new ushort[colsNum];
ushort[] sizes = new ushort[colsNum];
@ -285,18 +287,37 @@ namespace EscudeTools
{
recordCount = Convert.ToInt32(command.ExecuteScalar());
}
//uint dataSize = 4 * colsNum * (uint)recordCount;
uint dataSize = (uint)(sizes.Sum(x => (uint)x) * recordCount);
using (var command = new SqliteCommand($"SELECT * FROM {tableName};", connection))
using (var reader = command.ExecuteReader())
{
reader.Read();
if (reader.GetFieldType(1) == typeof(int))
{
flag2 = reader.GetInt32(1)==0;
}
else if (reader.GetFieldType(1) == typeof(string))
{
flag2 = string.IsNullOrEmpty(reader.GetString(1));
}
}
List<uint> textOffset1 = [];
for (int i = 0; i < cnames.Length; i++)
{
if (types[i] != 4)
continue;
if (textOffset == 0&&flag2)
{
textOffset++;
flag = false;
}
using var colCommand = new SqliteCommand($"SELECT {cnames[i]} FROM {tableName};", connection);
using var colReader = colCommand.ExecuteReader();
bool first = true;
bool first = flag2;
while (colReader.Read())
{
if (first)
@ -323,15 +344,30 @@ namespace EscudeTools
}
}
}
text.Add(tableName[..^3]);
int index1 = textMulti.IndexOf(tableName[..^3]);
textMulti.Add(tableName[..^3]);
if(index1 == -1)
{
text.Add(tableName[..^3]);//表名
textOffset1.Add(textOffset);
textOffset += (uint)shiftJis.GetBytes(tableName[..^3]).Length + 1;
}
else
textOffset1.Add(textOffset1[index1]);
foreach (string c in cnames)
{
text.Add(c[..^3]);
index1 = textMulti.IndexOf(c[..^3]);
textMulti.Add(c[..^3]);
if (index1 == -1)
{
text.Add(c[..^3]);//列名
textOffset1.Add(textOffset);
textOffset += (uint)shiftJis.GetBytes(c[..^3]).Length + 1;
}
else
textOffset1.Add(textOffset1[index1]);
}
//
bw.Write(textOffset1[textOffset1.Count - cnames.Length - 1]); //表名在text中的偏移
bw.Write(colsNum);//列数
@ -343,14 +379,18 @@ namespace EscudeTools
}
bw.Write(dataSize);//数据大小
//填充垃圾
if (flag2)
{
byte[] zeroBytes = new byte[sizes.Sum(x => (uint)x)];
bw.Write(zeroBytes);
}
//填充数据
using (var command = new SqliteCommand($"SELECT * FROM {tableName};", connection))
using (var reader = command.ExecuteReader())
{
int index = 0;
bool first = true;
bool first = flag2;
while (reader.Read())
{
if (first)
@ -366,7 +406,10 @@ namespace EscudeTools
string cname = cnames[i][..^3];
if (type == 4)
{
if (flag2)
bw.Write(textOffset1[index + (recordCount - 1) * j++]);//fix bug
else
bw.Write(textOffset1[index + (recordCount) * j++]);
}
else if (cname == "色" && size == 4)
bw.Write((uint)reader.GetInt64(i));
@ -381,7 +424,12 @@ namespace EscudeTools
}
}
bw.Write(textOffset);//文本大小
//bool flag = true; //只有sheetname和columnname需要text表
//bool flag2 = true; //第一行是空的吗
if (!flag)
{
bw.Write((byte)0);//垃圾
}
foreach (var str in text)//文本
{
bw.Write(shiftJis.GetBytes(str));

View File

@ -106,11 +106,11 @@
}
}
//}
//if (Directory.Exists(args[0]))
//{
// string[] files = Directory.GetFiles(args[0], "*.bin");
// DatabaseManager dm = new DatabaseManager();
// DatabaseManager dm = new();
// foreach (string file in files)
// {
// dm.LoadDatabase(file);