// fiko.istakip.* Lua bağlama katmanı — İş Takip (Kral/istemci ortak önbellek). // Mimari kural: her sistem doğuştan makro + plugin + olay erişilebilir. // Veri erişimi callback'ledir (servis yaşam döngüsü önbelleği yıkıp kurar); // yazma tek yoldan (IstakipServis::yaz — rol kapısı + iyimser kilit orada). #include #include "fiko/betik/makro_motor.hpp" #include "fiko/istakip/istemci.hpp" extern "C" { #include "lauxlib.h" #include "lua.h" } namespace fiko::betik { namespace { int hataDon(lua_State* L, const char* mesaj) { lua_pushnil(L); lua_pushstring(L, mesaj); return 2; } void kayitTablosu(lua_State* L, const istakip::IsKayit& k) { lua_createtable(L, 0, 5); lua_pushinteger(L, (lua_Integer)k.kimlik); lua_setfield(L, -2, "kimlik"); lua_pushinteger(L, (lua_Integer)k.surum); lua_setfield(L, -2, "surum"); lua_pushlstring(L, k.tur.data(), k.tur.size()); lua_setfield(L, -2, "tur"); lua_pushboolean(L, k.silindi); lua_setfield(L, -2, "silindi"); lua_createtable(L, 0, (int)k.alanlar.size()); for (const auto& [a, d] : k.alanlar) { lua_pushlstring(L, d.data(), d.size()); lua_setfield(L, -2, a.c_str()); } lua_setfield(L, -2, "alan"); } } // namespace // fiko.istakip.liste(tur) → {kayıt tabloları} (silinmişler hariç). int MakroMotor::l_istakipListe(lua_State* L) { MakroMotor* m = kendisi(L); istakip::IsIstemci* veri = m->istakipVeriCb_ ? m->istakipVeriCb_() : nullptr; if (!veri) return hataDon(L, "İş Takip kapalı — Ayarlar → İş Takip'ten açın"); const char* tur = luaL_checkstring(L, 1); const auto liste = veri->turListe(tur); lua_createtable(L, (int)liste.size(), 0); int i = 0; for (const istakip::IsKayit* k : liste) { kayitTablosu(L, *k); lua_rawseti(L, -2, ++i); } return 1; } // fiko.istakip.kayit(kimlik) → kayıt tablosu (tombstone dahil) | nil. int MakroMotor::l_istakipKayit(lua_State* L) { MakroMotor* m = kendisi(L); istakip::IsIstemci* veri = m->istakipVeriCb_ ? m->istakipVeriCb_() : nullptr; if (!veri) return hataDon(L, "İş Takip kapalı — Ayarlar → İş Takip'ten açın"); const istakip::IsKayit* k = veri->bul((u64)luaL_checkinteger(L, 1)); if (!k) return hataDon(L, "Kayıt bulunamadı"); kayitTablosu(L, *k); return 1; } // fiko.istakip.yaz{tur=, kimlik=0, silindi=false, beklenen=0, alan={k=v}} → sira. // kimlik 0 = yeni kayıt (kimliği kral atar); beklenen = iyimser kilit sürümü. int MakroMotor::l_istakipYaz(lua_State* L) { MakroMotor* m = kendisi(L); if (!m->istakipYazCb_) return hataDon(L, "İş Takip kapalı — Ayarlar → İş Takip'ten açın"); luaL_checktype(L, 1, LUA_TTABLE); istakip::IsKayit k; lua_getfield(L, 1, "kimlik"); k.kimlik = (u64)luaL_optinteger(L, -1, 0); lua_pop(L, 1); lua_getfield(L, 1, "tur"); if (const char* t = lua_tostring(L, -1)) k.tur = t; lua_pop(L, 1); lua_getfield(L, 1, "silindi"); k.silindi = lua_toboolean(L, -1) != 0; lua_pop(L, 1); lua_getfield(L, 1, "beklenen"); const u64 beklenen = (u64)luaL_optinteger(L, -1, 0); lua_pop(L, 1); if (k.tur.empty() && k.kimlik == 0) return hataDon(L, "tur alanı zorunlu (yeni kayıt)"); lua_getfield(L, 1, "alan"); if (lua_istable(L, -1)) { lua_pushnil(L); while (lua_next(L, -2)) { if (lua_type(L, -2) == LUA_TSTRING) { size_t dn = 0; const char* d = luaL_tolstring(L, -1, &dn); // sayı/bool → metin k.alanlar.emplace_back(lua_tostring(L, -2), std::string(d, dn)); lua_pop(L, 1); // tolstring kopyası } lua_pop(L, 1); } } lua_pop(L, 1); const u64 sira = m->istakipYazCb_(k, beklenen); if (sira == 0) return hataDon(L, "Yazılamadı — bağlantı/yetki/çakışma kontrol edin"); lua_pushinteger(L, (lua_Integer)sira); return 1; } } // namespace fiko::betik