Skip to content

Commit 9fa5746

Browse files
committed
Added wrapper for vfs_copy_dir() function
I noticed this function was missing when writing up a tutorial on VFS, so this is my attempt at wrapping it.
1 parent b461048 commit 9fa5746

File tree

6 files changed

+128
-24
lines changed

6 files changed

+128
-24
lines changed

NAMESPACE

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ export(tiledb_subarray_to_query)
298298
export(tiledb_version)
299299
export(tiledb_vfs)
300300
export(tiledb_vfs_close)
301+
export(tiledb_vfs_copy_dir)
301302
export(tiledb_vfs_copy_file)
302303
export(tiledb_vfs_create_bucket)
303304
export(tiledb_vfs_create_dir)

R/RcppExports.R

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,10 @@ libtiledb_vfs_copy_file <- function(vfs, old_uri, new_uri) {
953953
.Call(`_tiledb_libtiledb_vfs_copy_file`, vfs, old_uri, new_uri)
954954
}
955955

956+
libtiledb_vfs_copy_dir <- function(vfs, old_uri, new_uri) {
957+
.Call(`_tiledb_libtiledb_vfs_copy_dir`, vfs, old_uri, new_uri)
958+
}
959+
956960
libtiledb_vfs_fh_free <- function(fhxp) {
957961
invisible(.Call(`_tiledb_libtiledb_vfs_fh_free`, fhxp))
958962
}

