Skip to content
This repository was archived by the owner on Nov 9, 2022. It is now read-only.

Commit daa098c

Browse files
authored
Merge pull request #739 from ezbc/issue-738
Fixes issue 738: fast user/role retrieval
2 parents 6f7a80f + 2bf982e commit daa098c

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

deploy/lib/xquery/setup.xqy

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4742,6 +4742,9 @@ declare function setup:validate-external-security(
47424742
declare function setup:create-roles(
47434743
$import-config as element(configuration))
47444744
{
4745+
(: get the existing role names from the default security DB :)
4746+
let $existing-role-names := setup:get-existing-role-names()
4747+
47454748
(: Create all missing roles :)
47464749
for $role in $import-config/sec:roles/sec:role
47474750
let $role-name as xs:string := $role/sec:role-name
@@ -4754,7 +4757,7 @@ declare function setup:create-roles(
47544757
</options>
47554758
return
47564759
(: if the role exists, then don't create it :)
4757-
if (setup:get-roles(())/sec:role[sec:role-name = $role-name]) then ()
4760+
if ($existing-role-names[. = $role-name]) then ()
47584761
else
47594762
(
47604763
xdmp:eval(
@@ -4911,6 +4914,9 @@ declare function setup:create-roles(
49114914
declare function setup:validate-roles(
49124915
$import-config as element(configuration))
49134916
{
4917+
(: get the existing role names from the default security DB :)
4918+
let $existing-roles := setup:get-roles(())
4919+
49144920
for $role in $import-config/sec:roles/sec:role
49154921
let $role-name as xs:string := $role/sec:role-name
49164922
let $description as xs:string? := $role/sec:description
@@ -4921,7 +4927,7 @@ declare function setup:validate-roles(
49214927
let $privileges as element(sec:privilege)* := $role/sec:privileges/sec:privilege
49224928
let $amps as element(sec:amp)* := $role/sec:amps/*
49234929
let $external-names as xs:string* := $role/sec:external-names/sec:external-name
4924-
let $match := setup:get-roles(())/sec:role[sec:role-name = $role-name]
4930+
let $match := $existing-roles/sec:role[sec:role-name = $role-name]
49254931
return
49264932
if ($match) then
49274933
if ($match/sec:role-name != $role-name or
@@ -4964,6 +4970,10 @@ declare function setup:associate-users-with-roles($import-config as element(conf
49644970

49654971
declare function setup:create-users($import-config as element(configuration))
49664972
{
4973+
(: get the existing user names from the default security DB :)
4974+
let $existing-user-names := setup:get-existing-user-names()
4975+
4976+
(: Create all missing users :)
49674977
for $user in $import-config/sec:users/sec:user
49684978
let $user-name as xs:string := $user/sec:user-name
49694979
let $description as xs:string? := $user/sec:description
@@ -4978,7 +4988,7 @@ declare function setup:create-users($import-config as element(configuration))
49784988
<isolation>different-transaction</isolation>
49794989
</options>
49804990
return
4981-
if (setup:get-users(())/sec:user[sec:user-name = $user-name]) then
4991+
if ($existing-user-names[. = $user-name]) then
49824992
(
49834993
xdmp:eval(
49844994
'import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
@@ -5088,6 +5098,9 @@ declare function setup:create-users($import-config as element(configuration))
50885098

50895099
declare function setup:validate-users($import-config as element(configuration))
50905100
{
5101+
(: get the existing users from the default security DB :)
5102+
let $existing-users := setup:get-users(())
5103+
50915104
for $user in $import-config/sec:users/sec:user
50925105
let $user-name as xs:string := $user/sec:user-name
50935106
let $description as xs:string? := $user/sec:description
@@ -5096,7 +5109,7 @@ declare function setup:validate-users($import-config as element(configuration))
50965109
let $permissions as element(sec:permission)* := $user/sec:permissions/*
50975110
let $collections as xs:string* := $user/sec:collections/*
50985111
let $external-names as xs:string* := $user/sec:external-names/sec:external-name
5099-
let $match := setup:get-users(())/sec:user[sec:user-name = $user-name]
5112+
let $match := $existing-users/sec:user[sec:user-name = $user-name]
51005113
return
51015114
if ($match) then
51025115
if ($match/sec:description != $description or
@@ -5451,6 +5464,19 @@ declare function setup:get-privilege-by-name($name as xs:string) as element(sec:
54515464
</options>)
54525465
};
54535466

5467+
(: Gets the user names from the default security database :)
5468+
declare function setup:get-existing-user-names() as element(sec:user-name)* {
5469+
let $user-names :=
5470+
xdmp:eval(
5471+
'import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
5472+
/sec:user',
5473+
(),
5474+
<options xmlns="xdmp:eval">
5475+
<database>{$default-security}</database>
5476+
</options>)/sec:user-name
5477+
return $user-names
5478+
};
5479+
54545480
declare function setup:get-users-by-name($names as xs:string*) as element(sec:users)? {
54555481
let $ids :=
54565482
for $name in $names
@@ -5530,6 +5556,19 @@ declare function setup:get-user-id($user-name as xs:string) as xs:unsignedLong?
55305556
</options>)
55315557
};
55325558

5559+
(: Gets the role names from the default security database :)
5560+
declare function setup:get-existing-role-names() as element(sec:role-name)* {
5561+
let $role-names :=
5562+
xdmp:eval(
5563+
'import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy";
5564+
/sec:role',
5565+
(),
5566+
<options xmlns="xdmp:eval">
5567+
<database>{$default-security}</database>
5568+
</options>)/sec:role-name
5569+
return $role-names
5570+
};
5571+
55335572
declare function setup:get-roles-by-name($roles as xs:string*) as element(sec:roles)? {
55345573
let $ids :=
55355574
for $role in $roles

0 commit comments

Comments
 (0)