View difference between Paste ID: KqzfHRXP and g3xEXNLA
SHOW: | | - or go back to the newest paste.
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-
	format(str, 128, "%d", value);
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