R/VFS.R

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ tiledb_vfs_serialize <- function(obj, uri, vfs = tiledb_get_vfs()) {
505505
#' @param file Character variable with a local file path
506506
#' @param uri Character variable with a URI describing a file path
507507
#' @param vfs A TileDB VFS object; default is to use a cached value.
508-
#' @return The uri value of the removed file
508+
#' @return The uri value of the copied file
509509
#' @export
510510
tiledb_vfs_copy_file <- function(file, uri, vfs = tiledb_get_vfs()) {
511511
stopifnot(
@@ -517,6 +517,24 @@ tiledb_vfs_copy_file <- function(file, uri, vfs = tiledb_get_vfs()) {
517517
libtiledb_vfs_copy_file(vfs@ptr, file, uri)
518518
}
519519

520+
#' Copy a directory recursively to VFS
521+
#'
522+
#' @param dir Character variable with a local directory path
523+
#' @param uri Character variable with a URI describing a directory path
524+
#' @param vfs A TileDB VFS object; default is to use a cached value.
525+
#' @return The uri value of the copied directory
526+
#' @export
527+
tiledb_vfs_copy_dir <- function(dir, uri, vfs = tiledb_get_vfs()) {
528+
stopifnot(
529+
"Argument 'vfs' must be a tiledb_vfs object" = is(vfs, "tiledb_vfs"),
530+
"Argument 'uri' must be character" = is.character(uri),
531+
"Argument 'dir' must be character and point to a directory" =
532+
is.character(uri) && dir.exists(dir),
533+
"Directory with 'uri' already exists" = !dir.exists(uri)
534+
)
535+
libtiledb_vfs_copy_dir(vfs@ptr, dir, uri)
536+
}
537+
520538
#' Recursively list objects from given URI
521539
#'
522540
#' This functionality is currently limited to S3 URIs.

inst/tinytest/test_vfs.R

Lines changed: 82 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,94 @@ expect_true(is(vfs, "tiledb_vfs"))
1111
## create/remove/is/is_empty/empty bucket hard to test without credentials
1212

1313
#test_that("tiledb_vfs create / test / remove directory", {
14+
15+
# Create/copy/move/remove directory
1416
vfs <- tiledb_vfs()
15-
uri <- tempfile()
16-
17-
expect_equal(tiledb_vfs_create_dir(uri), uri)
18-
## check directly
19-
expect_true(dir.exists(uri))
20-
## check via VFS
21-
expect_true(tiledb_vfs_is_dir(uri))
22-
23-
newuri <- tempfile()
24-
expect_equal(tiledb_vfs_move_dir(uri, newuri), newuri)
25-
expect_equal(tiledb_vfs_remove_dir(newuri), newuri)
26-
expect_false(dir.exists(newuri))
17+
base_path <- tempdir()
18+
dir_uri <- file.path(base_path, "dir_uri")
19+
20+
## Create directory
21+
expect_equal(tiledb_vfs_create_dir(dir_uri), dir_uri)
22+
### check directly
23+
expect_true(dir.exists(dir_uri))
24+
### check via VFS
25+
expect_true(tiledb_vfs_is_dir(dir_uri))
26+
27+
## Check dir size
28+
expect_equal(tiledb_vfs_dir_size(dir_uri), 0)
29+
30+
## Create a file in dir_uri to make sure move_dir and copy_dir work
31+
file_name <- "test.txt"
32+
file_uri <- file.path(dir_uri, file_name)
33+
expect_equal(tiledb_vfs_touch(file_uri), file_uri)
34+
35+
## Copy directory
36+
copy_dir_uri <- file.path(base_path, "copy_dir_uri")
37+
expect_equal(tiledb_vfs_copy_dir(dir_uri, copy_dir_uri), copy_dir_uri)
38+
39+
### Check both directories exist
40+
expect_true(dir.exists(dir_uri))
41+
expect_true(dir.exists(copy_dir_uri))
42+
43+
### Check both files exist
44+
copy_file_uri <- file.path(copy_dir_uri, file_name)
45+
expect_true(file.exists(file_uri))
46+
expect_true(file.exists(copy_file_uri))
47+
48+
## Move directory
49+
move_dir_uri <- file.path(base_path, "move_dir_uri")
50+
expect_equal(tiledb_vfs_move_dir(dir_uri, move_dir_uri), move_dir_uri)
51+
52+
### Check only new directory exists
53+
expect_false(dir.exists(dir_uri))
54+
expect_true(dir.exists(copy_dir_uri))
55+
56+
### Check only new file exists
57+
move_file_uri <- file.path(move_dir_uri, file_name)
58+
expect_false(file.exists(file_uri))
59+
expect_true(file.exists(move_file_uri))
60+
61+
## Remove directory
62+
expect_equal(tiledb_vfs_remove_dir(move_dir_uri), move_dir_uri)
63+
64+
### Check the moved file and directory no longer exist
65+
expect_false(dir.exists(move_dir_uri))
66+
expect_false(file.exists(move_file_uri))
67+
2768
#})
2869

70+
# Create/copy/move/remove file
71+
2972
#test_that("tiledb_vfs create / test / remove file", {
3073
vfs <- tiledb_vfs()
31-
uri <- tempfile()
74+
file_uri <- tempfile()
75+
76+
## Touch file
77+
expect_equal(tiledb_vfs_touch(file_uri), file_uri)
78+
expect_true(file.exists(file_uri))
79+
expect_true(tiledb_vfs_is_file(file_uri))
3280

33-
expect_equal(tiledb_vfs_touch(uri), uri)
34-
expect_true(tiledb_vfs_is_file(uri))
81+
### Check file exists via VFS
82+
expect_true(tiledb_vfs_is_file(file_uri))
3583

36-
## check via VFS
37-
expect_true(tiledb_vfs_is_file(uri))
84+
### check file size via VFS
85+
expect_equal(tiledb_vfs_file_size(file_uri), 0)
3886

39-
## check via VFS
40-
expect_equal(tiledb_vfs_file_size(uri), 0)
87+
## Copy file
88+
copy_file_uri <- tempfile()
89+
expect_equal(tiledb_vfs_copy_file(file_uri, copy_file_uri), copy_file_uri)
90+
expect_true(file.exists(file_uri))
91+
expect_true(file.exists(copy_file_uri))
4192

42-
newuri <- tempfile()
43-
expect_equal(tiledb_vfs_move_file(uri, newuri), newuri)
44-
expect_equal(tiledb_vfs_remove_file(newuri), newuri)
45-
expect_false(file.exists(newuri))
93+
## Move file
94+
move_file_uri <- tempfile()
95+
expect_equal(tiledb_vfs_move_file(file_uri, move_file_uri), move_file_uri)
96+
expect_false(file.exists(file_uri))
97+
expect_true(file.exists(move_file_uri))
98+
99+
## Remove file
100+
expect_equal(tiledb_vfs_remove_file(move_file_uri), move_file_uri)
101+
expect_false(file.exists(move_file_uri))
46102

47103
#})
48104

@@ -62,6 +118,9 @@ if (requireNamespace("palmerpenguins", quietly=TRUE)) {
62118
uriser <- tempfile()
63119
expect_equal(tiledb_vfs_serialize(pp, uriser), uriser)
64120

121+
## Check file has contents
122+
expect_false(tiledb_vfs_file_size(uriser) == 0)
123+
65124
expect_equal(pp, tiledb_vfs_unserialize(uriser))
66125
}
67126

src/RcppExports.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2851,6 +2851,19 @@ BEGIN_RCPP
28512851
return rcpp_result_gen;
28522852
END_RCPP
28532853
}
2854+
// libtiledb_vfs_copy_dir
2855+
std::string libtiledb_vfs_copy_dir(XPtr<tiledb::VFS> vfs, std::string old_uri, std::string new_uri);
2856+
RcppExport SEXP _tiledb_libtiledb_vfs_copy_dir(SEXP vfsSEXP, SEXP old_uriSEXP, SEXP new_uriSEXP) {
2857+
BEGIN_RCPP
2858+
Rcpp::RObject rcpp_result_gen;
2859+
Rcpp::RNGScope rcpp_rngScope_gen;
2860+
Rcpp::traits::input_parameter< XPtr<tiledb::VFS> >::type vfs(vfsSEXP);
2861+
Rcpp::traits::input_parameter< std::string >::type old_uri(old_uriSEXP);
2862+
Rcpp::traits::input_parameter< std::string >::type new_uri(new_uriSEXP);
2863+
rcpp_result_gen = Rcpp::wrap(libtiledb_vfs_copy_dir(vfs, old_uri, new_uri));
2864+
return rcpp_result_gen;
2865+
END_RCPP
2866+
}
28542867
// libtiledb_vfs_fh_free
28552868
void libtiledb_vfs_fh_free(XPtr<vfs_fh_t> fhxp);
28562869
RcppExport SEXP _tiledb_libtiledb_vfs_fh_free(SEXP fhxpSEXP) {
@@ -3976,6 +3989,7 @@ static const R_CallMethodDef CallEntries[] = {
39763989
{"_tiledb_libtiledb_vfs_dir_size", (DL_FUNC) &_tiledb_libtiledb_vfs_dir_size, 2},
39773990
{"_tiledb_libtiledb_vfs_ls", (DL_FUNC) &_tiledb_libtiledb_vfs_ls, 2},
39783991
{"_tiledb_libtiledb_vfs_copy_file", (DL_FUNC) &_tiledb_libtiledb_vfs_copy_file, 3},
3992+
{"_tiledb_libtiledb_vfs_copy_dir", (DL_FUNC) &_tiledb_libtiledb_vfs_copy_dir, 3},
39793993
{"_tiledb_libtiledb_vfs_fh_free", (DL_FUNC) &_tiledb_libtiledb_vfs_fh_free, 1},
39803994
{"_tiledb_libtiledb_vfs_ls_recursive", (DL_FUNC) &_tiledb_libtiledb_vfs_ls_recursive, 3},
39813995
{"_tiledb_libtiledb_stats_enable", (DL_FUNC) &_tiledb_libtiledb_stats_enable, 0},

src/libtiledb.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4846,6 +4846,14 @@ std::string libtiledb_vfs_copy_file(XPtr<tiledb::VFS> vfs, std::string old_uri,
48464846
return new_uri;
48474847
}
48484848

4849+
// [[Rcpp::export]]
4850+
std::string libtiledb_vfs_copy_dir(XPtr<tiledb::VFS> vfs, std::string old_uri,
4851+
std::string new_uri) {
4852+
check_xptr_tag<tiledb::VFS>(vfs);
4853+
vfs->copy_dir(old_uri, new_uri);
4854+
return new_uri;
4855+
}
4856+
48494857
// [[Rcpp::export]]
48504858
void libtiledb_vfs_fh_free(XPtr<vfs_fh_t> fhxp) {
48514859
check_xptr_tag<vfs_fh_t>(fhxp);

0 commit comments

Comments
 (0)