Skip to content

Commit

Permalink
replace subdirs_walked() with subdirs(srollsubdirs, sroll)
Browse files Browse the repository at this point in the history
vrsummary computes the number of subdirectories each row has at runtime
added to vrsummary instead of summary because this function returns the correct value when the index is rolled up
  • Loading branch information
calccrypto committed Oct 30, 2023
1 parent d7f5751 commit 4c28be4
Show file tree
Hide file tree
Showing 7 changed files with 169 additions and 13 deletions.
9 changes: 5 additions & 4 deletions docs/latex/sections/addqueryfuncs.tex
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,11 @@ \subsection{SQLite Functions}
\hline
\texttt{starting\_point()} & Path of the starting directory \\
\hline
\texttt{subdirs\_walked()} & Number of subdirectories that were enqueued while processing \\
& the current directory. This function will return 0 if the \\
& current directory was rolled up. Only available in \texttt{-S} \\
& and \texttt{-E}. Not recommended for use with \texttt{-E}.\\
\texttt{subdirs(srollsubdirs, sroll)} & Number of subdirectories under a directory. Only \\
& available for use with \vrsummary. When the index \\
& is not rolled up, the value is retrieved from C. \\
& When the index is rolled up, the value is retrieved \\
& from \vrsummary. \\
\hline
\end{tabular}
\end{table}
Expand Down
2 changes: 1 addition & 1 deletion src/dbutils.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ static const char SUMMARY_INSERT[] =

const char VRSUMMARY_CREATE[] =
DROP_VIEW(VRSUMMARY)
"CREATE VIEW " VRSUMMARY " AS SELECT REPLACE(" SUMMARY ".name, RTRIM(" SUMMARY ".name, REPLACE(" SUMMARY ".name, '/', '')), '') AS dname, " SUMMARY ".name AS sname, " SUMMARY ".rollupscore AS sroll, " SUMMARY ".* FROM " SUMMARY ";";
"CREATE VIEW " VRSUMMARY " AS SELECT REPLACE(" SUMMARY ".name, RTRIM(" SUMMARY ".name, REPLACE(" SUMMARY ".name, '/', '')), '') AS dname, " SUMMARY ".name AS sname, " SUMMARY ".rollupscore AS sroll, (SELECT COUNT(*) FROM " SUMMARY " AS c WHERE c.pinode == " SUMMARY ".inode) AS srollsubdirs, " SUMMARY ".* FROM " SUMMARY ";";

const char PENTRIES_ROLLUP_CREATE[] =
DROP_TABLE(PENTRIES_ROLLUP)
Expand Down
23 changes: 17 additions & 6 deletions src/gufi_query/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -275,12 +275,23 @@ int count_rows(void *args, int count, char **data, char **columns) {
return 0;
}

