Historical EDBI, Revision 3
Euphoria DBI (DataBase Interface)
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) })
Available Drivers
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
- edbi_open
- edbi_close
- edbi_get_error_code
- edbi_get_error_message
- edbi_execute
- edbi_query
- edbi_next
- edbi_closeq
- edbi_last_insert_id
- edbi_total_changes
- edbi_is_empty
Database drivers can be implemented in C for sheer speed or in Euphoria compiled as a DLL.
Current Status
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.
An Example
-- -- 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()
API Reference
db_handle
include edbi.e public type db_handle(object o)
Defines a valid database connection handle.
dbr_handle
include edbi.e public type dbr_handle(object o)
Defines a valid database result set handle.
set_driver_path
include edbi.e public procedure set_driver_path(sequence v)
Set an alternate DBI driver path.
open
include edbi.e public function open(sequence connection)
Open a database connection.
close
include edbi.e public procedure close(db_handle h = 0)
Close a database connection
error_code
include edbi.e public function error_code(db_handle h = 0)
Get the current error code, if any
error_message
include edbi.e public function error_message(db_handle h = 0)
Get the current error message (text), if any
execute
include edbi.e public function execute(sequence sql, sequence data = {}, db_handle h = 0)
Execute a SQL query that does not expect any record results.
See Also:
last_insert_id
include edbi.e public function last_insert_id(sequence seq_name = "", db_handle h = 0)
Get the unique id of the last inserted record.
See Also:
total_changes
include edbi.e public function total_changes(db_handle h = 0)
Get the total number of changes caused by the last execute SQL statement.
See Also:
query
include edbi.e public function query(sequence sql, sequence data = {}, db_handle h = 0)
Issue a SQL query that expects record data as a result.
See Also:
next
include edbi.e public function next(dbr_handle dbr)
Retrieve the next available row of data.
See Also:
closeq
include edbi.e public procedure closeq(dbr_handle dbr)
Close an active query result.
See Also:
query_row
include edbi.e public function query_row(sequence sql, sequence data = {}, db_handle db = 0)
Query the database for just the first row. Querying the database, fetching the first row and closing the query is all handled internally with this routine.
See Also:
query_object
include edbi.e public function query_object(sequence sql, sequence data = {}, db_handle db = 0)
Query the database for just the first object of the first row. Querying the database, fetching the first object and closing the query is all handled internally with this routine. This routine is helpful for queries such as "SELECT COUNT(*) FROM people".
See Also:
- diff to current revision, view current revision history, backlinks
- Last modified Aug 28, 2009 by jeremy