Создание простой таблицы с таблицами Lua C API

Я запускаю MySQL-запрос, который всегда возвращает 4 строки:

row->name , row->date , row->ip , row->custom

Я хочу достичь простой таблицы, основанной на приведенных выше результатах, чтобы она выглядела так:

 { "name" = result of row->name, "date" = result of row->date, "ip" = result of row->ip, "custom" = result of row->custom } 

Я попробовал несколько возможностей, но приведенные примеры действительно разнообразны, и у меня возникают проблемы с его работой.

Моя последняя неудачная попытка:

 lua_createtable(L, 0, 4); top = lua_gettop(L); lua_pushstring(L, "name"); lua_pushstring(L, row->name); lua_pushstring(L, "date"); lua_pushnumber(L, row->date); lua_pushstring(L, "ip"); lua_pushstring(L, row->ip); lua_pushstring(L, "custom"); lua_pushstring(L, row->custom); lua_settable(L, top); 

Как я уже упоминал в комментарии, lua_settable() заботится только о одной key, value паре key, value . Повторите это, если вам нужно больше.

Я бы предпочел сохранить пространство стека Lua следующим образом:

 lua_createtable(L, 0, 4); lua_pushstring(L, "name"); lua_pushstring(L, row->name); lua_settable(L, -3); /* 3rd element from the stack top */ lua_pushstring(L, "date"); lua_pushstring(L, row->date); lua_settable(L, -3); lua_pushstring(L, "ip"); lua_pushstring(L, row->ip); lua_settable(L, -3); lua_pushstring(L, "custom"); lua_pushstring(L, row->custom); lua_settable(L, -3); /* We still have table left on top of the Lua stack. */ 

Кроме того, вы могли бы написать какой-то iterator структуры C или что-то еще.

ПРИМЕЧАНИЕ: если это для какой-либо оболочки Lua – вы должны обеспечить стандартизированный способ этого . В следующем примере применен комментарий @lhf о его сокращении:

 int l_row_push(lua_State *l) { lua_createtable(L, 0, 4); /* creates and pushes new table on top of Lua stack */ lua_pushstring(L, row->name); /* Pushes table value on top of Lua stack */ lua_setfield(L, -2, "name"); /* table["name"] = row->name. Pops key value */ lua_pushstring(L, row->date); lua_setfield(L, -2, "date"); lua_pushstring(L, row->ip); lua_setfield(L, -2, "ip"); lua_pushstring(L, row->custom); lua_setfield(L, -2, "custom"); /* Returning one table which is already on top of Lua stack. */ return 1; } 

EDIT: Исправлено использование lua_setfield() в примечании @lhf . Спасибо!