EDBI allows the programmer to use any supporting database with a unified database interface. Database drivers are loaded dynamically and can be written for any database server or client. Multiple database connections can be managed at the same time across multiple drivers. To use a different database server or driver, simply use the correct connection string. For example:
edbi:open("sqlite3://people.db") edbi:open("mysql://localhost?dbname=people") edbi:open("pgsql://localhost?dbname=people")
EDBI automatically maps database values and types into Euphoria native types. For instance, a VARCHAR comes back as a sequence, a NUMERIC or DECIMAL as an atom, an INTEGER as an integer, a DATE, TIME, DATETIME or TIMESTAMP as a datetime, etc...
Querying EDBI allows the use of Euphoria types directly as well:
edbi:query("SELECT * FROM people WHERE zip=%d AND dob < %D", { 30293, datetime:subtract(datetime:new(), 18, YEARS) })
At this point in time, only the reference driver is available for SQLite3. It's connection string is: sqlite3://filename. Other database drivers will come in due time, starting next with MySQL and then PostgreSQL.
Database drivers are very easy to write. Please see the source code, and look at drivers/sqlite3/ for more information and a good example.
Database drivers must implement a common, but very minimal API. The methods the database driver must implement are:
Database drivers can be implemented in C for sheer speed or in Euphoria compiled as a DLL.
EDBI is brand new and API changes will take place. I am seeking user input and user help for other drivers. Currently EDBI is only tested on Windows, although with a slight change to the binary driver build files, it should work with out source code change on all platforms that Euphoria supports.
EDBI can be downloaded via SVN at, http://jeremy.cowgar.com/svn/edbi/trunk by issuing the following commands
c:\projects> svn co http://jeremy.cowgar.com/svn/edbi/trunk edbiThis will include a pre-built sqlite driver.
Downloadable packages outside of SVN are not yet available as we are still early in the development stages.
-- -- Example edbi use -- include std/datetime.e include edbi/edbi.e sequence data = { { "Ronald Mc'Donald", 29382, datetime:subtract(datetime:new(), 32, YEARS) }, { "Super Man", 55555, datetime:new(1944, 5, 18) }, { "Wonder Woman", 21232, datetime:new(1972, 9, 29) } } edbi:set_driver_path("drivers") edbi:db_handle dbh = edbi:open("sqlite3://example.db") edbi:execute("DROP TABLE people") edbi:execute("CREATE TABLE people (name VARCHAR(30), zip INTEGER, dob datetime)") for i = 1 to length(data) do edbi:execute("INSERT INTO people VALUES (%s, %d, %D)", data[i]) end for edbi:dbr_handle dbr = edbi:query("SELECT * FROM people") while 1 do object o = edbi:next(dbr) if atom(o) then exit end if printf(1, "Name=%s, Zip=%d, Dob=%s\n", { o[1], o[2], datetime:format(o[3], "%m/%d/%Y") }) end while edbi:close()
EDBI is a common database interface for Euphoria that contains hot-loadable database drivers for a variety of database systems.