Advertisement
Eduardo_AC

Easy SQLite [e_db.inc]

Jun 28th, 2023 (edited)
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 13.63 KB | Gaming | 0 0
  1.  
  2. #if !defined MAX_DB_HANDLE
  3.     #define MAX_DB_HANDLE                   10
  4. #endif
  5. #define MAX_QUERY_STRING                    3072
  6. #define MAX_WHERE_STRING                    128
  7. #define MAX_TABLE_NAME                      50
  8. #define MAX_COLUMN_NAME                     50
  9. #define MAX_COLUMN_VALUE_STRING             256
  10. #define MAX_COLUMN_VALUE_INT                20
  11. #define MAX_COLUMN_VALUE_FLOAT              128
  12. #define INVALID_DB_HANDLE                   -1
  13.  
  14. enum E_DB_HANDLE_DATA
  15. {
  16.     _Table[MAX_TABLE_NAME],
  17.     _Where[MAX_WHERE_STRING],
  18.     _Value1[MAX_QUERY_STRING],
  19.     _Value2[MAX_QUERY_STRING],
  20.     _Query[MAX_QUERY_STRING],
  21.     _Elapsed
  22. }
  23. static __QueryData[MAX_DB_HANDLE][E_DB_HANDLE_DATA];
  24.  
  25. static DB:__dbHandle[MAX_DB_HANDLE] = {DB:INVALID_DB_HANDLE, ...};
  26.  
  27. forward OnDbExecuteQuery(DB:handle, sql[], bool:error, elapsed);
  28.  
  29. stock DBResult:hook_db_query(DB:db, const query[], bool:use_result)
  30. {
  31.     new tick = GetTickCount();
  32.    
  33.     new DBResult:result = db_query(db, query);
  34.     if(!use_result)
  35.         db_free_result(result);
  36.    
  37.     CallLocalFunction("OnDbExecuteQuery", "isbi", _:db, query, (result < DBResult:1), (GetTickCount() - tick));
  38.     return result;
  39. }
  40. #if defined _ALS_db_query
  41.     #undef db_query
  42. #else
  43.     #define _ALS_db_query
  44. #endif
  45. #define db_query hook_db_query
  46.  
  47. // --- COMMAND HANDLER ---
  48.  
  49. stock db_query_handle(DB:handle, bool:force_handle = true)
  50. {
  51.     new idx = GetFreeDbHandleSlot();
  52.     if(force_handle)
  53.     {
  54.         new bool:wait_handle = false;
  55.         new wait_handle_tick = GetTickCount();
  56.         while(idx == -1)
  57.         {
  58.             wait_handle = true;
  59.             idx = GetFreeDbHandleSlot();
  60.         }
  61.        
  62.         if(wait_handle)
  63.             printf("\n\n[E_DB WARN] Waiting for create new db handle (%ims)\n\n", GetTickCount() - wait_handle_tick);
  64.     }
  65.    
  66.     if(idx == -1)
  67.     {
  68.         print("\n\n[E_DB ERROR] Error to create new db handle (%ims)\n\n");
  69.         return INVALID_DB_HANDLE;
  70.     }
  71.    
  72.     __dbHandle[idx] = handle;
  73.     __QueryData[idx][_Elapsed] = GetTickCount();
  74.     return idx;
  75. }
  76.  
  77. // --- TABLE CREATE ---
  78.  
  79. stock db_create_table(handle, const name[])
  80. {
  81.     if(!IsValidDbHandle(handle) || !strlen(name))
  82.     {
  83.         ClearCashHandle(handle);
  84.         return false;
  85.     }
  86.    
  87.     strcat(__QueryData[handle][_Value1], "CREATE TABLE IF NOT EXISTS ");
  88.     strcat(__QueryData[handle][_Value1], name);
  89.     return true;
  90. }
  91.  
  92. stock db_add_column(handle, const name[], const datatype[])
  93. {
  94.     if(!IsValidDbHandle(handle) || !strlen(name) || !strlen(datatype))
  95.     {
  96.         ClearCashHandle(handle);
  97.         return false;
  98.     }
  99.    
  100.     strcat(__QueryData[handle][_Value2], name);
  101.     strcat(__QueryData[handle][_Value2], " ");
  102.     strcat(__QueryData[handle][_Value2], datatype);
  103.     strcat(__QueryData[handle][_Value2], ",");
  104.     return true;
  105. }
  106.  
  107. stock DBResult:db_execute_create_table(handle, bool:use_result = false, bool:debug_query = false)
  108. {
  109.     if(!IsValidDbHandle(handle) || !strlen(__QueryData[handle][_Value1]) || !strlen(__QueryData[handle][_Value2]))
  110.     {
  111.         ClearCashHandle(handle);
  112.         return DBResult:0;
  113.     }
  114.    
  115.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Value1]);
  116.     strcat(__QueryData[handle][_Query], " (");
  117.     strdel(__QueryData[handle][_Value2], strlen(__QueryData[handle][_Value2]) - 1, strlen(__QueryData[handle][_Value2]));
  118.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Value2]);
  119.     strcat(__QueryData[handle][_Query], ");");
  120.    
  121.     new DBResult:result = db_query(__dbHandle[handle], __QueryData[handle][_Query], use_result);
  122.     if(!use_result)
  123.         db_free_result(result);
  124.    
  125.     if(debug_query)
  126.         printf(__QueryData[handle][_Query]);
  127.    
  128.     ClearCashHandle(handle);
  129.     return result;
  130. }
  131.  
  132. // --- TABLE DEFINE ---
  133.  
  134. stock db_set_table(handle, const table[], bool:use_backticks = true)
  135. {
  136.     if(!IsValidDbHandle(handle) || !strlen(table))
  137.     {
  138.         ClearCashHandle(handle);
  139.         return false;
  140.     }
  141.    
  142.     __QueryData[handle][_Table][0] = '\0';
  143.     if(use_backticks)
  144.         strcat(__QueryData[handle][_Table], "`");
  145.     strcat(__QueryData[handle][_Table], table);
  146.     if(use_backticks)
  147.         strcat(__QueryData[handle][_Table], "`");
  148.     return true;
  149. }
  150.  
  151. // --- WHERE CLAUSE ---
  152.  
  153. #pragma unused __temp@WhereClause
  154.  
  155. new __temp@WhereClause[MAX_WHERE_STRING];
  156. #define db_set_where_clause_ex(%0,%1,%2)\
  157.     format(__temp@WhereClause, sizeof __temp@WhereClause, %1, %2),\
  158.     db_set_where_clause(%0, __temp@WhereClause)
  159.  
  160. stock db_set_where_clause(handle, const where[])
  161. {
  162.     if(__dbHandle[handle] == DB:INVALID_DB_HANDLE || !strlen(where))
  163.     {
  164.         ClearCashHandle(handle);
  165.         return false;
  166.     }
  167.    
  168.     strcat(__QueryData[handle][_Where], where);
  169.     return true;
  170. }
  171.  
  172. // --- DELETE COMMAND ---
  173.  
  174. stock DBResult:db_execute_delete(handle, bool:use_result = false, bool:debug_query = false)
  175. {
  176.     if(!IsValidDbHandle(handle) || !strlen(__QueryData[handle][_Table]))
  177.     {
  178.         ClearCashHandle(handle);
  179.         return DBResult:0;
  180.     }
  181.    
  182.     strcat(__QueryData[handle][_Query], "DELETE FROM ");
  183.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Table]);
  184.     if(__QueryData[handle][_Where][0] != '\0')
  185.     {
  186.         strcat(__QueryData[handle][_Query], " WHERE ");
  187.         strcat(__QueryData[handle][_Query], __QueryData[handle][_Where]);
  188.     }
  189.     strcat(__QueryData[handle][_Query], ";");
  190.    
  191.     new DBResult:result = db_query(__dbHandle[handle], __QueryData[handle][_Query], use_result);
  192.    
  193.     if(debug_query)
  194.         printf(__QueryData[handle][_Query]);
  195.    
  196.     if(!use_result)
  197.         db_free_result(result);
  198.     ClearCashHandle(handle);
  199.     return result;
  200. }
  201.  
  202. // --- SELECT COMMAND ---
  203.  
  204. stock db_add_select(handle, const column[], const as[] = "", bool:use_backticks = true)
  205. {
  206.     if(!IsValidDbHandle(handle) || !strlen(column))
  207.     {
  208.         ClearCashHandle(handle);
  209.         return false;
  210.     }
  211.    
  212.     if(use_backticks)
  213.         strcat(__QueryData[handle][_Value1], "`");
  214.     strcat(__QueryData[handle][_Value1], column);
  215.     if(use_backticks)
  216.         strcat(__QueryData[handle][_Value1], "`");
  217.    
  218.     if(as[0] != '\0')
  219.     {
  220.         strcat(__QueryData[handle][_Value1], " AS ");
  221.         strcat(__QueryData[handle][_Value1], "`");
  222.         strcat(__QueryData[handle][_Value1], as);
  223.         strcat(__QueryData[handle][_Value1], "`");
  224.     }
  225.     strcat(__QueryData[handle][_Value1], ",");
  226.     return true;
  227. }
  228.  
  229. stock DBResult:db_execute_select(handle, bool:use_result = false, bool:debug_query = false)
  230. {
  231.     if(!IsValidDbHandle(handle) || !strlen(__QueryData[handle][_Value1]) || !strlen(__QueryData[handle][_Table]))
  232.     {
  233.         ClearCashHandle(handle);
  234.         return DBResult:0;
  235.     }
  236.    
  237.     strdel(__QueryData[handle][_Value1], strlen(__QueryData[handle][_Value1]) - 1, strlen(__QueryData[handle][_Value1]));
  238.    
  239.     strcat(__QueryData[handle][_Query], "SELECT ");
  240.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Value1]);
  241.     strcat(__QueryData[handle][_Query], " FROM ");
  242.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Table]);
  243.     if(__QueryData[handle][_Where][0] != '\0')
  244.     {
  245.         strcat(__QueryData[handle][_Query], " WHERE ");
  246.         strcat(__QueryData[handle][_Query], __QueryData[handle][_Where]);
  247.     }
  248.     strcat(__QueryData[handle][_Query], ";");
  249.    
  250.     new DBResult:result = db_query(__dbHandle[handle], __QueryData[handle][_Query], use_result);
  251.     if(!use_result)
  252.         db_free_result(result);
  253.    
  254.     if(debug_query)
  255.         printf(__QueryData[handle][_Query]);
  256.    
  257.     ClearCashHandle(handle);
  258.     return result;
  259. }
  260.  
  261. // --- UPDATE COMMAND ---
  262.  
  263. stock db_update_string(handle, const column[], const value[], bool:use_backticks = true)
  264. {
  265.     if(!IsValidDbHandle(handle) || !strlen(column))
  266.     {
  267.         ClearCashHandle(handle);
  268.         return false;
  269.     }
  270.    
  271.     if(use_backticks)
  272.         strcat(__QueryData[handle][_Value1], "`");
  273.     strcat(__QueryData[handle][_Value1], column);
  274.     if(use_backticks)
  275.         strcat(__QueryData[handle][_Value1], "`");
  276.     strcat(__QueryData[handle][_Value1], "=");
  277.     strcat(__QueryData[handle][_Value1], "'");
  278.     strcat(__QueryData[handle][_Value1], value);
  279.     strcat(__QueryData[handle][_Value1], "'");
  280.     strcat(__QueryData[handle][_Value1], ",");
  281.     return true;
  282. }
  283.  
  284. stock db_update_int(handle, const column[], value, bool:use_backticks = true)
  285. {
  286.     if(!IsValidDbHandle(handle) || !strlen(column))
  287.     {
  288.         ClearCashHandle(handle);
  289.         return false;
  290.     }
  291.    
  292.     new valueStr[MAX_COLUMN_VALUE_INT];
  293.     valstr(valueStr, value);
  294.    
  295.     if(use_backticks)
  296.         strcat(__QueryData[handle][_Value1], "`");
  297.     strcat(__QueryData[handle][_Value1], column);
  298.     if(use_backticks)
  299.         strcat(__QueryData[handle][_Value1], "`");
  300.     strcat(__QueryData[handle][_Value1], "=");
  301.     strcat(__QueryData[handle][_Value1], valueStr);
  302.     strcat(__QueryData[handle][_Value1], ",");
  303.     return true;
  304. }
  305.  
  306. stock db_update_float(handle, const column[], Float:value, bool:use_backticks = true)
  307. {
  308.     if(!IsValidDbHandle(handle) || !strlen(column))
  309.     {
  310.         ClearCashHandle(handle);
  311.         return false;
  312.     }
  313.    
  314.     new valueStr[MAX_COLUMN_VALUE_FLOAT];
  315.     format(valueStr, sizeof valueStr, "%f", value);
  316.    
  317.     if(use_backticks)
  318.         strcat(__QueryData[handle][_Value1], "`");
  319.     strcat(__QueryData[handle][_Value1], column);
  320.     if(use_backticks)
  321.         strcat(__QueryData[handle][_Value1], "`");
  322.     strcat(__QueryData[handle][_Value1], "=");
  323.     strcat(__QueryData[handle][_Value1], valueStr);
  324.     strcat(__QueryData[handle][_Value1], ",");
  325.     return true;
  326. }
  327.  
  328. stock DBResult:db_execute_update(handle, bool:use_result = false, bool:debug_query = false)
  329. {
  330.     if(!IsValidDbHandle(handle) || !strlen(__QueryData[handle][_Value1]) || !strlen(__QueryData[handle][_Table]))
  331.     {
  332.         ClearCashHandle(handle);
  333.         return DBResult:0;
  334.     }
  335.    
  336.     strdel(__QueryData[handle][_Value1], strlen(__QueryData[handle][_Value1]) - 1, strlen(__QueryData[handle][_Value1]));
  337.    
  338.     strcat(__QueryData[handle][_Query], "UPDATE ");
  339.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Table]);
  340.     strcat(__QueryData[handle][_Query], " SET ");
  341.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Value1]);
  342.     if(__QueryData[handle][_Where][0] != '\0')
  343.     {
  344.         strcat(__QueryData[handle][_Query], " WHERE ");
  345.         strcat(__QueryData[handle][_Query], __QueryData[handle][_Where]);
  346.     }
  347.     strcat(__QueryData[handle][_Query], ";");
  348.    
  349.     new DBResult:result = db_query(__dbHandle[handle], __QueryData[handle][_Query], use_result);
  350.     if(!use_result)
  351.         db_free_result(result);
  352.    
  353.     if(debug_query)
  354.         printf(__QueryData[handle][_Query]);
  355.    
  356.     ClearCashHandle(handle);
  357.     return result;
  358. }
  359.  
  360. // --- INSERT COMMAND ---
  361.  
  362. stock db_insert_string(handle, const column[], const value[], bool:use_backticks = true)
  363. {
  364.     if(!IsValidDbHandle(handle) || !strlen(column))
  365.     {
  366.         ClearCashHandle(handle);
  367.         return false;
  368.     }
  369.    
  370.     if(use_backticks)
  371.         strcat(__QueryData[handle][_Value1], "`");
  372.     strcat(__QueryData[handle][_Value1], column);
  373.     if(use_backticks)
  374.         strcat(__QueryData[handle][_Value1], "`");
  375.     strcat(__QueryData[handle][_Value1], ",");
  376.     strcat(__QueryData[handle][_Value2], "'");
  377.     strcat(__QueryData[handle][_Value2], value);
  378.     strcat(__QueryData[handle][_Value2], "'");
  379.     strcat(__QueryData[handle][_Value2], ",");
  380.     return true;
  381. }
  382.  
  383. stock db_insert_int(handle, const column[], value, bool:use_backticks = true)
  384. {
  385.     if(!IsValidDbHandle(handle) || !strlen(column))
  386.     {
  387.         ClearCashHandle(handle);
  388.         return false;
  389.     }
  390.    
  391.     new valueStr[MAX_COLUMN_VALUE_INT];
  392.     valstr(valueStr, value);
  393.    
  394.     if(use_backticks)
  395.         strcat(__QueryData[handle][_Value1], "`");
  396.     strcat(__QueryData[handle][_Value1], column);
  397.     if(use_backticks)
  398.         strcat(__QueryData[handle][_Value1], "`");
  399.     strcat(__QueryData[handle][_Value1], ",");
  400.     strcat(__QueryData[handle][_Value2], valueStr);
  401.     strcat(__QueryData[handle][_Value2], ",");
  402.     return true;
  403. }
  404.  
  405. stock db_insert_float(handle, const column[], Float:value, bool:use_backticks = true)
  406. {
  407.     if(!IsValidDbHandle(handle) || !strlen(column))
  408.     {
  409.         ClearCashHandle(handle);
  410.         return false;
  411.     }
  412.    
  413.     new valueStr[MAX_COLUMN_VALUE_FLOAT];
  414.     format(valueStr, sizeof valueStr, "%f", value);
  415.    
  416.     if(use_backticks)
  417.         strcat(__QueryData[handle][_Value1], "`");
  418.     strcat(__QueryData[handle][_Value1], column);
  419.     if(use_backticks)
  420.         strcat(__QueryData[handle][_Value1], "`");
  421.     strcat(__QueryData[handle][_Value1], ",");
  422.     strcat(__QueryData[handle][_Value2], valueStr);
  423.     strcat(__QueryData[handle][_Value2], ",");
  424.     return true;
  425. }
  426.  
  427. stock DBResult:db_execute_insert(handle, bool:use_result = false, bool:debug_query = false)
  428. {
  429.     if(!IsValidDbHandle(handle) || !strlen(__QueryData[handle][_Value1]) || !strlen(__QueryData[handle][_Value2]) || !strlen(__QueryData[handle][_Table]))
  430.     {
  431.         ClearCashHandle(handle);
  432.         return DBResult:0;
  433.     }
  434.    
  435.     strdel(__QueryData[handle][_Value1], strlen(__QueryData[handle][_Value1]) - 1, strlen(__QueryData[handle][_Value1]));
  436.     strdel(__QueryData[handle][_Value2], strlen(__QueryData[handle][_Value2]) - 1, strlen(__QueryData[handle][_Value2]));
  437.    
  438.     strcat(__QueryData[handle][_Query], "INSERT INTO ");
  439.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Table]);
  440.     strcat(__QueryData[handle][_Query], " (");
  441.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Value1]);
  442.     strcat(__QueryData[handle][_Query], ") ");
  443.     strcat(__QueryData[handle][_Query], "VALUES");
  444.     strcat(__QueryData[handle][_Query], " (");
  445.     strcat(__QueryData[handle][_Query], __QueryData[handle][_Value2]);
  446.     strcat(__QueryData[handle][_Query], ");");
  447.    
  448.     new DBResult:result = db_query(__dbHandle[handle], __QueryData[handle][_Query], use_result);
  449.     if(!use_result)
  450.         db_free_result(result);
  451.    
  452.     if(debug_query)
  453.         printf(__QueryData[handle][_Query]);
  454.    
  455.     ClearCashHandle(handle);
  456.     return result;
  457. }
  458.  
  459. stock IsValidDbHandle(handle)
  460. {
  461.     if(handle < 0 || handle >= MAX_DB_HANDLE)
  462.         return false;
  463.    
  464.     if(__dbHandle[handle] == DB:INVALID_DB_HANDLE)
  465.         return false;
  466.     return true;
  467. }
  468.  
  469. // --- INTERNAL ---
  470.  
  471. static stock ClearCashHandle(handle)
  472. {
  473.     if(!IsValidDbHandle(handle))
  474.         return false;
  475.    
  476.     __QueryData[handle][_Table][0] = '\0';
  477.     __QueryData[handle][_Value1][0] = '\0';
  478.     __QueryData[handle][_Value2][0] = '\0';
  479.     __QueryData[handle][_Query][0] = '\0';
  480.     __QueryData[handle][_Where][0] = '\0';
  481.     __QueryData[handle][_Elapsed] = 0;
  482.     __dbHandle[handle] = DB:INVALID_DB_HANDLE;
  483.     return true;
  484. }
  485.  
  486. static stock GetFreeDbHandleSlot()
  487. {
  488.     for(new i = 0; i < MAX_DB_HANDLE; i ++)
  489.     {
  490.         if(__dbHandle[i] == DB:-1)
  491.             return i;
  492.     }
  493.     return INVALID_DB_HANDLE;
  494. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement