Darlene has a co-worker who discovered a problem: they didn’t know or understand any of the C++ libraries for manipulating dates and times. Checking the documentation or googling it is way too much to ask, so instead they opted to use the tools they already understood- a database. We’ve seen that before.

There was just one other problem: this application wasn’t data-driven, and thus didn’t have a database to query.

Darlene’s co-worker had the solution to that: create an in-memory Sqlite database!

std::string foo::getTimeStamp()
{
    static const char *sqlStmt =
            "SELECT strftime( '%Y-%m-%dT%H:%M:%fZ', CURRENT_TIMESTAMP );";

    sqlite3 *db = 0;
    int sqliteRC = SQLITE_OK;
    char *sqlErr = 0;

    // Well we should return something that can be used, so picked an
    // arbitrary date, which I believe is the time of the first armistice
    // for the First World War
    std::string rval = "1918-11-11T11:11:00.000Z";

    sqliteRC = sqlite3_open( ":memory:", &db );
    if( sqliteRC != SQLITE_OK )
    {
        LOG( Log::Warn ) << "Failed to open sqlite memory DB, with error ["
                          << sqlite3_errmsg( db ) << "]";
        return rval;
    }

    sqliteRC = sqlite3_exec( db, sqlStmt, &::populate, (void*) &rval, &sqlErr );
    if( sqliteRC != SQLITE_OK )
    {
        LOG( Log::Warn )
            << "Failed to gather current time stamp"
            << " from sqlite memory DB with error [" << sqlErr << "]";
        sqlite3_free( sqlErr );
    }

    sqliteRC = sqlite3_close( db );
    if( sqliteRC != SQLITE_OK )
    {
        // We may leak some memory if this happens
        LOG( Log::Warn )
            << "Failed to close sqlite memory DB with error ["
            << sqlite3_errmsg( db ) << "]";
    }
    db = 0;

    return rval;
}

This is very lightweight- it's Sqlite, after all. There's nothing light about strftime or its ilk. Just look at the names.