From 01a8933cca3009b598813ebb832e8654263e0b92 Mon Sep 17 00:00:00 2001 From: Thomas Roh Date: Sun, 15 Jan 2023 07:17:57 -0800 Subject: [PATCH 1/7] version 0.4 ready for submission --- .Rbuildignore | 2 + .lintr | 10 + DESCRIPTION | 7 +- NAMESPACE | 10 + NEWS.md | 39 +- R/bcp.R | 749 +++++++++++++++-------- README.md | 330 +++++----- _pkgdown.yml | 2 +- bcputility.Rproj | 4 +- docs/404.html | 32 +- docs/LICENSE-text.html | 6 +- docs/LICENSE.html | 6 +- docs/authors.html | 10 +- docs/index.html | 616 ++++++++++--------- docs/news/index.html | 40 +- docs/pkgdown.yml | 9 +- docs/reference/SQLServerCLIVersions.html | 91 +++ docs/reference/bcpExport.html | 86 +-- docs/reference/bcpImport.html | 125 ++-- docs/reference/createTable.html | 115 ++++ docs/reference/figures/benchmarks.png | Bin 67638 -> 68844 bytes docs/reference/index.html | 28 +- docs/reference/makeConnectArgs.html | 133 ++++ docs/reference/mapDataTypes.html | 129 ++++ docs/sitemap.xml | 33 +- man/SQLServerCLIVersions.Rd | 18 + man/bcpExport.Rd | 45 +- man/bcpImport.Rd | 75 +-- man/createTable.Rd | 33 + man/figures/benchmarks.png | Bin 67638 -> 68844 bytes man/makeConnectArgs.Rd | 40 ++ man/mapDataTypes.Rd | 43 ++ tests/a-init-db.R | 53 ++ tests/b-import-db.R | 229 +++++++ tests/c-export-db.R | 78 +++ tests/d-types.R | 42 ++ 36 files changed, 2275 insertions(+), 993 deletions(-) create mode 100644 .lintr create mode 100644 docs/reference/SQLServerCLIVersions.html create mode 100644 docs/reference/createTable.html create mode 100644 docs/reference/makeConnectArgs.html create mode 100644 docs/reference/mapDataTypes.html create mode 100644 man/SQLServerCLIVersions.Rd create mode 100644 man/createTable.Rd create mode 100644 man/makeConnectArgs.Rd create mode 100644 man/mapDataTypes.Rd create mode 100644 tests/a-init-db.R create mode 100644 tests/b-import-db.R create mode 100644 tests/c-export-db.R create mode 100644 tests/d-types.R diff --git a/.Rbuildignore b/.Rbuildignore index f112b7e..6c1e194 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,3 +9,5 @@ _pkgdown.yml ^pkgdown/ ^inst/tests$ +TODO.md +^.lintr$ diff --git a/.lintr b/.lintr new file mode 100644 index 0000000..725fd27 --- /dev/null +++ b/.lintr @@ -0,0 +1,10 @@ +linters: linters_with_defaults( + line_length_linter(80), + single_quotes_linter = NULL, + object_name_linter = object_name_linter("camelCase") + ) +encoding: "UTF-8" +exclusions: list( + "inst/", + "tests/" + ) diff --git a/DESCRIPTION b/DESCRIPTION index 9260556..224cf21 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,13 +1,14 @@ Package: bcputility Type: Package Title: Wrapper for SQL Server bcp Utility -Version: 0.3.1 +Version: 0.4.0 Authors@R: person("Thomas", "Roh", email = "thomas@roh.engineering", role = c("aut", "cre")) Description: Provides functions to utilize a command line utility that does bulk inserts and exports from SQL Server databases. License: MIT + file LICENSE Encoding: UTF-8 -RoxygenNote: 7.2.0 +RoxygenNote: 7.2.2 SystemRequirements: bcp Utility -Imports: data.table, DBI, odbc, sf +Imports: data.table, sf, methods +Suggests: blob URL: https://bcputility.roh.engineering, https://github.com/tomroh/bcputility BugReports: https://github.com/tomroh/bcputility/issues diff --git a/NAMESPACE b/NAMESPACE index 5ee7e80..8345a2a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -2,3 +2,13 @@ export(bcpExport) export(bcpImport) +export(bcpVersion) +export(checkTableExists) +export(createTable) +export(dropTable) +export(int) +export(makeConnectArgs) +export(mapDataTypes) +export(sqlcmdVersion) +export(varBinary) +export(varChar) diff --git a/NEWS.md b/NEWS.md index 8b70e27..c28785e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,41 @@ -# bcputility 0.3.1 +# bcputility 0.4.0 + +* Override/set path to sqlcmd with +`options(bcputility.sqlcmd.path = "")` + +* Added `bcpVersion` and `sqlcmdVersion` to check versions. + +* Specify tables without schema strictly as a character vector of size 1 e.g. +".". The schema and table will be quoted although special +characters are not recommended except for "_". + +* Tests have been added that can run against a local instance of SQL Server. +These do not work without it as SQL Server is a client/server configuration. + +* The README has been updated for new syntax and updated benchmarks. + +* `bcpImport` and `bcpExport` gain a bcpOptions argument that allows the user +to include any options from the CLI. See documentation for formatting and +specification. + +* The connections arguments for `bcpImport` and `bcpExport` have been +deprecated--server, database, username, password, trustedconnection. Use +`makeConnectArgs` for the connectargs argument which adds Azure AD +authentication and the option to disregard the trust server certificate. + +* The "DBI" dependency has been dropped and all SQL Server queries are run +using bcp or sqlcmd. + +* `mapDataTypes` is a convenience function to determine SQL Server data type +conversions. The defaults attempt to determine the smallest type size for +each column. + +* `createTable`, `dropTable`, and `checkTableExists` have been added for +internals and convenience. The primary purpose would be to define an empty +table with user-defined types that `bcpImport` could append to. + +* logicals no longer need to be converted from `FALSE/TRUE` to `0/1` before +importing in-memory data. * The argument azure was added to `bcpImport` and `bcpExport` for Azure Active Directory authentication. This only works for username and password diff --git a/R/bcp.R b/R/bcp.R index b6974e0..54d02ad 100644 --- a/R/bcp.R +++ b/R/bcp.R @@ -1,58 +1,21 @@ #' Import data to SQL Server #' -#' A wrapper for a system call to the bcp utility which bulk inserts to SQL Server. +#' A wrapper for a system call to the bcp utility which bulk inserts to SQL +#' Server. #' #' @param x #' #' dataframe object or path to file #' -#' @param server -#' -#' the instance of SQL Server to which to connect +#' @param connectargs #' -#' @param database -#' -#' specifies the database to connect to +#' named list of connection arguments. See \link[bcputility]{makeConnectArgs}. #' #' @param table #' -#' Name of the source table when exporting from SQL Server. For specifying the -#' schema in the table name see \code{DBI::SQL} or \code{DBI::Id}. -#' -#' @param driver -#' -#' name of driver for ODBC connection -#' -#' @param maxerrors -#' -#' maximum number of errors allowed -#' -#' @param batchsize -#' -#' number of rows to write at a time; 10,000 to 50,000 is a -#' starting recommendation -#' -#' @param packetsize -#' -#' size of packets to be sent -#' -#' @param regional -#' -#' Specifies that currency, date, and time data is bulk copied into SQL Server -#' using the regional format defined for the locale setting of the client -#' computer -#' -#' @param trustedconnection -#' -#' use integrated security, username and password are not required -#' -#' @param username -#' -#' login ID -#' -#' @param password -#' -#' password for login ID +#' Name of the source table when importing from SQL Server. For specifying the +#' schema in the table name see \code{.
} and if not specified the +#' default is "dbo". #' #' @param fieldterminator #' @@ -68,13 +31,13 @@ #' #' @param spatialtype #' -#' spatial data type for schema \url{https://docs.microsoft.com/en-us/sql/relational-databases/spatial/spatial-data-types-overview}, +#' spatial data type for schema +#' \url{https://docs.microsoft.com/en-us/sql/relational-databases/spatial/spatial-data-types-overview}, #' ignored if \code{x} is not an 'sf' object #' -#' @param azure +#' @param bcpOptions #' -#' use Azure Active Directory authentication, does not work with integrated -#' authentication. +#' list of additional options to pass to the 'bcp' utility. See details. #' #' @param ... #' @@ -99,6 +62,16 @@ #' #' To override the default path to the bcp command line utility, set the #' \code{bcputility.bcp.path} option. +#' To override the default path to the sqlcmd command line utility, set the +#' \code{bcputility.sqlcmd.path} option. +#' +#' The \code{bcpOptions} allows the user to include additional arguments for the +#' call to \code{system2}. Please refer to +#' \url{https://learn.microsoft.com/en-us/sql/tools/bcp-utility}. +#' The default options are set to the defaults for \code{bcp} CLI. \code{-b} +#' refers to number of rows to write at a time; 10,000 to 50,000 is a +#' starting recommendation. \code{-a} refers to size of packets to be sent in +#' bytes. \code{-e} refers to the maximum number of errors before failure. #' #' @return #' @@ -106,172 +79,111 @@ #' #' @export #' -#' @examples -#' \dontrun{ -#' set.seed(33) -#' x <- data.frame( -#' w = rpois(10, 10), -#' x = rnorm(10), -#' y = sample(LETTERS, 10), -#' z = Sys.time() -#' ) -#' bcpImport(x, -#' server = server, -#' database = database, -#' table = 'mytable') -#' } -bcpImport <- function(x, - server, - database, - table, - driver = 'SQL Server', - maxerrors = 10, - batchsize = 1000, - packetsize = 4096, - regional = FALSE, - trustedconnection = TRUE, - username, - password, - fieldterminator = '\t', - rowterminator = ifelse(.Platform$OS.type == 'windows', '\r\n', '\n'), - overwrite = FALSE, - spatialtype = c('geometry', 'geography'), - azure = FALSE, - ...) { - on.exit(if ( exists('con', inherits = FALSE) ) {DBI::dbDisconnect(con)}, add = TRUE) - on.exit(if ( exists('tmp', inherits = FALSE) ) {unlink(tmp)}, add = TRUE) - if ( isTRUE(trustedconnection) & isTRUE(azure) ) { - stop('trustedconnection and azure cannot both be TRUE') - } - if ( isTRUE(trustedconnection) ) { - bcpArgs <- list('-T') - con <- DBI::dbConnect(odbc::odbc(), - driver = driver, - server = server, - database = database, - trusted_connection = 'yes') - } else if ( isTRUE(azure) ) { - bcpArgs <- list('-G', '-U', shQuote(username), '-P', shQuote(password)) - con <- DBI::dbConnect(odbc::odbc(), - driver = driver, - server = server, - database = database, - UID = username, - PWD = password, - Authentication = 'ActiveDirectoryPassword') - - } else { - bcpArgs <- list('-U', shQuote(username), '-P', shQuote(password)) - con <- DBI::dbConnect(odbc::odbc(), - driver = driver, - server = server, - database = database, - UID = username, - PWD = password) - } - # convert to sql class early for Id - if ( inherits(table, 'Id') ) { - table <- DBI::SQL(sprintf('%s.%s', - table@name[['schema']], - table@name[['table']]) - ) +bcpImport <- function( + x, + connectargs, + table, + fieldterminator = '\t', + rowterminator = ifelse(.Platform$OS.type == 'windows', + '\r\n', '\n'), + overwrite = FALSE, + spatialtype = c('geometry', 'geography'), + bcpOptions = list( + '-b', 1000, + '-a', 4096, + '-m', 10 + ), + ...) { + on.exit( + if (exists('tmp', inherits = FALSE)) { + unlink(tmp) + }, + add = TRUE) + if (missing(connectargs)) { + stop('connectargs is missing. See ?bcputility::makeConnectArgs.') } - bcpArgs <- append(bcpArgs, - list( - '-c', - '-b', batchsize, - '-a', packetsize)) - isSpatial <- inherits(x, 'sf') - if ( inherits(x, 'data.frame') ) { + bcp <- findUtility('bcp') + # syntax differs for the two utilities + bcpArgs <- mapConnectArgs(connectargs = connectargs, utility = 'bcp') + isSpatial <- methods::is(x, 'sf') + if (methods::is(x, 'data.frame')) { tmp <- tempfile(fileext = '.dat') fileName <- tmp - if ( isSpatial ) { + if (isSpatial) { spatialtype <- match.arg(spatialtype) srid <- sf::st_crs(x)$epsg - if ( is.null(srid) | !is.numeric(srid) ) { - stop('Only EPSGs are supported for SQL Server SRIDs. Check with sf::st_crs and change projection with sf::st_transform.') + if (is.null(srid) || !is.numeric(srid)) { + stop('Only EPSGs are supported for SQL Server SRIDs. + Check with sf::st_crs and change projection with sf::st_transform.') } geometryCol <- attr(x, 'sf_column') - binaryCol <- sprintf('%sBinary', geometryCol) + binaryCol <- sprintf('%sWkb', geometryCol) x <- data.table::data.table(x) - x[[binaryCol]] <- sf::st_as_binary(x[[geometryCol]], hex = TRUE) - x[[geometryCol]] <- NA + data.table::set(x = x, j = binaryCol, + value = sf::st_as_binary(x[[geometryCol]], hex = TRUE)) + data.table::set(x = x, j = geometryCol, value = NULL) } data.table::fwrite(x, fileName, sep = fieldterminator, eol = rowterminator, + logical01 = TRUE, col.names = FALSE, dateTimeAs = 'write.csv') } else { stopifnot(file.exists(x)) fileName <- x # check data types - x <- data.table::fread(fileName, nrows = 0) + # this isn't currently working + x <- data.table::fread(fileName, nrows = 100000) } + # must use -c character storage for file type bcpArgs <- append(bcpArgs, list('-t', shQuote(fieldterminator), - '-r', shQuote(rowterminator))) - bcpArgs <- append(bcpArgs, list(table, - 'in', shQuote(fileName), - '-S', server, - '-d', database), after = 0) - if ( isTRUE(regional) ) { - bcpArgs <- append(bcpArgs, list('-R')) - } - dbTypes <- DBI::dbDataType(con, x) - if ( isSpatial ) { - dbTypes[[geometryCol]] <- spatialtype - dbTypes[[binaryCol]] <- 'varbinary(max)' - } - # used in check later for spatial data writes - append <- DBI::dbExistsTable(con, table) & !overwrite - if ( isTRUE(overwrite) ) { - if ( DBI::dbExistsTable(con, table) ) { - DBI::dbRemoveTable(con, name = table) + '-r', shQuote(rowterminator), + '-c')) + bcpArgs <- append(bcpArgs, list(quoteTable(table = table), + 'in', shQuote(fileName)), after = 0) + tableExists <- checkTableExists(connectargs = connectargs, + table = table) + append <- tableExists && isFALSE(overwrite) + if (isFALSE(append)) { + # guess sql server data types + if (isSpatial) { + dbTypes <- mapDataTypes(x = x[, !names(x) %in% binaryCol]) + dbTypes[[binaryCol]] <- 'varbinary(max)' + } else { + dbTypes <- mapDataTypes(x = x) + } + # delete table if overwrite is true + if (isTRUE(overwrite) && isTRUE(tableExists)) { + dropOutput <- dropTable(connectargs = connectargs, table = table, + stderr = TRUE) + if (length(dropOutput) != 0) { + stop(paste(dropOutput, collapse = ' ')) + } + } + # create empty table + createOutput <- createTable(connectargs = connectargs, + table = table, coltypes = dbTypes, stderr = TRUE) + if (length(createOutput) != 0) { + stop(paste(createOutput, collapse = ' ')) } - DBI::dbCreateTable(con, name = table, fields = dbTypes) - } - if ( !DBI::dbExistsTable(con, table) ) { - DBI::dbCreateTable(con, name = table, fields = dbTypes) - } - #cat(paste(append(bcpArgs, bcp, after = 0), collapse = ' '), sep = '\n') - bcp <- 'bcp' - if ( !is.null(getOption('bcputility.bcp.path')) ) { - bcp <- getOption('bcputility.bcp.path') - } - if ( Sys.which(bcp) == '' ) { - stop('bcp was not found or invalid path. Add bcp to path or to "bcputility.bcp.path" option.') } + # add optional args + bcpArgs <- append(bcpArgs, bcpOptions) output <- suppressWarnings(system2(bcp, args = bcpArgs, ...)) - if ( isSpatial & !append) { - # quote with brackets for table name - # ignored when passing DBI::SQL('schema.table') - if ( !inherits(table, 'SQL') ) { - table <- DBI::SQL(sprintf('[%s]', table)) + if (isSpatial && !append) { + # update empty geometry column with binary data and clean up + geoOutput <- convertGeoCol(connectargs = connectargs, + table = table, geometrycol = geometryCol, binarycol = binaryCol, + spatialtype = spatialtype, srid = srid, stdout = FALSE, stderr = TRUE) + if (length(geoOutput) != 0) { + stop(paste(geoOutput, collapse = ' ')) } - DBI::dbExecute( - con, - sprintf('UPDATE %s SET [%s] = %s::STGeomFromWKB([%s], %s)', - table, geometryCol, spatialtype, binaryCol, srid) - ) - if ( spatialtype == 'geography' ) { - DBI::dbExecute( - con, - sprintf('UPDATE %s SET [%s] = [%s].MakeValid().ReorientObject() - WHERE [%s].MakeValid().EnvelopeAngle() > 90;', - table, geometryCol, geometryCol, geometryCol) - ) - } - invisible(DBI::dbExecute( - con, - sprintf('ALTER TABLE %s DROP COLUMN [%s]', - table, binaryCol) - )) } output } - #' Export data from SQL Server #' #' A wrapper for a system call to the bcp utility which writes a SQL Server @@ -281,13 +193,9 @@ bcpImport <- function(x, #' #' output file name #' -#' @param server -#' -#' the instance of SQL Server to which to connect -#' -#' @param database +#' @param connectargs #' -#' Specifies the database to connect to +#' named list of connection arguments. See \link[bcputility]{makeConnectArgs}. #' #' @param table #' @@ -298,18 +206,6 @@ bcpImport <- function(x, #' Transact-SQL query that returns a result set. Ignored if #' table is specified. #' -#' @param trustedconnection -#' -#' use integrated security, username and password are not required -#' -#' @param username -#' -#' login ID -#' -#' @param password -#' -#' password for login ID -#' #' @param fieldterminator #' #' character separator for columns @@ -318,16 +214,9 @@ bcpImport <- function(x, #' #' character separator for rows--new lines #' -#' @param datatypes +#' @param bcpOptions #' -#' the format of datatypes, -#' char performs the operation using a character data type, -#' nchar performs the bulk copy operation using Unicode characters -#' -#' @param azure -#' -#' use Azure Active Directory authentication, does not work with integrated -#' authentication +#' list of additional options to pass to the \code{bcp} utility. See details. #' #' @param ... #' @@ -337,44 +226,39 @@ bcpImport <- function(x, #' #' No return value. Operations from bcp are printed to console; see #' \code{...} to redirect output + +#' @details #' -#' @export +#' The \code{bcpOptions} allows the user to include additional arguments for the +#' call to \code{system2}. Please refer to +#' \url{https://learn.microsoft.com/en-us/sql/tools/bcp-utility}. +#' The default options are set +#' to the defaults for \code{bcp} CLI. \code{-b} refers to +#' number of rows to write at a time; 10,000 to 50,000 is a +#' starting recommendation. \code{-a} refers to size of packets to be sent in +#' bytes. \code{-e} refers to the maximum number of errors before failure. #' +#' @export #' -#' @examples -#' \dontrun{ -#' bcpExport('myfile.tsv', -#' server = server, -#' database = database, -#' table = 'mytable', -#' fieldterminator = '|', -#' stdout = FALSE, -#' datatypes = 'char') -#' } -bcpExport <- function(file, - server, - database, - table, - query, - trustedconnection = TRUE, - username, - password, - fieldterminator = '\t', - rowterminator = ifelse(.Platform$OS.type == 'windows', '\r\n', '\n'), - datatypes = c('char', 'nchar'), - azure = FALSE, - ...) { - if ( isTRUE(trustedconnection) ) { - bcpArgs <- list('-T') - } else { - bcpArgs <- list('-U', shQuote(username), '-P', shQuote(password)) - } - datatypes <- match.arg(datatypes) - if ( datatypes == 'char' ) { - bcpArgs <- append(bcpArgs, list('-c')) - } else { - bcpArgs <- append(bcpArgs, list('-w')) +bcpExport <- function( + file, + connectargs, + table, + query, + fieldterminator = '\t', + rowterminator = ifelse(.Platform$OS.type == 'windows', '\r\n', '\n'), + bcpOptions = list( + '-c', + '-b', 1000, + '-a', 4096, + '-m', 10 + ), + ...) { + if (missing(connectargs)) { + stop('connectargs is missing. See ?bcputility::makeConnectArgs.') } + bcp <- findUtility('bcp') + bcpArgs <- mapConnectArgs(connectargs = connectargs, utility = 'bcp') bcpArgs <- append(bcpArgs, list( '-t', shQuote(fieldterminator), @@ -382,28 +266,373 @@ bcpExport <- function(file, ) ) outArg <- 'out' - if ( missing(table) ) { + if (missing(table)) { table <- shQuote(query) outArg <- 'queryout' } bcpArgs <- append(bcpArgs, list(table, - outArg, shQuote(file), - '-S', server, - '-d', database), after = 0) - if ( isTRUE(trustedconnection) & isTRUE(azure) ) { + outArg, shQuote(file)), after = 0) + # add optional args + bcpArgs <- append(bcpArgs, bcpOptions) + system2(bcp, args = bcpArgs, ...) +} +#' Check bcp and sqlcmd versions +#' +#' @param ... +#' +#' arguments to pass \link[base]{system2} +#' +#' @export +#' +#' @name SQLServerCLIVersions +#' +bcpVersion <- function(...) { + bcp <- findUtility('bcp') + system2(command = bcp, args = list('-v'), ...) +} +#' @export +#' +#' @rdname SQLServerCLIVersions +sqlcmdVersion <- function(...) { + sqlcmd <- findUtility('sqlcmd') + system2(command = sqlcmd, args = list('-?'), ...) +} + +#' Determine SQL Server data types from data frame. Follows SQL Server +#' data type size constraints and chooses the smallest data type size. +#' +#' @param x +#' +#' data.frame object +#' +#' @param coltypes +#' +#' vector with names of columns to override the default data type mapping +#' +#' @return +#' +#' character vector with names of columns +#' +#' @export +#' +#' @name mapDataTypes +#' +#' @examples +#' +#' mapDataTypes(data.frame( +#' int = 1:5L, +#' numeric = seq(0, 1, length.out = 5), +#' character = LETTERS[1:5], +#' factor = paste(LETTERS[1:5], LETTERS[1:5], sep = ''), +#' logical = c(TRUE, FALSE, TRUE, FALSE, TRUE), +#' date = seq(Sys.Date() - 4, Sys.Date(), 1L), +#' datetime = seq(Sys.time() - 5, Sys.time(), length.out = 5) +#' ) +#' ) +mapDataTypes <- function(x, coltypes) { + sqlTypes <- vapply(x, FUN = function(.x) { + # order is important, returns left-most match + types <- c('character', 'factor', 'integer', 'numeric', 'logical', 'Date', + 'POSIXct', 'sfc', 'blob') + dataType <- Find(f = function(.type) { + methods::is(object = .x, class2 = .type) + }, types, nomatch = 'nomatch') + switch(dataType, + character = varChar(.x), + factor = varChar(.x), + numeric = 'FLOAT', + integer = int(.x), + logical = 'BIT', + Date = 'DATE', + POSIXct = 'DATETIME', + sfc = 'VARBINARY(MAX)', + blob = varBinary(.x), + stop('Data type not supported.') + ) + }, FUN.VALUE = character(1)) + if (!missing(coltypes)) { + sqlTypes[names(coltypes)] <- coltypes + } + sqlTypes +} +#' @export +#' +#' @rdname mapDataTypes +varChar <- function(x) { + n <- suppressWarnings(max(nchar(as.character(x)), na.rm = TRUE)) + if (is.infinite(n)) { + n <- 1L + } + if (n > 8000) { + n <- 'MAX' + } + sprintf('VARCHAR(%s)', n) +} +#' @export +#' +#' @rdname mapDataTypes +varBinary <- function(x) { + n <- max(lengths(x), na.rm = TRUE) + if (n > 8000) { + n <- 'MAX' + } + sprintf('VARBINARY(%s)', n) +} +#' @export +#' +#' @rdname mapDataTypes +int <- function(x) { + # if all missing assume TINYINT + # range returns c(Inf, -Inf) + xRange <- suppressWarnings(range(x, na.rm = TRUE)) + if (xRange[1] >= 0 && xRange[2] <= 255) { + 'TINYINT' + } else if (xRange[1] >= (-2^15) && xRange[2] <= (2^15 - 1)) { + 'SMALLINT' + } else if (xRange[1] >= (-2^31) && xRange[2] <= (2^31 - 1)) { + 'INTEGER' + } else if (xRange[1] >= (-2^63) && xRange[2] <= (2^63 - 1)) { + 'BIGINT' + } else { + 'Invalid integer range.' + } +} + +#' Create or drop table +#' +#' @param connectargs +#' +#' named list of connection arguments. See \link[bcputility]{makeConnectArgs}. +#' +#' @param table +#' +#' Name of the source table when importing from SQL Server. For specifying the +#' schema in the table name see \code{.
} and if not specified the +#' default is "dbo". +#' +#' @param coltypes +#' +#' character vector of data types with the column names as list/vector names. +#' Use \link[bcputility]{mapDataTypes} or refer to for proper format. +#' +#' @param ... +#' +#' arguments to pass to \link[base]{system2} +#' +#' @return +#' +#' No return value. Operations from bcp are printed to console; see +#' \code{...} to redirect output +#' +#' @export +#' +createTable <- function(connectargs, table, coltypes, ...) { + sqlcmd <- findUtility('sqlcmd') + quotedTable <- quoteTable(table) + query <- sprintf( + 'CREATE TABLE %s (%s);', + quotedTable, + paste(names(coltypes), coltypes, sep = ' ', collapse = ', ') + ) + sqlcmdArgs <- append(mapConnectArgs(connectargs = connectargs, + utility = 'sqlcmd'), values = list('-Q', shQuote(query))) + system2(command = sqlcmd, args = sqlcmdArgs, ...) +} +#' @rdname createTable +#' +#' @export +#' +dropTable <- function(connectargs, table, ...) { + sqlcmd <- findUtility('sqlcmd') + quotedTable <- quoteTable(table) + query <- sprintf('DROP TABLE %s;', quotedTable) + sqlcmdArgs <- append(mapConnectArgs(connectargs = connectargs, + utility = 'sqlcmd'), values = list('-Q', shQuote(query))) + system2(command = sqlcmd, args = sqlcmdArgs, ...) +} +#' @rdname createTable +#' +#' @export +#' +checkTableExists <- function(connectargs, table) { + sqlcmd <- findUtility('sqlcmd') + # IF OBJECT_ID('*objectName*', 'U') IS NOT NULL + quotedTable <- quoteTable(table) + quotedTable <- strsplit(x = quotedTable, split = '\\.')[[1]] + if (length(quotedTable) > 2) { + stop('Only `
` and `.
` are supported for table + argument.') + } + if (length(quotedTable) < 2) { + quotedTable <- append(quotedTable, '[dbo]', after = 0) + } + query <- sprintf('EXECUTE sp_tables @table_name = %s, @table_owner = %s', + quotedTable[2], quotedTable[1]) + sqlcmdArgs <- append(mapConnectArgs(connectargs = connectargs, + utility = 'sqlcmd'), values = list('-Q', shQuote(query))) + system2(command = sqlcmd, args = sqlcmdArgs, stdout = TRUE)[[3]] != '' +} +readTable <- function(connectargs, table, ...) { + sqlcmd <- findUtility('sqlcmd') + quotedTable <- quoteTable(table) + query <- sprintf('SET NOCOUNT ON; SELECT * FROM %s;', quotedTable) + queryHeaders <- sprintf('SET NOCOUNT ON; SELECT TOP 0 * FROM %s;', + quotedTable) + sqlcmdArgs <- append(mapConnectArgs(connectargs = connectargs, + utility = 'sqlcmd'), + values = list( + '-s', shQuote(','), + '-W', + '-r', 1, + '-V', 1 + )) + sqlCmdArgsHeader <- append(sqlcmdArgs, list('-Q', shQuote(queryHeaders))) + sqlcmdArgsData <- append(sqlcmdArgs, list('-Q', shQuote(query), '-h', '-1')) + data.table::fread( + cmd = paste(append(shQuote(sqlcmd), sqlcmdArgsData), collapse = ' '), + header = FALSE, + col.names = strsplit(x = system2(command = sqlcmd, args = sqlCmdArgsHeader, + stdout = TRUE), split = ',')[[1]]) +} +#' Create a named list of connection arguments to translate to bcp and +#' sqlcmd options +#' +#' @param server +#' +#' the instance of SQL Server to which to connect +#' +#' @param database +#' +#' specifies the database to connect to +#' +#' @param username +#' +#' login ID +#' +#' @param password +#' +#' password for login ID +#' +#' @param trustedconnection +#' +#' use integrated security, username and password are not required +#' +#' @param trustservercert +#' +#' trust the server certificate +#' +#' @param azure +#' +#' use Azure Active Directory authentication, does not work with integrated +#' authentication. +#' +#' @return +#' +#' a list with connection arguments +#' +#' @export +makeConnectArgs <- function(server, database, username, password, + trustedconnection = TRUE, trustservercert = FALSE, azure = FALSE) { + if (isTRUE(trustedconnection) && isTRUE(azure)) { stop('trustedconnection and azure cannot both be TRUE') } - if ( isTRUE(azure) ) { - bcpArgs <- append(bcpArgs, '-G') + connectArgs <- list(server = server, database = database) + if (isTRUE(trustedconnection)) { + connectArgs <- append(x = connectArgs, + values = list(trustedconnection = trustedconnection)) + } else { + connectArgs <- append(x = connectArgs, + values = list(username = username, password = password)) } - bcp <- 'bcp' - if ( !is.null(getOption('bcputility.bcp.path')) ) { - bcp <- getOption('bcputility.bcp.path') + if (isTRUE(azure)) { + connectArgs <- append(x = connectArgs, + values = list(azure = azure)) } - if ( Sys.which(bcp) == '' ) { - stop('bcp was not found or invalid path. Add bcp to path or to "bcputility.bcp.path" option.') + if (isTRUE(trustservercert)) { + connectArgs <- append(x = connectArgs, + values = list(trustservercert = trustservercert)) } - #cat(paste(append(bcpArgs, bcp, after = 0), collapse = ' ')) - system2(bcp, args = bcpArgs, ...) + connectArgs } +# internal functions +quoteTable <- function(table) { + paste(lapply(strsplit(table, split = '\\.')[[1]], function(x) { + if (substring(text = x, first = 1, 1) == '[' && + substring(text = x, + first = nchar(x), + last = nchar(x)) == ']') { + return(x) + } + sprintf('[%s]', x) + }), collapse = '.') +} +convertGeoCol <- function(connectargs, table, geometrycol, binarycol, + spatialtype, srid, ...) { + sqlcmd <- findUtility(utility = 'sqlcmd') + quotedTable <- quoteTable(table) + query <- sprintf(' + SET NOCOUNT ON; + ALTER TABLE %1$s ADD [%2$s] %3$s; + GO + UPDATE %1$s SET [%2$s] = %3$s::STGeomFromWKB([%4$s], %5$s); + ALTER TABLE %1$s DROP COLUMN [%4$s];', + quotedTable, geometrycol, spatialtype, binarycol, srid) + if (spatialtype == 'geography') { + correctionQuery <- sprintf( + ' + UPDATE %1$s SET [%2$s] = [%2$s].MakeValid().ReorientObject().MakeValid() + WHERE [%2$s].MakeValid().EnvelopeAngle() > 90;', + quotedTable, geometrycol) + query <- sprintf('%s %s', query, correctionQuery) + } + sqlcmdArgs <- append(mapConnectArgs(connectargs = connectargs, + utility = 'sqlcmd'), values = list('-Q', shQuote(query))) + system2(command = sqlcmd, args = sqlcmdArgs, ...) +} +mapConnectArgs <- function(connectargs, utility = c('sqlcmd', 'bcp') + ) { + utility <- match.arg(utility) + argSyntax <- switch(utility, + sqlcmd = list(server = '-S', + database = '-d', + trustedconnection = '-E', + username = '-U', + password = '-P', + azure = '-G', + trustservercert = '-C'), + bcp = list(server = '-S', + database = '-d', + trustedconnection = '-T', + username = '-U', + password = '-P', + azure = '-G', + trustservercert = '-u'), + stop('Unsupported utility') + ) + argSyntax <- argSyntax[names(connectargs)] + unlist( + Map(function(argname, argsyntax, argvalue) { + if (is.logical(argvalue)) { + argsyntax + } else if (is.character(argvalue)) { + list(argsyntax, shQuote(argvalue)) + } else { + stop(sprintf('Invalid argument for %s option.', argname)) + } + }, argname = names(connectargs), argsyntax = argSyntax, + argvalue = connectargs), + recursive = FALSE, use.names = FALSE + ) +} +findUtility <- function(utility) { + optionName <- sprintf('bcputility.%s.path', utility) + if (!is.null(getOption(optionName))) { + utility <- getOption(optionName) + } + if (Sys.which(utility) == '') { + stop(sprintf('%1$s was not found or invalid path. Add %1$s to path or to + "%2$s" option.', utility, optionName)) + } + utility +} diff --git a/README.md b/README.md index b66fcda..2194830 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,11 @@ Install the development version with: devtools::install_github("tomroh/bcputility") ``` -If *bcp* is not on the system path or you want to override the default, -set the option with the full file path: +If *bcp* and *sqlcmd* is not on the system path or you want to override the default, set the option with the full file path: ```r options(bcputility.bcp.path = "") +options(bcputility.sqlcmd.path = "") ``` ## Benchmarks @@ -56,56 +56,84 @@ improved. ```r library(DBI) library(data.table) -library(nycflights13) -data("flights") -set.seed(82) -flights <- flights[sample.int(nrow(flights), 1000000, replace = TRUE),] -server <- 'localhost\\SQLEXPRESS' -database <- 'Main' +library(bcputility) +server <- Sys.getenv('MSSQL_SERVER') +database <- Sys.getenv('MSSQL_DB') +driver <- 'ODBC Driver 17 for SQL Server' +set.seed(11) +n <- 1000000 +importTable <- data.frame( + int = sample(x = seq(1L, 10000L, 1L), size = n, replace = TRUE), + numeric = sample(x = seq(0, 1, length.out = n/100), size = n, + replace = TRUE), + character = sample(x = state.abb, size = n, replace = TRUE), + factor = sample(x = factor(x = month.abb, levels = month.abb), + size = n, replace = TRUE), + logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), + date = sample(x = seq(as.Date('2022-01-01'), as.Date('2022-12-31'), + by = 'days'), size = n, replace = TRUE), + datetime = sample(x = seq(as.POSIXct('2022-01-01 00:00:00'), + as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, replace = TRUE) +) +connectArgs <- makeConnectArgs(server = server, database = database) con <- DBI::dbConnect(odbc::odbc(), Driver = "SQL Server", Server = server, Database = database) -results <- microbenchmark::microbenchmark( +importResults <- microbenchmark::microbenchmark( bcpImport1000 = { - bcpImport(flights, - server = server, - database = database, - table = 'flights1', + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable1', + bcpOptions = list("-b", 1000, "-a", 4096, "-e", 10), overwrite = TRUE, stdout = FALSE) }, bcpImport10000 = { - bcpImport(flights, - server = server, - database = database, - table = 'flights2', + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable2', + bcpOptions = list("-b", 10000, "-a", 4096, "-e", 10), overwrite = TRUE, - stdout = FALSE, - batchsize = 10000) + stdout = FALSE) }, bcpImport50000 = { - bcpImport(flights, - server = server, - database = database, - table = 'flights3', + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable3', + bcpOptions = list("-b", 50000, "-a", 4096, "-e", 10), overwrite = TRUE, - stdout = FALSE, - batchsize = 50000) + stdout = FALSE) + }, + bcpImport100000 = { + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable4', + bcpOptions = list("-b", 100000, "-a", 4096, "-e", 10), + overwrite = TRUE, + stdout = FALSE) }, dbWriteTable = { - DBI::dbWriteTable(con, name = 'flights4', flights, overwrite = TRUE) + con <- DBI::dbConnect(odbc::odbc(), + Driver = driver, + Server = server, + Database = database, + trusted_connection = 'yes') + DBI::dbWriteTable(con, name = 'importTable5', importTable, overwrite = TRUE) }, - times = 30L + times = 30L, + unit = 'seconds' ) +importResults ``` -|expr | min| lq| mean| median| uq| max| neval| -|:--------------|--------:|--------:|--------:|--------:|--------:|--------:|-----:| -|bcpImport1000 | 13.83131| 14.92755| 15.59979| 15.26361| 16.50634| 17.31753| 30| -|bcpImport10000 | 11.41458| 12.96426| 13.61049| 13.42964| 14.34338| 15.46362| 30| -|bcpImport50000 | 10.70270| 12.46274| 13.29288| 13.10546| 13.59440| 17.85827| 30| -|dbWriteTable | 25.71646| 28.39663| 29.63298| 29.39512| 30.49987| 35.38698| 30| +|expr | min| lq| mean| median| uq| max| neval| +|:---------------|---------:|---------:|---------:|---------:|---------:|--------:|-----:| +|bcpImport1000 | 15.017385| 16.610868| 17.405555| 17.656265| 18.100990| 19.44482| 30| +|bcpImport10000 | 10.091266| 10.657926| 10.926738| 10.916577| 11.208184| 11.46027| 30| +|bcpImport50000 | 8.982498| 9.337509| 9.677375| 9.571526| 9.896179| 10.77709| 30| +|bcpImport100000 | 8.769598| 9.303473| 9.562921| 9.581927| 9.855355| 10.36949| 30| +|dbWriteTable | 13.570956| 13.820707| 15.154505| 14.159002| 16.378986| 27.28819| 30| *Time in seconds* @@ -120,76 +148,73 @@ data that is small enough to be pulled into memory. ```r exportResults <- microbenchmark::microbenchmark( bcpExportChar = { - bcpExport('test1.csv', - server = server, - database = database, - table = 'flights1', + bcpExport('inst/benchmarks/test1.csv', + connectargs = connectArgs, + table = 'importTableInit', fieldterminator = ',', - stdout = FALSE, - datatypes = 'char') + stdout = FALSE) }, bcpExportNchar = { - bcpExport('test2.csv', - server = server, - database = database, - table = 'flights1', + bcpExport('inst/benchmarks/test2.csv', + connectargs = connectArgs, + table = 'importTableInit', fieldterminator = ',', - stdout = FALSE, - datatypes = 'nchar') + stdout = FALSE) }, fwriteQuery = { - fwrite(DBI::dbReadTable(con, 'flights1'), - 'test3.csv', dateTimeAs = 'write.csv', + fwrite(DBI::dbReadTable(con, 'importTableInit'), + 'inst/benchmarks/test3.csv', dateTimeAs = 'write.csv', col.names = FALSE) }, - times = 30L + times = 30L, + unit = 'seconds' ) +exportResults ``` -|expr | min| lq| mean| median| uq| max| neval| -|:--------------|---------:|---------:|---------:|---------:|--------:|---------:|-----:| -|bcpExportChar | 6.179264| 6.527793| 7.051096| 7.207091| 7.40403| 8.221965| 30| -|bcpExportNchar | 7.127671| 7.685442| 8.240679| 8.413417| 8.54752| 9.313255| 30| -|fwriteQuery | 11.096326| 11.515995| 11.852508| 11.741095| 12.20761| 13.015459| 30| +|expr | min| lq| mean| median| uq| max| neval| +|:--------------|--------:|--------:|--------:|--------:|--------:|--------:|-----:| +|bcpExportChar | 2.565654| 2.727477| 2.795670| 2.756685| 2.792291| 3.352325| 30| +|bcpExportNchar | 2.589367| 2.704135| 2.765784| 2.734957| 2.797286| 3.479074| 30| +|fwriteQuery | 7.429731| 7.602853| 7.645852| 7.654730| 7.703634| 7.868419| 30| *Time in seconds* ### Export Query ```r +query <- 'SELECT * FROM [dbo].[importTable1] WHERE int < 1000' queryResults <- microbenchmark::microbenchmark( bcpExportQueryChar = { - bcpExport('test4.csv', - server = server, - database = database, + bcpExport('inst/benchmarks/test4.csv', + connectargs = connectArgs, query = query, fieldterminator = ',', - stdout = FALSE, - datatypes = 'char') + stdout = FALSE) }, bcpExportQueryNchar = { - bcpExport('test5.csv', - server = server, - database = database, + bcpExport('inst/benchmarks/test5.csv', + connectargs = connectArgs, query = query, fieldterminator = ',', - stdout = FALSE, - datatypes = 'nchar') + stdout = FALSE) }, fwriteQuery = { fwrite(DBI::dbGetQuery(con, query), - 'test6.csv', dateTimeAs = 'write.csv', + 'inst/benchmarks/test6.csv', dateTimeAs = 'write.csv', col.names = FALSE) }, - times = 30L + times = 30L, + unit = 'seconds' ) +queryResults ``` -|expr | min| lq| mean| median| uq| max| neval| -|:-------------------|--------:|--------:|--------:|--------:|--------:|--------:|-----:| -|bcpExportQueryChar | 2.330189| 2.335963| 2.777578| 2.444756| 3.010092| 4.892223| 30| -|bcpExportQueryNchar | 2.666880| 2.777737| 3.435565| 2.789167| 3.443354| 7.774271| 30| -|fwriteQuery | 3.384254| 3.572138| 4.285159| 3.904367| 4.361619| 8.017063| 30| +|expr | min| lq| mean| median| uq| max| neval| +|:-------------------|---------:|---------:|---------:|---------:|---------:|---------:|-----:| +|bcpExportQueryChar | 0.3444491| 0.4397317| 0.4557119| 0.4490924| 0.4615573| 0.7237182| 30| +|bcpExportQueryNchar | 0.3305265| 0.4444705| 0.4412670| 0.4500690| 0.4605971| 0.4815894| 30| +|fwriteQuery | 0.6737879| 0.7141933| 0.7421377| 0.7311998| 0.7548233| 0.9143555| 30| *Time in seconds* @@ -201,94 +226,103 @@ after import are to produce equivalent tables in the database. ```r library(sf) nc <- st_read(system.file("gpkg/nc.gpkg", package = "sf")) -nc <- nc[sample.int(nrow(nc), 10000, replace = TRUE),] -microbenchmark::microbenchmark( +divN <- 10 +shp1 <- cbind(nc[sample.int(nrow(nc), n / divN, replace = TRUE),], + importTable[seq_len(n / divN), ], + id = seq_len(n / divN)) +geometryResults <- microbenchmark::microbenchmark( bcpImportGeometry = { - bcpImport(nc, - server = server, - database = database, - table = 'nc1', - overwrite = TRUE, - stdout = FALSE) + bcpImport(shp1, + connectargs = connectArgs, + table = 'shp1', + overwrite = TRUE, + stdout = FALSE, + spatialtype = 'geometry', + bcpOptions = list("-b", 50000, "-a", 4096, "-m", 0)) + }, + odbcImportGeometry = { con <- DBI::dbConnect(odbc::odbc(), - driver = 'SQL Server', - server = server, - database = database) - sql <- DBI::sqlInterpolate( - con, - 'alter table dbo.nc1 add ObjectID integer primary key identity(1,1); - create spatial index nc1_spix on nc1(geom) - with ( bounding_box = ( ?xmin, ?ymin, ?xmax, ?ymax ), - grids = (medium, medium, medium, medium), - cells_per_object = 16);', - .dots = st_bbox(nc) + driver = driver, + server = server, + database = database, + trusted_connection = 'yes') + tableName <- 'shp2' + spatialType <- 'geometry' + geometryColumn <- 'geom' + binaryColumn <- 'geomWkb' + srid <- sf::st_crs(nc)$epsg + shpBin2 <- data.table(shp1) + data.table::set(x = shpBin2, j = binaryColumn, + value = blob::new_blob(lapply(sf::st_as_binary(shpBin2[[geometryColumn]]), + as.raw))) + data.table::set(x = shpBin2, j = geometryColumn, value = NULL) + dataTypes <- DBI::dbDataType(con, shpBin2) + dataTypes[binaryColumn] <- 'varbinary(max)' + DBI::dbWriteTable(conn = con, name = tableName, value = shpBin2, + overwrite = TRUE, field.types = dataTypes) + DBI::dbExecute(conn = con, sprintf('alter table %1$s add %2$s %3$s;', + tableName, geometryColumn, spatialType)) + DBI::dbExecute(conn = con, + sprintf('UPDATE %1$s + SET geom = %3$s::STGeomFromWKB([%4$s], %2$d); + ALTER TABLE %1$s DROP COLUMN [%4$s];', tableName, srid, spatialType, + binaryColumn) ) - DBI::dbExecute(con, sql) }, bcpImportGeography = { - bcpImport(nc, - server = server, - database = database, - table = 'nc2', - overwrite = TRUE, - stdout = FALSE, - spatialtype = 'geography') - con <- DBI::dbConnect(odbc::odbc(), - driver = 'SQL Server', - server = server, - database = database) - sql <- 'alter table dbo.nc2 add ObjectID integer primary key identity(1,1); - create spatial index nc2_spix on nc2(geom) - using geography_grid - with ( grids = (medium, medium, medium, medium), - cells_per_object = 16);' - DBI::dbExecute(con, sql) + bcpImport(shp1, + connectargs = connectArgs, + table = 'shp3', + overwrite = TRUE, + stdout = FALSE, + spatialtype = 'geography', + bcpOptions = list("-b", 50000, "-a", 4096, "-m", 0)) }, - stWriteGeometry = { - Sys.setenv('MSSQLSPATIAL_USE_GEOMETRY_COLUMNS' = 'NO') - st_write(nc, - sprintf(r'(MSSQL:Server=%s;Database=%s;Trusted_Connection=True;)', - server, database), - 'dbo.nc3', - layer_options = c('GEOM_TYPE=geometry', 'LAUNDER=NO', - 'GEOMETRY_NAME=geom', 'FID=ObjectID'), - append = FALSE) + odbcImportGeography = { con <- DBI::dbConnect(odbc::odbc(), - driver = 'SQL Server', - server = server, - database = database) - DBI::dbExecute(con, - 'alter table dbo.nc3 alter column [NAME] varchar(255); - alter table dbo.nc3 alter column [FIPS] varchar(255);') - }, - stWriteGeography = { - Sys.setenv('MSSQLSPATIAL_USE_GEOMETRY_COLUMNS' = 'NO') - st_write(nc, - sprintf(r'(MSSQL:Server=%s;Database=%s;Trusted_Connection=True;)', - server, database), - 'dbo.nc4', - layer_options = c('GEOM_TYPE=geography', 'LAUNDER=NO', - 'GEOMETRY_NAME=geom', 'FID=ObjectID'), - append = FALSE) - con <- DBI::dbConnect(odbc::odbc(), - driver = 'SQL Server', - server = server, - database = database) - DBI::dbExecute(con, - 'alter table dbo.nc4 alter column [NAME] varchar(255); - alter table dbo.nc4 alter column [FIPS] varchar(255); - update dbo.nc4 SET geom = geom.MakeValid().ReorientObject() - where geom.MakeValid().EnvelopeAngle() > 90;') + driver = driver, + server = server, + database = database, + trusted_connection = 'yes') + tableName <- 'shp4' + spatialType <- 'geography' + geometryColumn <- 'geom' + binaryColumn <- 'geomWkb' + srid <- sf::st_crs(nc)$epsg + shpBin4 <- data.table(shp1) + data.table::set(x = shpBin4, j = binaryColumn, + value = blob::new_blob(lapply(sf::st_as_binary(shpBin4[[geometryColumn]]), + as.raw))) + data.table::set(x = shpBin4, j = geometryColumn, value = NULL) + dataTypes <- DBI::dbDataType(con, shpBin4) + dataTypes[binaryColumn] <- 'varbinary(max)' + DBI::dbWriteTable(conn = con, name = tableName, value = shpBin4, + overwrite = TRUE, field.types = dataTypes) + DBI::dbExecute(conn = con, sprintf('alter table %1$s add %2$s %3$s;', + tableName, geometryColumn, spatialType)) + DBI::dbExecute(conn = con, + sprintf('UPDATE %1$s + SET geom = %3$s::STGeomFromWKB([%4$s], %2$d); + ALTER TABLE %1$s DROP COLUMN [%4$s];', tableName, srid, spatialType, + binaryColumn) + ) + DBI::dbExecute(conn = con, + sprintf( + 'UPDATE %1$s SET [%2$s] = [%2$s].MakeValid().ReorientObject().MakeValid() + WHERE [%2$s].MakeValid().EnvelopeAngle() > 90;', + tableName, geometryColumn)) }, - times = 30L + times = 30L, + unit = 'seconds' ) +geometryResults ``` -|expr | min| lq| mean| median| uq| max| neval| -|:------------------|---------:|---------:|---------:|---------:|--------:|---------:|-----:| -|bcpImportGeometry | 3.837943| 4.029495| 4.167561| 4.108914| 4.28310| 4.617041| 30| -|bcpImportGeography | 7.536671| 8.848857| 9.062659| 9.032125| 9.31301| 10.307236| 30| -|stWriteGeometry | 30.058039| 32.603264| 33.576270| 32.955545| 33.93374| 38.260181| 30| -|stWriteGeography | 51.733421| 54.910806| 56.157718| 55.671590| 56.51970| 64.666461| 30| +|expr | min| lq| mean| median| uq| max| neval| +|:-------------------|--------:|--------:|--------:|--------:|--------:|---------:|-----:| +|bcpImportGeometry | 18.01451| 19.48747| 20.68834| 20.45136| 21.74212| 26.87033| 30| +|odbcImportGeometry | 18.29721| 20.63363| 22.35044| 21.29087| 24.04490| 27.81112| 30| +|bcpImportGeography | 71.23260| 75.04588| 82.65286| 76.36985| 96.68469| 102.70909| 30| +|odbcImportGeography | 73.29818| 76.12481| 84.58432| 77.93419| 97.36155| 107.00186| 30| *Time in seconds* diff --git a/_pkgdown.yml b/_pkgdown.yml index aec11cf..0542cbf 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -1,4 +1,4 @@ -url: https://bcputility.roh.engineering +#$url: https://bcputility.roh.engineering authors: Thomas Roh: href: https://roh.engineering/about diff --git a/bcputility.Rproj b/bcputility.Rproj index b9255bc..ee9a41a 100644 --- a/bcputility.Rproj +++ b/bcputility.Rproj @@ -1,7 +1,7 @@ Version: 1.0 -RestoreWorkspace: Default -SaveWorkspace: Default +RestoreWorkspace: No +SaveWorkspace: No AlwaysSaveHistory: Default EnableCodeIndexing: Yes diff --git a/docs/404.html b/docs/404.html index 62c685a..ed6b215 100644 --- a/docs/404.html +++ b/docs/404.html @@ -6,19 +6,19 @@ Page not found (404) • bcputility - - - - - - + + + + + + - - + + - - - + + + License • bcputilityLicense • bcputility @@ -17,7 +17,7 @@ bcputility - 0.3.1 + 0.4.0 @@ -65,7 +65,7 @@

