diff --git a/Rakefile b/Rakefile index abb3f63..a147b3a 100644 --- a/Rakefile +++ b/Rakefile @@ -9,20 +9,23 @@ CLOBBER.include %w( c_src/system ) directory 'c_src' DB_LIB = "c_src/system/lib/libdb.a" +DRIVER = "priv/bdberl_drv.so" file DB_LIB do sh "cd c_src && ./buildlib.sh 2>&1" end +file DRIVER do + puts "linking priv/#{DRIVER}..." + sh "gcc #{erts_link_cflags()} c_src/*.o c_src/system/lib/libdb-*.a -o #{DRIVER}", :verbose => false +end + rule ".o" => ["%X.c"] do |t| puts "compiling #{t.source}..." sh "gcc -c -Wall -Werror -Ic_src/system/include -I#{erts_dir()}/include #{t.source} -o #{t.name}", :verbose => false end -task :compile_c => ['c_src'] + C_OBJS do - puts "linking c_src/bdberl_drv.so..." - sh "gcc #{erts_link_cflags()} c_src/*.o c_src/system/lib/libdb-*.a -o priv/bdberl_drv.so", :verbose => false -end +task :compile_c => ['c_src'] + C_OBJS -task :compile => [DB_LIB, :compile_c] +task :compile => [DB_LIB, :compile_c, DRIVER] diff --git a/base.rake b/base.rake index 4b2e868..93d7091 100644 --- a/base.rake +++ b/base.rake @@ -65,7 +65,6 @@ def erl_app_modules(app) ERL output = erl_run(script, "-pa ebin") - puts output if output[/badmatch/] fail "Error processing .app file: ", output "" diff --git a/c_src/bdberl_drv.c b/c_src/bdberl_drv.c index 764adba..0a96a45 100644 --- a/c_src/bdberl_drv.c +++ b/c_src/bdberl_drv.c @@ -24,10 +24,15 @@ static int bdberl_drv_control(ErlDrvData handle, unsigned int cmd, char* inbuf, int inbuf_sz, char** outbuf, int outbuf_sz); +static void bdberl_ready_async(ErlDrvData handle, ErlDrvThreadData thread_data); + /** * Command codes */ -#define CMD_PARSE 0 +#define CMD_OPEN_DB 0 +#define CMD_CLOSE_DB 1 +#define CMD_GET 2 +#define CMD_PUT 3 /** * Driver Entry @@ -46,7 +51,7 @@ ErlDrvEntry bdberl_drv_entry = bdberl_drv_control, /* F_PTR control, port_command callback */ NULL, /* F_PTR timeout, reserved */ NULL, /* F_PTR outputv, reserved */ - NULL, /* F_PTR ready_async */ + bdberl_ready_async, /* F_PTR ready_async */ NULL, /* F_PTR flush */ NULL, /* F_PTR call */ NULL, /* F_PTR event */ @@ -105,3 +110,7 @@ static int bdberl_drv_control(ErlDrvData handle, unsigned int cmd, *outbuf = 0; return 0; } + +static void bdberl_ready_async(ErlDrvData handle, ErlDrvThreadData thread_data) +{ +} diff --git a/ebin/bdberl.app b/ebin/bdberl.app new file mode 100644 index 0000000..8845fd3 --- /dev/null +++ b/ebin/bdberl.app @@ -0,0 +1,10 @@ +{application, bdberl, + [{description, "Berkeley DB Erlang Driver"}, + {vsn, "1"}, + {modules, [ bdberl_port ]}, + {registered, []}, + {applications, [kernel, + stdlib]}, +% {mod, {sparker, []}}, + {env, []} +]}. diff --git a/src/bdberl_port.erl b/src/bdberl_port.erl new file mode 100644 index 0000000..54e2edc --- /dev/null +++ b/src/bdberl_port.erl @@ -0,0 +1,14 @@ +%% ------------------------------------------------------------------- +%% +%% bdberl: Port Interface +%% Copyright (c) 2008 The Hive. All rights reserved. +%% +%% ------------------------------------------------------------------- +-module(bdberl_port). + +-export([open/0]). + +open() -> + ok = erl_ddll:load_driver(code:priv_dir(bdberl), bdberl_drv), + Port = open_port({spawn, bdberl_drv}, [binary]), + {ok, Port}.