Création d’une table simple avec l’API C de Lua tables

J’exécute une requête MySQL qui renvoie toujours 4 lignes:

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

Ce que je veux réaliser est de créer un tableau simple, basé sur les résultats ci-dessus, de sorte qu’il ressemble à ceci:

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

J’ai essayé plusieurs possibilités, mais les exemples mis en ligne sont très variés et j’ai eu du mal à le faire fonctionner.

Mon dernier essai infructueux:

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

Comme je l’ai mentionné dans le commentaire, lua_settable() prend en charge qu’une paire key, value . Doit répéter cela si vous avez besoin de plus.

Je préférerais économiser l’espace de stack Lua comme ceci:

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

En outre, vous pourriez écrire une sorte d’iterator de structure C ou quelque chose d’autre.

REMARQUE: s’il s’agit d’une sorte d’emballage Lua, vous devez vous assurer que l’utilisation de cette méthode est normalisée . Dans l’exemple suivant, @lhf a appliqué un commentaire sur le raccourcissement:

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

EDIT: Corrige l’utilisation de lua_setfield() par @lhf note. Merci!