FileEngine struct_array no longer an ArrayList

Started to use toOwnedSlice to replace members that are arrayList
This commit is contained in:
Adrien Bouvais 2024-11-01 12:31:46 +01:00
parent dbf5a255a9
commit aff8fac0af
4 changed files with 28 additions and 26 deletions

View File

@ -38,16 +38,16 @@ pub const FileEngine = struct {
allocator: Allocator,
path_to_ZipponDB_dir: []const u8,
null_terminated_schema_buff: [:0]u8,
struct_array: std.ArrayList(SchemaStruct),
struct_array: []SchemaStruct,
pub fn init(allocator: Allocator, path: []const u8) FileEngine {
pub fn init(allocator: Allocator, path: []const u8) FileEngineError!FileEngine {
const path_to_ZipponDB_dir = path;
var schema_buf = allocator.alloc(u8, BUFFER_SIZE) catch @panic("Cant allocate the schema buffer");
var schema_buf = allocator.alloc(u8, BUFFER_SIZE) catch return FileEngineError.MemoryError;
defer allocator.free(schema_buf);
const len: usize = FileEngine.readSchemaFile(allocator, path_to_ZipponDB_dir, schema_buf) catch 0;
const null_terminated_schema_buff = allocator.dupeZ(u8, schema_buf[0..len]) catch @panic("Cant allocate null term buffer for the schema");
const null_terminated_schema_buff = allocator.dupeZ(u8, schema_buf[0..len]) catch return FileEngineError.MemoryError;
var toker = SchemaTokenizer.init(null_terminated_schema_buff);
var parser = SchemaParser.init(&toker, allocator);
@ -59,15 +59,13 @@ pub const FileEngine = struct {
.allocator = allocator,
.path_to_ZipponDB_dir = path_to_ZipponDB_dir,
.null_terminated_schema_buff = null_terminated_schema_buff,
.struct_array = struct_array,
.struct_array = struct_array.toOwnedSlice() catch return FileEngineError.MemoryError,
};
}
pub fn deinit(self: *FileEngine) void {
if (self.struct_array.items.len > 0) {
for (self.struct_array.items) |*elem| elem.deinit();
}
self.struct_array.deinit();
for (self.struct_array) |*elem| elem.deinit();
self.allocator.free(self.struct_array);
self.allocator.free(self.null_terminated_schema_buff);
self.allocator.free(self.path_to_ZipponDB_dir);
}
@ -195,10 +193,12 @@ pub const FileEngine = struct {
var parser = SchemaParser.init(&toker, self.allocator);
// Deinit the struct array before creating a new one
for (self.struct_array.items) |*elem| elem.deinit();
for (0..self.struct_array.items.len) |_| _ = self.struct_array.pop();
for (self.struct_array) |*elem| elem.deinit();
self.allocator(self.struct_array);
parser.parse(&self.struct_array) catch return error.SchemaNotConform;
var struct_array = std.ArrayList(SchemaStruct).init(self.allocator);
parser.parse(&struct_array) catch return error.SchemaNotConform;
self.struct_array = struct_array.toOwnedSlice();
const path = std.fmt.allocPrint(self.allocator, "{s}/DATA", .{self.path_to_ZipponDB_dir}) catch return FileEngineError.MemoryError;
defer self.allocator.free(path);
@ -206,7 +206,7 @@ pub const FileEngine = struct {
var data_dir = std.fs.cwd().openDir(path, .{}) catch return FileEngineError.CantOpenDir;
defer data_dir.close();
for (self.struct_array.items) |schema_struct| {
for (self.struct_array) |schema_struct| {
data_dir.makeDir(schema_struct.name) catch |err| switch (err) {
error.PathAlreadyExists => {},
else => return FileEngineError.CantMakeDir,
@ -958,27 +958,27 @@ pub const FileEngine = struct {
pub fn structName2structMembers(self: *FileEngine, struct_name: []const u8) FileEngineError![][]const u8 {
var i: usize = 0;
while (i < self.struct_array.items.len) : (i += 1) if (std.mem.eql(u8, self.struct_array.items[i].name, struct_name)) break;
while (i < self.struct_array.len) : (i += 1) if (std.mem.eql(u8, self.struct_array[i].name, struct_name)) break;
if (i == self.struct_array.items.len) {
if (i == self.struct_array.len) {
return FileEngineError.StructNotFound;
}
return self.struct_array.items[i].members.items;
return self.struct_array[i].members.items;
}
pub fn structName2DataType(self: *FileEngine, struct_name: []const u8) FileEngineError![]const DataType {
var i: u16 = 0;
while (i < self.struct_array.items.len) : (i += 1) {
if (std.mem.eql(u8, self.struct_array.items[i].name, struct_name)) break;
while (i < self.struct_array.len) : (i += 1) {
if (std.mem.eql(u8, self.struct_array[i].name, struct_name)) break;
}
if (i == self.struct_array.items.len and !std.mem.eql(u8, self.struct_array.items[i].name, struct_name)) {
if (i == self.struct_array.len and !std.mem.eql(u8, self.struct_array[i].name, struct_name)) {
return FileEngineError.StructNotFound;
}
return self.struct_array.items[i].types.items;
return self.struct_array[i].types.items;
}
/// Return the number of member of a struct
@ -995,7 +995,7 @@ pub const FileEngine = struct {
/// Chech if the name of a struct is in the current schema
pub fn isStructNameExists(self: *FileEngine, struct_name: []const u8) bool {
var i: u16 = 0;
while (i < self.struct_array.items.len) : (i += 1) if (std.mem.eql(u8, self.struct_array.items[i].name, struct_name)) return true;
while (i < self.struct_array.len) : (i += 1) if (std.mem.eql(u8, self.struct_array[i].name, struct_name)) return true;
return false;
}

View File

@ -295,13 +295,13 @@ const initFileEngine = struct {
return try initWithPath(allocator, p);
} else {
log.info("No environment variable ZIPPONDB_PATH found.", .{});
return FileEngine.init(allocator, "");
return try FileEngine.init(allocator, "");
}
}
fn initWithPath(allocator: std.mem.Allocator, path: []const u8) !FileEngine {
try ensureDirectoryExists(path);
var file_engine = FileEngine.init(allocator, path);
var file_engine = try FileEngine.init(allocator, path);
try file_engine.checkAndCreateDirectories();
if (!file_engine.isSchemaFileInDir()) {

View File

@ -33,6 +33,8 @@ pub const Parser = struct {
};
}
// TODO: Stop using array as members, use toOwnedSlice
// Rename something better and move it somewhere else
pub const SchemaStruct = struct {
allocator: Allocator,
name: []const u8,

View File

@ -1052,7 +1052,7 @@ fn testParsing(source: [:0]const u8) !void {
const allocator = std.testing.allocator;
const path = try allocator.dupe(u8, TEST_DATA_DIR);
var file_engine = FileEngine.init(allocator, path);
var file_engine = try FileEngine.init(allocator, path);
defer file_engine.deinit();
var tokenizer = Tokenizer.init(source);
@ -1066,7 +1066,7 @@ fn expectParsingError(source: [:0]const u8, err: ZiQlParserError) !void {
const allocator = std.testing.allocator;
const path = try allocator.dupe(u8, TEST_DATA_DIR);
var file_engine = FileEngine.init(allocator, path);
var file_engine = try FileEngine.init(allocator, path);
defer file_engine.deinit();
var tokenizer = Tokenizer.init(source);
@ -1089,7 +1089,7 @@ fn testParseFilter(source: [:0]const u8) !void {
const allocator = std.testing.allocator;
const path = try allocator.dupe(u8, TEST_DATA_DIR);
var file_engine = FileEngine.init(allocator, path);
var file_engine = try FileEngine.init(allocator, path);
defer file_engine.deinit();
var tokenizer = Tokenizer.init(source);