sqlHelperInstallPackages <- function()

in R/R/sqlPackage.R [2091:2189]


sqlHelperInstallPackages <- function(connectionString, packages, owner = "", scope = "PRIVATE", verbose, languageName)
{
    user <- "" # user argument for Create External Library
    queryUser <- "CURRENT_USER" # user argument for select to discover external_library_id

    scopeint <- parseScope(scope)

    if (scopeint == 0 && owner == '')
    {
        # if scope is public the user has to be either dbo or member of db_owner
        # if current user is already dbo we just proceed, else if user
        # is member of db_owner (e.g. RevoTester) we run as 'dbo' to
        # force it to install into the public folder instead of the private.
        currentUser <- sqlSelectUser(connectionString);
        if (currentUser == "dbo")
        {
            user <- ""
            queryUser = "CURRENT_USER"
        }
        else
        {
            user <- "dbo"
            queryUser = "'dbo'"
        }
    }
    else
    {
        user <- owner
        if (nchar(owner) > 0)
        {
            queryUser <- paste0("'", owner, "'")
        }
    }

    hodbc <- NULL
    haveTransaction <- FALSE
    packagesSuccess <- c()

    tryCatch({
        hodbc <- connectToServer(connectionString)
        checkResult(dbBegin(hodbc), expectedResult=TRUE, errorMessage="failed to create transaction")
        haveTransaction <- TRUE

        numPkgs <- nrow(packages)
        for (packageIndex in 1:numPkgs)
        {
            packageName <- packages[packageIndex,"Package"]
            filelocation <- packages[packageIndex, "File"]
            attribute <- packages[packageIndex, "Attribute"]

            if (verbose)
            {
                write(sprintf("%s  Copying package to Sql server [%d/%d] %s...", pkgTime(), packageIndex, numPkgs, packageName), stdout())
            }

            sqlCreateExternalLibrary(hodbc, packageName, filelocation, user, languageName)
            sqlAddExtendedProperty(hodbc, packageName, attribute, user)
        }

        if (verbose)
        {
            write(sprintf("%s  Installing packages to library path, this may take some time...", pkgTime()), stdout())
        }

        packagesSuccess <- sqlSyncAndCheckInstalledPackages(hodbc, packages[,"Package"], user, queryUser, scope, languageName);
        dbCommit(hodbc)
        haveTransaction = FALSE
    },
    error = function(err)
    {
        stop( sprintf("Installation of packages %s failed with error %s", paste(packages[,"Package"], collapse = ', '), err$message), call. = FALSE)
    },
    finally =
    {
        if(haveTransaction)
        {
            # If we still have a transaction something went wrong and we need to rollback
            #
            dbRollback(hodbc)
        }

        if(!is.null(hodbc))
        {
            dbDisconnect(hodbc)
        }
    })

    if(length(packagesSuccess) > 0)
    {
        if(verbose)
        {
            write(sprintf("%s  Successfully installed packages on SQL server (%s).", pkgTime(), paste(packagesSuccess, collapse = ', ')), stdout())
        }
        else
        {
            write(sprintf("Successfully installed packages on SQL server (%s).", paste(packagesSuccess, collapse = ', ')), stdout())
        }
    }
}