static void subdirs_walked(sqlite3_context *context, int argc, sqlite3_value **argv) {
/*
* SELECT subdirs(srollsubdirs, sroll) FROM vrsummary;
*
* custom sqlite function for getting number of subdirectories under current directory
*/
static void subdirs(sqlite3_context *context, int argc, sqlite3_value **argv) {
(void) argc; (void) argv;
size_t *subdirs_walked_count = (size_t *) sqlite3_user_data(context);

sqlite3_result_int64(context, *subdirs_walked_count);
return;
const int rollupscore = sqlite3_value_int(argv[1]);
if (rollupscore == 0) {
size_t *subdirs_walked_count = (size_t *) sqlite3_user_data(context);
sqlite3_result_int64(context, *subdirs_walked_count);
}
else {
const int64_t rollup_subdirs = sqlite3_value_int64(argv[0]);
sqlite3_result_int64(context, rollup_subdirs);
}
}

int processdir(QPTPool_t *ctx, const size_t id, void *data, void *args) {
Expand Down Expand Up @@ -419,8 +430,8 @@ int processdir(QPTPool_t *ctx, const size_t id, void *data, void *args) {
}

if (db) {
if (sqlite3_create_function(db, "subdirs_walked", 0, SQLITE_UTF8,
&subdirs_walked_count, &subdirs_walked,
if (sqlite3_create_function(db, "subdirs", 2, SQLITE_UTF8,
&subdirs_walked_count, &subdirs,
NULL, NULL) != SQLITE_OK) {
fprintf(stderr, "Warning: Could not create subdirs_walked function: %s (%d)\n",
sqlite3_errmsg(db), sqlite3_errcode(db));
Expand Down
2 changes: 1 addition & 1 deletion test/regression/gufi_query.expected
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ unusual, name?#
writable

# Get number of subdirectories
$ gufi_query -d " " -S "SELECT rpath(sname, sroll), subdirs_walked() FROM vrsummary;" "prefix"
$ gufi_query -d " " -S "SELECT rpath(sname, sroll), subdirs(srollsubdirs, sroll) FROM vrsummary;" "prefix"
prefix 3
prefix/directory 1
prefix/directory/subdirectory 0
Expand Down
2 changes: 1 addition & 1 deletion test/regression/gufi_query.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ echo "# Get all directory and non-directory names"
run_sort "${GUFI_QUERY} -d \" \" -S \"SELECT name FROM vrsummary;\" -E \"SELECT name FROM vrpentries;\" \"${INDEXROOT}\""

echo "# Get number of subdirectories"
run_sort "${GUFI_QUERY} -d \" \" -S \"SELECT rpath(sname, sroll), subdirs_walked() FROM vrsummary;\" \"${INDEXROOT}\""
run_sort "${GUFI_QUERY} -d \" \" -S \"SELECT rpath(sname, sroll), subdirs(srollsubdirs, sroll) FROM vrsummary;\" \"${INDEXROOT}\""

echo "# Get relative paths of all directories and non-directories ascending names"
run_no_sort "${GUFI_QUERY} -d \" \" -a -I \"CREATE TABLE out(path TEXT);\" -K \"CREATE TABLE aggregate(path TEXT);\" -S \"INSERT INTO out SELECT rpath(sname, sroll) FROM vrsummary;\" -E \"INSERT INTO out SELECT rpath(sname, sroll) || '/' || name FROM vrpentries;\" -J \"INSERT INTO aggregate SELECT path FROM out;\" -G \"SELECT path FROM aggregate ORDER BY path ASC;\" \"${INDEXROOT}\""
Expand Down
142 changes: 142 additions & 0 deletions test/regression/gufi_rollup.expected
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,77 @@ $ gufi_query -d " " -E "SELECT rpath(sname, sroll) || '/' || name FROM vrpentrie
$ gufi_query -d " " -S "SELECT rpath(sname, sroll) FROM vrsummary;" -E "SELECT rpath(sname, sroll) || '/' || name FROM vrpentries;" "prefix" | wc -l
165

$ gufi_query -d " " -S "SELECT rpath(sname, sroll), subdirs(srollsubdirs, sroll) FROM vrsummary;" "prefix"
prefix 4
prefix/o+rx 4
prefix/o+rx/o+rx 3
prefix/o+rx/o+rx/dir1 0
prefix/o+rx/o+rx/dir2 0
prefix/o+rx/o+rx/dir3 0
prefix/o+rx/u 3
prefix/o+rx/u/dir1 0
prefix/o+rx/u/dir2 0
prefix/o+rx/u/dir3 0
prefix/o+rx/ug 3
prefix/o+rx/ug/dir1 0
prefix/o+rx/ug/dir2 0
prefix/o+rx/ug/dir3 0
prefix/o+rx/ugo 3
prefix/o+rx/ugo/dir1 0
prefix/o+rx/ugo/dir2 0
prefix/o+rx/ugo/dir3 0
prefix/u 4
prefix/u/o+rx 3
prefix/u/o+rx/dir1 0
prefix/u/o+rx/dir2 0
prefix/u/o+rx/dir3 0
prefix/u/u 3
prefix/u/u/dir1 0
prefix/u/u/dir2 0
prefix/u/u/dir3 0
prefix/u/ug 3
prefix/u/ug/dir1 0
prefix/u/ug/dir2 0
prefix/u/ug/dir3 0
prefix/u/ugo 3
prefix/u/ugo/dir1 0
prefix/u/ugo/dir2 0
prefix/u/ugo/dir3 0
prefix/ug 4
prefix/ug/o+rx 3
prefix/ug/o+rx/dir1 0
prefix/ug/o+rx/dir2 0
prefix/ug/o+rx/dir3 0
prefix/ug/u 3
prefix/ug/u/dir1 0
prefix/ug/u/dir2 0
prefix/ug/u/dir3 0
prefix/ug/ug 3
prefix/ug/ug/dir1 0
prefix/ug/ug/dir2 0
prefix/ug/ug/dir3 0
prefix/ug/ugo 3
prefix/ug/ugo/dir1 0
prefix/ug/ugo/dir2 0
prefix/ug/ugo/dir3 0
prefix/ugo 4
prefix/ugo/o+rx 3
prefix/ugo/o+rx/dir1 0
prefix/ugo/o+rx/dir2 0
prefix/ugo/o+rx/dir3 0
prefix/ugo/u 3
prefix/ugo/u/dir1 0
prefix/ugo/u/dir2 0
prefix/ugo/u/dir3 0
prefix/ugo/ug 3
prefix/ugo/ug/dir1 0
prefix/ugo/ug/dir2 0
prefix/ugo/ug/dir3 0
prefix/ugo/ugo 3
prefix/ugo/ugo/dir1 0
prefix/ugo/ugo/dir2 0
prefix/ugo/ugo/dir3 0

$ gufi_query -d " " -T "SELECT rpath(vrsummary.sname, vrsummary.sroll) || ':', 'totalsubdirs:', treesummary.totsubdirs, 'maxsubdirfiles:', treesummary.maxsubdirfiles, 'totfiles:', treesummary.totfiles FROM treesummary, vrsummary WHERE vrsummary.isroot == 1" "prefix"
prefix/o+rx/o+rx: totalsubdirs: 3 maxsubdirfiles: 3 totfiles: 6
prefix/o+rx/u: totalsubdirs: 3 maxsubdirfiles: 3 totfiles: 6
Expand Down Expand Up @@ -714,6 +785,77 @@ $ gufi_query -d " " -E "SELECT rpath(sname, sroll) || '/' || name FROM vrpentrie
$ gufi_query -d " " -S "SELECT rpath(sname, sroll) FROM vrsummary;" -E "SELECT rpath(sname, sroll) || '/' || name FROM vrpentries;" "prefix" | wc -l
165

$ gufi_query -d " " -S "SELECT rpath(sname, sroll), subdirs(srollsubdirs, sroll) FROM vrsummary;" "prefix"
prefix 4
prefix/o+rx 4
prefix/o+rx/o+rx 3
prefix/o+rx/o+rx/dir1 0
prefix/o+rx/o+rx/dir2 0
prefix/o+rx/o+rx/dir3 0
prefix/o+rx/u 3
prefix/o+rx/u/dir1 0
prefix/o+rx/u/dir2 0
prefix/o+rx/u/dir3 0
prefix/o+rx/ug 3
prefix/o+rx/ug/dir1 0
prefix/o+rx/ug/dir2 0
prefix/o+rx/ug/dir3 0
prefix/o+rx/ugo 3
prefix/o+rx/ugo/dir1 0
prefix/o+rx/ugo/dir2 0
prefix/o+rx/ugo/dir3 0
prefix/u 4
prefix/u/o+rx 3
prefix/u/o+rx/dir1 0
prefix/u/o+rx/dir2 0
prefix/u/o+rx/dir3 0
prefix/u/u 3
prefix/u/u/dir1 0
prefix/u/u/dir2 0
prefix/u/u/dir3 0
prefix/u/ug 3
prefix/u/ug/dir1 0
prefix/u/ug/dir2 0
prefix/u/ug/dir3 0
prefix/u/ugo 3
prefix/u/ugo/dir1 0
prefix/u/ugo/dir2 0
prefix/u/ugo/dir3 0
prefix/ug 4
prefix/ug/o+rx 3
prefix/ug/o+rx/dir1 0
prefix/ug/o+rx/dir2 0
prefix/ug/o+rx/dir3 0
prefix/ug/u 3
prefix/ug/u/dir1 0
prefix/ug/u/dir2 0
prefix/ug/u/dir3 0
prefix/ug/ug 3
prefix/ug/ug/dir1 0
prefix/ug/ug/dir2 0
prefix/ug/ug/dir3 0
prefix/ug/ugo 3
prefix/ug/ugo/dir1 0
prefix/ug/ugo/dir2 0
prefix/ug/ugo/dir3 0
prefix/ugo 4
prefix/ugo/o+rx 3
prefix/ugo/o+rx/dir1 0
prefix/ugo/o+rx/dir2 0
prefix/ugo/o+rx/dir3 0
prefix/ugo/u 3
prefix/ugo/u/dir1 0
prefix/ugo/u/dir2 0
prefix/ugo/u/dir3 0
prefix/ugo/ug 3
prefix/ugo/ug/dir1 0
prefix/ugo/ug/dir2 0
prefix/ugo/ug/dir3 0
prefix/ugo/ugo 3
prefix/ugo/ugo/dir1 0
prefix/ugo/ugo/dir2 0
prefix/ugo/ugo/dir3 0

$ gufi_query -d " " -T "SELECT rpath(vrsummary.sname, vrsummary.sroll) || ':', 'totalsubdirs:', treesummary.totsubdirs, 'maxsubdirfiles:', treesummary.maxsubdirfiles, 'totfiles:', treesummary.totfiles FROM treesummary, vrsummary WHERE vrsummary.isroot == 1" "prefix"
prefix/o+rx/o+rx/dir1: totalsubdirs: 0 maxsubdirfiles: 1 totfiles: 1
prefix/o+rx/o+rx/dir2: totalsubdirs: 0 maxsubdirfiles: 2 totfiles: 2
Expand Down
2 changes: 2 additions & 0 deletions test/regression/gufi_rollup.sh.in
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ do_tests() {
run_no_sort "${GUFI_QUERY} -d \" \" -E \"SELECT rpath(sname, sroll) || '/' || name FROM vrpentries;\" \"${SEARCH}\" | wc -l"
run_no_sort "${GUFI_QUERY} -d \" \" -S \"SELECT rpath(sname, sroll) FROM vrsummary;\" -E \"SELECT rpath(sname, sroll) || '/' || name FROM vrpentries;\" \"${SEARCH}\" | wc -l"

run_sort "${GUFI_QUERY} -d \" \" -S \"SELECT rpath(sname, sroll), subdirs(srollsubdirs, sroll) FROM vrsummary;\" \"${SEARCH}\""

run_sort "${GUFI_QUERY} -d \" \" -T \"SELECT rpath(vrsummary.sname, vrsummary.sroll) || ':', 'totalsubdirs:', treesummary.totsubdirs, 'maxsubdirfiles:', treesummary.maxsubdirfiles, 'totfiles:', treesummary.totfiles FROM treesummary, vrsummary WHERE vrsummary.isroot == 1\" \"${INDEXROOT}\""

run_no_sort "${GUFI_FIND} -type d | wc -l"
Expand Down

0 comments on commit 4c28be4

Please sign in to comment.