On Monday, 22 June 2015 at 14:03:47 UTC, Laeeth Isharc wrote:
On Monday, 22 June 2015 at 11:29:50 UTC, Jacob Carlborg wrote:
On 22/06/15 01:43, Nick Sabalausky wrote:

Curiosity, what libraries do you feel a lack of?

For work, that would be:

* Some way to interface with Selenium and PhantomJS

It's not pretty, but for what I want to do I have found embedding Python calls to phantomjs code within a D program works quite well.

The SQLite stuff looks okay, although I haven't used for a big project yet.

This is how I use it as a persistent storage for property get/setters. Takes some imagination at first, but it saves a huge amount of time/headaches on the long run.

/// Opens the SQLite database from the data folder. The user must call .close() when finished!
Database openDB(bool read = true) {
        // DB is always created in static ctor
return Database(DATA_FOLDER_PATH() ~ "my.db", read ? SQLITE_OPEN_READONLY : (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
}


        private T get(T)(string name, lazy T default_value = T.init) {
                Database sqlite = openDB(READ);
                scope(exit) sqlite.close();
                T ret;
                try {
auto results = sqlite.execute("SELECT value FROM config WHERE name='" ~ name ~ "';");
                        auto val = results.oneValue!string;
                        ret = val.to!T;
                }
                catch { ret = default_value; }
                return ret;
        }

        private void set(T)(string name, T value) {
                Database sqlite = openDB(WRITE);
                scope(exit) sqlite.close();
                bool exists;
                try {
ResultRange res = sqlite.prepare("SELECT value FROM config WHERE name=?;").bind(1, name).execute(); string val = res.oneValue!string; // will throw if the value is not there
                        // Update the existing value.
auto prep = sqlite.prepare("UPDATE TABLE config SET value=? WHERE name=?;").bind(1, name).execute();
                        prep.bind(1, value.to!string);
                        res = prep.execute();
                }
                catch {
                        exists = false;
                }
                
                if (!exists) {
auto res = sqlite.prepare("INSERT INTO config (name, value) VALUES (?, ?);").bind(1, name).bind(2, value.to!string).execute();
                }
        }

// usage:

        @property Duration created() {
                return get!ulong("created", 120).dur!"seconds";
        }

        @property void created(Duration val) {
                set("created", val.total!"seconds");
        }


Reply via email to