On Tuesday, 27 January 2026 at 16:38:08 UTC, Lars Johansson wrote:
I have created a program using multithreading and Sqlite3.
This is a prestudy for map&reduce.

I found some parts of the program very hard to digest especially the 'as!' crap. Sqlite was not simple (for me) to set up and use. It took some time to understand I must make a physical copy of the result (the .idup).
It was hard to make this work.

I would appreciate, if anyone can comment on things I can do better:
(On your own, it not easy to know what can be done better)

import std.parallelism;
import std.stdio;
import core.thread;
import std.array;
import d2sqlite3;

    void main() {
        writeln("starting");
        auto myresults = getData("mydata.db");
auto pool = new TaskPool(2); // Create pool with only 2 worker threads
        foreach (i,row; pool.parallel(myresults)) {
            writeln(row);
           auto ID = row[0];
           auto Name = row[1];
           auto Age= row[2];
                writeln("Starting task ",i,  " ",ID, " ",Name, " ", Age);
                Thread.sleep(1.seconds);  // Simulate work
            writeln("finish task ",i);
        }
        pool.finish();
    }
    string[][] getData(string DB){
        string[][] results;
        writeln("getData starts");
        auto db = Database(DB);
        foreach (row; db.execute("SELECT * FROM users")) {
writeln("ID: ", row[0].as!int); //WTF is this as! crap
                writeln("Name: ", row[1].as!string);
                writeln("Age: ", row[2].as!int);
            results ~= [
row[0].as!string.idup, // .idup makes immutable copy row[1].as!string.idup, // why do i need this? row[2].as!string.idup // and why do I have to convert to string?
            ];}
            writeln("getData done");
        return results;
    }

`!` is a template call, and is always a template call; c syntax doesnt allow you to pass a type to a function 1 char and the double argument list was considered the best way forward.

I dont know where as comes from, but dup is used when you get a once off copy to a slice, `string` is *just* a one line of code `alias string=immutable char[]` in object. This make it a reference type.

---

I dont like the api's people make for deserialization, this looks like a bad one. Look for something that parses an entire "row" as a struct that way your passing bundles of types already.

Reply via email to