enumerateTopPackages <- function()

in R/R/sqlPackage.R [2606:2669]


enumerateTopPackages <- function(connectionString, packages, owner, scope, languageName)
{
    haveUser <- (owner != '')

    query <- "DECLARE @principalId INT;
    DECLARE @currentUser NVARCHAR(128);"

    query <- paste0( query, paste(sapply( seq(1,length(packages)), function(i) {paste0("DECLARE @pkg", toString(i), " NVARCHAR(MAX);")} ), collapse=" "))

    query = paste0( query, "SELECT @currentUser = ")

    if (haveUser)
    {
        query <- paste0(query, "?;")
        data <- data.frame(name = owner, stringsAsFactors = FALSE)
    }
    else
    {
        query <- paste0(query, "CURRENT_USER;")
        data <- data.frame(matrix(nrow=1, ncol=0), stringsAsFactors = FALSE)
    }

    for(pkg in packages)
    {
        data <- cbind(data, pkg, stringsAsFactors = FALSE)
    }

    data <- cbind(data, scope = scope, stringsAsFactors = FALSE)


    query <- paste0( query, paste(sapply( seq(1,length(packages)), function(i) {paste0("SELECT @pkg", toString(i), " = ?;")} ), collapse=" "))
    pkgcsv <- paste(sapply( seq(1,length(packages)), function(i) {paste0("@pkg", toString(i))} ), collapse=",")

    query = paste0(query , sprintf("
                                   SELECT @principalId = USER_ID(@currentUser);
                                   WITH eprop
                                   AS (
                                   SELECT piv.major_id, CAST([IsTopPackage] as bit) AS IsTopPackage FROM sys.extended_properties
                                   PIVOT (min(value) FOR name IN ([IsTopPackage])) AS piv
                                   WHERE class_desc = 'EXTERNAL_LIBRARY'
                                  )
                                   SELECT elib.name, eprop.IsTopPackage
                                   FROM sys.external_libraries AS elib
                                   INNER JOIN eprop
                                   ON eprop.major_id = elib.external_library_id AND elib.name in (%s)
                                   AND elib.principal_id=@principalId
                                   AND elib.language='%s' AND elib.scope=?
                                   ORDER BY elib.name ASC
                                   ;", pkgcsv, languageName))

    tryCatch(
    {
        result <- execute(connectionString, query, data)
        missingPkgs <- packages[!(packages %in% result[,"name"])]
        result <- rbind(result, data.frame(name = missingPkgs, IsTopPackage =  rep(IS_TOP_PACKAGE_MISSING, length(missingPkgs)), stringsAsFactors = FALSE))
    },
    error = function(err)
    {
        stop(sprintf("Failed to enumerate package attributes: pkgs=(%s), error='%s'",
                     paste(packages, collapse = ', '), err$message), call. = FALSE)
    })

    return(result)
}