@@ -10,6 +10,7 @@ const protocol = @import("shared").protocol;
const WebSocket = @import("WebSocket.zig");
const StaticHttpFileServer = @import("StaticHttpFileServer");
const Directory = std.Build.Cache.Directory;
const Twi = @import("Twi");
const usage =
\\Usage: groovebasin [options]
@@ -559,11 +560,14 @@ const Scan = struct {
const basename_z = try arena.dupeZ(u8, entry.name);
scan.new_count += 1;
try db.resizeWaveformArray(gpa, gop.index + 1);
scan.mutex.unlock();
defer scan.mutex.lock();
rcd_parent.ref();
const file_index: Db.File.Index = @enumFromInt(gop.index);
rcd_parent.ref();
scan.thread_pool.spawnWg(&scan.wait_group, analyzeFile, .{
scan, rcd_parent, basename_z, file_index,
});
@@ -594,7 +598,7 @@ const Scan = struct {
};
defer file.close();
var analysis = file.analyze(1920) catch |err| {
var analysis = file.analyze(Db.waveform_width) catch |err| {
std.log.err("unable to analyze '{s}': {s}", .{ basename_z, @errorName(err) });
return;
};
@@ -603,6 +607,8 @@ const Scan = struct {
scan.mutex.lock();
defer scan.mutex.unlock();
db.writeWaveformReserved(file_index, analysis.twi);
const metadata = fileMetaData(gpa, db, file) catch |err| {
std.log.err("unable to extract metadata from '{s}': {s}", .{ basename_z, @errorName(err) });
return;
@@ -854,6 +860,8 @@ fn saveDb(db: *const Db, install_directory: Directory, db_path: []const u8) !voi
const directories = std.mem.sliceAsBytes(db.directories.keys());
const albums = std.mem.sliceAsBytes(db.albums.keys());
const string_bytes = db.string_bytes.items;
const waveform_bytes = std.mem.sliceAsBytes(db.waveforms.items);
const header: DbFileHeader = .{
.magic = .v1,
.files_len = @intCast(db.files.entries.len),
@@ -868,6 +876,7 @@ fn saveDb(db: *const Db, install_directory: Directory, db_path: []const u8) !voi
.{ .base = directories.ptr, .len = directories.len },
.{ .base = albums.ptr, .len = albums.len },
.{ .base = string_bytes.ptr, .len = string_bytes.len },
.{ .base = waveform_bytes.ptr, .len = waveform_bytes.len },
};
var atomic_file = try install_directory.handle.atomicFile(db_path, .{});
@@ -895,20 +904,23 @@ fn loadDb(gpa: Allocator, db: *Db, install_directory: Directory, db_path: []cons
try db.directories.entries.resize(gpa, header.directories_len);
try db.albums.entries.resize(gpa, header.albums_len);
try db.string_bytes.resize(gpa, header.string_bytes_len);
try db.resizeWaveformArray(gpa, header.files_len);
const files = std.mem.sliceAsBytes(db.files.keys());
const directories = std.mem.sliceAsBytes(db.directories.keys());
const albums = std.mem.sliceAsBytes(db.albums.keys());
const string_bytes = db.string_bytes.items;
const waveforms = std.mem.sliceAsBytes(db.waveforms.items);
var iovecs = [_]std.posix.iovec{
.{ .base = files.ptr, .len = files.len },
.{ .base = directories.ptr, .len = directories.len },
.{ .base = albums.ptr, .len = albums.len },
.{ .base = string_bytes.ptr, .len = string_bytes.len },
.{ .base = waveforms.ptr, .len = waveforms.len },
};
const amt_read = try file.readvAll(&iovecs);
const amt_expected = files.len + directories.len + albums.len + string_bytes.len;
const amt_expected = files.len + directories.len + albums.len + string_bytes.len + waveforms.len;
if (amt_read != amt_expected) return error.UnexpectedFileSize;
try db.files.reIndexContext(gpa, .{});