License

-

Site built with pkgdown 2.0.4.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 1a13708..33e5ee9 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -1,5 +1,5 @@ -MIT License • bcputilityMIT License • bcputility @@ -17,7 +17,7 @@ bcputility - 0.3.1 + 0.4.0 @@ -69,7 +69,7 @@

MIT License

-

Site built with pkgdown 2.0.4.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/authors.html b/docs/authors.html index faee456..ef8fbbc 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -1,5 +1,5 @@ -Authors and Citation • bcputilityAuthors and Citation • bcputility @@ -17,7 +17,7 @@ bcputility - 0.3.1 + 0.4.0 @@ -61,14 +61,14 @@

Citation

-

Roh T (2022). +

Roh T (2023). bcputility: Wrapper for SQL Server bcp Utility. https://bcputility.roh.engineering, https://github.com/tomroh/bcputility.

@Manual{,
   title = {bcputility: Wrapper for SQL Server bcp Utility},
   author = {Thomas Roh},
-  year = {2022},
+  year = {2023},
   note = {https://bcputility.roh.engineering, https://github.com/tomroh/bcputility},
 }
@@ -83,7 +83,7 @@

Citation

-

Site built with pkgdown 2.0.4.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/index.html b/docs/index.html index 7fbe2e7..a55aa98 100644 --- a/docs/index.html +++ b/docs/index.html @@ -19,7 +19,7 @@ - + @@ -85,13 +85,14 @@

InstallationCRAN with:

-install.packages("bcputility")
+install.packages("bcputility")

Install the development version with:

-devtools::install_github("tomroh/bcputility")
-

If bcp is not on the system path or you want to override the default, set the option with the full file path:

+devtools::install_github("tomroh/bcputility") +

If bcp and sqlcmd is not on the system path or you want to override the default, set the option with the full file path:

-options(bcputility.bcp.path = "<path-to-bcp>")
+options(bcputility.bcp.path = "<path-to-bcp>") +options(bcputility.sqlcmd.path = "<path-to-sqlcmd>")

Benchmarks @@ -102,60 +103,87 @@

BenchmarksImport

-library(DBI)
-library(data.table)
-library(nycflights13)
-data("flights")
-set.seed(82)
-flights <- flights[sample.int(nrow(flights), 1000000, replace = TRUE),]
-server <- 'localhost\\SQLEXPRESS'
-database <- 'Main'
-con <- DBI::dbConnect(odbc::odbc(),
-                      Driver = "SQL Server",
-                      Server = server,
-                      Database = database)
-results <- microbenchmark::microbenchmark(
-  bcpImport1000 = {
-    bcpImport(flights,
-              server = server,
-              database = database,
-              table = 'flights1',
-              overwrite = TRUE,
-              stdout = FALSE)
-    },
-  bcpImport10000 = {
-    bcpImport(flights,
-              server = server,
-              database = database,
-              table = 'flights2',
-              overwrite = TRUE,
-              stdout = FALSE,
-              batchsize = 10000)
-  },
-  bcpImport50000 = {
-    bcpImport(flights,
-              server = server,
-              database = database,
-              table = 'flights3',
-              overwrite = TRUE,
-              stdout = FALSE,
-              batchsize = 50000)
-  },
-  dbWriteTable = {
-    DBI::dbWriteTable(con, name = 'flights4', flights, overwrite = TRUE)
-    },
-  times = 30L
-)
-

+library(DBI) +library(data.table) +library(bcputility) +server <- Sys.getenv('MSSQL_SERVER') +database <- Sys.getenv('MSSQL_DB') +driver <- 'ODBC Driver 17 for SQL Server' +set.seed(11) +n <- 1000000 +importTable <- data.frame( + int = sample(x = seq(1L, 10000L, 1L), size = n, replace = TRUE), + numeric = sample(x = seq(0, 1, length.out = n/100), size = n, + replace = TRUE), + character = sample(x = state.abb, size = n, replace = TRUE), + factor = sample(x = factor(x = month.abb, levels = month.abb), + size = n, replace = TRUE), + logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), + date = sample(x = seq(as.Date('2022-01-01'), as.Date('2022-12-31'), + by = 'days'), size = n, replace = TRUE), + datetime = sample(x = seq(as.POSIXct('2022-01-01 00:00:00'), + as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, replace = TRUE) +) +connectArgs <- makeConnectArgs(server = server, database = database) +con <- DBI::dbConnect(odbc::odbc(), + Driver = "SQL Server", + Server = server, + Database = database) +importResults <- microbenchmark::microbenchmark( + bcpImport1000 = { + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable1', + bcpOptions = list("-b", 1000, "-a", 4096, "-e", 10), + overwrite = TRUE, + stdout = FALSE) + }, + bcpImport10000 = { + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable2', + bcpOptions = list("-b", 10000, "-a", 4096, "-e", 10), + overwrite = TRUE, + stdout = FALSE) + }, + bcpImport50000 = { + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable3', + bcpOptions = list("-b", 50000, "-a", 4096, "-e", 10), + overwrite = TRUE, + stdout = FALSE) + }, + bcpImport100000 = { + bcpImport(importTable, + connectargs = connectArgs, + table = 'importTable4', + bcpOptions = list("-b", 100000, "-a", 4096, "-e", 10), + overwrite = TRUE, + stdout = FALSE) + }, + dbWriteTable = { + con <- DBI::dbConnect(odbc::odbc(), + Driver = driver, + Server = server, + Database = database, + trusted_connection = 'yes') + DBI::dbWriteTable(con, name = 'importTable5', importTable, overwrite = TRUE) + }, + times = 30L, + unit = 'seconds' +) +importResults +
-+--++ @@ -170,42 +198,52 @@

Import

- - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + + + + + + + + + + + - - - - - - + + + + + + @@ -217,42 +255,40 @@

Export Tabledata.table”. Optimized write formats for date times from fwrite outperforms bcp for data that is small enough to be pulled into memory.

-exportResults <- microbenchmark::microbenchmark(
-  bcpExportChar = {
-    bcpExport('test1.csv',
-              server = server,
-              database = database,
-              table = 'flights1',
-              fieldterminator = ',',
-              stdout = FALSE,
-              datatypes = 'char')
-    },
-  bcpExportNchar = {
-    bcpExport('test2.csv',
-              server = server,
-              database = database,
-              table = 'flights1',
-              fieldterminator = ',',
-              stdout = FALSE,
-              datatypes = 'nchar')
-  },
-  fwriteQuery = {
-    fwrite(DBI::dbReadTable(con, 'flights1'),
-           'test3.csv', dateTimeAs = 'write.csv',
-           col.names = FALSE)
-  },
-  times = 30L
-)
+exportResults <- microbenchmark::microbenchmark( + bcpExportChar = { + bcpExport('inst/benchmarks/test1.csv', + connectargs = connectArgs, + table = 'importTableInit', + fieldterminator = ',', + stdout = FALSE) + }, + bcpExportNchar = { + bcpExport('inst/benchmarks/test2.csv', + connectargs = connectArgs, + table = 'importTableInit', + fieldterminator = ',', + stdout = FALSE) + }, + fwriteQuery = { + fwrite(DBI::dbReadTable(con, 'importTableInit'), + 'inst/benchmarks/test3.csv', dateTimeAs = 'write.csv', + col.names = FALSE) + }, + times = 30L, + unit = 'seconds' +) +exportResults

expr
bcpImport100013.8313114.9275515.5997915.2636116.5063417.3175315.01738516.61086817.40555517.65626518.10099019.44482 30
bcpImport1000011.4145812.9642613.6104913.4296414.3433815.4636210.09126610.65792610.92673810.91657711.20818411.46027 30
bcpImport5000010.7027012.4627413.2928813.1054613.5944017.858278.9824989.3375099.6773759.5715269.89617910.77709 30
bcpImport1000008.7695989.3034739.5629219.5819279.85535510.3694930
dbWriteTable25.7164628.3966329.6329829.3951230.4998735.3869813.57095613.82070715.15450514.15900216.37898627.28819 30
-+--++ @@ -267,32 +303,32 @@

Export Table

- - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + @@ -303,42 +339,41 @@

Export TableExport Query

-queryResults <- microbenchmark::microbenchmark(
-  bcpExportQueryChar = {
-    bcpExport('test4.csv',
-              server = server,
-              database = database,
-              query = query,
-              fieldterminator = ',',
-              stdout = FALSE,
-              datatypes = 'char')
-  },
-  bcpExportQueryNchar = {
-    bcpExport('test5.csv',
-              server = server,
-              database = database,
-              query = query,
-              fieldterminator = ',',
-              stdout = FALSE,
-              datatypes = 'nchar')
-  },
-  fwriteQuery = {
-    fwrite(DBI::dbGetQuery(con, query),
-           'test6.csv', dateTimeAs = 'write.csv',
-           col.names = FALSE)
-  },
-  times = 30L
-)
-
exprbcpExportChar6.1792646.5277937.0510967.2070917.404038.2219652.5656542.7274772.7956702.7566852.7922913.352325 30
bcpExportNchar7.1276717.6854428.2406798.4134178.547529.3132552.5893672.7041352.7657842.7349572.7972863.479074 30
fwriteQuery11.09632611.51599511.85250811.74109512.2076113.0154597.4297317.6028537.6458527.6547307.7036347.868419 30
+query <- 'SELECT * FROM [dbo].[importTable1] WHERE int < 1000' +queryResults <- microbenchmark::microbenchmark( + bcpExportQueryChar = { + bcpExport('inst/benchmarks/test4.csv', + connectargs = connectArgs, + query = query, + fieldterminator = ',', + stdout = FALSE) + }, + bcpExportQueryNchar = { + bcpExport('inst/benchmarks/test5.csv', + connectargs = connectArgs, + query = query, + fieldterminator = ',', + stdout = FALSE) + }, + fwriteQuery = { + fwrite(DBI::dbGetQuery(con, query), + 'inst/benchmarks/test6.csv', dateTimeAs = 'write.csv', + col.names = FALSE) + }, + times = 30L, + unit = 'seconds' +) +queryResults +
-+-+ @@ -353,32 +388,32 @@

Export Query

- - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + @@ -390,98 +425,107 @@

Import Geometry

Importing spatial data from ‘sf’ objects is also supported. The sql statements after import are to produce equivalent tables in the database.

-library(sf)
-nc <- st_read(system.file("gpkg/nc.gpkg", package = "sf"))
-nc <- nc[sample.int(nrow(nc), 10000, replace = TRUE),]
-microbenchmark::microbenchmark(
-  bcpImportGeometry = {
-    bcpImport(nc,
-              server = server,
-              database = database,
-              table = 'nc1',
-              overwrite = TRUE,
-              stdout = FALSE)
-    con <- DBI::dbConnect(odbc::odbc(),
-                          driver = 'SQL Server',
-                          server = server,
-                          database = database)
-    sql <- DBI::sqlInterpolate(
-      con,
-      'alter table dbo.nc1 add ObjectID integer primary key identity(1,1);
-       create spatial index nc1_spix on nc1(geom)
-       with ( bounding_box = ( ?xmin, ?ymin, ?xmax, ?ymax ),
-              grids = (medium, medium, medium, medium),
-              cells_per_object = 16);',
-      .dots = st_bbox(nc)
-    )
-    DBI::dbExecute(con, sql)
-  },
-  bcpImportGeography = {
-    bcpImport(nc,
-              server = server,
-              database = database,
-              table = 'nc2',
-              overwrite = TRUE,
-              stdout = FALSE,
-              spatialtype = 'geography')
-    con <- DBI::dbConnect(odbc::odbc(),
-                          driver = 'SQL Server',
-                          server = server,
-                          database = database)
-    sql <- 'alter table dbo.nc2 add ObjectID integer primary key identity(1,1);
-            create spatial index nc2_spix on nc2(geom)
-            using geography_grid
-            with ( grids = (medium, medium, medium, medium),
-                   cells_per_object = 16);'
-    DBI::dbExecute(con, sql)
-  },
-  stWriteGeometry = {
-    Sys.setenv('MSSQLSPATIAL_USE_GEOMETRY_COLUMNS' = 'NO')
-    st_write(nc,
-             sprintf(r'(MSSQL:Server=%s;Database=%s;Trusted_Connection=True;)',
-                     server, database),
-             'dbo.nc3',
-             layer_options = c('GEOM_TYPE=geometry', 'LAUNDER=NO',
-                               'GEOMETRY_NAME=geom', 'FID=ObjectID'),
-             append = FALSE)
-    con <- DBI::dbConnect(odbc::odbc(),
-                          driver = 'SQL Server',
-                          server = server,
-                          database = database)
-    DBI::dbExecute(con,
-                   'alter table dbo.nc3 alter column [NAME] varchar(255);
-                    alter table dbo.nc3 alter column [FIPS] varchar(255);')
-    },
-  stWriteGeography = {
-    Sys.setenv('MSSQLSPATIAL_USE_GEOMETRY_COLUMNS' = 'NO')
-    st_write(nc,
-             sprintf(r'(MSSQL:Server=%s;Database=%s;Trusted_Connection=True;)',
-                     server, database),
-             'dbo.nc4',
-             layer_options = c('GEOM_TYPE=geography', 'LAUNDER=NO',
-                               'GEOMETRY_NAME=geom', 'FID=ObjectID'),
-             append = FALSE)
-    con <- DBI::dbConnect(odbc::odbc(),
-                          driver = 'SQL Server',
-                          server = server,
-                          database = database)
-    DBI::dbExecute(con,
-                   'alter table dbo.nc4 alter column [NAME] varchar(255);
-                    alter table dbo.nc4 alter column [FIPS] varchar(255);
-                    update dbo.nc4 SET geom = geom.MakeValid().ReorientObject()
-                    where geom.MakeValid().EnvelopeAngle() > 90;')
-  },
-  times = 30L
-)
+library(sf) +nc <- st_read(system.file("gpkg/nc.gpkg", package = "sf")) +divN <- 10 +shp1 <- cbind(nc[sample.int(nrow(nc), n / divN, replace = TRUE),], + importTable[seq_len(n / divN), ], + id = seq_len(n / divN)) +geometryResults <- microbenchmark::microbenchmark( + bcpImportGeometry = { + bcpImport(shp1, + connectargs = connectArgs, + table = 'shp1', + overwrite = TRUE, + stdout = FALSE, + spatialtype = 'geometry', + bcpOptions = list("-b", 50000, "-a", 4096, "-m", 0)) + }, + odbcImportGeometry = { + con <- DBI::dbConnect(odbc::odbc(), + driver = driver, + server = server, + database = database, + trusted_connection = 'yes') + tableName <- 'shp2' + spatialType <- 'geometry' + geometryColumn <- 'geom' + binaryColumn <- 'geomWkb' + srid <- sf::st_crs(nc)$epsg + shpBin2 <- data.table(shp1) + data.table::set(x = shpBin2, j = binaryColumn, + value = blob::new_blob(lapply(sf::st_as_binary(shpBin2[[geometryColumn]]), + as.raw))) + data.table::set(x = shpBin2, j = geometryColumn, value = NULL) + dataTypes <- DBI::dbDataType(con, shpBin2) + dataTypes[binaryColumn] <- 'varbinary(max)' + DBI::dbWriteTable(conn = con, name = tableName, value = shpBin2, + overwrite = TRUE, field.types = dataTypes) + DBI::dbExecute(conn = con, sprintf('alter table %1$s add %2$s %3$s;', + tableName, geometryColumn, spatialType)) + DBI::dbExecute(conn = con, + sprintf('UPDATE %1$s + SET geom = %3$s::STGeomFromWKB([%4$s], %2$d); + ALTER TABLE %1$s DROP COLUMN [%4$s];', tableName, srid, spatialType, + binaryColumn) + ) + }, + bcpImportGeography = { + bcpImport(shp1, + connectargs = connectArgs, + table = 'shp3', + overwrite = TRUE, + stdout = FALSE, + spatialtype = 'geography', + bcpOptions = list("-b", 50000, "-a", 4096, "-m", 0)) + }, + odbcImportGeography = { + con <- DBI::dbConnect(odbc::odbc(), + driver = driver, + server = server, + database = database, + trusted_connection = 'yes') + tableName <- 'shp4' + spatialType <- 'geography' + geometryColumn <- 'geom' + binaryColumn <- 'geomWkb' + srid <- sf::st_crs(nc)$epsg + shpBin4 <- data.table(shp1) + data.table::set(x = shpBin4, j = binaryColumn, + value = blob::new_blob(lapply(sf::st_as_binary(shpBin4[[geometryColumn]]), + as.raw))) + data.table::set(x = shpBin4, j = geometryColumn, value = NULL) + dataTypes <- DBI::dbDataType(con, shpBin4) + dataTypes[binaryColumn] <- 'varbinary(max)' + DBI::dbWriteTable(conn = con, name = tableName, value = shpBin4, + overwrite = TRUE, field.types = dataTypes) + DBI::dbExecute(conn = con, sprintf('alter table %1$s add %2$s %3$s;', + tableName, geometryColumn, spatialType)) + DBI::dbExecute(conn = con, + sprintf('UPDATE %1$s + SET geom = %3$s::STGeomFromWKB([%4$s], %2$d); + ALTER TABLE %1$s DROP COLUMN [%4$s];', tableName, srid, spatialType, + binaryColumn) + ) + DBI::dbExecute(conn = con, + sprintf( + 'UPDATE %1$s SET [%2$s] = [%2$s].MakeValid().ReorientObject().MakeValid() + WHERE [%2$s].MakeValid().EnvelopeAngle() > 90;', + tableName, geometryColumn)) + }, + times = 30L, + unit = 'seconds' +) +geometryResults

exprbcpExportQueryChar2.3301892.3359632.7775782.4447563.0100924.8922230.34444910.43973170.45571190.44909240.46155730.7237182 30
bcpExportQueryNchar2.6668802.7777373.4355652.7891673.4433547.7742710.33052650.44447050.44126700.45006900.46059710.4815894 30
fwriteQuery3.3842543.5721384.2851593.9043674.3616198.0170630.67378790.71419330.74213770.73119980.75482330.9143555 30
-+-+ @@ -497,42 +541,42 @@

Import Geometry

- - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + @@ -598,7 +642,7 @@

Dev status

-

Site built with pkgdown 2.0.4.

+

Site built with pkgdown 2.0.7.

diff --git a/docs/news/index.html b/docs/news/index.html index c88f5b6..c652985 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -1,5 +1,5 @@ -Changelog • bcputilityChangelog • bcputility @@ -17,7 +17,7 @@ bcputility - 0.3.1 + 0.4.0 @@ -48,29 +48,45 @@

Changelog

- -
  • The argument azure was added to bcpImport and bcpExport for Azure Active Directory authentication. This only works for username and password authentication.
  • -
-
- + +
  • Override/set path to sqlcmd with options(bcputility.sqlcmd.path = "<path-to-sqlcmd>")

  • +
  • Added bcpVersion and sqlcmdVersion to check versions.

  • +
  • +

    Specify tables without schema strictly as a character vector of size 1 e.g. “.

    +
bcpImportGeometry3.8379434.0294954.1675614.1089144.283104.61704118.0145119.4874720.6883420.4513621.7421226.87033 30
bcpImportGeography7.5366718.8488579.0626599.0321259.3130110.307236odbcImportGeometry18.2972120.6336322.3504421.2908724.0449027.81112 30
stWriteGeometry30.05803932.60326433.57627032.95554533.9337438.260181bcpImportGeography71.2326075.0458882.6528676.3698596.68469102.70909 30
stWriteGeography51.73342154.91080656.15771855.67159056.5197064.666461odbcImportGeography73.2981876.1248184.5843277.9341997.36155107.00186 30

“. The schema and table will be quoted although special characters are not recommended except for”_“.

+
  • Tests have been added that can run against a local instance of SQL Server. These do not work without it as SQL Server is a client/server configuration.

  • +
  • The README has been updated for new syntax and updated benchmarks.

  • +
  • bcpImport and bcpExport gain a bcpOptions argument that allows the user to include any options from the CLI. See documentation for formatting and specification.

  • +
  • The connections arguments for bcpImport and bcpExport have been deprecated–server, database, username, password, trustedconnection. Use makeConnectArgs for the connectargs argument which adds Azure AD authentication and the option to disregard the trust server certificate.

  • +
  • The “DBI” dependency has been dropped and all SQL Server queries are run using bcp or sqlcmd.

  • +
  • mapDataTypes is a convenience function to determine SQL Server data type conversions. The defaults attempt to determine the smallest type size for each column.

  • +
  • createTable, dropTable, and checkTableExists have been added for internals and convenience. The primary purpose would be to define an empty table with user-defined types that bcpImport could append to.

  • +
  • logicals no longer need to be converted from FALSE/TRUE to 0/1 before importing in-memory data.

  • +
  • The argument azure was added to bcpImport and bcpExport for Azure Active Directory authentication. This only works for username and password authentication.

  • + + +
    +
    • bcpImport now returns the output of system2 for all specifications of stderr and stdout

    • added documentation for using schema and DBI::Id is now supported

    • trusted connections are now compatible with newer sql server drivers as the default for all drivers is now trusted_connection='yes'

    • user name and passwords are now quoted with shQuote so special characters are handled across platforms

    • added check to see if bcp program can be found

    -
    - +
    +
    • set the path to the bcp utility with the bcputility.bcp.path option

    • added links to source code, bug reports, and documentation site

    • rowterminator and fieldterminator are no passed to data.table::fwrite if data is in memory

    • Added support for geometry/geography data import for ‘sf’ objects

    -
    - +
    +
    • Added a NEWS.md file to track changes to the package.
    • Added bcpImport to import data to SQL Server
    • Added bcpExport to export data from SQL Server
    • +
    +
    @@ -86,7 +102,7 @@

    Export data from SQL Server

    -
    bcpExport(
    -  file,
    -  server,
    -  database,
    -  table,
    -  query,
    -  trustedconnection = TRUE,
    -  username,
    -  password,
    -  fieldterminator = "\t",
    -  rowterminator = ifelse(.Platform$OS.type == "windows", "\r\n", "\n"),
    -  datatypes = c("char", "nchar"),
    -  azure = FALSE,
    -  ...
    -)
    +
    bcpExport(
    +  file,
    +  connectargs,
    +  table,
    +  query,
    +  fieldterminator = "\t",
    +  rowterminator = ifelse(.Platform$OS.type == "windows", "\r\n", "\n"),
    +  bcpOptions = list("-c", "-b", 1000, "-a", 4096, "-m", 10),
    +  ...
    +)
    @@ -78,12 +73,8 @@

    Arguments

    output file name

    -
    server
    -

    the instance of SQL Server to which to connect

    - - -
    database
    -

    Specifies the database to connect to

    +
    connectargs
    +

    named list of connection arguments. See makeConnectArgs.

    table
    @@ -95,18 +86,6 @@

    Arguments

    table is specified.

    -
    trustedconnection
    -

    use integrated security, username and password are not required

    - - -
    username
    -

    login ID

    - - -
    password
    -

    password for login ID

    - -
    fieldterminator

    character separator for columns

    @@ -115,15 +94,8 @@

    Arguments

    character separator for rows--new lines

    -
    datatypes
    -

    the format of datatypes, -char performs the operation using a character data type, -nchar performs the bulk copy operation using Unicode characters

    - - -
    azure
    -

    use Azure Active Directory authentication, does not work with integrated -authentication

    +
    bcpOptions
    +

    list of additional options to pass to the bcp utility. See details.

    ...
    @@ -137,20 +109,18 @@

    Value

    No return value. Operations from bcp are printed to console; see ... to redirect output

    - -
    -

    Examples

    -
    if (FALSE) {
    -bcpExport('myfile.tsv',
    -          server = server,
    -          database = database,
    -          table = 'mytable',
    -          fieldterminator = '|',
    -          stdout = FALSE,
    -          datatypes = 'char')
    -}
    -
    +
    +

    Details

    +

    The bcpOptions allows the user to include additional arguments for the +call to system2. Please refer to +https://learn.microsoft.com/en-us/sql/tools/bcp-utility. +The default options are set +to the defaults for bcp CLI. -b refers to +number of rows to write at a time; 10,000 to 50,000 is a +starting recommendation. -a refers to size of packets to be sent in +bytes. -e refers to the maximum number of errors before failure.

    +
    -

    Site built with pkgdown 2.0.4.

    +

    Site built with pkgdown 2.0.7.

    diff --git a/docs/reference/bcpImport.html b/docs/reference/bcpImport.html index 82fb1af..a81ddc0 100644 --- a/docs/reference/bcpImport.html +++ b/docs/reference/bcpImport.html @@ -1,5 +1,6 @@ -Import data to SQL Server — bcpImport • bcputilityImport data to SQL Server — bcpImport • bcputility @@ -17,7 +18,7 @@ bcputility - 0.3.1 + 0.4.0 @@ -49,30 +50,22 @@

    Import data to SQL Server

    -

    A wrapper for a system call to the bcp utility which bulk inserts to SQL Server.

    +

    A wrapper for a system call to the bcp utility which bulk inserts to SQL +Server.

    -
    bcpImport(
    -  x,
    -  server,
    -  database,
    -  table,
    -  driver = "SQL Server",
    -  maxerrors = 10,
    -  batchsize = 1000,
    -  packetsize = 4096,
    -  regional = FALSE,
    -  trustedconnection = TRUE,
    -  username,
    -  password,
    -  fieldterminator = "\t",
    -  rowterminator = ifelse(.Platform$OS.type == "windows", "\r\n", "\n"),
    -  overwrite = FALSE,
    -  spatialtype = c("geometry", "geography"),
    -  azure = FALSE,
    -  ...
    -)
    +
    bcpImport(
    +  x,
    +  connectargs,
    +  table,
    +  fieldterminator = "\t",
    +  rowterminator = ifelse(.Platform$OS.type == "windows", "\r\n", "\n"),
    +  overwrite = FALSE,
    +  spatialtype = c("geometry", "geography"),
    +  bcpOptions = list("-b", 1000, "-a", 4096, "-m", 10),
    +  ...
    +)
    @@ -81,52 +74,14 @@

    Arguments

    dataframe object or path to file

    -
    server
    -

    the instance of SQL Server to which to connect

    - - -
    database
    -

    specifies the database to connect to

    +
    connectargs
    +

    named list of connection arguments. See makeConnectArgs.

    table
    -

    Name of the source table when exporting from SQL Server. For specifying the -schema in the table name see DBI::SQL or DBI::Id.

    - - -
    driver
    -

    name of driver for ODBC connection

    - - -
    maxerrors
    -

    maximum number of errors allowed

    - - -
    batchsize
    -

    number of rows to write at a time; 10,000 to 50,000 is a -starting recommendation

    - - -
    packetsize
    -

    size of packets to be sent

    - - -
    regional
    -

    Specifies that currency, date, and time data is bulk copied into SQL Server -using the regional format defined for the locale setting of the client -computer

    - - -
    trustedconnection
    -

    use integrated security, username and password are not required

    - - -
    username
    -

    login ID

    - - -
    password
    -

    password for login ID

    +

    Name of the source table when importing from SQL Server. For specifying the +schema in the table name see <schema>.<table> and if not specified the +default is "dbo".

    fieldterminator
    @@ -142,13 +97,13 @@

    Arguments

    spatialtype
    -

    spatial data type for schema https://docs.microsoft.com/en-us/sql/relational-databases/spatial/spatial-data-types-overview, +

    spatial data type for schema +https://docs.microsoft.com/en-us/sql/relational-databases/spatial/spatial-data-types-overview, ignored if x is not an 'sf' object

    -
    azure
    -

    use Azure Active Directory authentication, does not work with integrated -authentication.

    +
    bcpOptions
    +

    list of additional options to pass to the 'bcp' utility. See details.

    ...
    @@ -176,26 +131,18 @@

    Details

    The EPSG code is automatically read from the sf object and used as the SRID.

    To override the default path to the bcp command line utility, set the -bcputility.bcp.path option.

    +bcputility.bcp.path option. +To override the default path to the sqlcmd command line utility, set the +bcputility.sqlcmd.path option.

    +

    The bcpOptions allows the user to include additional arguments for the +call to system2. Please refer to +https://learn.microsoft.com/en-us/sql/tools/bcp-utility. +The default options are set to the defaults for bcp CLI. -b +refers to number of rows to write at a time; 10,000 to 50,000 is a +starting recommendation. -a refers to size of packets to be sent in +bytes. -e refers to the maximum number of errors before failure.

    -
    -

    Examples

    -
    if (FALSE) {
    -set.seed(33)
    -x <- data.frame(
    -  w = rpois(10, 10),
    -  x = rnorm(10),
    -  y = sample(LETTERS, 10),
    -  z = Sys.time()
    -)
    -bcpImport(x,
    -          server = server,
    -          database = database,
    -          table = 'mytable')
    -}
    -
    -
    -

    Site built with pkgdown 2.0.4.

    +

    Site built with pkgdown 2.0.7.

    diff --git a/docs/reference/createTable.html b/docs/reference/createTable.html new file mode 100644 index 0000000..6831243 --- /dev/null +++ b/docs/reference/createTable.html @@ -0,0 +1,115 @@ + +Create or drop table — createTable • bcputility + + +
    +
    + + + +
    +
    + + +
    +

    Create or drop table

    +
    + +
    +
    createTable(connectargs, table, coltypes, ...)
    +
    +dropTable(connectargs, table, ...)
    +
    +checkTableExists(connectargs, table)
    +
    + +
    +

    Arguments

    +
    connectargs
    +

    named list of connection arguments. See makeConnectArgs.

    + + +
    table
    +

    Name of the source table when importing from SQL Server. For specifying the +schema in the table name see <schema>.<table> and if not specified the +default is "dbo".

    + + +
    coltypes
    +

    character vector of data types with the column names as list/vector names. +Use mapDataTypes or refer to for proper format.

    + + +
    ...
    +

    arguments to pass to system2

    + +
    +
    +

    Value

    + + +

    No return value. Operations from bcp are printed to console; see +... to redirect output

    +
    + +
    + +
    + + +
    + + + + + + + + diff --git a/docs/reference/figures/benchmarks.png b/docs/reference/figures/benchmarks.png index 97d2bd842b2041b13d9cba870ebcc6e8792b8276..6ad2028b5216dca5a40e244b854faa8231ee143f 100644 GIT binary patch literal 68844 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 literal 67638 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 diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 8ccf7b4..8eaf8b1 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -2,5 +2,5 @@ pandoc: 2.19.2 pkgdown: 2.0.7 pkgdown_sha: ~ articles: {} -last_built: 2023-01-16T22:12Z +last_built: 2023-01-16T22:28Z
  • %*jP5Yk^j_jp_Ts{uY-?H#e(1mSRY@r~ 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�=7y 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 ARR910 diff --git a/docs/reference/index.html b/docs/reference/index.html index 72b351e..c38dc4c 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -1,5 +1,5 @@ -Function reference • bcputilityFunction reference • bcputility @@ -17,7 +17,7 @@ bcputility - 0.3.1 + 0.4.0 @@ -51,13 +51,31 @@

    All functions

    +

    bcpExport()

    + +

    Export data from SQL Server

    +

    bcpImport()

    Import data to SQL Server

    -

    bcpExport()

    +

    createTable() dropTable() checkTableExists()

    -

    Export data from SQL Server

    +

    Create or drop table

    + +

    mapDataTypes() varChar() varBinary() int()

    + +

    Determine SQL Server data types from data frame. Follows SQL Server +data type size constraints and chooses the smallest data type size.

    + +

    makeConnectArgs()

    + +

    Create a named list of connection arguments to translate to bcp and +sqlcmd options

    + +

    bcpVersion() sqlcmdVersion()

    + +

    Check bcp and sqlcmd versions

    diff --git a/docs/reference/makeConnectArgs.html b/docs/reference/makeConnectArgs.html new file mode 100644 index 0000000..1a3d93b --- /dev/null +++ b/docs/reference/makeConnectArgs.html @@ -0,0 +1,133 @@ + +Create a named list of connection arguments to translate to bcp and +sqlcmd options — makeConnectArgs • bcputility + + +
    +
    + + + +
    +
    + + +
    +

    Create a named list of connection arguments to translate to bcp and +sqlcmd options

    +
    + +
    +
    makeConnectArgs(
    +  server,
    +  database,
    +  username,
    +  password,
    +  trustedconnection = TRUE,
    +  trustservercert = FALSE,
    +  azure = FALSE
    +)
    +
    + +
    +

    Arguments

    +
    server
    +

    the instance of SQL Server to which to connect

    + + +
    database
    +

    specifies the database to connect to

    + + +
    username
    +

    login ID

    + + +
    password
    +

    password for login ID

    + + +
    trustedconnection
    +

    use integrated security, username and password are not required

    + + +
    trustservercert
    +

    trust the server certificate

    + + +
    azure
    +

    use Azure Active Directory authentication, does not work with integrated +authentication.

    + +
    +
    +

    Value

    + + +

    a list with connection arguments

    +
    + +
    + +
    + + +
    + + + + + + + + diff --git a/docs/reference/mapDataTypes.html b/docs/reference/mapDataTypes.html new file mode 100644 index 0000000..cddaeb4 --- /dev/null +++ b/docs/reference/mapDataTypes.html @@ -0,0 +1,129 @@ + +Determine SQL Server data types from data frame. Follows SQL Server +data type size constraints and chooses the smallest data type size. — mapDataTypes • bcputility + + +
    +
    + + + +
    +
    + + +
    +

    Determine SQL Server data types from data frame. Follows SQL Server +data type size constraints and chooses the smallest data type size.

    +
    + +
    +
    mapDataTypes(x, coltypes)
    +
    +varChar(x)
    +
    +varBinary(x)
    +
    +int(x)
    +
    + +
    +

    Arguments

    +
    x
    +

    data.frame object

    + + +
    coltypes
    +

    vector with names of columns to override the default data type mapping

    + +
    +
    +

    Value

    + + +

    character vector with names of columns

    +
    + +
    +

    Examples

    +
    
    +mapDataTypes(data.frame(
    +  int = 1:5L,
    +  numeric = seq(0, 1, length.out = 5),
    +  character = LETTERS[1:5],
    +  factor = paste(LETTERS[1:5], LETTERS[1:5], sep = ''),
    +  logical = c(TRUE, FALSE, TRUE, FALSE, TRUE),
    +  date = seq(Sys.Date() - 4, Sys.Date(), 1L),
    +  datetime = seq(Sys.time() - 5, Sys.time(), length.out = 5)
    +  )
    +)
    +#>          int      numeric    character       factor      logical         date 
    +#>    "TINYINT"      "FLOAT" "VARCHAR(1)" "VARCHAR(2)"        "BIT"       "DATE" 
    +#>     datetime 
    +#>   "DATETIME" 
    +
    +
    +
    + +
    + + +
    + + + + + + + + diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 3e9af89..8960988 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -1,30 +1,45 @@ - https://bcputility.roh.engineering/index.html + /reference/index.html - https://bcputility.roh.engineering/LICENSE.html + /reference/bcpImport.html - https://bcputility.roh.engineering/authors.html + /reference/bcpExport.html - https://bcputility.roh.engineering/LICENSE-text.html + /reference/createTable.html - https://bcputility.roh.engineering/404.html + /reference/mapDataTypes.html - https://bcputility.roh.engineering/reference/bcpExport.html + /reference/makeConnectArgs.html - https://bcputility.roh.engineering/reference/bcpImport.html + /reference/SQLServerCLIVersions.html - https://bcputility.roh.engineering/reference/index.html + /news/index.html - https://bcputility.roh.engineering/news/index.html + /authors.html + + + /LICENSE-text.html + + + /LICENSE.html + + + /index.html + + + /404.html + + + /TODO.html diff --git a/man/SQLServerCLIVersions.Rd b/man/SQLServerCLIVersions.Rd new file mode 100644 index 0000000..6479b1e --- /dev/null +++ b/man/SQLServerCLIVersions.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bcp.R +\name{SQLServerCLIVersions} +\alias{SQLServerCLIVersions} +\alias{bcpVersion} +\alias{sqlcmdVersion} +\title{Check bcp and sqlcmd versions} +\usage{ +bcpVersion(...) + +sqlcmdVersion(...) +} +\arguments{ +\item{...}{arguments to pass \link[base]{system2}} +} +\description{ +Check bcp and sqlcmd versions +} diff --git a/man/bcpExport.Rd b/man/bcpExport.Rd index 11cd201..d25da58 100644 --- a/man/bcpExport.Rd +++ b/man/bcpExport.Rd @@ -6,48 +6,30 @@ \usage{ bcpExport( file, - server, - database, + connectargs, table, query, - trustedconnection = TRUE, - username, - password, fieldterminator = "\\t", rowterminator = ifelse(.Platform$OS.type == "windows", "\\r\\n", "\\n"), - datatypes = c("char", "nchar"), - azure = FALSE, + bcpOptions = list("-c", "-b", 1000, "-a", 4096, "-m", 10), ... ) } \arguments{ \item{file}{output file name} -\item{server}{the instance of SQL Server to which to connect} - -\item{database}{Specifies the database to connect to} +\item{connectargs}{named list of connection arguments. See \link[bcputility]{makeConnectArgs}.} \item{table}{name of the source table when exporting from SQL Server} \item{query}{Transact-SQL query that returns a result set. Ignored if table is specified.} -\item{trustedconnection}{use integrated security, username and password are not required} - -\item{username}{login ID} - -\item{password}{password for login ID} - \item{fieldterminator}{character separator for columns} \item{rowterminator}{character separator for rows--new lines} -\item{datatypes}{the format of datatypes, -char performs the operation using a character data type, -nchar performs the bulk copy operation using Unicode characters} - -\item{azure}{use Azure Active Directory authentication, does not work with integrated -authentication} +\item{bcpOptions}{list of additional options to pass to the \code{bcp} utility. See details.} \item{...}{arguments to pass \link[base]{system2}} } @@ -59,14 +41,13 @@ No return value. Operations from bcp are printed to console; see A wrapper for a system call to the bcp utility which writes a SQL Server table or query (T-SQL) to a file. } -\examples{ -\dontrun{ -bcpExport('myfile.tsv', - server = server, - database = database, - table = 'mytable', - fieldterminator = '|', - stdout = FALSE, - datatypes = 'char') -} +\details{ +The \code{bcpOptions} allows the user to include additional arguments for the +call to \code{system2}. Please refer to +\url{https://learn.microsoft.com/en-us/sql/tools/bcp-utility}. +The default options are set +to the defaults for \code{bcp} CLI. \code{-b} refers to +number of rows to write at a time; 10,000 to 50,000 is a +starting recommendation. \code{-a} refers to size of packets to be sent in +bytes. \code{-e} refers to the maximum number of errors before failure. } diff --git a/man/bcpImport.Rd b/man/bcpImport.Rd index 3af650a..6db405f 100644 --- a/man/bcpImport.Rd +++ b/man/bcpImport.Rd @@ -6,53 +6,24 @@ \usage{ bcpImport( x, - server, - database, + connectargs, table, - driver = "SQL Server", - maxerrors = 10, - batchsize = 1000, - packetsize = 4096, - regional = FALSE, - trustedconnection = TRUE, - username, - password, fieldterminator = "\\t", rowterminator = ifelse(.Platform$OS.type == "windows", "\\r\\n", "\\n"), overwrite = FALSE, spatialtype = c("geometry", "geography"), - azure = FALSE, + bcpOptions = list("-b", 1000, "-a", 4096, "-m", 10), ... ) } \arguments{ \item{x}{dataframe object or path to file} -\item{server}{the instance of SQL Server to which to connect} +\item{connectargs}{named list of connection arguments. See \link[bcputility]{makeConnectArgs}.} -\item{database}{specifies the database to connect to} - -\item{table}{Name of the source table when exporting from SQL Server. For specifying the -schema in the table name see \code{DBI::SQL} or \code{DBI::Id}.} - -\item{driver}{name of driver for ODBC connection} - -\item{maxerrors}{maximum number of errors allowed} - -\item{batchsize}{number of rows to write at a time; 10,000 to 50,000 is a -starting recommendation} - -\item{packetsize}{size of packets to be sent} - -\item{regional}{Specifies that currency, date, and time data is bulk copied into SQL Server -using the regional format defined for the locale setting of the client -computer} - -\item{trustedconnection}{use integrated security, username and password are not required} - -\item{username}{login ID} - -\item{password}{password for login ID} +\item{table}{Name of the source table when importing from SQL Server. For specifying the +schema in the table name see \code{.} and if not specified the +default is "dbo".} \item{fieldterminator}{character separator for columns} @@ -60,11 +31,11 @@ computer} \item{overwrite}{Whether to overwrite the table if it exists} -\item{spatialtype}{spatial data type for schema \url{https://docs.microsoft.com/en-us/sql/relational-databases/spatial/spatial-data-types-overview}, +\item{spatialtype}{spatial data type for schema +\url{https://docs.microsoft.com/en-us/sql/relational-databases/spatial/spatial-data-types-overview}, ignored if \code{x} is not an 'sf' object} -\item{azure}{use Azure Active Directory authentication, does not work with integrated -authentication.} +\item{bcpOptions}{list of additional options to pass to the 'bcp' utility. See details.} \item{...}{arguments to pass to \link[base]{system2}} } @@ -72,7 +43,8 @@ authentication.} Output from \code{system2}. See \code{...} to redirect output. } \description{ -A wrapper for a system call to the bcp utility which bulk inserts to SQL Server. +A wrapper for a system call to the bcp utility which bulk inserts to SQL +Server. } \details{ If x is a dataframe object, \code{data.table::fwrite} is used to write the @@ -92,19 +64,14 @@ SRID. To override the default path to the bcp command line utility, set the \code{bcputility.bcp.path} option. -} -\examples{ -\dontrun{ -set.seed(33) -x <- data.frame( - w = rpois(10, 10), - x = rnorm(10), - y = sample(LETTERS, 10), - z = Sys.time() -) -bcpImport(x, - server = server, - database = database, - table = 'mytable') -} +To override the default path to the sqlcmd command line utility, set the +\code{bcputility.sqlcmd.path} option. + +The \code{bcpOptions} allows the user to include additional arguments for the +call to \code{system2}. Please refer to +\url{https://learn.microsoft.com/en-us/sql/tools/bcp-utility}. +The default options are set to the defaults for \code{bcp} CLI. \code{-b} +refers to number of rows to write at a time; 10,000 to 50,000 is a +starting recommendation. \code{-a} refers to size of packets to be sent in +bytes. \code{-e} refers to the maximum number of errors before failure. } diff --git a/man/createTable.Rd b/man/createTable.Rd new file mode 100644 index 0000000..570b0b9 --- /dev/null +++ b/man/createTable.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bcp.R +\name{createTable} +\alias{createTable} +\alias{dropTable} +\alias{checkTableExists} +\title{Create or drop table} +\usage{ +createTable(connectargs, table, coltypes, ...) + +dropTable(connectargs, table, ...) + +checkTableExists(connectargs, table) +} +\arguments{ +\item{connectargs}{named list of connection arguments. See \link[bcputility]{makeConnectArgs}.} + +\item{table}{Name of the source table when importing from SQL Server. For specifying the +schema in the table name see \code{.
    } and if not specified the +default is "dbo".} + +\item{coltypes}{character vector of data types with the column names as list/vector names. +Use \link[bcputility]{mapDataTypes} or refer to for proper format.} + +\item{...}{arguments to pass to \link[base]{system2}} +} +\value{ +No return value. Operations from bcp are printed to console; see +\code{...} to redirect output +} +\description{ +Create or drop table +} diff --git a/man/figures/benchmarks.png b/man/figures/benchmarks.png index 97d2bd842b2041b13d9cba870ebcc6e8792b8276..6ad2028b5216dca5a40e244b854faa8231ee143f 100644 GIT binary patch literal 68844 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 literal 67638 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
  • %*jP5Yk^j_jp_Ts{uY-?H#e(1mSRY@r~ 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�=7y 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 ARR910 diff --git a/man/makeConnectArgs.Rd b/man/makeConnectArgs.Rd new file mode 100644 index 0000000..841ecdf --- /dev/null +++ b/man/makeConnectArgs.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bcp.R +\name{makeConnectArgs} +\alias{makeConnectArgs} +\title{Create a named list of connection arguments to translate to bcp and +sqlcmd options} +\usage{ +makeConnectArgs( + server, + database, + username, + password, + trustedconnection = TRUE, + trustservercert = FALSE, + azure = FALSE +) +} +\arguments{ +\item{server}{the instance of SQL Server to which to connect} + +\item{database}{specifies the database to connect to} + +\item{username}{login ID} + +\item{password}{password for login ID} + +\item{trustedconnection}{use integrated security, username and password are not required} + +\item{trustservercert}{trust the server certificate} + +\item{azure}{use Azure Active Directory authentication, does not work with integrated +authentication.} +} +\value{ +a list with connection arguments +} +\description{ +Create a named list of connection arguments to translate to bcp and +sqlcmd options +} diff --git a/man/mapDataTypes.Rd b/man/mapDataTypes.Rd new file mode 100644 index 0000000..5fbd4f1 --- /dev/null +++ b/man/mapDataTypes.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bcp.R +\name{mapDataTypes} +\alias{mapDataTypes} +\alias{varChar} +\alias{varBinary} +\alias{int} +\title{Determine SQL Server data types from data frame. Follows SQL Server +data type size constraints and chooses the smallest data type size.} +\usage{ +mapDataTypes(x, coltypes) + +varChar(x) + +varBinary(x) + +int(x) +} +\arguments{ +\item{x}{data.frame object} + +\item{coltypes}{vector with names of columns to override the default data type mapping} +} +\value{ +character vector with names of columns +} +\description{ +Determine SQL Server data types from data frame. Follows SQL Server +data type size constraints and chooses the smallest data type size. +} +\examples{ + +mapDataTypes(data.frame( + int = 1:5L, + numeric = seq(0, 1, length.out = 5), + character = LETTERS[1:5], + factor = paste(LETTERS[1:5], LETTERS[1:5], sep = ''), + logical = c(TRUE, FALSE, TRUE, FALSE, TRUE), + date = seq(Sys.Date() - 4, Sys.Date(), 1L), + datetime = seq(Sys.time() - 5, Sys.time(), length.out = 5) + ) +) +} diff --git a/tests/a-init-db.R b/tests/a-init-db.R new file mode 100644 index 0000000..6838cf8 --- /dev/null +++ b/tests/a-init-db.R @@ -0,0 +1,53 @@ +library(bcputility) +init <- FALSE +if (!identical(Sys.getenv("NOT_CRAN"), "true") && isTRUE(init)) { + # set up connnect args + server <- Sys.getenv("MSSQL_SERVER") + database <- Sys.getenv('MSSQL_DB') + connectArgs <- makeConnectArgs(server = server, database = database) + # create sample datasets + set.seed(11) + n <- 100000 + importTable <- data.frame( + int = sample(x = seq(1L, 10000L, 1L), size = n, replace = TRUE), + numeric = sample(x = seq(0, 1, length.out = n / 100), size = n, + replace = TRUE), + character = sample(x = state.abb, size = n, replace = TRUE), + factor = sample(x = factor(x = month.abb, levels = month.abb), + size = n, replace = TRUE), + #logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), + date = sample(x = seq(as.Date('2022-01-01'), as.Date('2022-12-31'), + by = 'days'), size = n, replace = TRUE), + datetime = sample(x = seq(as.POSIXct('2022-01-01 00:00:00'), + as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, replace = TRUE) + ) + exportTable <- importTable[seq(1L, 10000L, 1L), ] + sfTable <- sf::st_read(system.file(package = 'sf', 'gpkg/nc.gpkg'), + quiet = TRUE) + sfTable <- sfTable[sample.int(nrow(sfTable), 10000, replace = TRUE),] + # create init datasets for testing against + bcpImport(x = importTable, connectargs = connectArgs, + table = 'importTableInit', overwrite = TRUE, stdout = FALSE) + bcpImport(x = exportTable, connectargs = connectArgs, + table = 'exportTableInit', overwrite = TRUE, stdout = FALSE) + bcpExport(file = 'inst/benchmarks/exportTableInit.csv', + connectargs = connectArgs, table = 'exportTableInit', fieldterminator = ',', + stdout = FALSE + ) + query <- 'SELECT * FROM [dbo].[exportTableInit] WHERE int < 1000' + bcpExport(file = 'inst/benchmarks/queryTableInit.csv', + connectargs = connectArgs, query = query, fieldterminator = ',', + stdout = FALSE + ) + bcpImport(x = sfTable, connectargs = connectArgs, table = 'sfTableGeomInit', + overwrite = TRUE, stdout = FALSE) + bcpImport(x = sfTable, connectargs = connectArgs, table = 'sfTableGeogInit', + overwrite = TRUE, stdout = FALSE, spatialtype = 'geography') + sqlcmdArgs <- append(bcputility:::mapConnectArgs(connectargs = connectArgs, + utility = 'sqlcmd'), values = list('-Q', + shQuote("IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'test') + BEGIN + EXEC('CREATE SCHEMA test;') + END"))) + system2(command = bcputility:::findUtility('sqlcmd'), args = sqlcmdArgs) +} diff --git a/tests/b-import-db.R b/tests/b-import-db.R new file mode 100644 index 0000000..5972f7d --- /dev/null +++ b/tests/b-import-db.R @@ -0,0 +1,229 @@ +library(bcputility) +testLocal <- TRUE +if (!identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { + tryDropTable <- function(connectargs, table) { + if (checkTableExists(connectargs, table)) { + dropTable(connectargs, table) + } + } + testImport <- function(connectargs) { + # clean up on exit + on.exit( + expr = tryDropTable(connectargs = connectArgs, 'importTable1000'), + add = TRUE + ) + on.exit( + expr = tryDropTable(connectargs = connectArgs, 'importTable10000'), + add = TRUE + ) + on.exit( + expr = tryDropTable(connectargs = connectArgs, 'sfTableGeom'), + add = TRUE + ) + on.exit( + expr = tryDropTable(connectargs = connectArgs, 'sfTableGeog'), + add = TRUE + ) + on.exit( + expr = tryDropTable(connectargs = connectArgs, 'importTableLogin'), + add = TRUE + ) + on.exit( + expr = tryDropTable(connectargs = connectArgs, 'test.importTable'), + add = TRUE + ) + on.exit( + expr = tryDropTable(connectargs = connectArgs, 'test.sfTable'), + add = TRUE + ) + # create sample datasets + set.seed(11) + n <- 100000 + importTable <- data.frame( + int = sample(x = seq(1L, 10000L, 1L), size = n, replace = TRUE), + numeric = sample(x = seq(0, 1, length.out = n/100), size = n, + replace = TRUE), + character = sample(x = state.abb, size = n, replace = TRUE), + factor = sample(x = factor(x = month.abb, levels = month.abb), + size = n, replace = TRUE), + #logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), + date = sample(x = seq(as.Date('2022-01-01'), as.Date('2022-12-31'), + by = 'days'), size = n, replace = TRUE), + datetime = sample(x = seq(as.POSIXct('2022-01-01 00:00:00'), + as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, replace = TRUE) + ) + sfTable <- sf::st_read(system.file(package = 'sf', 'gpkg/nc.gpkg'), + quiet = TRUE) + sfTable <- sfTable[sample.int(nrow(sfTable), 10000, replace = TRUE),] + # bcpImport 1000 + bcpImport( + importTable, + connectargs = connectArgs, + table = '[importTable1000]', + overwrite = TRUE, + stdout = FALSE + ) |> + identical(0L) |> + stopifnot() + bcputility:::readTable(connectargs = connectArgs, table = 'importTable1000') |> + identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + stopifnot() + # bcpImport 10000 + bcpImport( + importTable, + connectargs = connectArgs, + table = '[importTable10000]', + overwrite = TRUE, + stdout = FALSE, + bcpOptions = list( + '-b', 10000, + '-a', 4096 + ) + ) |> + identical(0L) |> + stopifnot() + bcputility:::readTable(connectargs = connectArgs, table = 'importTable10000') |> + identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + stopifnot() + # bcpImportGeometry + bcpImport( + sfTable, + connectargs = connectArgs, + table = 'sfTableGeom', + overwrite = TRUE, + stdout = FALSE + ) |> + identical(0L) |> + stopifnot() + bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeom') |> + identical(bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeomInit')) |> + stopifnot() + # bcpImportGeography + bcpImport( + sfTable, + connectargs = connectArgs, + table = 'sfTableGeog', + overwrite = TRUE, + stdout = FALSE, + spatialtype = 'geography' + ) |> + identical(0L) |> + stopifnot() + bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeog') |> + identical(bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeogInit')) |> + stopifnot() + # test sql login + loginConnectArgs <- makeConnectArgs(server = server, database = database, + username = Sys.getenv('MSSQL_UID'), password = Sys.getenv('MSSQL_PWD')) + bcpImport( + importTable, + connectargs = connectArgs, + table = '[importTableLogin]', + overwrite = TRUE, + stdout = FALSE + ) |> + identical(0L) |> + stopifnot() + bcputility:::readTable(connectargs = connectArgs, table = 'importTableLogin') |> + identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + stopifnot() + # bcpImport schema + bcpImport( + importTable, + connectargs = connectArgs, + table = 'test.[importTable]', + overwrite = TRUE, + stdout = FALSE + ) |> + identical(0L) |> + stopifnot() + bcputility:::readTable(connectargs = connectArgs, table = 'test.importTable') |> + identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + stopifnot() + # test return output + # fail no capture + bcpImport( + importTable[1:10000, rev(seq_len(ncol(importTable)))], + connectargs = connectArgs, + table = '[test].importTable', + overwrite = FALSE, + stdout = FALSE + ) |> + identical(1L) |> + stopifnot() + # pass with capture + bcpImport( + importTable[1:10000, ], + connectargs = connectArgs, + table = '[test].importTable', + overwrite = TRUE, + stdout = TRUE, + stderr = TRUE + ) |> + attr('status') |> + is.null() |> + stopifnot() + # fail with capture + bcpImport( + importTable[1:10000, rev(seq_len(ncol(importTable)))], + connectargs = connectArgs, + table = '[test].importTable', + overwrite = FALSE, + stdout = TRUE, + stderr = TRUE + ) |> + attr('status') |> + identical(1L) |> + stopifnot() + # test return output sf + # pass no capture + bcpImport( + sfTable, + connectargs = connectArgs, + table = '[test].sfTable', + overwrite = TRUE, + stdout = FALSE + ) |> + identical(0L) |> + stopifnot() + # fail no capture + bcpImport( + sfTable, + connectargs = connectArgs, + table = '[test].sfTable', + overwrite = FALSE, + stdout = FALSE + ) |> + identical(1L) |> + stopifnot() + # pass with capture + bcpImport( + sfTable, + connectargs = connectArgs, + table = '[test].sfTable', + overwrite = TRUE, + stdout = TRUE, + stderr = TRUE + ) |> + attr('status') |> + is.null() |> + stopifnot() + # fail with capture + bcpImport( + sfTable, + connectargs = connectArgs, + table = '[test].sfTable', + overwrite = FALSE, + stdout = TRUE, + stderr = TRUE + ) |> + attr('status') |> + identical(1L) |> + stopifnot() + } + # set up connnect args + server <- Sys.getenv('MSSQL_SERVER') + database <- Sys.getenv('MSSQL_DB') + connectArgs <- makeConnectArgs(server = server, database = database) + testImport(connectargs = connectArgs) +} diff --git a/tests/c-export-db.R b/tests/c-export-db.R new file mode 100644 index 0000000..f33782e --- /dev/null +++ b/tests/c-export-db.R @@ -0,0 +1,78 @@ +library(bcputility) +testLocal <- TRUE +if (!identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { + testExport <- function(connectargs) { + on.exit( + expr = file.remove( + c( + 'inst/benchmarks/queryTable.csv', + 'inst/benchmarks/queryTableNchar.csv', + 'inst/benchmarks/exportTableChar.csv', + 'inst/benchmarks/exportTableNchar.csv')) |> + invisible() |> + suppressWarnings(), + add = TRUE) + # bcpExportChar + bcpExport( + 'inst/benchmarks/exportTableChar.csv', + connectargs = connectArgs, + table = 'exportTableInit', + fieldterminator = ',', + stdout = FALSE + ) |> + identical(0L) |> + stopifnot() + # bcpExportNchar + bcpExport( + 'inst/benchmarks/exportTableNchar.csv', + connectargs = connectArgs, + table = 'exportTableInit', + fieldterminator = ',', + stdout = FALSE, + bcpOptions = list( + '-w', + '-b', 1000, + '-a', 4096, + '-e', 10 + ) + ) |> + identical(0L) |> + stopifnot() + data.table::fread('inst/benchmarks/exportTableChar.csv') |> + identical(data.table::fread('inst/benchmarks/exportTableInit.csv')) |> + stopifnot() + # test query export + query <- 'SELECT * FROM [dbo].[exportTableInit] WHERE int < 1000' + # bcpExportChar + bcpExport(file = 'inst/benchmarks/queryTable.csv', + connectargs = connectArgs, query = query, fieldterminator = ',', + stdout = FALSE + ) |> + identical(0L) |> + stopifnot() + # bcpExportQueryNchar + bcpExport( + 'inst/benchmarks/queryTableNchar.csv', + connectargs = connectArgs, + query = query, + fieldterminator = ',', + stdout = FALSE, + bcpOptions = list( + '-w', + '-b', 1000, + '-a', 4096, + '-e', 10 + ) + ) |> + identical(0L) |> + stopifnot() + data.table::fread('inst/benchmarks/queryTable.csv') |> + identical(data.table::fread('inst/benchmarks/queryTableInit.csv')) |> + stopifnot() + } + # set up connnect args + server <- Sys.getenv('MSSQL_SERVER') + database <- Sys.getenv('MSSQL_DB') + connectArgs <- makeConnectArgs(server = server, database = database) + testExport(connectargs = connectArgs) +} diff --git a/tests/d-types.R b/tests/d-types.R new file mode 100644 index 0000000..c8888f4 --- /dev/null +++ b/tests/d-types.R @@ -0,0 +1,42 @@ +library(bcputility) +# test map data types +testTypeMapping <- function() { + mapDataTypes(data.frame( + int = 1:5L, + numeric = seq(0, 1, length.out = 5), + character = LETTERS[1:5], + factor = paste(LETTERS[1:5], LETTERS[1:5], sep = ''), + logical = c(TRUE, FALSE, TRUE, FALSE, TRUE), + date = seq(Sys.Date() - 4, Sys.Date(), 1L), + datetime = seq(Sys.time() - 5, Sys.time(), length.out = 5) + ) + ) |> + identical( + c(int = "TINYINT", numeric = "FLOAT", character = "VARCHAR(1)", + factor = "VARCHAR(2)", logical = "BIT", date = "DATE", + datetime = "DATETIME")) |> + stopifnot() + # test varChar + (varChar(paste(rep('A', 1), collapse = '')) == 'VARCHAR(1)') |> + stopifnot() + (varChar(paste(rep('A', 8001), collapse = '')) == 'VARCHAR(MAX)') |> + stopifnot() + (varChar(NA_character_) == 'VARCHAR(1)') |> + stopifnot() + # test varBinary + (varBinary(blob::as_blob(raw(length = 1))) == 'VARBINARY(1)') |> + stopifnot() + (varBinary(blob::as_blob(raw(length = 8001))) == 'VARBINARY(MAX)') |> + stopifnot() + (varBinary(blob::as_blob(NA)) == 'VARBINARY(0)') |> + stopifnot() + (int(2) == 'TINYINT') |> + stopifnot() + (int(2^8) == 'SMALLINT') |> + stopifnot() + (int(2^15) == 'INTEGER') |> + stopifnot() + (int(2^31) == 'BIGINT') |> + stopifnot() +} +testTypeMapping() From ba9d66ec5dd9b3cf22e808b40da3d4209bcf815a Mon Sep 17 00:00:00 2001 From: Thomas Roh Date: Sun, 15 Jan 2023 09:26:00 -0800 Subject: [PATCH 2/7] updating readme and tests for cran compliance --- README.md | 4 ++-- docs/index.html | 2 +- docs/pkgdown.yml | 2 +- docs/sitemap.xml | 3 --- tests/a-init-db.R | 2 +- tests/b-import-db.R | 2 +- tests/c-export-db.R | 2 +- 7 files changed, 7 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2194830..e32841a 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,10 @@ **bcputility** is a wrapper for the command line utility program from SQL Server -that does bulk imports/exports. The package assumes that [bcp](https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver15) +that does bulk imports/exports. The package assumes that [bcp](https://docs.microsoft.com/en-us/sql/tools/bcp-utility) is already installed and is on the system search path. For large inserts to SQL Server over an ODBC connection (e.g. with the -"[DBI](https://db.rstudio.com/dbi/)" package), writes can take a very long time as +"[DBI](https://dbi.r-dbi.org/)" package), writes can take a very long time as each row generates an individual insert statement. The bcp Utility greatly improves performance of large writes by using bulk inserts. diff --git a/docs/index.html b/docs/index.html index a55aa98..c3ab272 100644 --- a/docs/index.html +++ b/docs/index.html @@ -78,7 +78,7 @@ -

    bcputility is a wrapper for the command line utility program from SQL Server that does bulk imports/exports. The package assumes that bcp is already installed and is on the system search path. For large inserts to SQL Server over an ODBC connection (e.g. with the “DBI” package), writes can take a very long time as each row generates an individual insert statement. The bcp Utility greatly improves performance of large writes by using bulk inserts.

    +

    bcputility is a wrapper for the command line utility program from SQL Server that does bulk imports/exports. The package assumes that bcp is already installed and is on the system search path. For large inserts to SQL Server over an ODBC connection (e.g. with the “DBI” package), writes can take a very long time as each row generates an individual insert statement. The bcp Utility greatly improves performance of large writes by using bulk inserts.

    An export function is provided for convenience, but likely will not significantly improve performance over other methods.

    Installation diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 5069e38..60a710f 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -2,5 +2,5 @@ pandoc: 2.19.2 pkgdown: 2.0.7 pkgdown_sha: ~ articles: {} -last_built: 2023-01-15T15:09Z +last_built: 2023-01-15T17:18Z diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 8960988..f7bf88d 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -39,7 +39,4 @@ /404.html - - /TODO.html - diff --git a/tests/a-init-db.R b/tests/a-init-db.R index 6838cf8..9fb36fd 100644 --- a/tests/a-init-db.R +++ b/tests/a-init-db.R @@ -1,6 +1,6 @@ library(bcputility) init <- FALSE -if (!identical(Sys.getenv("NOT_CRAN"), "true") && isTRUE(init)) { +if (identical(Sys.getenv("NOT_CRAN"), "true") && isTRUE(init)) { # set up connnect args server <- Sys.getenv("MSSQL_SERVER") database <- Sys.getenv('MSSQL_DB') diff --git a/tests/b-import-db.R b/tests/b-import-db.R index 5972f7d..d200db1 100644 --- a/tests/b-import-db.R +++ b/tests/b-import-db.R @@ -1,6 +1,6 @@ library(bcputility) testLocal <- TRUE -if (!identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { +if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { tryDropTable <- function(connectargs, table) { if (checkTableExists(connectargs, table)) { dropTable(connectargs, table) diff --git a/tests/c-export-db.R b/tests/c-export-db.R index f33782e..3987711 100644 --- a/tests/c-export-db.R +++ b/tests/c-export-db.R @@ -1,6 +1,6 @@ library(bcputility) testLocal <- TRUE -if (!identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { +if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { testExport <- function(connectargs) { on.exit( expr = file.remove( From 24e93de9ee8688d72c1912239c29e4c9825d94fc Mon Sep 17 00:00:00 2001 From: Thomas Roh Date: Mon, 16 Jan 2023 13:57:47 -0800 Subject: [PATCH 3/7] updating tests --- .lintr | 3 +- R/sysdata.rda | Bin 0 -> 115459 bytes tests/a-init-db.R | 126 +++++++++++++++++++++++++++----------------- tests/b-import-db.R | 39 +++++++++----- tests/c-export-db.R | 33 ++++++------ 5 files changed, 120 insertions(+), 81 deletions(-) create mode 100644 R/sysdata.rda diff --git a/.lintr b/.lintr index 725fd27..b0a3f24 100644 --- a/.lintr +++ b/.lintr @@ -5,6 +5,5 @@ linters: linters_with_defaults( ) encoding: "UTF-8" exclusions: list( - "inst/", - "tests/" + "inst/" ) diff --git a/R/sysdata.rda b/R/sysdata.rda new file mode 100644 index 0000000000000000000000000000000000000000..789ec2903d27e6e0be58d1b3c08efe731f9aa8e5 GIT binary patch literal 115459 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 LML1B9Fg3p}_hSOV literal 0 HcmV?d00001 diff --git a/tests/a-init-db.R b/tests/a-init-db.R index 9fb36fd..ea2a6c3 100644 --- a/tests/a-init-db.R +++ b/tests/a-init-db.R @@ -1,53 +1,85 @@ library(bcputility) -init <- FALSE -if (identical(Sys.getenv("NOT_CRAN"), "true") && isTRUE(init)) { +# DEVELOPERS ONLY +# This is provided as a convenience to set up a testing environment for those +# who wish to modify. This only needs to be run once for setting up the +# required tables and schema in a SQL Server instance. Set the environment +# variables MSSQL_SERVER and MSSQL_DB or modify the `makeConnectArgs` function +# below. It is best to `source` this file from the package home directory. + +# Writes the data to SQL Server if TRUES +initDB <- FALSE +# This should never need to be TRUE as the internall R data is already contained +# in the package. +initRData <- FALSE +if (identical(Sys.getenv("NOT_CRAN"), "true")) { + initTestData <- function(connectargs, initDB = initDB, + initRData = initRData) { + # create sample datasets + set.seed(11) + n <- 100000 + importTable <- data.frame( + int = sample(x = seq(1L, 10000L, 1L), size = n, replace = TRUE), + numeric = sample(x = seq(0, 1, length.out = n / 100), size = n, + replace = TRUE), + character = sample(x = state.abb, size = n, replace = TRUE), + factor = sample(x = factor(x = month.abb, levels = month.abb), + size = n, replace = TRUE), + logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), + date = sample(x = seq(as.Date('2022-01-01'), as.Date('2022-12-31'), + by = 'days'), size = n, replace = TRUE), + datetime = sample(x = seq(as.POSIXct('2022-01-01 00:00:00'), + as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, + replace = TRUE) + ) + exportTable <- importTable[seq(1L, 10000L, 1L), ] + sfTable <- sf::st_read(system.file(package = 'sf', 'gpkg/nc.gpkg'), + quiet = TRUE) + sfTable <- sfTable[sample.int(nrow(sfTable), 10000, replace = TRUE), ] + if (isTRUE(initDB)) { + # create init datasets for testing against + bcpImport(x = importTable, connectargs = connectArgs, + table = 'importTableInit', overwrite = TRUE, stdout = FALSE) + bcpImport(x = exportTable, connectargs = connectArgs, + table = 'exportTableInit', overwrite = TRUE, stdout = FALSE) + # write spatial data + bcpImport(x = sfTable, connectargs = connectArgs, + table = 'sfTableGeomInit', overwrite = TRUE, stdout = FALSE) + bcpImport(x = sfTable, connectargs = connectArgs, + table = 'sfTableGeogInit', overwrite = TRUE, stdout = FALSE, + spatialtype = 'geography') + # create "test" schema + sqlcmdArgs <- append( + bcputility:::mapConnectArgs(connectargs = connectArgs, + utility = 'sqlcmd'), values = list('-Q', + shQuote("IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'test') + BEGIN + EXEC('CREATE SCHEMA test;') + END"))) + system2(command = bcputility:::findUtility('sqlcmd'), args = sqlcmdArgs) + } + if (isTRUE(initDB)) { + # create internal data + exportTableFile <- tempfile('exportTableInit', fileext = '.csv') + bcpExport(file = exportTableFile, connectargs = connectArgs, + table = 'exportTableInit', fieldterminator = ',', + stdout = FALSE + ) + .exportTableInit <- data.table::fread(exportTableFile) + queryTableFile <- tempfile('queryTableInit', fileext = '.csv') + query <- 'SELECT * FROM [dbo].[exportTableInit] WHERE int < 1000' + bcpExport(file = queryTableFile, connectargs = connectArgs, query = query, + fieldterminator = ',', stdout = FALSE + ) + .queryTableInit <- data.table::fread(queryTableFile) + save(.exportTableInit, .queryTableInit, + file = '../bcputility/R/sysdata.rda', + compress = 'bzip2') + } + } # set up connnect args server <- Sys.getenv("MSSQL_SERVER") database <- Sys.getenv('MSSQL_DB') connectArgs <- makeConnectArgs(server = server, database = database) - # create sample datasets - set.seed(11) - n <- 100000 - importTable <- data.frame( - int = sample(x = seq(1L, 10000L, 1L), size = n, replace = TRUE), - numeric = sample(x = seq(0, 1, length.out = n / 100), size = n, - replace = TRUE), - character = sample(x = state.abb, size = n, replace = TRUE), - factor = sample(x = factor(x = month.abb, levels = month.abb), - size = n, replace = TRUE), - #logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), - date = sample(x = seq(as.Date('2022-01-01'), as.Date('2022-12-31'), - by = 'days'), size = n, replace = TRUE), - datetime = sample(x = seq(as.POSIXct('2022-01-01 00:00:00'), - as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, replace = TRUE) - ) - exportTable <- importTable[seq(1L, 10000L, 1L), ] - sfTable <- sf::st_read(system.file(package = 'sf', 'gpkg/nc.gpkg'), - quiet = TRUE) - sfTable <- sfTable[sample.int(nrow(sfTable), 10000, replace = TRUE),] - # create init datasets for testing against - bcpImport(x = importTable, connectargs = connectArgs, - table = 'importTableInit', overwrite = TRUE, stdout = FALSE) - bcpImport(x = exportTable, connectargs = connectArgs, - table = 'exportTableInit', overwrite = TRUE, stdout = FALSE) - bcpExport(file = 'inst/benchmarks/exportTableInit.csv', - connectargs = connectArgs, table = 'exportTableInit', fieldterminator = ',', - stdout = FALSE - ) - query <- 'SELECT * FROM [dbo].[exportTableInit] WHERE int < 1000' - bcpExport(file = 'inst/benchmarks/queryTableInit.csv', - connectargs = connectArgs, query = query, fieldterminator = ',', - stdout = FALSE - ) - bcpImport(x = sfTable, connectargs = connectArgs, table = 'sfTableGeomInit', - overwrite = TRUE, stdout = FALSE) - bcpImport(x = sfTable, connectargs = connectArgs, table = 'sfTableGeogInit', - overwrite = TRUE, stdout = FALSE, spatialtype = 'geography') - sqlcmdArgs <- append(bcputility:::mapConnectArgs(connectargs = connectArgs, - utility = 'sqlcmd'), values = list('-Q', - shQuote("IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'test') - BEGIN - EXEC('CREATE SCHEMA test;') - END"))) - system2(command = bcputility:::findUtility('sqlcmd'), args = sqlcmdArgs) + initTestData(connectargs = connectArgs, initDB = initDB, + initRData = initRData) } diff --git a/tests/b-import-db.R b/tests/b-import-db.R index d200db1..4d172ef 100644 --- a/tests/b-import-db.R +++ b/tests/b-import-db.R @@ -41,20 +41,21 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { n <- 100000 importTable <- data.frame( int = sample(x = seq(1L, 10000L, 1L), size = n, replace = TRUE), - numeric = sample(x = seq(0, 1, length.out = n/100), size = n, + numeric = sample(x = seq(0, 1, length.out = n / 100), size = n, replace = TRUE), character = sample(x = state.abb, size = n, replace = TRUE), factor = sample(x = factor(x = month.abb, levels = month.abb), size = n, replace = TRUE), - #logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), + logical = sample(x = c(TRUE, FALSE), size = n, replace = TRUE), date = sample(x = seq(as.Date('2022-01-01'), as.Date('2022-12-31'), by = 'days'), size = n, replace = TRUE), datetime = sample(x = seq(as.POSIXct('2022-01-01 00:00:00'), - as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, replace = TRUE) + as.POSIXct('2022-12-31 23:59:59'), by = 'min'), size = n, + replace = TRUE) ) sfTable <- sf::st_read(system.file(package = 'sf', 'gpkg/nc.gpkg'), quiet = TRUE) - sfTable <- sfTable[sample.int(nrow(sfTable), 10000, replace = TRUE),] + sfTable <- sfTable[sample.int(nrow(sfTable), 10000, replace = TRUE), ] # bcpImport 1000 bcpImport( importTable, @@ -65,8 +66,10 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { ) |> identical(0L) |> stopifnot() - bcputility:::readTable(connectargs = connectArgs, table = 'importTable1000') |> - identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + bcputility:::readTable(connectargs = connectArgs, + table = 'importTable1000') |> + identical(bcputility:::readTable(connectargs = connectArgs, + table = 'importTableInit')) |> stopifnot() # bcpImport 10000 bcpImport( @@ -82,8 +85,10 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { ) |> identical(0L) |> stopifnot() - bcputility:::readTable(connectargs = connectArgs, table = 'importTable10000') |> - identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + bcputility:::readTable(connectargs = connectArgs, + table = 'importTable10000') |> + identical(bcputility:::readTable(connectargs = connectArgs, + table = 'importTableInit')) |> stopifnot() # bcpImportGeometry bcpImport( @@ -96,7 +101,8 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { identical(0L) |> stopifnot() bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeom') |> - identical(bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeomInit')) |> + identical(bcputility:::readTable(connectargs = connectArgs, + table = 'sfTableGeomInit')) |> stopifnot() # bcpImportGeography bcpImport( @@ -110,7 +116,8 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { identical(0L) |> stopifnot() bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeog') |> - identical(bcputility:::readTable(connectargs = connectArgs, table = 'sfTableGeogInit')) |> + identical(bcputility:::readTable(connectargs = connectArgs, + table = 'sfTableGeogInit')) |> stopifnot() # test sql login loginConnectArgs <- makeConnectArgs(server = server, database = database, @@ -124,8 +131,10 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { ) |> identical(0L) |> stopifnot() - bcputility:::readTable(connectargs = connectArgs, table = 'importTableLogin') |> - identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + bcputility:::readTable(connectargs = connectArgs, + table = 'importTableLogin') |> + identical(bcputility:::readTable(connectargs = connectArgs, + table = 'importTableInit')) |> stopifnot() # bcpImport schema bcpImport( @@ -137,8 +146,10 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { ) |> identical(0L) |> stopifnot() - bcputility:::readTable(connectargs = connectArgs, table = 'test.importTable') |> - identical(bcputility:::readTable(connectargs = connectArgs, table = 'importTableInit')) |> + bcputility:::readTable(connectargs = connectArgs, + table = 'test.importTable') |> + identical(bcputility:::readTable(connectargs = connectArgs, + table = 'importTableInit')) |> stopifnot() # test return output # fail no capture diff --git a/tests/c-export-db.R b/tests/c-export-db.R index 3987711..d466726 100644 --- a/tests/c-export-db.R +++ b/tests/c-export-db.R @@ -3,18 +3,15 @@ testLocal <- TRUE if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { testExport <- function(connectargs) { on.exit( - expr = file.remove( - c( - 'inst/benchmarks/queryTable.csv', - 'inst/benchmarks/queryTableNchar.csv', - 'inst/benchmarks/exportTableChar.csv', - 'inst/benchmarks/exportTableNchar.csv')) |> - invisible() |> - suppressWarnings(), + expr = file.remove(tmpFiles) |> + invisible() |> + suppressWarnings(), add = TRUE) + tmpFiles <- tempfile(c('exportTableChar', 'exportTableNChar', + 'queryTableChar', 'queryTableNChar'), fileext = '.csv') # bcpExportChar bcpExport( - 'inst/benchmarks/exportTableChar.csv', + tmpFiles[1], connectargs = connectArgs, table = 'exportTableInit', fieldterminator = ',', @@ -24,7 +21,7 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { stopifnot() # bcpExportNchar bcpExport( - 'inst/benchmarks/exportTableNchar.csv', + tmpFiles[2], connectargs = connectArgs, table = 'exportTableInit', fieldterminator = ',', @@ -33,18 +30,18 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { '-w', '-b', 1000, '-a', 4096, - '-e', 10 + '-m', 0 ) ) |> identical(0L) |> stopifnot() - data.table::fread('inst/benchmarks/exportTableChar.csv') |> - identical(data.table::fread('inst/benchmarks/exportTableInit.csv')) |> + data.table::fread(tmpFiles[1]) |> + identical(data.table::data.table(bcputility:::.exportTableInit)) |> stopifnot() # test query export query <- 'SELECT * FROM [dbo].[exportTableInit] WHERE int < 1000' # bcpExportChar - bcpExport(file = 'inst/benchmarks/queryTable.csv', + bcpExport(file = tmpFiles[3], connectargs = connectArgs, query = query, fieldterminator = ',', stdout = FALSE ) |> @@ -52,7 +49,7 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { stopifnot() # bcpExportQueryNchar bcpExport( - 'inst/benchmarks/queryTableNchar.csv', + tmpFiles[4], connectargs = connectArgs, query = query, fieldterminator = ',', @@ -61,13 +58,13 @@ if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { '-w', '-b', 1000, '-a', 4096, - '-e', 10 + '-m', 0 ) ) |> identical(0L) |> stopifnot() - data.table::fread('inst/benchmarks/queryTable.csv') |> - identical(data.table::fread('inst/benchmarks/queryTableInit.csv')) |> + data.table::fread(tmpFiles[3]) |> + identical(data.table::data.table(bcputility:::.queryTableInit)) |> stopifnot() } # set up connnect args From 14a8403771f3e62d8a0766b144c26f2ba614c30a Mon Sep 17 00:00:00 2001 From: Thomas Roh Date: Mon, 16 Jan 2023 14:01:35 -0800 Subject: [PATCH 4/7] updat pkg yml --- docs/pkgdown.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 60a710f..d684c57 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -2,5 +2,5 @@ pandoc: 2.19.2 pkgdown: 2.0.7 pkgdown_sha: ~ articles: {} -last_built: 2023-01-15T17:18Z +last_built: 2023-01-16T21:59Z From 1b2eb968fddffe17878b876d4780d34a3918e293 Mon Sep 17 00:00:00 2001 From: Thomas Roh Date: Mon, 16 Jan 2023 14:13:03 -0800 Subject: [PATCH 5/7] adding depends for R version --- DESCRIPTION | 1 + docs/pkgdown.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 224cf21..105320e 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -8,6 +8,7 @@ License: MIT + file LICENSE Encoding: UTF-8 RoxygenNote: 7.2.2 SystemRequirements: bcp Utility +Depends: R (>= 3.5.0) Imports: data.table, sf, methods Suggests: blob URL: https://bcputility.roh.engineering, https://github.com/tomroh/bcputility diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index d684c57..8ccf7b4 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -2,5 +2,5 @@ pandoc: 2.19.2 pkgdown: 2.0.7 pkgdown_sha: ~ articles: {} -last_built: 2023-01-16T21:59Z +last_built: 2023-01-16T22:12Z From 790116e17bd83e712331fba130beab28db896765 Mon Sep 17 00:00:00 2001 From: Thomas Roh Date: Mon, 16 Jan 2023 14:21:44 -0800 Subject: [PATCH 6/7] turn off local testing --- tests/b-import-db.R | 2 +- tests/c-export-db.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/b-import-db.R b/tests/b-import-db.R index 4d172ef..71d55be 100644 --- a/tests/b-import-db.R +++ b/tests/b-import-db.R @@ -1,5 +1,5 @@ library(bcputility) -testLocal <- TRUE +testLocal <- FALSE if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { tryDropTable <- function(connectargs, table) { if (checkTableExists(connectargs, table)) { diff --git a/tests/c-export-db.R b/tests/c-export-db.R index d466726..cbd9392 100644 --- a/tests/c-export-db.R +++ b/tests/c-export-db.R @@ -1,5 +1,5 @@ library(bcputility) -testLocal <- TRUE +testLocal <- FALSE if (identical(Sys.getenv('NOT_CRAN'), 'true') && isTRUE(testLocal)) { testExport <- function(connectargs) { on.exit( From 112c142c88502e1fce89651cef8e2fd9198939a0 Mon Sep 17 00:00:00 2001 From: Thomas Roh Date: Mon, 16 Jan 2023 14:29:17 -0800 Subject: [PATCH 7/7] updating site --- NEWS.md | 2 +- docs/news/index.html | 21 ++++++++------------- docs/pkgdown.yml | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/NEWS.md b/NEWS.md index c28785e..4d69d84 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,7 +6,7 @@ * Added `bcpVersion` and `sqlcmdVersion` to check versions. * Specify tables without schema strictly as a character vector of size 1 e.g. -".

  • ". The schema and table will be quoted although special +```".
    "```. The schema and table will be quoted although special characters are not recommended except for "_". * Tests have been added that can run against a local instance of SQL Server. diff --git a/docs/news/index.html b/docs/news/index.html index c652985..e46fd7f 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -51,9 +51,7 @@

    Changelog

    • Override/set path to sqlcmd with options(bcputility.sqlcmd.path = "<path-to-sqlcmd>")

    • Added bcpVersion and sqlcmdVersion to check versions.

    • -
    • -

      Specify tables without schema strictly as a character vector of size 1 e.g. “.

      -

    “. The schema and table will be quoted although special characters are not recommended except for”_“.

    +
  • Specify tables without schema strictly as a character vector of size 1 e.g. "<schema>.<table>". The schema and table will be quoted although special characters are not recommended except for “_“.

  • Tests have been added that can run against a local instance of SQL Server. These do not work without it as SQL Server is a client/server configuration.

  • The README has been updated for new syntax and updated benchmarks.

  • bcpImport and bcpExport gain a bcpOptions argument that allows the user to include any options from the CLI. See documentation for formatting and specification.

  • @@ -63,30 +61,27 @@