On 10/10/11 9:07 AM, Steve Teale wrote:
Here's a sketch of an interface. This is based on my experiments with
MySQL, and as such it is probably mid-level, and not a top level covers-
all interface.

Hopefully it will create a number of discussion points.

// Can interfaces include template functions???
interface SQLDBConnection
{
    @property Handle handle();
    Handle connect(string host, string user, string password,
                   string database = null);
    T getProperty(T)(string name);
    T getProperty(T)(int id);
    void setProperty(T)(T property, string name);
    void setProperty(T)(T property, int id);
    Handle disconnect();
}
[snip]

This makes sense from the perspective of a database implementor who needs to provide the appropriate interfaces, but I think a better angle would be to focus on use cases and work the API backwards from there.

Here's what I think should be a complete program:

import std.sql, std.stdio;

void main() {
    auto db = connect("
        engine = mysql;
        user = john;
        password = doe;
        port = 6900;
    ");
    auto rows = db.execute("SELECT score, a.user FROM users a
      JOIN scores b on a.user = b.user");
    foreach (row; rows) {
        writeln("%10s\t%s", row[0], row[1]);
        // or
        // writeln("%10s\t%s", row["score"], row["user"]);
    }
}

This should cleanly close everything upon exiting from main, provide proper error reporting if anything bad happens (and a lot could go wrong: malformed conn string, missing driver, wrong username/password, connection errors, malformed query, wrong column name...).

Using the interfaces you propose directly would allow one to implement the same program, but with significant extra chaff. That's why suggest we focus on user-level APIs first because in many ways those are the most important thing. Then we will distill the proper interfaces.

So the question is - what should a typical database task look like? That includes prepared statements, binding to tuples and structs, and a lot more.


Andrei

Reply via email to