Node.js Firebird API

Posted on in firebird, nodejs, javascript, typescript

I started a personal project to create a Node.js Firebird driver based on the FB 3 OO API.

Why another driver if there are others? Althrough it's a manual work for now as I understand the technology, the idea is to generate the driver based in the cloop interface file and always have a up-to-date driver. As a personal project, it will probably take some time having to conciliate two jobs.

The API will be based in promises instead of callback. A nice thing I already see is the capability to use the asynchronous functions as synchronous ones using TypeScript (and future JavaScript) async/await functions.

Here is a test demonstrating multi-threaded use of two databases. It's so simple to write multi-threaded code that I think it would be much better to write tools (a multi-threaded gbak?) than currently is with C++.

it("test()", async function() {
    async function f(filename: string): Promise<void>
    {
        let status = master.getStatus();
        try
        {
            const stmt1 = "create table t1 (n1 integer)";
            const stmt2 = "insert into t1 values (1)";

            let attachment = await dispatcher.createDatabase(status, filename);
            try
            {
                let transaction = await attachment.startTransaction(status);
                try
                {
                    await attachment.execute(status, transaction, 0, stmt1, 3);
                    await transaction.commitRetaining(status);

                    for (let i = 0; i < 10000; ++i)
                        await attachment.execute(status, transaction, 0, stmt2, 3);
                }
                finally
                {
                    await transaction.commit(status);
                }
            }
            finally
            {
                await attachment.detach(status);
            }
        }
        finally
        {
            status.dispose();
        }
    }

    //await f("/tmp/f1.fdb");
    //await f("/tmp/f2.fdb");
    return Promise.all([f("/tmp/f1.fdb"), f("/tmp/f2.fdb")]);
});

It also would be much simpler to write tests than it's with currently used tools (C++ and Python). The Firebird Python test suite is a monster with lots of manual dependencies that I never managed to install.