moving around sources

This commit is contained in:
Maas-Maarten Zeeman
2011-12-31 17:19:00 +01:00
parent 8407931bb3
commit 69b47fc974
4 changed files with 1 additions and 178 deletions

View File

@@ -1,4 +0,0 @@
%%
%%
-record(edbc_column_info, {name, type, default, notnull, pk}).

View File

@@ -2,7 +2,7 @@
[
{description, "sqlite nif interface"},
{vsn, "1"},
{modules, [esqlite]},
{modules, [esqlite, esqlite_nif]},
{registered, []},
{applications, [
kernel,

View File

@@ -1,78 +0,0 @@
%%
%% Generic database interface. Sort of...
%%
%%
-module(gen_db).
-export([behaviour_info/1]).
-export([open/2, close/1, run/2, run/3, execute/2, execute/3, commit/1, rollback/1, tables/1, describe_table/2, column_names/2]).
-include("edbc.hrl").
behaviour_info(callbacks) ->
[{open, 1},
{close, 1},
{commit, 1},
{rollback, 1},
{run, 3},
{execute, 3},
{tables, 1},
{describe_table, 2}];
behaviour_info(_Other) ->
undefined.
-record(connection, {driver, connection_data}).
%% @doc Open a connection to a new database
%%
open(Driver, Args) ->
{ok, ConnectionData} = Driver:open(Args),
{ok, #connection{driver=Driver, connection_data=ConnectionData}}.
%% @doc Close a database connection.
%%
close(#connection{driver=Driver, connection_data=Data}) ->
Driver:close(Data).
%% @doc Commit all changes
commit(#connection{driver=Driver, connection_data=Data}) ->
Driver:commit(Data).
%% @doc Rollback all changes
rollback(#connection{driver=Driver, connection_data=Data}) ->
Driver:rollback(Data).
%% @doc Return a list with tablenames...
tables(#connection{driver=Driver, connection_data=Data}) ->
Driver:tables(Data).
%% @doc
describe_table(TableName, #connection{driver=Driver, connection_data=Data}) ->
Driver:describe_table(TableName, Data).
%% @doc
column_names(TableName, Connection) ->
[Info#edbc_column_info.name || Info <- describe_table(TableName, Connection) ].
%% @doc Execute the statement, without returning results.
run(Sql, Connection) ->
run(Sql, [], Connection).
run(Sql, Params, #connection{driver=Driver, connection_data=Data}) ->
Driver:run(Sql, Params, Data).
%% @doc Execute the statement, return the result
execute(Sql, Connection) ->
execute(Sql, [], Connection).
execute(Sql, Params, #connection{driver=Driver, connection_data=Data}) ->
Driver:execute(Sql, Params, Data).

View File

@@ -1,95 +0,0 @@
%%
%% Exploring making a database driver for the generic gen_db interface
%%
-module(sqlite).
-include("edbc.hrl").
-behaviour(gen_db).
-export([open/1, run/3, execute/3, close/1, commit/1, rollback/1, tables/1, describe_table/2]).
%% @doc Open a database connection
%%
open([DatabaseName]) ->
{ok, C} = esqlite3:open(DatabaseName),
ok = esqlite3:exec(<<"BEGIN TRANSACTION;">>, C),
{ok, C}.
%% @doc Close the connection
%%
close(Connection) ->
ok = esqlite3:close(Connection).
%% @doc
%%
run(Sql, [], Connection) ->
case esqlite3:exec(Sql, Connection) of
{error, Error} -> {error, ?MODULE, Error};
ok -> ok
end;
run(Sql, Args, Connection) ->
case esqlite3:prepare(Sql, Connection) of
{error, Error} ->
{error, ?MODULE, Error};
{ok, Stmt} ->
case esqlite3:bind(Stmt, Args) of
{error, Error} -> {error, ?MODULE, Error};
ok ->
case esqlite3:fetchone(Stmt) of
{error, Error} -> {error, ?MODULE, Error};
_ -> ok
end
end
end.
%% @doc Execute a query and return the results
%%
execute(Sql, [], Connection) ->
case esqlite3:prepare(Sql, Connection) of
{error, Error} ->
{error, ?MODULE, Error};
{ok, Stmt} ->
{ok, esqlite3:column_names(Stmt), esqlite3:fetchall(Stmt)}
end;
execute(Sql, Args, Connection) ->
case esqlite3:prepare(Sql, Connection) of
{error, Error} ->
{error, ?MODULE, Error};
{ok, Stmt} ->
case esqlite3:bind(Stmt, Args) of
ok ->
Names = esqlite3:column_names(Stmt),
Result = esqlite3:fetchall(Stmt),
{ok, Names, Result};
{error, Error} ->
{error, ?MODULE, Error}
end
end.
%%
commit(Connection) ->
ok = run(<<"COMMIT;">>, [], Connection).
%%
rollback(Connection) ->
ok = run(<<"ROLLBACK;">>, [], Connection).
%%
tables(Connection) ->
esqlite3:map(fun({TableName}) -> list_to_atom(TableName) end,
<<"SELECT name FROM sqlite_master WHERE type='table' ORDER by name;">>, Connection).
%%
describe_table(TableName, Connection) when is_atom(TableName) ->
esqlite3:map(fun({_Cid, ColumnName, ColumnType, NotNull, Default, PrimaryKey}) ->
#edbc_column_info{name=list_to_atom(ColumnName),
type=ColumnType,
default=Default,
notnull=NotNull =/= 0,
pk=PrimaryKey =/= 0}
end,
[<<"PRAGMA table_info('">>, atom_to_list(TableName), <<"');">>], Connection).