Advertisement
YiinY

inline for MySQL queries.

Feb 12th, 2013
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. stock CompressFormat(const data[])
  2. {
  3.     new
  4.         pos = 0,
  5.         total = 1;
  6.     for ( ; ; )
  7.     {
  8.         switch (data[pos++])
  9.         {
  10.             case '\0':
  11.             {
  12.                 break;
  13.             }
  14.             case 's':
  15.             {
  16.                 total <<= 1;
  17.             }
  18.             default:
  19.             {
  20.                 total = (total << 1) | 1;
  21.             }
  22.         }
  23.     }
  24.     return ~total;
  25. }
  26.  
  27. forward @queryCallback(e_CALLBACK_FLAGS:cF, cP, cX, Alloc:cA, Alloc:a);
  28. public @queryCallback(e_CALLBACK_FLAGS:cF, cP, cX, Alloc:cA, Alloc:a)
  29. {
  30.     new
  31.         ret[E_CALLBACK_DATA];
  32.     ret[E_CALLBACK_DATA_FLAGS] = cF;
  33.     ret[E_CALLBACK_DATA_POINTER] = cP;
  34.     ret[E_CALLBACK_DATA_FORMAT] = cX;
  35.     ret[E_CALLBACK_DATA_ALLOC] = cA;
  36.     Callback_Block(ret, Malloc_GetData(a, 2), Malloc_GetSlotSize(a) - 2);
  37.     free(cA);
  38.     free(a);
  39. }
  40.  
  41. stock send_query(connectionHandle, query[], bool:cache, callback:callback, const type[], GLOBAL_TAG_TYPES:...)
  42. {
  43.     new
  44.         ret[E_CALLBACK_DATA],
  45.         mem = CompressFormat(type);
  46.     if (!Callback_Get(callback, ret))
  47.     {
  48.         return 0;
  49.     }
  50.     if (!(ret[E_CALLBACK_DATA_FLAGS] & e_CALLBACK_FLAGS_PUBLIC) && mem != ret[E_CALLBACK_DATA_FORMAT])
  51.     {
  52.         P:E("Blogai nurodytas kintamojo formatas inline funkcijoje %s: %04x%04x != %04x%04x", callback, mem >>> 16, mem & 0xFFFF, ret[E_CALLBACK_DATA_FORMAT] >>> 16, ret[E_CALLBACK_DATA_FORMAT] & 0xFFFF);
  53.         Callback_Release(ret);
  54.         return 0;
  55.     }
  56.     mem = 2;
  57.     for (new i = 0; ; ++i)
  58.     {
  59.         switch (type[i])
  60.         {
  61.             case '\0':
  62.             {
  63.                 break;
  64.             }
  65.             case 's':
  66.             {
  67.                 mem += YSI_MAX_STRING;
  68.             }
  69.             case 'a':
  70.             {
  71.                 P:E("y_inline nepalaiko masyvų");
  72.                 return 0;
  73.             }
  74.             default:
  75.             {
  76.                 ++mem;
  77.             }
  78.         }
  79.     }
  80.     new
  81.         Alloc:a = malloc(mem);
  82.     if (a == NO_ALLOC)
  83.     {
  84.         Callback_Release(ret);
  85.         return 0;
  86.     }
  87.     for (new i = 0, j = 4; ; ++i, ++j)
  88.     {
  89.         switch (type[i])
  90.         {
  91.             case '\0':
  92.             {
  93.                 break;
  94.             }
  95.             case 's':
  96.             {
  97.                 mem -= YSI_MAX_STRING;
  98.                 Malloc_SetVAS(a, mem, j);
  99.             }
  100.             default:
  101.             {
  102.                 --mem;
  103.                 Malloc_Set(a, mem, getarg(j));
  104.             }
  105.         }
  106.     }
  107.     Malloc_Set(a, 1, _:ret[E_CALLBACK_DATA_ALLOC]);
  108.     Malloc_Set(a, 0, mysql_function_query(connectionHandle, query, cache, "@queryCallback", "iiiii", _:ret[E_CALLBACK_DATA_FLAGS], ret[E_CALLBACK_DATA_POINTER], ret[E_CALLBACK_DATA_FORMAT], _:ret[E_CALLBACK_DATA_ALLOC], _:a));
  109.     return 1;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement