Spring Cleaning, Part Ichi (1)
Various minor things done to project files Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way) Updated regex project file and makefile --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401971
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
#include <sourcemod>
|
||||
#include <profiler>
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "Benchmarks",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Basic benchmarks",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
#define MATH_INT_LOOPS 2000
|
||||
#define MATH_FLOAT_LOOPS 2000
|
||||
#define STRING_OP_LOOPS 2000
|
||||
#define STRING_FMT_LOOPS 2000
|
||||
#define STRING_ML_LOOPS 2000
|
||||
#define STRING_RPLC_LOOPS 2000
|
||||
|
||||
new Float:g_dict_time
|
||||
new Handle:g_Prof = INVALID_HANDLE
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
RegServerCmd("bench", Benchmark);
|
||||
g_Prof = CreateProfiler();
|
||||
StartProfiling(g_Prof);
|
||||
LoadTranslations("fakedict-sourcemod.cfg");
|
||||
StopProfiling(g_Prof);
|
||||
g_dict_time = GetProfilerTime(g_Prof);
|
||||
}
|
||||
|
||||
public Action:Benchmark(args)
|
||||
{
|
||||
PrintToServer("dictionary time: %f seconds", g_dict_time);
|
||||
StringBench();
|
||||
MathBench();
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
MathBench()
|
||||
{
|
||||
StartProfiling(g_Prof);
|
||||
new iter = MATH_INT_LOOPS;
|
||||
new a, b, c;
|
||||
while(iter--)
|
||||
{
|
||||
a = iter * 7;
|
||||
b = 5 + iter;
|
||||
c = 6 / (iter + 3);
|
||||
a = 6 * (iter);
|
||||
b = a * 185;
|
||||
a = b / 25;
|
||||
c = b - a + 3;
|
||||
b = b*b;
|
||||
a = (a + c) / (b - c);
|
||||
b = 6;
|
||||
c = 1;
|
||||
b = a * 128 - c;
|
||||
c = b * (a + 16) * b;
|
||||
if (!a)
|
||||
{
|
||||
a = 5;
|
||||
}
|
||||
a = c + (28/a) - c;
|
||||
}
|
||||
StopProfiling(g_Prof);
|
||||
PrintToServer("int benchmark: %f seconds", GetProfilerTime(g_Prof));
|
||||
|
||||
StartProfiling(g_Prof);
|
||||
new Float:fa, Float:fb, Float:fc
|
||||
new int1
|
||||
iter = MATH_FLOAT_LOOPS;
|
||||
while (iter--)
|
||||
{
|
||||
fa = iter * 0.7;
|
||||
fb = 5.1 + iter;
|
||||
fc = 6.1 / (float(iter) + 2.5);
|
||||
fa = 6.1 * (iter);
|
||||
fb = fa * 185.26;
|
||||
fa = fb / 25.56;
|
||||
fc = fb - a + float(3);
|
||||
fb = fb*fb;
|
||||
fa = (fa + fc) / (fb - fc);
|
||||
fb = 6.2;
|
||||
fc = float(1);
|
||||
int1 = RoundToNearest(fa);
|
||||
fb = fa * float(128) - int1;
|
||||
fc = fb * (a + 16.85) * float(RoundToCeil(fb));
|
||||
if (fa == 0.0)
|
||||
{
|
||||
fa = 5.0;
|
||||
}
|
||||
fa = fc + (float(28)/fa) - RoundToFloor(fc);
|
||||
}
|
||||
StopProfiling(g_Prof);
|
||||
PrintToServer("float benchmark: %f seconds", GetProfilerTime(g_Prof));
|
||||
}
|
||||
|
||||
#define KEY1 "LVWANBAGVXSXUGB"
|
||||
#define KEY2 "IDYCVNWEOWNND"
|
||||
#define KEY3 "UZWTRNHY"
|
||||
#define KEY4 "EPRHAFCIUOIG"
|
||||
#define KEY5 "RMZCVWIEY"
|
||||
#define KEY6 "ZHPU"
|
||||
|
||||
StringBench()
|
||||
{
|
||||
new i = STRING_FMT_LOOPS;
|
||||
new String:buffer[255];
|
||||
|
||||
StartProfiling(g_Prof);
|
||||
new end
|
||||
while (i--)
|
||||
{
|
||||
end = 0;
|
||||
Format(buffer, sizeof(buffer), "%d", i);
|
||||
Format(buffer, sizeof(buffer), "%d %s %d %f %d %-3.4s %s", i, "gaben", 30, 10.0, 20, "hello", "What a gaben");
|
||||
end = Format(buffer, sizeof(buffer), "Well, that's just %-17.18s!", "what. this isn't a valid string! wait it is");
|
||||
end += Format(buffer[end], sizeof(buffer)-end, "There are %d in this %d", i, end);
|
||||
end += Format(buffer[end], sizeof(buffer)-end, "There are %d in this %d", i, end);
|
||||
}
|
||||
StopProfiling(g_Prof);
|
||||
PrintToServer("format() benchmark: %f seconds", GetProfilerTime(g_Prof));
|
||||
|
||||
StartProfiling(g_Prof);
|
||||
i = STRING_ML_LOOPS;
|
||||
new String:fmtbuf[2048]; /* don't change to decl, amxmodx doesn't use it */
|
||||
while (i--)
|
||||
{
|
||||
Format(fmtbuf, 2047, "%T %T %d %s %f %T", KEY1, LANG_SERVER, KEY2, LANG_SERVER, 50, "what the", 50.0, KEY3, LANG_SERVER);
|
||||
Format(fmtbuf, 2047, "%s %T %s %T %T", "gaben", KEY4, LANG_SERVER, "what TIME is it", KEY5, LANG_SERVER, KEY6, LANG_SERVER);
|
||||
}
|
||||
StopProfiling(g_Prof);
|
||||
PrintToServer("ml benchmark: %f seconds", GetProfilerTime(g_Prof));
|
||||
|
||||
StartProfiling(g_Prof);
|
||||
i = STRING_OP_LOOPS;
|
||||
while (i--)
|
||||
{
|
||||
StringToInt(fmtbuf)
|
||||
}
|
||||
StopProfiling(g_Prof);
|
||||
PrintToServer("str benchmark: %f seconds", GetProfilerTime(g_Prof));
|
||||
|
||||
StartProfiling(g_Prof);
|
||||
i = STRING_RPLC_LOOPS;
|
||||
while (i--)
|
||||
{
|
||||
strcopy(fmtbuf, 2047, "This is a test string for you.");
|
||||
ReplaceString(fmtbuf, sizeof(fmtbuf), " ", "ASDF")
|
||||
ReplaceString(fmtbuf, sizeof(fmtbuf), "SDF", "")
|
||||
ReplaceString(fmtbuf, sizeof(fmtbuf), "string", "gnirts")
|
||||
}
|
||||
StopProfiling(g_Prof);
|
||||
PrintToServer("replace benchmark: %f seconds", GetProfilerTime(g_Prof));
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
#include <sourcemod>
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "Function Call Testing Lab",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Tests basic function calls",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
RegServerCmd("test_callfunc", Command_CallFunc);
|
||||
RegServerCmd("test_callfunc_reentrant", Command_ReentrantCallFunc);
|
||||
}
|
||||
|
||||
public OnCallFuncReceived(num, Float:fnum, String:str[], String:str2[], &val, &Float:fval, array[], array2[], size, hello2[1])
|
||||
{
|
||||
PrintToServer("Inside OnCallFuncReceived...");
|
||||
|
||||
PrintToServer("num = %d (expected: %d)", num, 5);
|
||||
PrintToServer("fnum = %f (expected: %f)", fnum, 7.17);
|
||||
PrintToServer("str[] = \"%s\" (expected: \"%s\")", str, "Gaben");
|
||||
PrintToServer("str2[] = \"%s\" (expected: \"%s\")", str2, ".taf si nebaG");
|
||||
|
||||
PrintToServer("val = %d (expected %d, setting to %d)", val, 62, 15);
|
||||
val = 15;
|
||||
|
||||
PrintToServer("fval = %f (expected: %f, setting to %f)", fval, 6.25, 1.5);
|
||||
fval = 1.5;
|
||||
|
||||
PrintToServer("Printing %d elements of array[] (expected: %d)", size, 6);
|
||||
for (new i = 0; i < size; i++)
|
||||
{
|
||||
PrintToServer("array[%d] = %d (expected: %d)", i, array[i], i);
|
||||
}
|
||||
for (new i = 0; i < size; i++)
|
||||
{
|
||||
PrintToServer("array2[%d] = %d (expected: %d)", i, array[i], i);
|
||||
}
|
||||
|
||||
/* This shouldn't get copied back */
|
||||
strcopy(str, strlen(str) + 1, "Yeti");
|
||||
/* This should get copied back */
|
||||
strcopy(str2, strlen(str2) + 1, "Gaben is fat.");
|
||||
|
||||
/* This should get copied back */
|
||||
array[0] = 5;
|
||||
array[1] = 6;
|
||||
/* This shouldn't get copied back */
|
||||
hello2[0] = 25;
|
||||
|
||||
return 42;
|
||||
}
|
||||
|
||||
public OnReentrantCallReceived(num, String:str[])
|
||||
{
|
||||
new err, ret;
|
||||
|
||||
PrintToServer("Inside OnReentrantCallReceived...");
|
||||
|
||||
PrintToServer("num = %d (expected: %d)", num, 7);
|
||||
PrintToServer("str[] = \"%s\" (expected: \"%s\")", str, "nana");
|
||||
|
||||
new Function:func = GetFunctionByName(INVALID_HANDLE, "OnReentrantCallReceivedTwo");
|
||||
|
||||
if (func == INVALID_FUNCTION)
|
||||
{
|
||||
PrintToServer("Failed to get the function id of OnReentrantCallReceivedTwo");
|
||||
return 0;
|
||||
}
|
||||
|
||||
PrintToServer("Calling OnReentrantCallReceivedTwo...");
|
||||
|
||||
Call_StartFunction(INVALID_HANDLE, func);
|
||||
Call_PushFloat(8.0);
|
||||
err = Call_Finish(ret);
|
||||
|
||||
PrintToServer("Call to OnReentrantCallReceivedTwo has finished!");
|
||||
PrintToServer("Error code = %d (expected: %d)", err, 0);
|
||||
PrintToServer("Return value = %d (expected: %d)", ret, 707);
|
||||
|
||||
return 11;
|
||||
}
|
||||
|
||||
public OnReentrantCallReceivedTwo(Float:fnum)
|
||||
{
|
||||
PrintToServer("Inside OnReentrantCallReceivedTwo...");
|
||||
|
||||
PrintToServer("fnum = %f (expected: %f)", fnum, 8.0);
|
||||
|
||||
return 707;
|
||||
}
|
||||
|
||||
public Action:Command_CallFunc(args)
|
||||
{
|
||||
new a = 62;
|
||||
new Float:b = 6.25;
|
||||
new const String:what[] = "Gaben";
|
||||
new String:truth[] = ".taf si nebaG";
|
||||
new hello[] = {0, 1, 2, 3, 4, 5};
|
||||
new hello2[] = {9};
|
||||
new pm = 6;
|
||||
new err;
|
||||
new ret;
|
||||
|
||||
new Function:func = GetFunctionByName(INVALID_HANDLE, "OnCallFuncReceived");
|
||||
|
||||
if (func == INVALID_FUNCTION)
|
||||
{
|
||||
PrintToServer("Failed to get the function id of OnCallFuncReceived");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
PrintToServer("Calling OnCallFuncReceived...");
|
||||
|
||||
Call_StartFunction(INVALID_HANDLE, func);
|
||||
Call_PushCell(5);
|
||||
Call_PushFloat(7.17);
|
||||
Call_PushString(what);
|
||||
Call_PushStringEx(truth, sizeof(truth), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK);
|
||||
Call_PushCellRef(a);
|
||||
Call_PushFloatRef(b);
|
||||
Call_PushArrayEx(hello, pm, SM_PARAM_COPYBACK);
|
||||
Call_PushArray(hello, pm);
|
||||
Call_PushCell(pm);
|
||||
Call_PushArray(hello2, 1);
|
||||
err = Call_Finish(ret);
|
||||
|
||||
PrintToServer("Call to OnCallFuncReceived has finished!");
|
||||
PrintToServer("Error code = %d (expected: %d)", err, 0);
|
||||
PrintToServer("Return value = %d (expected: %d)", ret, 42);
|
||||
|
||||
PrintToServer("a = %d (expected: %d)", a, 15);
|
||||
PrintToServer("b = %f (expected: %f)", b, 1.5);
|
||||
PrintToServer("what = \"%s\" (expected: \"%s\")", what, "Gaben");
|
||||
PrintToServer("truth = \"%s\" (expected: \"%s\")", truth, "Gaben is fat.");
|
||||
PrintToServer("hello[0] = %d (expected: %d)", hello[0], 5);
|
||||
PrintToServer("hello[1] = %d (expected: %d)", hello[1], 6);
|
||||
PrintToServer("hello2[0] = %d (expected: %d)", hello2[0], 9);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_ReentrantCallFunc(args)
|
||||
{
|
||||
new err, ret;
|
||||
new Function:func = GetFunctionByName(INVALID_HANDLE, "OnReentrantCallReceived");
|
||||
|
||||
if (func == INVALID_FUNCTION)
|
||||
{
|
||||
PrintToServer("Failed to get the function id of OnReentrantCallReceived");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
PrintToServer("Calling OnReentrantCallReceived...");
|
||||
|
||||
Call_StartFunction(INVALID_HANDLE, func);
|
||||
Call_PushCell(7);
|
||||
Call_PushString("nana");
|
||||
err = Call_Finish(ret);
|
||||
|
||||
PrintToServer("Call to OnReentrantCallReceived has finished!");
|
||||
PrintToServer("Error code = %d (expected: %d)", err, 0);
|
||||
PrintToServer("Return value = %d (expected: %d)", ret, 11);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
#include <sourcemod>
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "FakeNative Testing Lab #1",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Test suite #1 for dynamic natives",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
public bool:AskPluginLoad(Handle:myself, bool:late, String:error[], err_max)
|
||||
{
|
||||
CreateNative("TestNative1", __TestNative1);
|
||||
CreateNative("TestNative2", __TestNative2);
|
||||
CreateNative("TestNative3", __TestNative3);
|
||||
CreateNative("TestNative4", __TestNative4);
|
||||
CreateNative("TestNative5", __TestNative5);
|
||||
return true;
|
||||
}
|
||||
|
||||
public __TestNative1(Handle:plugin, numParams)
|
||||
{
|
||||
PrintToServer("TestNative1: Plugin: %x params: %d", plugin, numParams);
|
||||
if (numParams == 4)
|
||||
{
|
||||
ThrowNativeError(SP_ERROR_NATIVE, "Four parameters ARE NOT ALLOWED lol");
|
||||
}
|
||||
return 5;
|
||||
}
|
||||
|
||||
public __TestNative2(Handle:plugin, numParams)
|
||||
{
|
||||
new String:buffer[512];
|
||||
new bytes;
|
||||
|
||||
GetNativeString(1, buffer, sizeof(buffer), bytes);
|
||||
|
||||
for (new i=0; i<bytes; i++)
|
||||
{
|
||||
buffer[i] = buffer[i] + 1;
|
||||
}
|
||||
|
||||
SetNativeString(1, buffer, bytes+1);
|
||||
}
|
||||
|
||||
public __TestNative3(Handle:plugin, numParams)
|
||||
{
|
||||
new val1 = GetNativeCell(1);
|
||||
new val2 = GetNativeCellRef(2);
|
||||
|
||||
SetNativeCellRef(2, val1+val2);
|
||||
}
|
||||
|
||||
public __TestNative4(Handle:plugin, numParams)
|
||||
{
|
||||
new size = GetNativeCell(3);
|
||||
new local[size];
|
||||
|
||||
GetNativeArray(1, local, size);
|
||||
SetNativeArray(2, local, size);
|
||||
}
|
||||
|
||||
public __TestNative5(Handle:plugin, numParams)
|
||||
{
|
||||
new local = GetNativeCell(1);
|
||||
|
||||
if (local)
|
||||
{
|
||||
FormatNativeString(2, 4, 5, GetNativeCell(3));
|
||||
} else {
|
||||
new len = GetNativeCell(3);
|
||||
new fmt_len;
|
||||
new String:buffer[len];
|
||||
|
||||
GetNativeStringLength(4, fmt_len);
|
||||
|
||||
new String:format[fmt_len];
|
||||
|
||||
GetNativeString(2, buffer, len);
|
||||
GetNativeString(4, format, fmt_len);
|
||||
|
||||
FormatNativeString(0, 0, 5, len, _, buffer, format);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
#include <sourcemod>
|
||||
|
||||
native TestNative1(gaben, ...);
|
||||
native TestNative2(String:buffer[]);
|
||||
native TestNative3(value1, &value2);
|
||||
native TestNative4(const input[], output[], size);
|
||||
native TestNative5(bool:local, String:buffer[], maxlength, const String:fmt[], {Handle,Float,String,_}:...);
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "FakeNative Testing Lab #2",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Test suite #2 for dynamic natives",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
RegServerCmd("test_native1", Test_Native1);
|
||||
RegServerCmd("test_native2", Test_Native2);
|
||||
RegServerCmd("test_native3", Test_Native3);
|
||||
RegServerCmd("test_native4", Test_Native4);
|
||||
RegServerCmd("test_native5", Test_Native5);
|
||||
}
|
||||
|
||||
public Action:Test_Native1(args)
|
||||
{
|
||||
PrintToServer("Returned: %d", TestNative1(1));
|
||||
PrintToServer("Returned: %d", TestNative1(1,2));
|
||||
PrintToServer("Returned: %d", TestNative1(1,2,3,4));
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Test_Native2(args)
|
||||
{
|
||||
new String:buffer[] = "IBM";
|
||||
|
||||
PrintToServer("Before: %s", buffer);
|
||||
|
||||
TestNative2(buffer);
|
||||
|
||||
PrintToServer("AfteR: %s", buffer);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Test_Native3(args)
|
||||
{
|
||||
new value1 = 5, value2 = 6
|
||||
|
||||
PrintToServer("Before: %d, %d", value1, value2);
|
||||
|
||||
TestNative3(value1, value2);
|
||||
|
||||
PrintToServer("After: %d, %d", value1, value2);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Test_Native4(args)
|
||||
{
|
||||
new input[5] = {0, 1, 2, 3, 4};
|
||||
new output[5];
|
||||
|
||||
TestNative4(input, output, 5);
|
||||
|
||||
PrintToServer("[0=%d] [1=%d] [2=%d] [3=%d] [4=%d]", input[0], input[1], input[2], input[3], input[4]);
|
||||
PrintToServer("[0=%d] [1=%d] [2=%d] [3=%d] [4=%d]", output[0], output[1], output[2], output[3], output[4]);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Test_Native5(args)
|
||||
{
|
||||
new String:buffer1[512];
|
||||
new String:buffer2[512];
|
||||
|
||||
TestNative5(true, buffer1, sizeof(buffer1), "%d gabens in the %s", 50, "gabpark");
|
||||
TestNative5(true, buffer2, sizeof(buffer2), "%d gabens in the %s", 50, "gabpark");
|
||||
|
||||
PrintToServer("Test 1: %s", buffer1);
|
||||
PrintToServer("Test 2: %s", buffer2);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
#include <sourcemod>
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "Forward Testing Lab #1",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Tests suite #1 for forwards created by plugins",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
new Handle:g_GlobalFwd = INVALID_HANDLE;
|
||||
new Handle:g_PrivateFwd = INVALID_HANDLE;
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
RegServerCmd("test_create_gforward", Command_CreateGlobalForward);
|
||||
RegServerCmd("test_create_pforward", Command_CreatePrivateForward);
|
||||
RegServerCmd("test_exec_gforward", Command_ExecGlobalForward);
|
||||
RegServerCmd("test_exec_pforward", Command_ExecPrivateForward);
|
||||
}
|
||||
|
||||
public OnPluginEnd()
|
||||
{
|
||||
CloseHandle(g_GlobalFwd);
|
||||
CloseHandle(g_PrivateFwd);
|
||||
}
|
||||
|
||||
public Action:Command_CreateGlobalForward(args)
|
||||
{
|
||||
if (g_GlobalFwd != INVALID_HANDLE)
|
||||
{
|
||||
CloseHandle(g_GlobalFwd);
|
||||
}
|
||||
|
||||
g_GlobalFwd = CreateGlobalForward("OnGlobalForward", ET_Ignore, Param_Any, Param_Cell, Param_Float, Param_String, Param_Array, Param_CellByRef, Param_FloatByRef);
|
||||
|
||||
if (g_GlobalFwd == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to create global forward!");
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_CreatePrivateForward(args)
|
||||
{
|
||||
new Handle:pl;
|
||||
new Function:func;
|
||||
|
||||
if (g_PrivateFwd != INVALID_HANDLE)
|
||||
{
|
||||
CloseHandle(g_PrivateFwd);
|
||||
}
|
||||
|
||||
g_PrivateFwd = CreateForward(ET_Hook, Param_Cell, Param_String, Param_VarArgs);
|
||||
|
||||
if (g_PrivateFwd == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to create private forward!")
|
||||
}
|
||||
|
||||
pl = FindPluginByFile("fwdtest2.smx");
|
||||
|
||||
if (!pl)
|
||||
{
|
||||
PrintToServer("Could not find fwdtest2.smx!");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
func = GetFunctionByName(pl, "OnPrivateForward");
|
||||
|
||||
/* This shouldn't happen, but oh well */
|
||||
if (func == INVALID_FUNCTION)
|
||||
{
|
||||
PrintToServer("Could not find \"OnPrivateForward\" in fwdtest2.smx!");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
if (!AddToForward(g_PrivateFwd, pl, func) || !AddToForward(g_PrivateFwd, GetMyHandle(), ZohMyGod))
|
||||
{
|
||||
PrintToServer("Failed to add functions to private forward!");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_ExecGlobalForward(args)
|
||||
{
|
||||
new a = 99;
|
||||
new Float:b = 4.215;
|
||||
new err, ret;
|
||||
|
||||
if (g_GlobalFwd == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to execute global forward. Create it first.");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
PrintToServer("Beginning call to %d functions in global forward \"OnGlobalForward\"", GetForwardFunctionCount(g_GlobalFwd));
|
||||
|
||||
Call_StartForward(g_GlobalFwd);
|
||||
Call_PushCell(OnPluginStart);
|
||||
Call_PushCell(7);
|
||||
Call_PushFloat(-8.5);
|
||||
Call_PushString("Anata wa doko desu ka?");
|
||||
Call_PushArray({0.0, 1.1, 2.2}, 3);
|
||||
Call_PushCellRef(a);
|
||||
Call_PushFloatRef(b);
|
||||
err = Call_Finish(ret);
|
||||
|
||||
PrintToServer("Call to global forward \"OnGlobalForward\" completed");
|
||||
PrintToServer("Error code = %d (expected: %d)", err, 0);
|
||||
PrintToServer("Return value = %d (expected: %d)", ret, Plugin_Continue);
|
||||
|
||||
PrintToServer("a = %d (expected: %d)", a, 777);
|
||||
PrintToServer("b = %f (expected: %f)", b, -0.782);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_ExecPrivateForward(args)
|
||||
{
|
||||
new err, ret;
|
||||
|
||||
if (g_PrivateFwd == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to execute private forward. Create it first.");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
PrintToServer("Beginning call to %d functions in private forward", GetForwardFunctionCount(g_PrivateFwd));
|
||||
|
||||
Call_StartForward(g_PrivateFwd);
|
||||
Call_PushCell(24);
|
||||
Call_PushString("I am a format string: %d %d %d %d %d %d");
|
||||
Call_PushCell(0);
|
||||
Call_PushCell(1);
|
||||
Call_PushCell(2);
|
||||
Call_PushCell(3);
|
||||
Call_PushCell(4);
|
||||
Call_PushCell(5);
|
||||
err = Call_Finish(ret);
|
||||
|
||||
PrintToServer("Call to private forward completed");
|
||||
PrintToServer("Error code = %d (expected: %d)", err, 0);
|
||||
PrintToServer("Return value = %d (expected: %d)", ret, Plugin_Handled);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:ZohMyGod(num, const String:format[], ...)
|
||||
{
|
||||
decl String:buffer[128];
|
||||
|
||||
PrintToServer("Inside private forward #1");
|
||||
|
||||
PrintToServer("num = %d (expected: %d)", num, 24);
|
||||
|
||||
VFormat(buffer, sizeof(buffer), format, 3);
|
||||
PrintToServer("buffer = \"%s\" (expected: \"%s\")", buffer, "I am a format string: 0 1 2 3 4 5");
|
||||
|
||||
PrintToServer("End private forward #1");
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
#include <sourcemod>
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "Forward Testing Lab #2",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Tests suite #2 for forwards created by plugins",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
public Action:OnPrivateForward(num, const String:format[], ...)
|
||||
{
|
||||
decl String:buffer[128];
|
||||
|
||||
PrintToServer("Inside private forward #2");
|
||||
|
||||
PrintToServer("num = %d (expected: %d)", num, 24);
|
||||
|
||||
VFormat(buffer, sizeof(buffer), format, 3);
|
||||
PrintToServer("buffer = \"%s\" (expected: \"%s\")", buffer, "I am a format string: 0 1 2 3 4 5");
|
||||
|
||||
PrintToServer("End private forward #2");
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public OnGlobalForward(Function:a, b, Float:c, const String:d[], Float:e[3], &f, &Float:g)
|
||||
{
|
||||
PrintToServer("Inside global forward \"OnGlobalForward\"");
|
||||
|
||||
PrintToServer("a = %d (expected: %d)", a, 11);
|
||||
PrintToServer("b = %d (expected: %d)", b, 7);
|
||||
PrintToServer("c = %f (expected: %f)", c, -8.5);
|
||||
PrintToServer("d = \"%s\" (expected: \"%s\")", d, "Anata wa doko desu ka?");
|
||||
PrintToServer("e = %f %f %f (expected: %f %f %f)", e[0], e[1], e[2], 0.0, 1.1, 2.2);
|
||||
|
||||
PrintToServer("f = %d (expected %d, setting to %d)", f, 99, 777);
|
||||
f = 777;
|
||||
|
||||
PrintToServer("g = %f (expected %f, setting to %f)", g, 4.215, -0.782);
|
||||
g = -0.782;
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
#include <sourcemod>
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
RegServerCmd("test_goto", Test_Goto);
|
||||
}
|
||||
|
||||
public Action:Test_Goto(args)
|
||||
{
|
||||
new bool:hello = false;
|
||||
new String:crab[] = "space crab";
|
||||
|
||||
sample_label:
|
||||
|
||||
new String:yam[] = "yams";
|
||||
|
||||
PrintToServer("%s %s", crab, yam);
|
||||
|
||||
if (!hello)
|
||||
{
|
||||
new bool:what = true;
|
||||
hello = what
|
||||
goto sample_label;
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,331 @@
|
||||
#include <sourcemod>
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "Sorting Test",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Tests sorting functions",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
RegServerCmd("test_sort_ints", Command_TestSortInts)
|
||||
RegServerCmd("test_sort_floats", Command_TestSortFloats)
|
||||
RegServerCmd("test_sort_strings", Command_TestSortStrings)
|
||||
RegServerCmd("test_sort_1d", Command_TestSort1D)
|
||||
RegServerCmd("test_sort_2d", Command_TestSort2D)
|
||||
RegServerCmd("test_adtsort_ints", Command_TestSortADTInts)
|
||||
RegServerCmd("test_adtsort_floats", Command_TestSortADTFloats)
|
||||
RegServerCmd("test_adtsort_strings", Command_TestSortADTStrings)
|
||||
RegServerCmd("test_adtsort_custom", Command_TestSortADTCustom)
|
||||
}
|
||||
|
||||
/*****************
|
||||
* INTEGER TESTS *
|
||||
*****************/
|
||||
// Note that integer comparison is just int1-int2 (or a variation therein)
|
||||
|
||||
PrintIntegers(const array[], size)
|
||||
{
|
||||
for (new i=0; i<size; i++)
|
||||
{
|
||||
PrintToServer("array[%d] = %d", i, array[i])
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSortInts(args)
|
||||
{
|
||||
new array[10] = {6, 7, 3, 2, 8, 5, 0, 1, 4, 9}
|
||||
|
||||
PrintToServer("Testing ascending sort:")
|
||||
SortIntegers(array, 10, Sort_Ascending)
|
||||
PrintIntegers(array, 10)
|
||||
|
||||
PrintToServer("Testing descending sort:")
|
||||
SortIntegers(array, 10, Sort_Descending)
|
||||
PrintIntegers(array, 10)
|
||||
|
||||
PrintToServer("Testing random sort:")
|
||||
SortIntegers(array, 10, Sort_Random)
|
||||
PrintIntegers(array, 10)
|
||||
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
/**************************
|
||||
* Float comparison tests *
|
||||
**************************/
|
||||
|
||||
PrintFloats(const Float:array[], size)
|
||||
{
|
||||
for (new i=0; i<size; i++)
|
||||
{
|
||||
PrintToServer("array[%d] = %f", i, array[i])
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSortFloats(args)
|
||||
{
|
||||
new Float:array[10] = {6.3, 7.6, 3.2, 2.1, 8.5, 5.2, 0.4, 1.7, 4.8, 8.2}
|
||||
|
||||
PrintToServer("Testing ascending sort:")
|
||||
SortFloats(array, 10, Sort_Ascending)
|
||||
PrintFloats(array, 10)
|
||||
|
||||
PrintToServer("Testing descending sort:")
|
||||
SortFloats(array, 10, Sort_Descending)
|
||||
PrintFloats(array, 10)
|
||||
|
||||
PrintToServer("Testing random sort:")
|
||||
SortFloats(array, 10, Sort_Random)
|
||||
PrintFloats(array, 10)
|
||||
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
public Custom1DSort(elem1, elem2, const array[], Handle:hndl)
|
||||
{
|
||||
new Float:f1 = Float:elem1
|
||||
new Float:f2 = Float:elem2
|
||||
if (f1 > f2)
|
||||
{
|
||||
return -1;
|
||||
} else if (f1 < f2) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Action:Command_TestSort1D(args)
|
||||
{
|
||||
new Float:array[10] = {6.3, 7.6, 3.2, 2.1, 8.5, 5.2, 0.4, 1.7, 4.8, 8.2}
|
||||
|
||||
SortCustom1D(_:array, 10, Custom1DSort)
|
||||
PrintFloats(array, 10)
|
||||
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
/***************************
|
||||
* String comparison tests *
|
||||
***************************/
|
||||
|
||||
PrintStrings(const String:array[][], size)
|
||||
{
|
||||
for (new i=0; i<size; i++)
|
||||
{
|
||||
PrintToServer("array[%d] = %s", i, array[i])
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSortStrings(args)
|
||||
{
|
||||
new String:strarray[][] =
|
||||
{
|
||||
"faluco",
|
||||
"bailopan",
|
||||
"pm onoto",
|
||||
"damaged soul",
|
||||
"sniperbeamer",
|
||||
"sidluke",
|
||||
"johnny got his gun",
|
||||
"gabe newell",
|
||||
"pRED*'s awesome",
|
||||
"WHAT?!"
|
||||
}
|
||||
|
||||
PrintToServer("Testing ascending sort:")
|
||||
SortStrings(strarray, 10, Sort_Ascending)
|
||||
PrintStrings(strarray, 10)
|
||||
|
||||
PrintToServer("Testing descending sort:")
|
||||
SortStrings(strarray, 10, Sort_Descending)
|
||||
PrintStrings(strarray, 10)
|
||||
|
||||
PrintToServer("Testing random sort:")
|
||||
SortStrings(strarray, 10, Sort_Random)
|
||||
PrintStrings(strarray, 10)
|
||||
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
public Custom2DSort(String:elem1[], String:elem2[], String:array[][], Handle:hndl)
|
||||
{
|
||||
return strcmp(elem1, elem2)
|
||||
}
|
||||
|
||||
public Action:Command_TestSort2D(args)
|
||||
{
|
||||
new String:array[][] =
|
||||
{
|
||||
"faluco",
|
||||
"bailopan",
|
||||
"pm onoto",
|
||||
"damaged soul",
|
||||
"sniperbeamer",
|
||||
"sidluke",
|
||||
"johnny got his gun",
|
||||
"gabe newell",
|
||||
"pred is a crab",
|
||||
"WHAT?!"
|
||||
}
|
||||
|
||||
SortCustom2D(_:array, 10, Custom2DSort)
|
||||
PrintStrings(array, 10)
|
||||
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
/*******************
|
||||
* ADT ARRAY TESTS *
|
||||
*******************/
|
||||
// Int and floats work the same as normal comparisions. Strings are direct
|
||||
// comparisions with no hacky memory stuff like Pawn arrays.
|
||||
|
||||
PrintADTArrayIntegers(Handle:array)
|
||||
{
|
||||
new size = GetArraySize(array);
|
||||
for (new i=0; i<size;i++)
|
||||
{
|
||||
PrintToServer("array[%d] = %d", i, GetArrayCell(array, i));
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSortADTInts(args)
|
||||
{
|
||||
new Handle:array = CreateArray();
|
||||
PushArrayCell(array, 6);
|
||||
PushArrayCell(array, 7);
|
||||
PushArrayCell(array, 3);
|
||||
PushArrayCell(array, 2);
|
||||
PushArrayCell(array, 8);
|
||||
PushArrayCell(array, 5);
|
||||
PushArrayCell(array, 0);
|
||||
PushArrayCell(array, 1);
|
||||
PushArrayCell(array, 4);
|
||||
PushArrayCell(array, 9);
|
||||
|
||||
PrintToServer("Testing ascending sort:")
|
||||
SortADTArray(array, Sort_Ascending, Sort_Integer)
|
||||
PrintADTArrayIntegers(array)
|
||||
|
||||
PrintToServer("Testing descending sort:")
|
||||
SortADTArray(array, Sort_Descending, Sort_Integer)
|
||||
PrintADTArrayIntegers(array)
|
||||
|
||||
PrintToServer("Testing random sort:")
|
||||
SortADTArray(array, Sort_Random, Sort_Integer)
|
||||
PrintADTArrayIntegers(array)
|
||||
|
||||
return Plugin_Handled
|
||||
|
||||
}
|
||||
|
||||
PrintADTArrayFloats(Handle:array)
|
||||
{
|
||||
new size = GetArraySize(array);
|
||||
for (new i=0; i<size;i++)
|
||||
{
|
||||
PrintToServer("array[%d] = %f", i, float:GetArrayCell(array, i));
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSortADTFloats(args)
|
||||
{
|
||||
new Handle:array = CreateArray();
|
||||
PushArrayCell(array, 6.0);
|
||||
PushArrayCell(array, 7.0);
|
||||
PushArrayCell(array, 3.0);
|
||||
PushArrayCell(array, 2.0);
|
||||
PushArrayCell(array, 8.0);
|
||||
PushArrayCell(array, 5.0);
|
||||
PushArrayCell(array, 0.0);
|
||||
PushArrayCell(array, 1.0);
|
||||
PushArrayCell(array, 4.0);
|
||||
PushArrayCell(array, 9.0);
|
||||
|
||||
PrintToServer("Testing ascending sort:")
|
||||
SortADTArray(array, Sort_Ascending, Sort_Float)
|
||||
PrintADTArrayFloats(array)
|
||||
|
||||
PrintToServer("Testing descending sort:")
|
||||
SortADTArray(array, Sort_Descending, Sort_Float)
|
||||
PrintADTArrayFloats(array)
|
||||
|
||||
PrintToServer("Testing random sort:")
|
||||
SortADTArray(array, Sort_Random, Sort_Float)
|
||||
PrintADTArrayFloats(array)
|
||||
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
PrintADTArrayStrings(Handle:array)
|
||||
{
|
||||
new size = GetArraySize(array);
|
||||
decl String:buffer[64];
|
||||
for (new i=0; i<size;i++)
|
||||
{
|
||||
GetArrayString(array, i, buffer, sizeof(buffer));
|
||||
PrintToServer("array[%d] = %s", i, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSortADTStrings(args)
|
||||
{
|
||||
new Handle:array = CreateArray(ByteCountToCells(64));
|
||||
PushArrayString(array, "faluco");
|
||||
PushArrayString(array, "bailopan");
|
||||
PushArrayString(array, "pm onoto");
|
||||
PushArrayString(array, "damaged soul");
|
||||
PushArrayString(array, "sniperbeamer");
|
||||
PushArrayString(array, "sidluke");
|
||||
PushArrayString(array, "johnny got his gun");
|
||||
PushArrayString(array, "gabe newell");
|
||||
PushArrayString(array, "Hello pRED*");
|
||||
PushArrayString(array, "WHAT?!");
|
||||
|
||||
PrintToServer("Testing ascending sort:")
|
||||
SortADTArray(array, Sort_Ascending, Sort_String)
|
||||
PrintADTArrayStrings(array)
|
||||
|
||||
PrintToServer("Testing descending sort:")
|
||||
SortADTArray(array, Sort_Descending, Sort_String)
|
||||
PrintADTArrayStrings(array)
|
||||
|
||||
PrintToServer("Testing random sort:")
|
||||
SortADTArray(array, Sort_Random, Sort_String)
|
||||
PrintADTArrayStrings(array)
|
||||
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
public ArrayADTCustomCallback(index1, index2, Handle:array, Handle:hndl)
|
||||
{
|
||||
decl String:buffer1[64], String:buffer2[64];
|
||||
GetArrayString(array, index1, buffer1, sizeof(buffer1));
|
||||
GetArrayString(array, index2, buffer2, sizeof(buffer2));
|
||||
|
||||
return strcmp(buffer1, buffer2);
|
||||
}
|
||||
|
||||
public Action:Command_TestSortADTCustom(args)
|
||||
{
|
||||
new Handle:array = CreateArray(ByteCountToCells(64));
|
||||
PushArrayString(array, "faluco");
|
||||
PushArrayString(array, "bailopan");
|
||||
PushArrayString(array, "pm onoto");
|
||||
PushArrayString(array, "damaged soul");
|
||||
PushArrayString(array, "sniperbeamer");
|
||||
PushArrayString(array, "sidluke");
|
||||
PushArrayString(array, "johnny got his gun");
|
||||
PushArrayString(array, "gabe newell");
|
||||
PushArrayString(array, "pRED*'s running out of ideas");
|
||||
PushArrayString(array, "WHAT?!");
|
||||
|
||||
PrintToServer("Testing custom sort:")
|
||||
SortADTArrayCustom(array, ArrayADTCustomCallback)
|
||||
PrintADTArrayStrings(array);
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
#include <sourcemod>
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
name = "SQL Testing Lab",
|
||||
author = "AlliedModders LLC",
|
||||
description = "Tests basic function calls",
|
||||
version = "1.0.0.0",
|
||||
url = "http://www.sourcemod.net/"
|
||||
};
|
||||
|
||||
public OnPluginStart()
|
||||
{
|
||||
RegServerCmd("sql_test_normal", Command_TestSql1)
|
||||
RegServerCmd("sql_test_stmt", Command_TestSql2)
|
||||
RegServerCmd("sql_test_thread1", Command_TestSql3)
|
||||
RegServerCmd("sql_test_thread2", Command_TestSql4)
|
||||
RegServerCmd("sql_test_thread3", Command_TestSql5)
|
||||
}
|
||||
|
||||
PrintQueryData(Handle:query)
|
||||
{
|
||||
if (!SQL_HasResultSet(query))
|
||||
{
|
||||
PrintToServer("Query Handle %x has no results", query)
|
||||
return
|
||||
}
|
||||
|
||||
new rows = SQL_GetRowCount(query)
|
||||
new fields = SQL_GetFieldCount(query)
|
||||
|
||||
decl String:fieldNames[fields][32]
|
||||
PrintToServer("Fields: %d", fields)
|
||||
for (new i=0; i<fields; i++)
|
||||
{
|
||||
SQL_FieldNumToName(query, i, fieldNames[i], 32)
|
||||
PrintToServer("-> Field %d: \"%s\"", i, fieldNames[i])
|
||||
}
|
||||
|
||||
PrintToServer("Rows: %d", rows)
|
||||
decl String:result[255]
|
||||
new row
|
||||
while (SQL_FetchRow(query))
|
||||
{
|
||||
row++
|
||||
PrintToServer("Row %d:", row)
|
||||
for (new i=0; i<fields; i++)
|
||||
{
|
||||
SQL_FetchString(query, i, result, sizeof(result))
|
||||
PrintToServer(" [%s] %s", fieldNames[i], result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSql1(args)
|
||||
{
|
||||
new String:error[255]
|
||||
new Handle:db = SQL_DefConnect(error, sizeof(error))
|
||||
if (db == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to connect: %s", error)
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
new Handle:query = SQL_Query(db, "SELECT * FROM gaben")
|
||||
if (query == INVALID_HANDLE)
|
||||
{
|
||||
SQL_GetError(db, error, sizeof(error))
|
||||
PrintToServer("Failed to query: %s", error)
|
||||
} else {
|
||||
PrintQueryData(query)
|
||||
CloseHandle(query)
|
||||
}
|
||||
|
||||
CloseHandle(db)
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_TestSql2(args)
|
||||
{
|
||||
new String:error[255]
|
||||
new Handle:db = SQL_DefConnect(error, sizeof(error))
|
||||
if (db == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to connect: %s", error)
|
||||
return Plugin_Handled
|
||||
}
|
||||
|
||||
new Handle:stmt = SQL_PrepareQuery(db, "SELECT * FROM gaben WHERE gaben > ?", error, sizeof(error))
|
||||
if (stmt == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to prepare query: %s", error)
|
||||
} else {
|
||||
SQL_BindParamInt(stmt, 0, 1)
|
||||
if (!SQL_Execute(stmt))
|
||||
{
|
||||
SQL_GetError(stmt, error, sizeof(error))
|
||||
PrintToServer("Failed to execute query: %s", error)
|
||||
} else {
|
||||
PrintQueryData(stmt)
|
||||
}
|
||||
CloseHandle(stmt)
|
||||
}
|
||||
|
||||
CloseHandle(db)
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
new Handle:g_ThreadedHandle = INVALID_HANDLE;
|
||||
|
||||
public CallbackTest3(Handle:owner, Handle:hndl, const String:error[], any:data)
|
||||
{
|
||||
PrintToServer("CallbackTest1() (owner %x) (hndl %x) (error \"%s\") (data %d)", owner, hndl, error, data);
|
||||
if (g_ThreadedHandle != INVALID_HANDLE && hndl != INVALID_HANDLE)
|
||||
{
|
||||
CloseHandle(hndl);
|
||||
} else {
|
||||
g_ThreadedHandle = hndl;
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSql3(args)
|
||||
{
|
||||
if (g_ThreadedHandle != INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("A threaded connection already exists, run the next test");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
new String:name[32];
|
||||
GetCmdArg(1, name, sizeof(name));
|
||||
|
||||
SQL_TConnect(CallbackTest3, name);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
|
||||
public Action:Command_TestSql4(args)
|
||||
{
|
||||
SQL_LockDatabase(g_ThreadedHandle);
|
||||
new Handle:query = SQL_Query(g_ThreadedHandle, "SELECT * FROM gaben")
|
||||
if (query == INVALID_HANDLE)
|
||||
{
|
||||
new String:error[255];
|
||||
SQL_GetError(g_ThreadedHandle, error, sizeof(error))
|
||||
PrintToServer("Failed to query: %s", error)
|
||||
} else {
|
||||
PrintQueryData(query)
|
||||
CloseHandle(query)
|
||||
}
|
||||
SQL_UnlockDatabase(g_ThreadedHandle);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public CallbackTest5(Handle:owner, Handle:hndl, const String:error[], any:data)
|
||||
{
|
||||
if (hndl == INVALID_HANDLE)
|
||||
{
|
||||
PrintToServer("Failed to query: %s", error)
|
||||
} else {
|
||||
PrintQueryData(hndl)
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_TestSql5(args)
|
||||
{
|
||||
SQL_TQuery(g_ThreadedHandle, CallbackTest5, "SELECT * FROM gaben", 52)
|
||||
SQL_TQuery(g_ThreadedHandle, CallbackTest5, "SELECT * FROM gaben", 52)
|
||||
SQL_TQuery(g_ThreadedHandle, CallbackTest5, "SELECT * FROM gaben", 52)
|
||||
SQL_TQuery(g_ThreadedHandle, CallbackTest5, "SELECT * FROM gaben", 52)
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
CREATE TABLE gaben (gaben int primary key, fat varchar(32));
|
||||
|
||||
INSERT INTO gaben VALUES(1, 'what the');
|
||||
INSERT INTO gaben VALUES(2, 'Bee''s Knees!');
|
||||
INSERT INTO gaben VALUES(3, 'newell');
|
||||
INSERT INTO gaben VALUES(4, 'CRAB CAKE.');
|
||||
Reference in New Issue
Block a user