https://github.com/Eonblast/Emysql
application:start(emysql).
emysql:add_pool(PoolName, PoolSize, Username, Password, Host, Port, Database, Encoding) -> ok | {error, pool_already_exists}
PoolName = atom()
PoolSize = integer()
Username = string()
Password = string()
Host = string()
Port = integer()
Database = string()
Encoding = atom()
emysql:add_pool(mypoolname, 1, "username", "mypassword", "localhost", 3306, "mydatabase", utf8).
-record(ok_packet, {seq_num, affected_rows, insert_id, status, warning_count, msg}).
-record(error_packet, {seq_num, code, msg}).
-record(result_packet, {seq_num, field_list, rows, extra}).
emysql:execute(PoolName, Statement) -> result_packet() | ok_packet() | error_packet()
PoolName = atom()
Statement = string() | binary()
emysql:execute(mypoolname, <<"SELECT * from mytable">>).
#result_packet{field_list=[...], rows=[...]}
emysql:execute(mypoolname, <<"UPDATE mytable SET bar = 'baz' WHERE id = 1">>).
#ok_packet{affected_rows=1}
emysql:prepare(StmtName, Statement) -> ok
StmtName = atom()
Statement = binary() | string()
emysql:prepare(my_stmt, <<"SELECT * from mytable WHERE id = ?">>).
ok
emysql:execute(StmtName, Args) -> result_packet() | ok_packet() | error_packet()
StmtName = atom()
Args = [term()]
emysql:execute(my_stmt, [1]).
#result_packet{field_list=[...], rows=[...]}
emysql_util:as_record(ResultPacket, RecordName, Fields) -> Result
ResultPacket = result_packet()
RecordName = atom() (the name of the record to generate)
Fields = [atom()] (the field names to generate for each record)
Result = [record()]
-module(fetch_example).
-record(foo, {bar, baz, bat}).
fetch_foo() ->
Result = emysql:execute(pool1, <<"select bar, baz, bat from foo">>),
Recs = emysql_util:as_record(Result, foo, record_info(fields, foo)),
[begin
io:format("foo: ~p, ~p, ~p~n", [Foo#foo.bar, Foo#foo.baz, Foo#foo.bat])
end || Foo <- Recs].
- decrementing pool size could close sockets that are in use
- spawn individual conn_mgr gen_server processes for each pool
- allow row results to be returned as binary