Advertisement
Guest User

infinite.inc

a guest
Aug 17th, 2014
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* infinite.inc
  2. **  Erweitert SA:MP um unendlich viele unendlich große Arrays.
  3. **  Copyright (c) tionsys.de
  4. */
  5.  
  6. #include <a_samp>
  7.  
  8. static DB:inf_database;
  9. static database_count = 0; // AUTOINCREMENT scheint nicht zu funktionieren ._.
  10.  
  11. public OnGameModeInit() {
  12.     inf_initDatabase();
  13.  
  14.     return CallLocalFunction("inf_OnGameModeInit", "");
  15. }
  16.  
  17. public OnFilterScriptInit() {
  18.     inf_initDatabase();
  19.  
  20.     return CallLocalFunction("inf_OnFilterScriptInit", "");
  21. }
  22.  
  23. stock inf_initDatabase() {
  24.     // Datenbank bei jedem Start löschen und neu initialisieren
  25.     if(fexist("infinite_arrays.db"))
  26.         fremove("infinite_arrays.db");
  27.     inf_database = db_open("infinite_arrays.db");
  28.     db_query(inf_database, "CREATE TABLE array_vars (id integer, array_name TEXT, array_value TEXT);");
  29. }
  30.  
  31. forward ArrayPushString(array[], value[]);
  32. public ArrayPushString(array[], value[]) {
  33.     if(strlen(array) == 0 || strlen(array) >= 32) {
  34.         printf("<=[ Infinite Array ]=>\nFehler - der Array-Name darf nicht länger als 32 Zeichen sein.\nAktuell: \"%s\" (Zeichen: %d)", array, strlen(array));
  35.         return false;
  36.     }
  37.     if(strlen(value) == 0 || strlen(value) >= 128) {
  38.         printf("<=[ Infinite Array ]=>\nFehler - der Array-Wert darf nicht länger als 128 Zeichen sein.\nAktuell: \"%s\" (Zeichen: %d)", value, strlen(value));
  39.         return false;
  40.     }
  41.     // v 80 = "Grundgerüst", 258 = 2*128 (worst case: value ist 32 mal "'", wird also zu 32 mal "\'"), 64 = 2*array
  42.     new query[80 + 256 + 64];
  43.     format(query, sizeof(query), "INSERT INTO array_vars (id, array_name, array_value) VALUES (%d, '%s', '%s');", database_count++, inf_arr_escape(array), inf_arr_escape(value));
  44.     db_query(inf_database, query);
  45.     return true;
  46. }
  47.  
  48. forward ArrayPushInteger(array[], value);
  49. public ArrayPushInteger(array[], value) {
  50.     new str[128];
  51.     valstr(str, value);
  52.     ArrayPushString(array, str);
  53. }
  54.  
  55. forward ArrayPushFloat(array[], Float:value);
  56. public ArrayPushFloat(array[], Float:value) {
  57.     new str[128];
  58.     format(str, 128, "%f", value);
  59.     ArrayPushString(array, str);
  60. }
  61.  
  62. forward ArrayLength(array[]);
  63. public ArrayLength(array[]) {
  64.     if(strlen(array) == 0 || strlen(array) >= 32) {
  65.         printf("<=[ Infinite Array ]=>\nFehler - der Array-Name darf nicht länger als 32 Zeichen sein.\nAktuell: \"%s\" (Zeichen: %d)", array, strlen(array));
  66.         return false;
  67.     }
  68.     // v 60 = "Grundgerüst", 64 = 2*array
  69.     new query[60 + 64];
  70.     format(query, sizeof(query), "SELECT COUNT(id) FROM array_vars WHERE array_name = '%s';", inf_arr_escape(array));
  71.     new DBResult:res = db_query(inf_database, query);
  72.     db_get_field(res, 0, query, sizeof(query));
  73.     db_free_result(res);
  74.     return strval(query);
  75. }
  76.  
  77. forward ArrayPullString(array[], index, value[]);
  78. public ArrayPullString(array[], index, value[]) {
  79.     if(strlen(array) == 0 || strlen(array) >= 32) {
  80.         printf("<=[ Infinite Array ]=>\nFehler - der Array-Name darf nicht länger als 32 Zeichen sein.\nAktuell: \"%s\" (Zeichen: %d)", array, strlen(array));
  81.         return false;
  82.     }
  83.     new query[98 + 256 + 64];
  84.     format(query, sizeof(query), "SELECT array_value FROM array_vars WHERE array_name = '%s' ORDER BY id ASC LIMIT %d,1;", inf_arr_escape(array), index);
  85.     new DBResult:res = db_query(inf_database, query);
  86.  
  87.     if(db_num_rows(res) >= 1) {
  88.         db_get_field(res, 0, value, 128);
  89.     }
  90.  
  91.     db_free_result(res);
  92.     return db_num_rows(res) >= 1;
  93. }
  94.  
  95. forward ArrayPullInteger(array[], index);
  96. public ArrayPullInteger(array[], index) {
  97.     new str[128];
  98.     ArrayPullString(array, index, str);
  99.     return strval(str);
  100. }
  101.  
  102. forward Float:ArrayPullFloat(array[], index);
  103. public Float:ArrayPullFloat(array[], index) {
  104.     new str[128];
  105.     ArrayPullString(array, index, str);
  106.     return floatstr(str);
  107. }
  108.  
  109. forward ArrayUpdateString(array[], index, value[]);
  110. public ArrayUpdateString(array[], index, value[]) {
  111.     if(strlen(array) == 0 || strlen(array) >= 32) {
  112.         printf("<=[ Infinite Array ]=>\nFehler - der Array-Name darf nicht länger als 32 Zeichen sein.\nAktuell: \"%s\" (Zeichen: %d)", array, strlen(array));
  113.         return false;
  114.     }
  115.     if(strlen(value) == 0 || strlen(value) >= 128) {
  116.         printf("<=[ Infinite Array ]=>\nFehler - der Array-Wert darf nicht länger als 128 Zeichen sein.\nAktuell: \"%s\" (Zeichen: %d)", array, strlen(value));
  117.         return false;
  118.     }
  119.     if(ArrayLength(array) >= index) {
  120.         printf("<=[ Infinite Array ]=>\nFehler - versuche Wert %d von Array '%s' zu ändern.\nDas Array hat nicht so viele Elemente", index, array);
  121.         return false;
  122.     }
  123.     // v 80 = "Grundgerüst", 258 = 2*128 (worst case: value ist 32 mal "'", wird also zu 32 mal "\'"), 64 = 2*array
  124.     new query[124 + 64 + 256];
  125.     format(query, sizeof(query), "UPDATE array_vars SET value = '%s' WHERE id IN (SELECT id FROM array_vars WHERE array_name = '%s' ORDER BY id ASC LIMIT %d,1)", inf_arr_escape(value), inf_arr_escape(array), index);
  126.     db_query(inf_database, query);
  127.     return true;
  128. }
  129.  
  130. forward ArrayUpdateInteger(array[], index, value);
  131. public ArrayUpdateInteger(array[], index, value) {
  132.     new str[128];
  133.     valstr(str, value);
  134.     return ArrayUpdateString(array, index, str);
  135. }
  136.  
  137. forward ArrayUpdateFloat(array[], index, Float:value);
  138. public ArrayUpdateFloat(array[], index, Float:value) {
  139.     new str[128];
  140.     format(str, 128, "%f", value);
  141.     return ArrayUpdateString(array, index, str);
  142. }
  143.  
  144. forward ArrayDeleteIndex(array[], index);
  145. public ArrayDeleteIndex(array[], index) {
  146.     if(strlen(array) == 0 || strlen(array) >= 32) {
  147.         printf("<=[ Infinite Array ]=>\nFehler - der Array-Name darf nicht länger als 32 Zeichen sein.\nAktuell: \"%s\" (Zeichen: %d)", array, strlen(array));
  148.         return false;
  149.     }
  150.     // v 80 = "Grundgerüst", 258 = 2*128 (worst case: value ist 32 mal "'", wird also zu 32 mal "\'"), 64 = 2*array
  151.     new query[113 + 64];
  152.     format(query, sizeof(query), "DELETE FROM array_vars WHERE id IN (SELECT id FROM array_vars WHERE array_name = '%s' ORDER BY id ASC LIMIT %d,1)", inf_arr_escape(array), index);
  153.     db_query(inf_database, query);
  154.     return true;
  155. }
  156.  
  157. stock inf_arr_escape(str[]) {
  158.     new copy[128];
  159.     format(copy, 128, str);
  160.     str_replace("\\", "\\\\", copy);
  161.     str_replace("\"", "\\\"", copy);
  162.     return copy;
  163. }
  164.  
  165. // Source: http://pastebin.com/bZsxHdK0 (Google result. No author found ._.)
  166. stock str_replace(const needle[], const replace[], haystack[], bool:ignorecase = true, needlen = sizeof(needle), haylen = sizeof(haystack)) {
  167.     new count, index = strfind(haystack, needle, ignorecase);
  168.     while(index != -1) {
  169.         strdel(haystack, index, index + (needlen - 1));
  170.         strins(haystack, replace, index, haylen);
  171.         index = strfind(haystack, needle, ignorecase);
  172.         count++;
  173.     }
  174.     return count;
  175. }
  176.  
  177. forward inf_OnGameModeInit();
  178. #if defined _ALS_OnGameModeInit
  179.     #undef OnGameModeInit
  180. #else
  181.     #define _ALS_OnGameModeInit
  182. #endif
  183. #define OnGameModeInit inf_OnGameModeInit
  184.  
  185. forward inf_OnFilterScriptInit();
  186. #if defined _ALS_OnFilterScriptInit
  187.     #undef OnFilterScriptInit
  188. #else
  189.     #define _ALS_OnFilterScriptInit
  190. #endif
  191. #define OnFilterscriptInit inf_OnFilterScriptInit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement