Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

how to return a table? #64

Open
owen200008 opened this issue Jun 26, 2017 · 2 comments
Open

how to return a table? #64

owen200008 opened this issue Jun 26, 2017 · 2 comments

Comments

@owen200008
Copy link

owen200008 commented Jun 26, 2017

how can i return a table?
i do not want to create map in c/c++(it use frequency)

now code:(how to change to kaguya)
int nRows = dataTable.NumOfRows();
int nField = dataTable.NumOfFields();
lua_newtable(tolua_S);
int array_index = lua_gettop(tolua_S);
for (int i = 0; i < nRows; i++)
{
lua_newtable(tolua_S);
int result_index = lua_gettop(tolua_S);
for (int j = 0; j < nField; j++)
{
dataTable.SetRow(i);
lua_pushstring(tolua_S, dataTable.NameOfField(j));
lua_pushstring(tolua_S, dataTable.ValueOfField(j));
lua_settable(tolua_S, result_index);
}
lua_settop(tolua_S, result_index);
lua_rawseti(tolua_S, array_index, i + 1);
}

@satoren
Copy link
Owner

satoren commented Jun 26, 2017

It is maybe like this

int luafnc(lua_State* L)
{
int nRows = dataTable.NumOfRows();
int nField = dataTable.NumOfFields();

kaguya::State state(L);
kaguya::LuaTable array= state.newTable(nRows);
for (int i = 0; i < nRows; i++)
{
  kaguya::LuaTable row= state.newTable(0,nField);
  for (int j = 0; j < nField; j++)
  {
    dataTable.SetRow(i);
    row[dataTable.NameOfField(j)] = dataTable.ValueOfField(j);
  }
  array[i + 1] = row;
}
state.pushToStack(array);
return 1;
}

@owen200008
Copy link
Author

owen200008 commented Jul 6, 2017

in member function, can i write like this?
.addStaticFunction("QueryTotalData", [](CCQLite3DB* pDB, char* pSQL, CCQLite3DBTable* pTable)->kaguya::CCQLite3DBTable_Warp { {
kaguya::CCQLite3DBTable_Warp ret;
if (!pDB->GetDataToTable(pSQL, pTable)) {
return ret;
}
ret.m_pTmpTable = pTable;
return ret;
}})
);
namespace kaguya {
class CCQLite3DBTable_Warp {
public:
CCQLite3DBTable_Warp() {
m_pTmpTable = nullptr;
}
virtual ~CCQLite3DBTable_Warp() {

	}
public:
	CCQLite3DBTable* m_pTmpTable;
};
template<> struct lua_type_traits<CCQLite3DBTable_Warp> {
	typedef CCQLite3DBTable_Warp get_type;
	typedef const CCQLite3DBTable_Warp& push_type;
	static int push(lua_State* l, push_type sTmp) {
		CCQLite3DBTable* s = (CCQLite3DBTable*)sTmp.m_pTmpTable;
		if (s == nullptr)
			lua_pushnil(l);
		else {
			int nRows = s->NumOfRows();
			int nField = s->NumOfFields();
			lua_newtable(l);
			int array_index = lua_gettop(l);
			for (int i = 0; i < nRows; i++) {
				lua_newtable(l);
				int result_index = lua_gettop(l);
				for (int j = 0; j < nField; j++) {
					s->SetRow(i);
					lua_pushstring(l, s->NameOfField(j));
					lua_pushstring(l, s->ValueOfField(j));
					lua_settable(l, result_index);
				}
				lua_settop(l, result_index);
				lua_rawseti(l, array_index, i + 1);
			}
		}
		return 1;
	}
};

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants