diff -r 4ff31a4ea1fb -r 408291a6eb3e dbd/postgresql/connection.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dbd/postgresql/connection.c Sun Nov 23 01:29:09 2008 +0000 @@ -0,0 +1,135 @@ +#include "dbd_postgresql.h" + +int dbd_postgresql_statement_create(lua_State *L, connection_t *conn, const char *sql_query); + +static int connection_new(lua_State *L) { + int n = lua_gettop(L); + connection_t *conn = NULL; + + const char *host = NULL; + const char *user = NULL; + const char *password = NULL; + const char *db = NULL; + const char *port = NULL; + + const char *options = NULL; /* TODO always NULL */ + const char *tty = NULL; /* TODO always NULL */ + + char portbuf[18]; + + /* db, user, password, host, port */ + switch (n) { + case 5: + if (lua_isnil(L, 5) == 0) + { + int pport = luaL_checkint(L, 5); + + if (pport >= 1 && pport <= 65535) { + snprintf(portbuf, sizeof(portbuf), "%d", pport); + port = portbuf; + } else { + luaL_error(L, "Invalid port %d", pport); + } + } + case 4: + if (lua_isnil(L, 4) == 0) + host = luaL_checkstring(L, 4); + case 3: + if (lua_isnil(L, 3) == 0) + password = luaL_checkstring(L, 3); + case 2: + if (lua_isnil(L, 2) == 0) + user = luaL_checkstring(L, 2); + case 1: + if (lua_isnil(L, 1) == 0) + db = luaL_checkstring(L, 1); + } + + conn = (connection_t *)lua_newuserdata(L, sizeof(connection_t)); + + conn->postgresql = PQsetdbLogin(host, port, options, tty, db, user, password); + conn->statement_id = 0; + + if (PQstatus(conn->postgresql) == CONNECTION_OK) { + luaL_getmetatable(L, DBD_POSTGRESQL_CONNECTION); + lua_setmetatable(L, -2); + } else { + luaL_error(L, "Failed to connect to database: %s", PQerrorMessage(conn->postgresql)); + lua_pushnil(L); + } + + return 1; +} + +static int connection_close(lua_State *L) { + connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_CONNECTION); + int disconnect = 0; + + if (conn->postgresql) { + PQfinish(conn->postgresql); + disconnect = 1; + } + + lua_pushboolean(L, disconnect); + return 1; +} + +static int connection_ping(lua_State *L) { + connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_CONNECTION); + int ok = 0; + + if (conn->postgresql) { + ConnStatusType status = PQstatus(conn->postgresql); + + if (status == CONNECTION_OK) + ok = 1; + } + + lua_pushboolean(L, ok); + return 1; +} + +static int connection_prepare(lua_State *L) { + connection_t *conn = (connection_t *)luaL_checkudata(L, 1, DBD_POSTGRESQL_CONNECTION); + + if (conn->postgresql) { + return dbd_postgresql_statement_create(L, conn, luaL_checkstring(L, 2)); + } + + lua_pushnil(L); + return 1; +} + + +static int connection_gc(lua_State *L) { + /* always close the connection */ + connection_close(L); + + return 0; +} + +static const luaL_Reg connection_methods[] = { + {"close", connection_close}, + {"ping", connection_ping}, + {"prepare", connection_prepare}, + {NULL, NULL} +}; + +static const luaL_Reg connection_class_methods[] = { + {"New", connection_new}, + {NULL, NULL} +}; + +int dbd_postgresql_connection(lua_State *L) { + luaL_newmetatable(L, DBD_POSTGRESQL_CONNECTION); + luaL_register(L, 0, connection_methods); + lua_pushvalue(L,-1); + lua_setfield(L, -2, "__index"); + + lua_pushcfunction(L, connection_gc); + lua_setfield(L, -2, "__gc"); + + luaL_register(L, DBD_POSTGRESQL_CONNECTION, connection_class_methods); + + return 1; +}