luaReg.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. #include "stdafx.h"
  2. #include "luaReg.h"
  3. /************************************************************************/
  4. /* 函数:[1/15/2018 Jeff];
  5. /* 描述:;
  6. /* 参数:;
  7. /* [IN] :;
  8. /* [OUT] :;
  9. /* [IN/OUT] :;
  10. /* 返回:void;
  11. /* 注意:;
  12. /* 示例:;
  13. /*
  14. /* 修改:;
  15. /* 日期:;
  16. /* 内容:;
  17. /************************************************************************/
  18. int StackDump(lua_State* luaVM)
  19. {
  20. // 得到栈的元素个数,栈顶的位置;
  21. int nTop = lua_gettop(luaVM);
  22. // 输出栈顶位置;
  23. printf("当前栈的元素个数: %d\n", nTop);
  24. for (int i = 1; i <= nTop; ++i)
  25. {
  26. int t = lua_type(luaVM, i);
  27. // 这里的typename是把类型的枚举变成字符串,是类型名,不是栈中的位置;
  28. printf("%s:", lua_typename(luaVM, t));
  29. switch (t)
  30. {
  31. case LUA_TNUMBER:
  32. printf("%f\n", lua_tonumber(luaVM, i));
  33. break;
  34. case LUA_TSTRING:
  35. printf("%s\n", lua_tostring(luaVM, i));
  36. break;
  37. case LUA_TTABLE:
  38. printf("%s\n", lua_tostring(luaVM, i));
  39. break;
  40. case LUA_TFUNCTION:
  41. printf("%s\n", lua_tostring(luaVM, i));
  42. break;
  43. case LUA_TNIL:
  44. printf("Is NULL\n");
  45. break;
  46. case LUA_TBOOLEAN:
  47. printf("%s\n", lua_toboolean(luaVM, i) ? "true" : "false");
  48. break;
  49. case LUA_TUSERDATA:
  50. printf("用户数据\n");
  51. break;
  52. default:
  53. printf("什么都不是???\n");
  54. break;
  55. }
  56. }
  57. printf("\n");
  58. return 0;
  59. }
  60. int lua_create_aos(lua_State *luaVM)
  61. {
  62. if (luaVM == NULL)
  63. return 0;
  64. // 创建一个对象指针到栈里,返回给lua使用, userdata的位置为-1;
  65. CAosClient **aos = (CAosClient**)lua_newuserdata(luaVM, sizeof(CAosClient*));
  66. *aos = new CAosClient();
  67. // 得到全局元表位置-1, userdata位置-2;
  68. luaL_getmetatable(luaVM, "AosClient");
  69. // 将元表赋值给位置-2的userdata,并弹出-1的元表;
  70. lua_setmetatable(luaVM, -2);
  71. // 成功必须返回1,否则出错;
  72. return 1;
  73. }
  74. // 自动内存回收;
  75. int lua_auto_gc(lua_State *luaVM)
  76. {
  77. if (luaVM == NULL)
  78. return 0;
  79. CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
  80. luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
  81. if (aos)
  82. delete *aos;
  83. printf("gc执行成功\n");
  84. return 1;
  85. }
  86. //////////////////////////////////////////////////////////////////////////
  87. // 成员函数全局化,给lua脚本调用;
  88. int lua_InitClient(lua_State *luaVM)
  89. {
  90. if (luaVM == NULL)
  91. return 0;
  92. // 获取第一个传入的对象参数(在栈底);
  93. CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1/*第n个*/, "AosClient");
  94. luaL_argcheck(luaVM, aos != NULL, 1/*个数*/, "invalid user data");
  95. // 从lua中获取参数值;
  96. luaL_checktype(luaVM, -1, LUA_TSTRING);
  97. std::string key_secret = lua_tostring(luaVM, -1);
  98. luaL_checktype(luaVM, -2, LUA_TSTRING);
  99. std::string access_key = lua_tostring(luaVM, -2);
  100. luaL_checktype(luaVM, -3, LUA_TSTRING);
  101. std::string endpoint = lua_tostring(luaVM, -3);
  102. // 清空栈;
  103. lua_settop(luaVM, 0);
  104. // 执行函数并将函数结果放入栈中, 供lua调用 ;
  105. lua_pushboolean(luaVM, (*aos)->InitClient(endpoint, access_key, key_secret));
  106. printf("Aos初始化成功\n");
  107. return 1;
  108. }
  109. int lua_IsObjectUploaded(lua_State *luaVM)
  110. {
  111. if (luaVM == NULL)
  112. return 0;
  113. // 获取第一个传入的对象参数(在栈底);
  114. CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
  115. luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
  116. // 从lua中获取参数值;
  117. luaL_checktype(luaVM, -1, LUA_TSTRING);
  118. std::string key = lua_tostring(luaVM, -1);
  119. luaL_checktype(luaVM, -2, LUA_TSTRING);
  120. std::string bucket = lua_tostring(luaVM, -2);
  121. // 清空栈;
  122. lua_settop(luaVM, 2);
  123. // 执行函数并将函数结果放入栈中, 供lua调用 ;
  124. lua_pushboolean(luaVM, (*aos)->IsObjectUploaded(bucket, key));
  125. return 1;
  126. }
  127. int lua_PutObjectFromFile(lua_State *luaVM)
  128. {
  129. if (luaVM == NULL)
  130. return 0;
  131. // 获取第一个传入的对象参数(在栈底);
  132. CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
  133. luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
  134. // 从lua中获取参数值;
  135. luaL_checktype(luaVM, -1, LUA_TSTRING);
  136. std::string key = lua_tostring(luaVM, -1);
  137. luaL_checktype(luaVM, -2, LUA_TSTRING);
  138. std::string file = lua_tostring(luaVM, -2);
  139. luaL_checktype(luaVM, -3, LUA_TSTRING);
  140. std::string bucket = lua_tostring(luaVM, -3);
  141. // 清空栈;
  142. lua_settop(luaVM, 0);
  143. // 执行函数并将函数结果放入栈中, 供lua调用 ;
  144. lua_pushboolean(luaVM, (*aos)->PutObjectFromFile(bucket, file, key));
  145. return 1;
  146. }
  147. int lua_GetObject(lua_State *luaVM)
  148. {
  149. if (luaVM == NULL)
  150. return 0;
  151. // 获取第一个传入的对象参数(在栈底);
  152. CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
  153. luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
  154. // 从lua中获取参数值;
  155. luaL_checktype(luaVM, -1, LUA_TSTRING);
  156. std::string savepath = lua_tostring(luaVM, -1);
  157. luaL_checktype(luaVM, -2, LUA_TSTRING);
  158. std::string key = lua_tostring(luaVM, -2);
  159. luaL_checktype(luaVM, -3, LUA_TSTRING);
  160. std::string bucket = lua_tostring(luaVM, -3);
  161. // 清空栈;
  162. lua_settop(luaVM, 0);
  163. // 执行函数并将函数结果放入栈中, 供lua调用 ;
  164. lua_pushboolean(luaVM, (*aos)->GetObject(bucket, key, savepath));
  165. return 1;
  166. }
  167. int lua_DeleteObject(lua_State *luaVM)
  168. {
  169. if (luaVM == NULL)
  170. return 0;
  171. // 获取第一个传入的对象参数(在栈底);
  172. CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
  173. luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
  174. // 从lua中获取参数值;
  175. luaL_checktype(luaVM, -1, LUA_TSTRING);
  176. std::string key = lua_tostring(luaVM, -1);
  177. luaL_checktype(luaVM, -2, LUA_TSTRING);
  178. std::string bucket = lua_tostring(luaVM, -2);
  179. // 清空栈;
  180. lua_settop(luaVM, 0);
  181. // 执行函数并将函数结果放入栈中, 供lua调用 ;
  182. lua_pushboolean(luaVM, (*aos)->DeleteObject(bucket, key));
  183. return 1;
  184. }
  185. int lua_newArray()
  186. {
  187. return 1;
  188. }
  189. int lua_GetListAllObjects(lua_State *luaVM)
  190. {
  191. printf("lua_GetListAllObjects\n");
  192. if (luaVM == NULL)
  193. return 0;
  194. // 获取第一个传入的对象参数(在栈底);
  195. CAosClient **aos = (CAosClient**)luaL_checkudata(luaVM, 1, "AosClient");
  196. luaL_argcheck(luaVM, aos != NULL, 1, "invalid user data");
  197. // 从lua中获取参数值;
  198. luaL_checktype(luaVM, -1, LUA_TSTRING);
  199. std::string end_date = lua_tostring(luaVM, -1);
  200. luaL_checktype(luaVM, -2, LUA_TSTRING);
  201. std::string start_date = lua_tostring(luaVM, -2);
  202. luaL_checktype(luaVM, -3, LUA_TSTRING);
  203. std::string prefix = lua_tostring(luaVM, -3);
  204. luaL_checktype(luaVM, -4, LUA_TSTRING);
  205. std::string bucket = lua_tostring(luaVM, -4);
  206. luaL_checktype(luaVM, -5, LUA_TNUMBER);
  207. INT64 nStopSize = lua_tointeger(luaVM, -5);
  208. vector<KeyContent> vtKeyContent;
  209. bool bRet = (*aos)->GetListAllObjects(nStopSize, bucket, prefix, vtKeyContent, start_date, end_date);
  210. size_t size = vtKeyContent.size() * sizeof(KeyContent);
  211. //KeyContent *a = (KeyContent*)lua_newuserdata(luaVM, size);
  212. // 清空栈;
  213. lua_settop(luaVM, 0);
  214. int nIndex = 0;
  215. // 向栈顶压入一个table;
  216. lua_newtable(luaVM);
  217. // 设置table下标(lua是从-1开始的);
  218. for (vector<KeyContent>::iterator it = vtKeyContent.begin(); it != vtKeyContent.end(); it++)
  219. {
  220. lua_pushstring(luaVM, it->strKey.c_str());// 当做key,压入key;
  221. lua_pushstring(luaVM, it->strDate.c_str());// 当做value,压入value;
  222. //lua_rawset(luaVM, -3);// 弹出key,value,并设置到table中;
  223. lua_settable(luaVM, -3); // 弹出key,value,并设置到table中;
  224. }
  225. StackDump(luaVM);
  226. Sleep(5000);
  227. return 1;
  228. }
  229. // 将函数注册到lua环境中;
  230. int lua_regFuns(lua_State *luaVM)
  231. {
  232. if (luaVM == NULL)
  233. return 0;
  234. // 创建全局元表,元表位置为-1(栈顶);
  235. luaL_newmetatable(luaVM, "AosClient");
  236. // 将元素作为一个副本压栈到位置-1(栈顶), 原元表位置-2;
  237. lua_pushvalue(luaVM, -1);
  238. // 设置-2位置元表的__index索引值为位置-1的元表, 并弹出位置-1的元素, 原元表的位置变成-1;
  239. lua_setfield(luaVM, -2, "__index");
  240. // 将类成员函数注册到元表中(此时,全局元表设置完成);
  241. luaL_setfuncs(luaVM, g_member_funs, 0);
  242. // 再注册构造函数到新表中,返回给lua;
  243. luaL_newlib(luaVM, g_constructor_funs);
  244. return 1;
  245. }
  246. // 将模块注册到lua环境中;
  247. void lua_regLibs(lua_State *luaVM)
  248. {
  249. const luaL_Reg *lib = g_libs;
  250. for (; lib->func != NULL; lib++)
  251. {
  252. //注意这里如果使用的不是requiref,则需要手动在Lua里面调用require "模块名"
  253. luaL_requiref(luaVM, lib->name, lib->func, 1);
  254. lua_settop(luaVM, 0);
  255. }
  256. }
  257. int lua_new()
  258. {
  259. if (Global::g_IsLuaRunning)
  260. {
  261. printf("脚本已在运行中\n");
  262. return 0;
  263. }
  264. else
  265. {
  266. printf("开始执行脚本\n");
  267. Sleep(5000);
  268. }
  269. Global::WriteTextLog(_T("执行脚本\r"));
  270. // 创建环境;
  271. lua_State *luaVM = luaL_newstate();
  272. if (luaVM == NULL)
  273. return 0;
  274. // 注册模块;
  275. lua_regLibs(luaVM);
  276. // 加载lua脚本文件;
  277. if (0 != luaL_dofile(luaVM, "config.lua"))
  278. {
  279. // 如果执行出错,栈顶(-1)则是错误字符串;
  280. std::string err = lua_tostring(luaVM, -1);
  281. printf("执行脚本出错:%s\n", err.c_str());
  282. // 将错误消息占用内存从栈中弹出;
  283. lua_pop(luaVM, 1);
  284. return -1;
  285. }
  286. // 获取lua脚本全局变量;
  287. lua_getglobal(luaVM, "Sleep");
  288. if (lua_isnumber(luaVM, -1))
  289. {
  290. Global::g_nSleep = lua_tonumber(luaVM, -1);
  291. if ( Global::g_nSleep < 1000 )
  292. Global::g_nSleep = 1000;
  293. }
  294. // 恢复lua的栈;
  295. lua_pop(luaVM, 1);
  296. // 关闭lua虚拟环境;
  297. lua_close(luaVM);
  298. Global::g_IsLuaRunning = false;
  299. return 1;
  300. }