@@ -72,14 +72,6 @@ OF SUCH DAMAGE.
7272
7373#include "dbutils.h"
7474
75- static int str_output(void *args, int, char **data, char **) {
76- char *output = static_cast <char *> (args);
77- const size_t len = strlen(data[0]);
78- memcpy(output, data[0], len);
79- output[len] = '\0';
80- return 0;
81- }
82-
8375TEST(attachdb, nullptr) {
8476 EXPECT_EQ(attachdb("filename", nullptr, "attach name", SQLITE_OPEN_READONLY, 0), nullptr);
8577 EXPECT_EQ(attachdb("filename", nullptr, "attach name", SQLITE_OPEN_READONLY, 1), nullptr);
@@ -184,8 +176,9 @@ TEST(addqueryfuncs, path) {
184176 ASSERT_NE(db, nullptr);
185177 ASSERT_EQ(addqueryfuncs_with_context(db, &work), 0);
186178
187- char output[MAXPATH] = {};
188- EXPECT_EQ(sqlite3_exec(db, "SELECT path();", str_output, output, nullptr), SQLITE_OK);
179+ char buf[MAXPATH] = {};
180+ char *output = buf;
181+ EXPECT_EQ(sqlite3_exec(db, "SELECT path();", copy_columns_callback, &output, nullptr), SQLITE_OK);
189182
190183 EXPECT_STREQ(output, work.name);
191184
@@ -207,8 +200,9 @@ TEST(addqueryfuncs, epath) {
207200 ASSERT_NE(db, nullptr);
208201 ASSERT_EQ(addqueryfuncs_with_context(db, &work), 0);
209202
210- char output[MAXPATH] = {};
211- EXPECT_EQ(sqlite3_exec(db, "SELECT epath();", str_output, output, nullptr), SQLITE_OK);
203+ char buf[MAXPATH] = {};
204+ char *output = buf;
205+ EXPECT_EQ(sqlite3_exec(db, "SELECT epath();", copy_columns_callback, &output, nullptr), SQLITE_OK);
212206
213207 EXPECT_STREQ(output, dirname);
214208
@@ -224,7 +218,7 @@ TEST(addqueryfuncs, fpath) {
224218 ASSERT_EQ(sqlite3_open(":memory:", &db), SQLITE_OK);
225219 ASSERT_NE(db, nullptr);
226220 ASSERT_EQ(addqueryfuncs_with_context(db, &work), 0);
227- EXPECT_EQ(sqlite3_exec(db, "SELECT fpath();", str_output, &work , nullptr), SQLITE_OK);
221+ EXPECT_EQ(sqlite3_exec(db, "SELECT fpath();", nullptr, nullptr , nullptr), SQLITE_OK);
228222 EXPECT_NE(work.fullpath, nullptr);
229223 EXPECT_GT(work.fullpath_len, (size_t) 0);
230224
@@ -233,7 +227,7 @@ TEST(addqueryfuncs, fpath) {
233227 const size_t fullpath_len = work.fullpath_len;
234228
235229 // call again - should not update fullpath
236- EXPECT_EQ(sqlite3_exec(db, "SELECT fpath();", str_output, &work , nullptr), SQLITE_OK);
230+ EXPECT_EQ(sqlite3_exec(db, "SELECT fpath();", nullptr, nullptr , nullptr), SQLITE_OK);
237231 EXPECT_EQ(work.fullpath, fullpath);
238232 EXPECT_EQ(work.fullpath_len, fullpath_len);
239233
@@ -264,8 +258,9 @@ TEST(addqueryfuncs, rpath) {
264258 SNPRINTF(query, MAXSQL, "SELECT rpath('%s', %d);", dirname, rollupscore);
265259
266260 // the path returned by the query is the path without the index prefix
267- char output[MAXPATH] = {};
268- EXPECT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
261+ char buf[MAXPATH] = {};
262+ char *output = buf;
263+ EXPECT_EQ(sqlite3_exec(db, query, copy_columns_callback, &output, nullptr), SQLITE_OK);
269264
270265 EXPECT_STREQ(output, work.name);
271266 }
@@ -280,8 +275,8 @@ TEST(addqueryfuncs, uidtouser) {
280275 struct passwd pwd;
281276 struct passwd *result = nullptr;
282277
283- char buf [MAXPATH] = {};
284- ASSERT_EQ(getpwuid_r(uid, &pwd, buf, MAXPATH , &result), 0);
278+ char ubuf [MAXPATH] = {};
279+ ASSERT_EQ(getpwuid_r(uid, &pwd, ubuf, sizeof(ubuf) , &result), 0);
285280 ASSERT_EQ(result, &pwd);
286281
287282 sqlite3 *db = nullptr;
@@ -294,8 +289,9 @@ TEST(addqueryfuncs, uidtouser) {
294289 char query[MAXSQL] = {};
295290 SNPRINTF(query, MAXSQL, "SELECT uidtouser('%d')", uid);
296291
297- char output[MAXPATH] = {};
298- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
292+ char buf[MAXPATH] = {};
293+ char *output = buf;
294+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, &output, nullptr), SQLITE_OK);
299295
300296 EXPECT_STREQ(output, pwd.pw_name);
301297
@@ -309,8 +305,8 @@ TEST(addqueryfuncs, gidtogroup) {
309305 struct group grp;
310306 struct group *result = nullptr;
311307
312- char buf [MAXPATH] = {};
313- ASSERT_EQ(getgrgid_r(gid, &grp, buf, MAXPATH , &result), 0);
308+ char gbuf [MAXPATH] = {};
309+ ASSERT_EQ(getgrgid_r(gid, &grp, gbuf, sizeof(gbuf) , &result), 0);
314310 ASSERT_EQ(result, &grp);
315311
316312 sqlite3 *db = nullptr;
@@ -323,8 +319,9 @@ TEST(addqueryfuncs, gidtogroup) {
323319 char query[MAXSQL] = {};
324320 SNPRINTF(query, MAXSQL, "SELECT gidtogroup('%d')", gid);
325321
326- char output[MAXPATH] = {};
327- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
322+ char buf[MAXPATH] = {};
323+ char *output = buf;
324+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, &output, nullptr), SQLITE_OK);
328325
329326 EXPECT_STREQ(output, grp.gr_name);
330327
@@ -340,17 +337,18 @@ TEST(addqueryfuncs, modetotxt) {
340337
341338 for(mode_t perm = 0; perm < 01000; perm++) {
342339 char query[MAXSQL] = {};
343- char output[11] = {};
340+ char buf[11] = {};
341+ char *output = buf;
344342 char expected[11] = {};
345343
346344 // file
347345 SNPRINTF(query, MAXSQL, "SELECT modetotxt(%zu)", (size_t) perm);
348- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
346+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, & output, nullptr), SQLITE_OK);
349347 EXPECT_STREQ(output, modetostr(expected, 11, perm));
350348
351349 // directory
352350 SNPRINTF(query, MAXSQL, "SELECT modetotxt(%zu)", perm | S_IFDIR);
353- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
351+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, & output, nullptr), SQLITE_OK);
354352 EXPECT_STREQ(output, modetostr(expected, 11, perm | S_IFDIR));
355353 }
356354
@@ -371,8 +369,9 @@ TEST(addqueryfuncs, strftime) {
371369 char query[MAXSQL] = {};
372370 SNPRINTF(query, MAXSQL, "SELECT strftime('%s', %d)", fmt, (int) now);
373371
374- char output[MAXPATH] = {};
375- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
372+ char buf[MAXPATH] = {};
373+ char *output = buf;
374+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, &output, nullptr), SQLITE_OK);
376375
377376 char expected[MAXSQL] = {};
378377 struct tm tm;
@@ -421,37 +420,38 @@ TEST(addqueryfuncs, blocksize) {
421420
422421 for(size_t j = 0; j < 3; j++) {
423422 char query[MAXSQL] = {};
424- char output[MAXPATH] = {};
423+ char buf[MAXPATH] = {};
424+ char *output = buf;
425425 char expected[MAXPATH] = {};
426426
427427 SNPRINTF(query, MAXSQL, "SELECT blocksize(%zu, '%c')", iBinputs[j], SIZE[i]);
428- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
428+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, & output, nullptr), SQLITE_OK);
429429 SNPRINTF(expected, MAXPATH, "%c%c", expecteds[j], SIZE[i]);
430430 EXPECT_STREQ(output, expected);
431431
432432 SNPRINTF(query, MAXSQL, "SELECT blocksize(%zu, '%cB')", Binputs[j], SIZE[i]);
433- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
433+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, & output, nullptr), SQLITE_OK);
434434 SNPRINTF(expected, MAXPATH, "%c%cB", expecteds[j], SIZE[i]);
435435 EXPECT_STREQ(output, expected);
436436
437437 SNPRINTF(query, MAXSQL, "SELECT blocksize(%zu, '%ciB')", iBinputs[j], SIZE[i]);
438- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
438+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, & output, nullptr), SQLITE_OK);
439439 SNPRINTF(expected, MAXPATH, "%c%ciB", expecteds[j], SIZE[i]);
440440 EXPECT_STREQ(output, expected);
441441 }
442442 }
443443
444- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize('', '')", str_output , nullptr, nullptr), SQLITE_ERROR); /* non-integer size argument */
445- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize('abc', '')", str_output , nullptr, nullptr), SQLITE_ERROR); /* missing size argument */
446- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'i')", str_output , nullptr, nullptr), SQLITE_ERROR); /* single bad character */
447- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'iB')", str_output , nullptr, nullptr), SQLITE_ERROR); /* 1st character isn't valid */
448- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'ij')", str_output , nullptr, nullptr), SQLITE_ERROR); /* 2nd character isn't B */
449- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'AiB')", str_output , nullptr, nullptr), SQLITE_ERROR); /* 1st character isn't valid */
450- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'AjB')", str_output , nullptr, nullptr), SQLITE_ERROR); /* 2nd character isn't i */
451- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'Aij')", str_output , nullptr, nullptr), SQLITE_ERROR); /* 3nd character isn't B */
452- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, '0KB')", str_output , nullptr, nullptr), SQLITE_ERROR); /* block coefficient is 0 */
453- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, '1.2KiB')", str_output , nullptr, nullptr), SQLITE_ERROR); /* decimal point is not allowed */
454- ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'KiBGiB')", str_output , nullptr, nullptr), SQLITE_ERROR); /* suffix is too long */
444+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize('', '')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* non-integer size argument */
445+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize('abc', '')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* missing size argument */
446+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'i')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* single bad character */
447+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'iB')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* 1st character isn't valid */
448+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'ij')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* 2nd character isn't B */
449+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'AiB')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* 1st character isn't valid */
450+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'AjB')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* 2nd character isn't i */
451+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'Aij')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* 3nd character isn't B */
452+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, '0KB')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* block coefficient is 0 */
453+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, '1.2KiB')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* decimal point is not allowed */
454+ ASSERT_EQ(sqlite3_exec(db, "SELECT blocksize(0, 'KiBGiB')", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* suffix is too long */
455455
456456 sqlite3_close(db);
457457}
@@ -464,12 +464,13 @@ TEST(addqueryfuncs, human_readable_size) {
464464 ASSERT_EQ(addqueryfuncs(db), 0);
465465
466466 char query[MAXSQL] = {};
467- char output[MAXPATH] = {};
467+ char buf[MAXPATH] = {};
468+ char *output = buf;
468469
469470 size_t size = 1;
470471
471472 SNPRINTF(query, MAXSQL, "SELECT human_readable_size(%zu);", size);
472- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
473+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, & output, nullptr), SQLITE_OK);
473474 EXPECT_STREQ(output, "1.0");
474475
475476 // greater than 1K - has unit suffix
@@ -479,13 +480,13 @@ TEST(addqueryfuncs, human_readable_size) {
479480 size *= 1024;
480481
481482 SNPRINTF(query, MAXSQL, "SELECT human_readable_size(%zu);", size + (size / 10));
482- ASSERT_EQ(sqlite3_exec(db, query, str_output, output, nullptr), SQLITE_OK);
483+ ASSERT_EQ(sqlite3_exec(db, query, copy_columns_callback, & output, nullptr), SQLITE_OK);
483484 SNPRINTF(expected, MAXPATH, "1.1%c", SIZE[i]);
484485 EXPECT_STREQ(output, expected);
485486 }
486487
487- ASSERT_EQ(sqlite3_exec(db, "SELECT human_readable_size('');", str_output , nullptr, nullptr), SQLITE_ERROR); /* empty input */
488- ASSERT_EQ(sqlite3_exec(db, "SELECT human_readable_size('abc');", str_output , nullptr, nullptr), SQLITE_ERROR); /* non-integer input */
488+ ASSERT_EQ(sqlite3_exec(db, "SELECT human_readable_size('');", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* empty input */
489+ ASSERT_EQ(sqlite3_exec(db, "SELECT human_readable_size('abc');", copy_columns_callback , nullptr, nullptr), SQLITE_ERROR); /* non-integer input */
489490
490491 sqlite3_close(db);
491492}
@@ -501,8 +502,9 @@ TEST(addqueryfuncs, level) {
501502 for(work.level = 0; work.level < 10; work.level++) {
502503 ASSERT_EQ(addqueryfuncs_with_context(db, &work), 0);
503504
504- char output[MAXPATH] = {};
505- ASSERT_EQ(sqlite3_exec(db, "SELECT level()", str_output, output, nullptr), SQLITE_OK);
505+ char buf[MAXPATH] = {};
506+ char *output = buf;
507+ ASSERT_EQ(sqlite3_exec(db, "SELECT level()", copy_columns_callback, &output, nullptr), SQLITE_OK);
506508
507509 char expected[MAXPATH] = {};
508510 SNPRINTF(expected, MAXPATH, "%zu", work.level);
@@ -525,8 +527,9 @@ TEST(addqueryfuncs, starting_point) {
525527
526528 ASSERT_EQ(addqueryfuncs_with_context(db, &work), 0);
527529
528- char output[MAXPATH] = {};
529- ASSERT_EQ(sqlite3_exec(db, "SELECT starting_point()", str_output, output, nullptr), SQLITE_OK);
530+ char buf[MAXPATH] = {};
531+ char *output = buf;
532+ ASSERT_EQ(sqlite3_exec(db, "SELECT starting_point()", copy_columns_callback, &output, nullptr), SQLITE_OK);
530533
531534 EXPECT_STREQ(output, work.orig_root.data);
532535
@@ -540,31 +543,32 @@ TEST(addqueryfuncs, basename) {
540543
541544 ASSERT_EQ(addqueryfuncs(db), 0);
542545
543- char output[MAXPATH] = {};
546+ char buf[MAXPATH] = {};
547+ char *output = buf;
544548
545549 /* from basename(3) manpage */
546550
547- ASSERT_EQ(sqlite3_exec(db, "SELECT basename('/usr/lib')", str_output, output, nullptr), SQLITE_OK);
551+ ASSERT_EQ(sqlite3_exec(db, "SELECT basename('/usr/lib')", copy_columns_callback, & output, nullptr), SQLITE_OK);
548552 EXPECT_STREQ(output, "lib");
549553
550- ASSERT_EQ(sqlite3_exec(db, "SELECT basename('/usr/')", str_output, output, nullptr), SQLITE_OK);
554+ ASSERT_EQ(sqlite3_exec(db, "SELECT basename('/usr/')", copy_columns_callback, & output, nullptr), SQLITE_OK);
551555 EXPECT_STREQ(output, "usr");
552556
553- ASSERT_EQ(sqlite3_exec(db, "SELECT basename('usr')", str_output, output, nullptr), SQLITE_OK);
557+ ASSERT_EQ(sqlite3_exec(db, "SELECT basename('usr')", copy_columns_callback, & output, nullptr), SQLITE_OK);
554558 EXPECT_STREQ(output, "usr");
555559
556- ASSERT_EQ(sqlite3_exec(db, "SELECT basename('/')", str_output, output, nullptr), SQLITE_OK);
560+ ASSERT_EQ(sqlite3_exec(db, "SELECT basename('/')", copy_columns_callback, & output, nullptr), SQLITE_OK);
557561 EXPECT_STREQ(output, "/");
558562
559- ASSERT_EQ(sqlite3_exec(db, "SELECT basename('.')", str_output, output, nullptr), SQLITE_OK);
563+ ASSERT_EQ(sqlite3_exec(db, "SELECT basename('.')", copy_columns_callback, & output, nullptr), SQLITE_OK);
560564 EXPECT_STREQ(output, ".");
561565
562- ASSERT_EQ(sqlite3_exec(db, "SELECT basename('..')", str_output, output, nullptr), SQLITE_OK);
566+ ASSERT_EQ(sqlite3_exec(db, "SELECT basename('..')", copy_columns_callback, & output, nullptr), SQLITE_OK);
563567 EXPECT_STREQ(output, "..");
564568
565569 /* not from manpage */
566570
567- ASSERT_EQ(sqlite3_exec(db, "SELECT basename(NULL)", str_output, output, nullptr), SQLITE_OK);
571+ ASSERT_EQ(sqlite3_exec(db, "SELECT basename(NULL)", copy_columns_callback, & output, nullptr), SQLITE_OK);
568572 EXPECT_STREQ(output, "");
569573
570574 sqlite3_close(db);
0 commit comments