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)
}