GammixSAMP

g_vars.inc - By Gammix

Jun 2nd, 2015
407
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.45 KB | None | 0 0
  1. /*
  2. Gammix's Vars Include (g_vars.inc)
  3. * This is a type of new generation Database system!
  4. * No SQL knowledge required, its even more easier than INI files but fastes (SQLITE)
  5.  
  6. Author: (creator)
  7. * Gammix
  8.  
  9. (c) Copyright 2015
  10. * This file is provided as is (no warranties).
  11. */
  12.  
  13. /*
  14. FUNCTIONS:
  15. native Var_SetString(varname[], value[]);
  16. native Var_SetInt(varname[], value);
  17. native Var_SetFloat(varname[], Float:value);
  18. native Var_GetString(varname[], value[], len = sizeof(value));
  19. native Var_GetInt(varname[]);
  20. native Float:Var_GetFloat(varname[]);
  21. native Var_Delete(varname[]);
  22. */
  23.  
  24. #define DATABASE_NAME "g_vars.db"
  25. #define RECORD_NAME "GlobalVars"
  26. #define MAX_VAR_VALUE 128
  27.  
  28. #define TYPE_STRING 0
  29. #define TYPE_INTEGER 1
  30. #define TYPE_FLOAT 2
  31.  
  32. static DB:gDatabase;
  33. static DBResult:gResult;
  34. static bool:gActivated;
  35.  
  36. //Note: if you use this in a filterscript, please define "FILTERSCRIPT" in your script
  37. #if defined FILTERSCRIPT// if used in a filterscript
  38.  
  39. public OnFilterScriptInit()
  40. {
  41. gDatabase = db_open(DATABASE_NAME);
  42. gResult = db_query( gDatabase,
  43. "CREATE TABLE IF NOT EXISTS `"RECORD_NAME"` \
  44. (`name` VARCHAR(24) COLLATE NOCASE, \
  45. `value` VARCHAR("#MAX_VAR_VALUE"), \
  46. `type` INTEGER DEFAULT -1 NOT NULL)"
  47. );
  48. db_free_result(gResult);
  49.  
  50. if(gDatabase == DB:0)
  51. {
  52. printf("Failed to open a connection to \"%s\".", DATABASE_NAME);
  53. gActivated = false;
  54. }
  55. else gActivated = true;
  56.  
  57. return CallLocalFunction("VAR_OnFilterScriptInit", "");
  58. }
  59. #if defined _ALS_OnFilterScriptInit
  60. #undef OnFilterScriptInit
  61. #else
  62. #define _ALS_OnFilterScriptInit
  63. #endif
  64. #define OnFilterScriptInit VAR_OnFilterScriptInit
  65. forward VAR_OnFilterScriptInit();
  66.  
  67. public OnFilterScriptExit()
  68. {
  69. db_close(gDatabase);
  70.  
  71. return CallLocalFunction("VAR_OnFilterScriptExit", "");
  72. }
  73. #if defined _ALS_OnFilterScriptExit
  74. #undef OnFilterScriptExit
  75. #else
  76. #define _ALS_OnFilterScriptExit
  77. #endif
  78. #define OnFilterScriptExit VAR_OnFilterScriptExit
  79. forward VAR_OnFilterScriptExit();
  80.  
  81. #else// if used in a gamemode
  82.  
  83. public OnGameModeInit()
  84. {
  85. gDatabase = db_open(DATABASE_NAME);
  86. gResult = db_query( gDatabase,
  87. "CREATE TABLE IF NOT EXISTS `"RECORD_NAME"` \
  88. (`name` VARCHAR(24) COLLATE NOCASE, \
  89. `value` VARCHAR("#MAX_VAR_VALUE"), \
  90. `type` INTEGER DEFAULT 0 NOT NULL)"
  91. );
  92. db_free_result(gResult);
  93.  
  94. if(gDatabase == DB:0)
  95. {
  96. printf("Failed to open a connection to \"%s\".", DATABASE_NAME);
  97. gActivated = false;
  98. }
  99. else gActivated = true;
  100.  
  101. return CallLocalFunction("VAR_OnGameModeInit", "");
  102. }
  103. #if defined _ALS_OnGameModeInit
  104. #undef OnGameModeInit
  105. #else
  106. #define _ALS_OnGameModeInit
  107. #endif
  108. #define OnGameModeInit VAR_OnGameModeInit
  109. forward VAR_OnGameModeInit();
  110.  
  111. public OnGameModeExit()
  112. {
  113. db_close(gDatabase);
  114.  
  115. return CallLocalFunction("VAR_OnGameModeExit", "");
  116. }
  117. #if defined _ALS_OnGameModeExit
  118. #undef OnGameModeExit
  119. #else
  120. #define _ALS_OnGameModeExit
  121. #endif
  122. #define OnGameModeExit VAR_OnGameModeExit
  123. forward VAR_OnGameModeExit();
  124.  
  125. #endif
  126.  
  127.  
  128. //internal functions
  129. stock static Var_Escape(str[])
  130. {
  131. new
  132. ret[80* 2],
  133. ch,
  134. i,
  135. j;
  136. while ((ch = str[i++]) && j < sizeof (ret))
  137. {
  138. if (ch == '\'')
  139. {
  140. if (j < sizeof (ret) - 2)
  141. {
  142. ret[j++] = '\'';
  143. ret[j++] = '\'';
  144. }
  145. }
  146. else if (j < sizeof (ret))
  147. {
  148. ret[j++] = ch;
  149. }
  150. else
  151. {
  152. j++;
  153. }
  154. }
  155. ret[sizeof (ret) - 1] = '\0';
  156. return ret;
  157. }
  158.  
  159. stock static Var_IsValidName(varname[])
  160. {
  161. for(new i; varname[i] != EOS; ++i)
  162. {
  163. switch(varname[i])
  164. {
  165. case '0'..'9', 'A'..'Z', 'a'..'z', '@', '!', '$', '&', '*': continue;
  166. default: return false;
  167. }
  168. }
  169. return true;
  170. }
  171.  
  172. stock static Var_Set(varname[], value[], type)
  173. {
  174. new gQuery[256];
  175. format( gQuery,
  176. sizeof(gQuery),
  177. "SELECT `name` FROM `%s` WHERE `name` = '%s' COLLATE NOCASE",
  178. RECORD_NAME, Var_Escape(varname)
  179. );
  180. gResult = db_query(gDatabase, gQuery);
  181.  
  182. if(! db_num_rows(gResult))
  183. {
  184. format( gQuery,
  185. sizeof(gQuery),
  186. "INSERT INTO `%s` (`name`, `value`, `type`) VALUES ('%s', '%s', '%i')",
  187. RECORD_NAME, Var_Escape(varname), Var_Escape(value), type
  188. );
  189. gResult = db_query(gDatabase, gQuery);
  190.  
  191. if(db_num_rows(gResult))
  192. {
  193. db_free_result(gResult);
  194. return true;
  195. }
  196. }
  197. else
  198. {
  199. new _string[5];
  200. db_get_field_assoc(gResult, "type", _string, sizeof(_string));
  201.  
  202. new _type;
  203. _type = strval(_string);
  204.  
  205. if(_type == type)
  206. {
  207. format( gQuery,
  208. sizeof(gQuery),
  209. "UPDATE `%s` SET `value` = '%s' WHERE `name` = '%s'",
  210. RECORD_NAME, Var_Escape(value), Var_Escape(varname)
  211. );
  212. gResult = db_query(gDatabase, gQuery);
  213.  
  214. if(! db_num_rows(gResult))
  215. {
  216. db_free_result(gResult);
  217. return true;
  218. }
  219. }
  220. }
  221. db_free_result(gResult);
  222. return false;
  223. }
  224.  
  225. stock static Var_Get(varname[], value[], type, len = sizeof(value))
  226. {
  227. new gQuery[256];
  228. format( gQuery,
  229. sizeof(gQuery),
  230. "SELECT `name` FROM `%s` WHERE `name` = '%s' COLLATE NOCASE",
  231. RECORD_NAME, Var_Escape(varname)
  232. );
  233. gResult = db_query(gDatabase, gQuery);
  234.  
  235. if(! db_num_rows(gResult))
  236. {
  237. db_free_result(gResult);
  238.  
  239. format(value, len, "");
  240. return false;
  241. }
  242. else
  243. {
  244. new _string[5];
  245. db_get_field_assoc(gResult, "type", _string, sizeof(_string));
  246.  
  247. new _type;
  248. _type = strval(_string);
  249.  
  250. if(_type == type)
  251. {
  252. db_free_result(gResult);
  253.  
  254. format( gQuery,
  255. sizeof(gQuery),
  256. "SELECT `value` FROM `%s` WHERE `name` = '%s' COLLATE NOCASE",
  257. RECORD_NAME, Var_Escape(varname)
  258. );
  259. gResult = db_query(gDatabase, gQuery);
  260.  
  261. db_get_field_assoc(gResult, "value", value, len);
  262.  
  263. db_free_result(gResult);
  264. return true;
  265. }
  266. db_free_result(gResult);
  267. }
  268. return false;
  269. }
  270.  
  271. stock static Var_IsNumeric(str[])
  272. {
  273. new ch, i;
  274. while ((ch = str[i++])) if (!('0' <= ch <= '9')) return false;
  275. return true;
  276. }
  277.  
  278. stock static Var_IsFloat(str[])
  279. {
  280. new l = strlen(str);
  281. new dcount = 0;
  282. for(new i=0; i<l; i++)
  283. {
  284. if(str[i] == '.')
  285. {
  286. if(i == 0 || i == l-1) return false;
  287. else
  288. {
  289. dcount++;
  290. }
  291. }
  292. if((str[i] > '9' || str[i] < '0') && str[i] != '+' && str[i] != '-' && str[i] != '.') return false;
  293. if(str[i] == '+' || str[i] == '-')
  294. {
  295. if(i != 0 || l == 1) return false;
  296. }
  297. }
  298. if(dcount == 0 || dcount > 1) return false;
  299. return true;
  300. }
  301.  
  302. //main functions
  303. stock Var_SetString(varname[], value[])
  304. {
  305. if(! gActivated) return false;
  306.  
  307. if(strlen(value) > MAX_VAR_VALUE) return false;
  308.  
  309. if(! Var_IsValidName(varname)) return false;
  310.  
  311. return Var_Set(varname, value, TYPE_STRING);
  312. }
  313.  
  314. stock Var_SetInt(varname[], value)
  315. {
  316. if(! gActivated) return false;
  317.  
  318. if(value > MAX_VAR_VALUE) return false;
  319.  
  320. if(! Var_IsValidName(varname)) return false;
  321.  
  322. new gQuery[256];
  323. format(gQuery, sizeof(gQuery), "%i", value);
  324.  
  325. return Var_Set(varname, gQuery, TYPE_INTEGER);
  326. }
  327.  
  328. stock Var_SetFloat(varname[], Float:value)
  329. {
  330. if(! gActivated) return false;
  331.  
  332. if(value > float(MAX_VAR_VALUE)) return false;
  333.  
  334. if(! Var_IsValidName(varname)) return false;
  335.  
  336. new gQuery[256];
  337. format(gQuery, sizeof(gQuery), "%f", value);
  338.  
  339. return Var_Set(varname, gQuery, TYPE_FLOAT);
  340. }
  341.  
  342. stock Var_GetString(varname[], value[], len = sizeof(value))
  343. {
  344. if(! gActivated) return false;
  345.  
  346. if(! Var_IsValidName(varname)) return false;
  347.  
  348. return Var_Get(varname, value, TYPE_STRING, len);
  349. }
  350.  
  351. stock Var_GetInt(varname[])
  352. {
  353. if(! gActivated) return -1;
  354.  
  355. if(! Var_IsValidName(varname)) return -1;
  356.  
  357. new value[MAX_VAR_VALUE];
  358. Var_Get(varname, value, TYPE_INTEGER, sizeof(value));
  359.  
  360. if(Var_IsNumeric(value))
  361. {
  362. return strval(value);
  363. }
  364. return -1;
  365. }
  366.  
  367. stock Float:Var_GetFloat(varname[])
  368. {
  369. if(! gActivated) return -1000.0;
  370.  
  371. if(! Var_IsValidName(varname)) return -1000.0;
  372.  
  373. new value[MAX_VAR_VALUE];
  374. Var_Get(varname, value, TYPE_FLOAT, sizeof(value));
  375.  
  376. if(Var_IsFloat(value))
  377. {
  378. return floatstr(value);
  379. }
  380. return -1000.0;
  381. }
  382.  
  383. stock Var_Delete(varname[])
  384. {
  385. if(! Var_IsValidName(varname)) return false;
  386.  
  387. new gQuery[256];
  388. format( gQuery,
  389. sizeof(gQuery),
  390. "DELETE FROM `%s` WHERE `name` = '%s'",
  391. RECORD_NAME, Var_Escape(varname)
  392. );
  393. gResult = db_query(gDatabase, gQuery);
  394.  
  395. if(db_num_rows(gResult))
  396. {
  397. db_free_result(gResult);
  398. return true;
  399. }
  400. return false;
  401. }
  402. //
Advertisement
Add Comment
Please, Sign In to add comment