From e90442fe60c1e758709419767970b77cdfd2e3a8 Mon Sep 17 00:00:00 2001 From: deva Date: Sat, 28 Aug 2010 13:54:43 +0000 Subject: Initial (untested) shot at a lua<->QSql wrapper. --- client/client.pro | 2 + client/lua.cc | 2 + client/luadb.cc | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++ client/luadb.h | 35 +++++++++++ client/luawidget.cc | 2 +- client/luawidget.h | 2 +- 6 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 client/luadb.cc create mode 100644 client/luadb.h diff --git a/client/client.pro b/client/client.pro index 3758693..877f19f 100644 --- a/client/client.pro +++ b/client/client.pro @@ -36,6 +36,7 @@ HEADERS += \ collapser.h \ debug.h \ lua.h \ + luadb.h \ luawidget.h \ macro.h \ macrowindow.h \ @@ -72,6 +73,7 @@ SOURCES += \ collapser.cc \ debug.cc \ lua.cc \ + luadb.cc \ luawidget.cc \ macro.cc \ macrowindow.cc \ diff --git a/client/lua.cc b/client/lua.cc index eae2e32..2753139 100644 --- a/client/lua.cc +++ b/client/lua.cc @@ -31,6 +31,7 @@ #include "widgets/widget.h" #include "luawidget.h" +#include "luadb.h" #include "debug.h" @@ -121,6 +122,7 @@ void LUA::clear() lua_register(L, "debug", debug); register_widget(L); + register_db(L); } QString LUA::runScriptS(QString script, Widget *widget, QString name) diff --git a/client/luadb.cc b/client/luadb.cc new file mode 100644 index 0000000..8666f98 --- /dev/null +++ b/client/luadb.cc @@ -0,0 +1,176 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * luadb.cc + * + * Sat Aug 28 13:40:58 CEST 2010 + * Copyright 2010 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "luadb.h" + +#include +#include + +#include + +#include "debug.h" + +#define luaL_checkbool(L, i) \ + (lua_isboolean(L,i) ? lua_toboolean(L,i) : luaL_checkint(L,i)) + +class DB { +public: + DB(QString driver, QString server, QString database, + QString user, QString password = "", int port = -1) { + db = QSqlDatabase::addDatabase(driver); + db.setHostName(server); + if(port != -1) db.setPort(port); + db.setDatabaseName(database); + db.setUserName(user); + if(password != "") db.setPassword(password); + db.setConnectOptions("connect_timeout=2000"); + } + + ~DB() { } + + void exec(const QString &querystr) { + query = db.exec(querystr); + } + + bool next() + { + return query.next(); + } + + QString value(int idx) { + return query.value(idx).toString(); + } + +private: + QSqlDatabase db; + QSqlQuery query; +}; + +typedef struct db_userdata { + DB *db; +} db_userdata; + +static int db_value(lua_State *L) +{ + db_userdata *dbu; + + dbu = (db_userdata *)luaL_checkudata(L, 1, "DB"); + luaL_argcheck(L, dbu, 1, "DB expected"); + + int idx = luaL_checkinteger(L, 2); + + lua_pushstring(L, dbu->db->value(idx).toStdString().c_str()); + + return 1; +} + +static int db_exec(lua_State *L) +{ + db_userdata *dbu; + + dbu = (db_userdata *)luaL_checkudata(L, 1, "DB"); + luaL_argcheck(L, dbu, 1, "DB expected"); + + const char *query = luaL_checkstring(L, 2); + + dbu->db->exec(query); + + return 0; +} + +static int db_next(lua_State *L) +{ + db_userdata *dbu; + + dbu = (db_userdata *)luaL_checkudata(L, 1, "DB"); + luaL_argcheck(L, dbu, 1, "DB expected"); + + bool more = dbu->db->next(); + + lua_pushboolean(L, more); + + return 1; +} + +static int db_new(lua_State *L) +{ + db_userdata *dbu; + dbu = (db_userdata *)lua_newuserdata(L, sizeof(db_userdata)); + + luaL_getmetatable(L, "DB"); + lua_setmetatable(L, -2); + + dbu->db = new DB("", "", "", ""); + + return 1; +} + +static int db_gc(lua_State *L) +{ + db_userdata *dbu; + + dbu = (db_userdata *)luaL_checkudata(L, 1, "DB"); + luaL_argcheck(L, dbu, 1, "DB expected"); + + delete dbu->db; + + return 0; +} + +static const struct luaL_Reg db_meths[] = { + {"__new", db_new}, + {"__gc" ,db_gc}, + {"value", db_value}, + {"next", db_next}, + {"exec", db_exec}, + {NULL, NULL} +}; + +void register_db(lua_State *L) +{ + luaL_newmetatable(L, "DB"); + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -2); + lua_rawset(L, -3); + luaL_register(L, NULL, db_meths); +} + +/* + +Example: +-------- +db = DB:new(...) +db.exec('...') + +while db.next() +do + val0 = db.value(0) + val1 = db.value(1) + ... +end + + */ diff --git a/client/luadb.h b/client/luadb.h new file mode 100644 index 0000000..a87baf5 --- /dev/null +++ b/client/luadb.h @@ -0,0 +1,35 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * luadb.h + * + * Sat Aug 28 13:40:58 CEST 2010 + * Copyright 2010 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __PRACRO_LUADB_H__ +#define __PRACRO_LUADB_H__ + +#include + +void register_db(lua_State *L); + +#endif/*__PRACRO_LUADB_H__*/ diff --git a/client/luawidget.cc b/client/luawidget.cc index ba64257..bd000f0 100644 --- a/client/luawidget.cc +++ b/client/luawidget.cc @@ -37,7 +37,7 @@ ** Copied from lauxlib.c, but modified return NULL upon error instead of ** casting a lua error. **/ -LUALIB_API void *luaL_isudata (lua_State *L, int ud, const char *tname) { +static void *luaL_isudata (lua_State *L, int ud, const char *tname) { void *p = lua_touserdata(L, ud); if (p != NULL) { /* value is a userdata? */ if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ diff --git a/client/luawidget.h b/client/luawidget.h index db615b5..b110598 100644 --- a/client/luawidget.h +++ b/client/luawidget.h @@ -29,7 +29,7 @@ #define __PRACRO_LUAWIDGET_H__ #include -#include +//#include #include "widgets/widget.h" -- cgit v1.2.3