Streetboy_xD

[Computercraft] Database - WIP V0.60.143

Oct 24th, 2016
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.45 KB | None | 0 0
  1. database = {};
  2. database_mt = { __index = database };
  3. log_print = false;
  4.  
  5. -- Table: {column_name = {data}, column_name = {data}, ...}
  6. -- Config: {table = {column = {type, key}, column = {type, key}}, table = {column = {type, key}, column = {type, key}}, ...}
  7.  
  8. -- CREATE DATABASE dbname
  9. -- CREATE TABLE tablename (col, col, col)
  10. -- INSERT tablename (col, col, col) VALUES (val, val, val), (val, val, val), (val, val, val)
  11. -- SELECT * or colname FROM tablename [WHERE col='val']
  12. -- DELETE ---- coming soon
  13. -- USE dbname
  14.  
  15. function database:new( ip, username, password )
  16. local self = setmetatable({}, database_mt);
  17. self.ip = ip;
  18. self.username = username;
  19. self.password = password;
  20. self.db_accesscode = '000000';
  21. self.used_db = "";
  22. self:create_empty_config( );
  23. return self;
  24. end
  25.  
  26. function database:create( name )
  27. fs.makeDir("databases/" .. name);
  28. self.used_db = name;
  29. end
  30.  
  31. function database:log_( console )
  32. logfile = fs.open(".temp/log.txt", "a");
  33. logfile.writeLine(console);
  34. logfile.close();
  35. if(log_print) then
  36. print(console);
  37. end
  38. end
  39.  
  40. function database:tr_command( command )
  41. local commands = {};
  42. local return_array = {};
  43. command = command:gsub(" ", "");
  44.  
  45. if(command:find(";")) then
  46. for i in command:gmatch("([^;]+)") do
  47. table.insert(commands, i);
  48. end
  49. else
  50. table.insert(commands, command);
  51. end
  52.  
  53. command = command:gsub(";", "");
  54.  
  55. for c = 1, #commands do
  56. local curCommand = commands[c];
  57. local CREATE = curCommand:find("CREATE");
  58. local INSERT = curCommand:find("INSERT");
  59. local SELECT = curCommand:find("SELECT");
  60. local DELETE = curCommand:find("DELETE");
  61. local USE = curCommand:find("USE");
  62. if(CREATE) then
  63. local DATABASE = curCommand:find("DATABASE");
  64. local TABLE = curCommand:find("TABLE");
  65.  
  66. if(DATABASE) then
  67. local f, l = curCommand:find("DATABASE");
  68. local db_name = curCommand:sub(l+1, -1);
  69. self:create( db_name );
  70. table.insert(return_array, true);
  71. elseif(TABLE) then
  72. if(fs.exists("databases/" .. self.used_db) and self.used_db ~= "") then
  73. local f, l = curCommand:find("TABLE");
  74. local f_, l_ = curCommand:find("%(");
  75. local f__, l__ = curCommand:find("%)");
  76. local table_name = curCommand:sub(l+1, f_-1);
  77. local columns = curCommand:sub(l_+1, f__-1);
  78. local columns_ = {};
  79. local table_data = {};
  80. local config_data = {[table_name] = {}};
  81.  
  82. for i in columns:gmatch("([^,]+)") do
  83. table.insert(columns_, i);
  84. end
  85.  
  86. columns = columns_;
  87.  
  88. for i,v in pairs(columns) do
  89. table_data[v] = {};
  90. config_data[table_name][v] = {false,false};
  91. end
  92.  
  93. self:edit_table( table_name, table_data, false );
  94. self:edit_config( table_name, config_data );
  95. table.insert(return_array, true);
  96. else
  97. self:log_("database doesn't exists");
  98. table.insert(return_array, false);
  99. end
  100. end
  101. elseif(INSERT) then
  102. if(fs.exists("databases/" .. self.used_db) and self.used_db ~= "") then
  103. local f, l = curCommand:find("INSERT");
  104. local f_, l_ = curCommand:find("%(");
  105. local f__, l__ = curCommand:find("%)");
  106. local f___, l___ = curCommand:find("VALUES");
  107. local table_name = curCommand:sub(l+1, f_-1);
  108. local columns = curCommand:sub(l_+1, f__-1);
  109. local values = curCommand:sub(l___+1, -1);
  110. local columns_ = {};
  111. local values_ = {};
  112. local split_values= {};
  113. local table_data = {};
  114.  
  115. for i in columns:gmatch("([^,]+)") do
  116. table.insert(columns_, i);
  117. end
  118.  
  119. for i in values:gmatch("%(([^%)]+)%)") do
  120. table.insert(values_, i);
  121. end
  122.  
  123. for j,v in pairs(columns_) do
  124. local cur = {};
  125. for i in values_[j]:gmatch("([^,]+)") do
  126. table.insert(cur, i);
  127. end
  128. table.insert(split_values, cur);
  129. end
  130.  
  131. values_ = split_values;
  132. table_data = self:read_table( table_name );
  133.  
  134. for i,v in pairs(columns_) do
  135. if(self:search_key_in_table( v, table_data )) then
  136. for j,k in pairs(values_[i]) do
  137. table.insert(table_data[v], k);
  138. end
  139. else
  140. self:log_("error with insert: " .. v);
  141. end
  142. end
  143.  
  144. self:edit_table( table_name, table_data, true );
  145. table.insert(return_array, true);
  146. end
  147. table.insert(return_array, false);
  148. elseif(SELECT) then
  149. local WHERE = curCommand:find("WHERE");
  150. local f, l = curCommand:find("SELECT");
  151. local f_, l_ = curCommand:find("FROM");
  152. local columns = curCommand:sub(l+1, f_-1);
  153. local columns_ = {};
  154. local table_data = {};
  155. local return_arr = {};
  156.  
  157. if(WHERE) then
  158. local f__, l__ = curCommand:find("WHERE");
  159. local filter = curCommand:sub(l__+1, -1);
  160. local f___, l___ = filter:find("=");
  161. local filter_col = filter:sub(1,f___-1);
  162. local filter_val = filter:sub(l___+1, -1);
  163. local filter_vals = {};
  164. local table_name = curCommand:sub(l_+1, f__-1);
  165.  
  166. if(self:table_exists( table_name )) then
  167. table_data = self:read_table( table_name );
  168. filter_val = filter_val:gsub("'", "");
  169.  
  170. for i in filter_val:gmatch("([^,]+)") do
  171. table.insert(filter_vals, i);
  172. end
  173.  
  174. if(self:search_val_in_table( filter_col, table_data )) then
  175. if(columns == "*") then
  176. for index, value in pairs(table_data) do
  177. local ret_vals = {};
  178. for index_, value_ in pairs(value) do
  179. if(self:search_val_in_val_table( table_data[filter_col][index_], filter_vals )) then
  180. table.insert(ret_vals, value_);
  181. end
  182. end
  183. return_arr[index] = ret_vals;
  184. end
  185. table.insert(return_array, return_arr);
  186. else
  187. for i in columns:gmatch("([^,]+)") do
  188. table.insert(columns_, i);
  189. end
  190.  
  191. for index, value in pairs(table_data) do
  192. local ret_vals = {};
  193. if(self:search_val_in_val_table( index, columns_ )) then
  194. for index_, value_ in pairs(value) do
  195. if(self:search_val_in_val_table( table_data[filter_col][index_], filter_vals )) then
  196. table.insert(ret_vals, value_);
  197. end
  198. end
  199. return_arr[index] = ret_vals;
  200. end
  201. end
  202. table.insert(return_array, return_arr);
  203. end
  204. else
  205. table.insert(return_array, false);
  206. end
  207. end
  208. else
  209. local table_name = curCommand:sub(l_+1, -1);
  210.  
  211. if(self:table_exists( table_name )) then
  212. table_data = self:read_table( table_name );
  213.  
  214. if(columns == "*") then
  215. table.insert(return_array, table_data);
  216. else
  217. for i in columns:gmatch("([^,]+)") do
  218. table.insert(columns_, i);
  219. end
  220.  
  221. for i,v in pairs(columns_) do
  222. if(self:search_val_in_table( v, table_data )) then
  223. return_arr[v] = table_data[v];
  224. end
  225. end
  226.  
  227. table.insert(return_array, return_arr);
  228. end
  229. end
  230. end
  231. elseif(DELETE) then
  232. local WHERE = curCommand:find("WHERE");
  233. local f, l = curCommand:find("DELETE");
  234. local f_, l_ = curCommand:find("FROM");
  235. local table_name = curCommand:sub(l_+1, -1);
  236. local table_data = {};
  237.  
  238. if(WHERE) then
  239. local f__, l__ = curCommand:find("WHERE");
  240. local AND = curCommand:find("AND");
  241. local filter = curCommand:sub(l__+1, -1);
  242. table_name = curCommand:sub(l_+1, f__-1);
  243. filter = filter:gsub("'", "");
  244.  
  245. if(AND) then
  246. -- AND noch Buggy, Funktion muss noch überarbeitet werden.
  247. local filter_vals = {};
  248. local to_delete = {};
  249. for _ in filter:gmatch("AND") do
  250. local _f,_l = filter:find("AND");
  251. local cur = filter:sub(1, _f-1);
  252. filter_vals[cur:sub(1,cur:find("=")-1)] = cur:sub(cur:find("=")+1,-1);
  253. filter = filter:sub(_l+1, -1);
  254. end
  255.  
  256. if(self:table_exists( table_name )) then
  257. table_data = self:read_table( table_name );
  258. local temp_table_data = table_data;
  259. for index, value in pairs(table_data) do
  260. for index_, value_ in pairs(value) do
  261. local filtered = false;
  262. for _i, _v in pairs(filter_vals) do
  263. if(self:search_val_in_val_table( table_data[_i][index_], filter_vals )) then
  264. filtered = true;
  265. else
  266. filtered = false;
  267. break;
  268. end
  269. end
  270.  
  271. if(filtered) then
  272. if( index == temp_table_data[1] ) then
  273. table.insert(to_delete,index_-#to_delete);
  274. end
  275. end
  276. end
  277. end
  278.  
  279. print(textutils.serialize(to_delete));
  280.  
  281. for _i, _v in pairs(temp_table_data) do
  282. for __i, __v in pairs(to_delete) do
  283. table.remove(temp_table_data[_i], __v);
  284. end
  285. end
  286.  
  287. self:edit_table( table_name, temp_table_data, true);
  288. table.insert(return_array, true);
  289. else
  290. table.insert(return_array, false);
  291. end
  292. else
  293. local f___, l___ = filter:find("=");
  294. local filter_col = filter:sub(1,f___-1);
  295. local filter_val = filter:sub(l___+1, -1);
  296. local to_delete = {};
  297.  
  298. if(self:table_exists( table_name )) then
  299. table_data = self:read_table( table_name );
  300. local temp_table_data = self:read_table( table_name );
  301. for index, value in pairs(table_data) do
  302. for index_, value_ in pairs(value) do
  303. if( table_data[filter_col][index_] == filter_val ) then
  304. if( index == filter_col ) then
  305. table.insert(to_delete,index_-#to_delete);
  306. end
  307. end
  308. end
  309. end
  310.  
  311. for _i, _v in pairs(temp_table_data) do
  312. for __i, __v in pairs(to_delete) do
  313. table.remove(temp_table_data[_i], __v);
  314. end
  315. end
  316.  
  317. self:edit_table( table_name, temp_table_data, true);
  318. table.insert(return_array, true);
  319. else
  320. table.insert(return_array, false);
  321. end
  322. end
  323. else
  324. local table_name = curCommand:sub(l_+1, -1);
  325.  
  326. self:edit_table( table_name, table_data, true);
  327. table.insert(return_array, true);
  328. end
  329. elseif(USE) then
  330. local f, l = curCommand:find("USE");
  331. local db = curCommand:sub(l+1, -1);
  332. if(fs.exists("databases/" .. db)) then
  333. self.used_db = db;
  334. table.insert(return_array, true);
  335. else
  336. table.insert(return_array, false);
  337. end
  338. else
  339. self:log_("unkonwn command");
  340. table.insert(return_array, false);
  341. end
  342. end
  343. if(#commands == 1) then
  344. return return_array[1];
  345. end
  346. return return_array;
  347. end
  348.  
  349. function database:table_exists( table_name )
  350. if(fs.exists("databases/" .. self.used_db .. "/" .. table_name) and self.used_db ~= "") then
  351. return true;
  352. end
  353. return false;
  354. end
  355.  
  356. function database:search_key_in_table( key, table_ )
  357. if(table_ ~= nil) then
  358. for i, v in pairs(table_) do
  359. if key == i then
  360. return true;
  361. end
  362. end
  363. end
  364. return false;
  365. end
  366.  
  367. function database:search_val_in_table( val, table_ )
  368. if(table_ ~= nil) then
  369. for i, v in pairs(table_) do
  370. if val == i then
  371. return true;
  372. end
  373. end
  374. end
  375. return false;
  376. end
  377.  
  378. function database:search_val_in_val_table( val, table_ )
  379. if(table_ ~= nil) then
  380. for i, v in pairs(table_) do
  381. if val == v then
  382. return true;
  383. end
  384. end
  385. end
  386. return false;
  387. end
  388.  
  389. function database:create_empty_config( )
  390. if(not fs.exists("databases/config.ccsql")) then
  391. config = fs.open("databases/config.ccsql", "w");
  392. config.write("{}");
  393. config.close();
  394. end
  395. end
  396.  
  397. function database:read_table( table_name )
  398. table_file = fs.open("databases/" .. self.used_db .. "/" .. table_name, "r");
  399. table_data = textutils.unserialize(table_file.readAll());
  400. table_file.close();
  401. return table_data;
  402. end
  403.  
  404. function database:edit_table( table_name, data, overwrite )
  405. if(not fs.exists("databases/" .. self.used_db .. "/" .. table_name) or overwrite) then
  406. table_file = fs.open("databases/" .. self.used_db .. "/" .. table_name, "w");
  407. table_file.write(textutils.serialize(data));
  408. table_file.close();
  409. else
  410. self:log_("table already exists");
  411. end
  412. end
  413.  
  414. function database:edit_config( table_name, data )
  415. config_file = fs.open("databases/config.ccsql", "r");
  416. config_data = config_file.readAll();
  417. config_data = textutils.unserialize(config_data);
  418. config_file.close();
  419.  
  420. config_data[table_name] = data[table_name];
  421.  
  422. config_file = fs.open("databases/config.ccsql", "w");
  423. config_file.write(textutils.serialize(config_data));
  424. config_file.close();
  425. end
  426.  
  427. function database:refresh_accesscode( )
  428. while (true) do
  429. local accesscode = "";
  430. local gen_number = 0;
  431. for i = 1,6 do
  432. gen_number = math.random(0,9);
  433. accesscode = accesscode .. tostring(gen_number);
  434. end
  435. self.db_accesscode = accesscode;
  436.  
  437. sleep(300);
  438. end
  439. end
Add Comment
Please, Sign In to add comment