From 1616fc533c0c1a00d343fe64b33fc2ffd2f18943 Mon Sep 17 00:00:00 2001 From: Paxton Hare Date: Sun, 25 Nov 2012 21:32:33 -0500 Subject: [PATCH] Issue #56 - adding missing database and appserver settings to deployer --- deploy/lib/xquery/setup.xqy | 2035 ++++++++++++------------------- deploy/test/data/ml4-config.xml | 184 ++- deploy/test/data/ml5-config.xml | 188 ++- deploy/test/data/ml6-config.xml | 189 ++- 4 files changed, 1190 insertions(+), 1406 deletions(-) diff --git a/deploy/lib/xquery/setup.xqy b/deploy/lib/xquery/setup.xqy index fd0baaa9..286eea21 100644 --- a/deploy/lib/xquery/setup.xqy +++ b/deploy/lib/xquery/setup.xqy @@ -19,7 +19,6 @@ import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy"; declare namespace setup = "http://marklogic.com/roxy/setup"; -declare namespace display = "http://marklogic.com/roxy/setup/display"; declare namespace xdmp="http://marklogic.com/xdmp"; declare namespace xs="http://www.w3.org/2001/XMLSchema"; declare namespace db="http://marklogic.com/xdmp/database"; @@ -41,12 +40,205 @@ declare variable $default-schemas := xdmp:database("Schemas"); declare variable $default-security := xdmp:database("Security"); declare variable $default-user := xdmp:user("nobody"); -declare variable $context-path := fn:resolve-uri(".", xdmp:get-request-path()); - declare variable $roll-back := map:map(); declare variable $restart-needed as xs:boolean := fn:false(); +declare variable $database-settings := + + enabled + language + stemmed-searches + word-searches + word-positions + fast-phrase-searches + fast-reverse-searches + fast-case-sensitive-searches + fast-diacritic-sensitive-searches + fast-element-word-searches + element-word-positions + fast-element-phrase-searches + element-value-positions + attribute-value-positions + field-value-searches + field-value-positions + three-character-searches + three-character-word-positions + fast-element-character-searches + trailing-wildcard-searches + trailing-wildcard-word-positions + fast-element-trailing-wildcard-searches + two-character-searches + one-character-searches + uri-lexicon + collection-lexicon + reindexer-enable + reindexer-throttle + reindexer-timestamp + directory-creation + maintain-last-modified + maintain-directory-last-modified + inherit-permissions + inherit-collections + inherit-quality + in-memory-limit + in-memory-list-size + in-memory-tree-size + in-memory-range-index-size + in-memory-reverse-index-size + large-size-threshold + locking + journaling + journal-size + preallocate-journals + preload-mapped-data + preload-replica-mapped-data + range-index-optimize + positions-list-max-size + format-compatibility + index-detection + expunge-locks + tf-normalization + merge-priority + merge-max-size + merge-min-size + merge-min-ratio + merge-timestamp + ; + +declare variable $http-server-settings := + + enabled + root + port + modules-database + database + last-login + display-last-login + address + backlog + threads + request-timeout + keep-alive-timeout + session-timeout + max-time-limit + default-time-limit + static-expires + pre-commit-trigger-depth + pre-commit-trigger-limit + collation + authentication + default-user + privilege2 + concurrent-request-limit + log-errors + debug-allow + profile-allow + default-xquery-version + multi-version-concurrency-control + output-sgml-character-entities + output-encoding + output-method + output-byte-order-mark + output-cdata-section-namespace-uri + output-cdata-section-localname + output-doctype-public + output-doctype-system + output-escape-uri-attributes + output-include-content-type + output-indent + output-indent-untyped + output-media-type + output-normalization-form + output-omit-xml-declaration + output-standalone + output-undeclare-prefixes + output-version + output-include-default-attributes + error-handler + url-rewriter + rewrite-resolves-globally + ssl-certificate-template + ssl-allow-sslv3 + ssl-allow-tls + ssl-hostname + ssl-ciphers + ssl-require-client-certificate + +; + +declare variable $xcc-server-settings := + + enabled + root + port + modules-database + database + last-login + display-last-login + address + backlog + threads + request-timeout + keep-alive-timeout + session-timeout + max-time-limit + default-time-limit + pre-commit-trigger-depth + pre-commit-trigger-limit + collation + authentication + privilege2 + concurrent-request-limit + log-errors + debug-allow + profile-allow + default-xquery-version + multi-version-concurrency-control + output-sgml-character-entities + output-encoding + output-method + output-byte-order-mark + output-cdata-section-namespace-uri + output-cdata-section-localname + output-doctype-public + output-doctype-system + output-escape-uri-attributes + output-include-content-type + output-indent + output-indent-untyped + output-media-type + output-normalization-form + output-omit-xml-declaration + output-standalone + output-undeclare-prefixes + output-version + output-include-default-attributes + ssl-certificate-template + ssl-allow-sslv3 + ssl-allow-tls + ssl-hostname + ssl-ciphers + ssl-require-client-certificate + ssl-client-certificate-authorities + +; + +declare variable $task-server-settings := + + debug-allow + debug-threads + default-time-limit + log-errors + max-time-limit + post-commit-trigger-depth + pre-commit-trigger-depth + pre-commit-trigger-limit + profile-allow + queue-size + threads + ; + (: A note on naming conventions: $admin-config refers to the configuration passed around by the Admin APIs $import-config is the import/export configuration format that setup:get-configuration() generates @@ -57,55 +249,52 @@ declare function setup:add-rollback( $value as item()+) { map:put( - $roll-back, - $key, - (map:get($roll-back, $key), $value)) + $roll-back, + $key, + (map:get($roll-back, $key), $value)) }; declare function setup:get-rollback-config() { - let $config := - element configuration + element configuration + { + element gr:http-servers { - element gr:http-servers - { - map:get($roll-back, "http-servers") - }, - element gr:xdbc-servers - { - map:get($roll-back, "xdbc-servers") - }, - element db:databases - { - map:get($roll-back, "databases") - }, - element as:assignments - { - map:get($roll-back, "assignments") - }, - element mt:mimetypes - { - map:get($roll-back, "mimetypes") - }, - element sec:amps - { - map:get($roll-back, "amps") - }, - element sec:users - { - map:get($roll-back, "users") - }, - element sec:roles - { - map:get($roll-back, "roles") - }, - element sec:privileges - { - map:get($roll-back, "privileges") - } + map:get($roll-back, "http-servers") + }, + element gr:xdbc-servers + { + map:get($roll-back, "xdbc-servers") + }, + element db:databases + { + map:get($roll-back, "databases") + }, + element as:assignments + { + map:get($roll-back, "assignments") + }, + element mt:mimetypes + { + map:get($roll-back, "mimetypes") + }, + element sec:amps + { + map:get($roll-back, "amps") + }, + element sec:users + { + map:get($roll-back, "users") + }, + element sec:roles + { + map:get($roll-back, "roles") + }, + element sec:privileges + { + map:get($roll-back, "privileges") } - return - $config + } }; declare function setup:do-setup($import-config as element(configuration)) as item()* @@ -130,6 +319,7 @@ declare function setup:do-setup($import-config as element(configuration)) as ite } catch($ex) { + xdmp:log($ex), setup:do-wipe(setup:get-rollback-config()), $ex } @@ -183,7 +373,12 @@ declare function setup:do-wipe($import-config as element(configuration)) as item xdmp:rethrow() }, - for $db-config in $import-config/db:databases/db:database + let $databases := + ( + $import-config/db:databases/db:database[db:security-database or db:schema-database or db:triggers-database], + $import-config/db:databases/db:database[fn:not(db:security-database or db:schema-database or db:triggers-database)] + ) + for $db-config in $databases return setup:delete-database-and-forests($db-config), @@ -294,11 +489,6 @@ declare function setup:do-wipe($import-config as element(configuration)) as item else () }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Delete a database and any forests that are attached - :: to it. - ::) - declare function setup:delete-database-and-forests($db-config as element(db:database)) { let $db-name := $db-config/db:database-name @@ -339,9 +529,6 @@ declare function setup:delete-database-and-forests($db-config as element(db:data else () }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Restart the target group. - ::) declare function setup:do-restart($group-name as xs:string?) as item()* { try @@ -368,17 +555,11 @@ declare function setup:do-restart($group-name as xs:string?) as item()* } }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: - ::) declare function setup:find-forest-ids( $db-config as element(db:database)) as xs:unsignedLong* { - let $group-id := xdmp:group() let $admin-config := admin:get-configuration() - let $hosts := admin:group-get-host-ids($admin-config, $group-id) - let $data-directory := $db-config/db:forests/db:data-directory - for $host at $i in $hosts + for $host in admin:group-get-host-ids($admin-config, xdmp:group()) for $j in (1 to $db-config/db:forests-per-host) let $name := fn:string-join(( @@ -392,10 +573,6 @@ declare function setup:find-forest-ids( else () }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Creation of mimetypes - ::) - declare function setup:create-mimetypes($import-config as element(configuration)) as item()* { for $mimetype-config in $import-config/mt:mimetypes/mt:mimetype @@ -437,10 +614,6 @@ declare function setup:validate-mimetypes($import-config as element(configuratio setup:validation-fail(fn:concat("Missing mimetype: ", $name)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Creation of forests - ::) - declare function setup:create-forests($import-config as element(configuration)) as item()* { for $db-config in setup:get-databases-from-config($import-config) @@ -465,9 +638,6 @@ declare function setup:validate-forests($import-config as element(configuration) setup:validate-forests-from-config($import-config, $db-config, $database-name) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: - ::) declare function setup:create-forests-from-config( $import-config as element(configuration), $db-config as element(db:database), @@ -501,16 +671,13 @@ declare function setup:validate-forests-from-config( if ($host-name) then xdmp:host($host-name) else ()) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: - ::) declare function setup:create-forests-from-count( $db-config as element(db:database), $database-name as xs:string, $forests-per-host as xs:int) as item()* { let $data-directory := $db-config/db:forests/db:data-directory - for $host at $i in admin:group-get-host-ids(admin:get-configuration(), xdmp:group()) + for $host in admin:group-get-host-ids(admin:get-configuration(), xdmp:group()) for $j in (1 to $forests-per-host) let $forest-name := fn:string-join(($database-name, xdmp:host-name($host), xs:string($j)), "-") return @@ -526,7 +693,7 @@ declare function setup:validate-forests-from-count( $forests-per-host as xs:int) { let $data-directory := $db-config/db:forests/db:data-directory - for $host at $i in admin:group-get-host-ids(admin:get-configuration(), xdmp:group()) + for $host in admin:group-get-host-ids(admin:get-configuration(), xdmp:group()) for $j in (1 to $forests-per-host) let $forest-name := fn:string-join(($database-name, xdmp:host-name($host), xs:string($j)), "-") return @@ -536,20 +703,14 @@ declare function setup:validate-forests-from-count( $host) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: - ::) declare function setup:get-database-forest-configs( $import-config as element(configuration), $db as xs:string) as element(as:assignment)* { $import-config/as:assignments/as:assignment[ - as:forest-name = $import-config/db:databases/db:database[db:database-name = $db]/db:forests/db:forest-id/@name] + as:forest-name = fn:data($import-config/db:databases/db:database[db:database-name = $db]/db:forests/db:forest-id/(@name|text()))] }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: - ::) declare function setup:create-forest( $forest-name as xs:string, $data-directory as xs:string?, @@ -611,10 +772,6 @@ declare function setup:validate-forest( setup:validation-fail(fn:concat("Forest missing: ", $forest-name)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Creation of databases - ::) - declare function setup:create-databases($import-config as element(configuration)) as item()* { for $db-config in setup:get-databases-from-config($import-config) @@ -649,16 +806,11 @@ declare function setup:validate-databases($import-config as element(configuratio setup:validation-fail(fn:concat("Missing database: ", $database-name)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Attaching forests to databases - ::) - declare function setup:attach-forests($import-config as element(configuration)) as item()* { for $db-config in setup:get-databases-from-config($import-config) let $database-name := setup:get-database-name-from-database-config($db-config) let $forests-per-host := $db-config/db:forests-per-host - let $forest-config := setup:get-database-forest-configs($import-config, $database-name) return if (fn:exists($forests-per-host)) then setup:attach-forests-by-count($db-config) @@ -671,7 +823,6 @@ declare function setup:validate-attached-forests($import-config as element(confi for $db-config in setup:get-databases-from-config($import-config) let $database-name := setup:get-database-name-from-database-config($db-config) let $forests-per-host := $db-config/db:forests-per-host - let $forest-config := setup:get-database-forest-configs($import-config, $database-name) return if (fn:exists($forests-per-host)) then setup:validate-attached-forests-by-count($db-config) @@ -686,7 +837,7 @@ declare function setup:attach-forests-by-config( { for $forest-ref in $db-config/db:forests/db:forest-id return - setup:attach-database-forest($database-name, $forest-ref/@name) + setup:attach-database-forest($database-name, fn:data($forest-ref/(@name|text()))) }; declare function setup:validate-attached-forests-by-config( @@ -696,7 +847,7 @@ declare function setup:validate-attached-forests-by-config( { for $forest-ref in $db-config/db:forests/db:forest-id return - setup:validate-attached-database-forest($database-name, $forest-ref/@name) + setup:validate-attached-database-forest($database-name, fn:data($forest-ref/(@name|text()))) }; declare function setup:attach-forests-by-count($db-config as element(db:database)) as item()* @@ -745,68 +896,22 @@ declare function setup:attach-database-forest( }; declare function setup:validate-attached-database-forest( - $database-name as xs:string, $forest-name as xs:string) + $database-name as xs:string, + $forest-name as xs:string) { - let $db := xdmp:database($database-name) - let $forest := xdmp:forest($forest-name) - let $admin-config := admin:get-configuration() - return - if (xdmp:database-forests(xdmp:database($database-name))[$forest-name = xdmp:forest-name(.)]) then () - else - setup:validation-fail(fn:concat("Forest not attached to database: ", $forest-name, " => ", $database-name)) + if (xdmp:database-forests(xdmp:database($database-name))[$forest-name = xdmp:forest-name(.)]) then () + else + setup:validation-fail(fn:concat("Forest not attached to database: ", $forest-name, " => ", $database-name)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Applying of database settings - ::) - declare function setup:apply-database-settings($import-config as element(configuration)) as item()* { let $admin-config := admin:get-configuration() for $db-config in setup:get-databases-from-config($import-config) let $database-name := setup:get-database-name-from-database-config($db-config) let $database := xdmp:database($database-name) - let $settings := - - language - stemmed-searches - word-searches - word-positions - fast-phrase-searches - fast-reverse-searches - fast-case-sensitive-searches - fast-diacritic-sensitive-searches - fast-element-word-searches - element-word-positions - fast-element-phrase-searches - element-value-positions - attribute-value-positions - three-character-searches - three-character-word-positions - fast-element-character-searches - trailing-wildcard-searches - trailing-wildcard-word-positions - fast-element-trailing-wildcard-searches - two-character-searches - one-character-searches - uri-lexicon - collection-lexicon - reindexer-enable - reindexer-throttle - reindexer-timestamp - directory-creation - maintain-last-modified - maintain-directory-last-modified - inherit-permissions - inherit-collections - inherit-quality - format-compatibility - index-detection - expunge-locks - tf-normalization - let $apply-settings := - for $setting in $settings/*:setting + for $setting in $database-settings/*:setting let $value := fn:data(xdmp:value(fn:concat("$db-config/db:", $setting))) where fn:exists($value) return @@ -825,62 +930,29 @@ declare function setup:apply-database-settings($import-config as element(configu declare function setup:validate-database-settings($import-config as element(configuration)) { - let $admin-config := admin:get-configuration() - for $db-config in setup:get-databases-from-config($import-config) - let $database := xdmp:database(setup:get-database-name-from-database-config($db-config)) - let $settings := - - language - stemmed-searches - word-searches - word-positions - fast-phrase-searches - fast-reverse-searches - fast-case-sensitive-searches - fast-diacritic-sensitive-searches - fast-element-word-searches - element-word-positions - fast-element-phrase-searches - element-value-positions - attribute-value-positions - three-character-searches - three-character-word-positions - fast-element-character-searches - trailing-wildcard-searches - trailing-wildcard-word-positions - fast-element-trailing-wildcard-searches - two-character-searches - one-character-searches - uri-lexicon - collection-lexicon - reindexer-enable - reindexer-throttle - reindexer-timestamp - directory-creation - maintain-last-modified - maintain-directory-last-modified - inherit-permissions - inherit-collections - inherit-quality - format-compatibility - index-detection - expunge-locks - tf-normalization - - for $setting in $settings/*:setting - let $expected := fn:data(xdmp:value(fn:concat("$db-config/db:", $setting))) - let $actual := xdmp:value(fn:concat("admin:database-get-", $setting, "($admin-config, $database)")) - where fn:exists($expected) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("database ", $setting, " mismatch: ", $expected, " != ", $actual)) + let $admin-config := admin:get-configuration() + for $db-config in setup:get-databases-from-config($import-config) + let $database := xdmp:database(setup:get-database-name-from-database-config($db-config)) + for $setting in $database-settings/*:setting + let $expected := fn:data(xdmp:value(fn:concat("$db-config/db:", $setting))) + let $actual := + try + { + xdmp:value(fn:concat("admin:database-get-", $setting, "($admin-config, $database)")) + } + catch($ex) + { + if ($ex/error:code = "XDMP-UNDFUN") then () + else + xdmp:rethrow() + } + where fn:exists($expected) + return + if ($expected = $actual) then () + else + setup:validation-fail(fn:concat("database ", $setting, " mismatch: ", $expected, " != ", $actual)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Configuration of databases - ::) - declare function setup:configure-databases($import-config as element(configuration)) as item()* { for $db-config in setup:get-databases-from-config($import-config) @@ -894,16 +966,12 @@ declare function setup:configure-databases($import-config as element(configurati let $admin-config := setup:add-word-lexicons($admin-config, $database, $db-config) let $admin-config := setup:add-fragment-roots($admin-config, $database, $db-config) let $admin-config := setup:add-fragment-parents($admin-config, $database, $db-config) - let $admin-config := setup:config-word-query($admin-config, $database, $db-config) + let $admin-config := setup:set-schema-database($admin-config, $db-config, $database) (: - - - + Changing the Security database is serious stuff. Roxy doesn't support this :) - - let $admin-config := setup:set-schema-database($admin-config, $db-config, $database) - let $admin-config := setup:set-security-database($admin-config, $db-config, $database) + (:let $admin-config := setup:set-security-database($admin-config, $db-config, $database):) let $admin-config := setup:set-triggers-database($admin-config, $db-config, $database) let $admin-config := setup:add-range-element-indexes($admin-config, $database, $db-config) let $admin-config := setup:add-range-element-attribute-indexes($admin-config, $database, $db-config) @@ -916,9 +984,13 @@ declare function setup:configure-databases($import-config as element(configurati let $admin-config := setup:add-fields($admin-config, $database, $db-config) let $admin-config := setup:add-field-includes($admin-config, $database, $db-config) let $admin-config := setup:add-field-excludes($admin-config, $database, $db-config) + let $admin-config := setup:add-field-word-lexicons($admin-config, $database, $db-config) let $admin-config := setup:add-range-field-indexes($admin-config, $database, $db-config) let $admin-config := setup:add-element-word-lexicons($admin-config, $database, $db-config) let $admin-config := setup:add-element-attribute-word-lexicons($admin-config, $database, $db-config) + let $admin-config := setup:add-element-word-query-throughs($admin-config, $database, $db-config) + let $admin-config := setup:add-phrase-throughs($admin-config, $database, $db-config) + let $admin-config := setup:add-phrase-arounds($admin-config, $database, $db-config) return ( @@ -929,12 +1001,10 @@ declare function setup:configure-databases($import-config as element(configurati ) }; -(: TODO: YOU ARE HERE :) declare function setup:validate-databases-indexes($import-config as element(configuration)) { for $db-config in setup:get-databases-from-config($import-config) - let $database-name := setup:get-database-name-from-database-config($db-config) - let $database := xdmp:database($database-name) + let $database := xdmp:database(setup:get-database-name-from-database-config($db-config)) let $admin-config := admin:get-configuration() return ( @@ -943,7 +1013,7 @@ declare function setup:validate-databases-indexes($import-config as element(conf setup:validate-fragment-parents($admin-config, $database, $db-config), setup:validate-word-query($admin-config, $database, $db-config), setup:validate-schema-database($admin-config, $db-config, $database), - setup:validate-security-database($admin-config, $db-config, $database), + (:setup:validate-security-database($admin-config, $db-config, $database),:) setup:validate-triggers-database($admin-config, $db-config, $database), setup:validate-range-element-indexes($admin-config, $database, $db-config), setup:validate-range-element-attribute-indexes($admin-config, $database, $db-config), @@ -952,13 +1022,14 @@ declare function setup:validate-databases-indexes($import-config as element(conf setup:validate-geospatial-element-indexes($admin-config, $database, $db-config), setup:validate-geospatial-element-attribute-pair-indexes($admin-config, $database, $db-config), setup:validate-geospatial-element-pair-indexes($admin-config, $database, $db-config), - setup:validate-geospatial-element-child-indexes($admin-config, $database, $db-config)(:, + setup:validate-geospatial-element-child-indexes($admin-config, $database, $db-config), setup:validate-fields($admin-config, $database, $db-config), - setup:validate-field-includes($admin-config, $database, $db-config), - setup:validate-field-excludes($admin-config, $database, $db-config), setup:validate-range-field-indexes($admin-config, $database, $db-config), setup:validate-element-word-lexicons($admin-config, $database, $db-config), - setup:validate-element-attribute-word-lexicons($admin-config, $database, $db-config):) + setup:validate-element-attribute-word-lexicons($admin-config, $database, $db-config), + setup:validate-element-word-query-throughs($admin-config, $database, $db-config), + setup:validate-phrase-throughs($admin-config, $database, $db-config), + setup:validate-phrase-arounds($admin-config, $database, $db-config) ) }; @@ -980,14 +1051,12 @@ declare function setup:add-fields( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-fields($admin-config, $database) - return - setup:add-fields-R( - $admin-config, - $database, - for $e in $db-config/db:fields/db:field[db:field-name != ""] - return - admin:database-field($e/db:field-name, $e/db:include-root)) + setup:add-fields-R( + setup:remove-existing-fields($admin-config, $database), + $database, + for $e in $db-config/db:fields/db:field[db:field-name != ""] + return + admin:database-field($e/db:field-name, $e/db:include-root)) }; declare function setup:add-fields-R( @@ -1004,6 +1073,16 @@ declare function setup:add-fields-R( $admin-config }; +declare function setup:validate-fields($admin-config, $database, $db-config) +{ + let $existing := admin:database-get-fields($admin-config, $database) + for $expected in $db-config/db:fields/db:field + return + if ($existing[fn:deep-equal(., $expected)]) then () + else + setup:validation-fail(fn:concat("Database mismatched field: ", $expected/db:field-name)) +}; + declare function setup:add-field-includes( $admin-config as element(configuration), $database as xs:unsignedLong, @@ -1091,6 +1170,37 @@ declare function setup:add-field-excludes-R( $admin-config }; +declare function setup:add-field-word-lexicons( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $db-config as element(db:database)) as element(configuration) +{ + setup:add-field-word-lexicons-R( + $admin-config, + $database, + $db-config/db:fields/db:field[db:field-name != ""]) +}; + +declare function setup:add-field-word-lexicons-R( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $field-configs as element(db:field)*) as element(configuration) +{ + if ($field-configs) then + setup:add-field-word-lexicons-R( + admin:database-add-field-word-lexicon( + $admin-config, + $database, + $field-configs[1]/db:field-name, + for $e in $field-configs[1]/db:word-lexicons/db:word-lexicon + return + admin:database-word-lexicon($e)), + $database, + fn:subsequence($field-configs, 2)) + else + $admin-config +}; + declare function setup:remove-existing-range-element-indexes( $admin-config as element(configuration), $database as xs:unsignedLong) as element(configuration) @@ -1108,12 +1218,10 @@ declare function setup:add-range-element-indexes( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-range-element-indexes($admin-config, $database) - return - setup:add-range-element-indexes-R( - $admin-config, - $database, - $db-config/db:range-element-indexes/db:range-element-index) + setup:add-range-element-indexes-R( + setup:remove-existing-range-element-indexes($admin-config, $database), + $database, + $db-config/db:range-element-indexes/db:range-element-index) }; declare function setup:add-range-element-indexes-R( @@ -1160,12 +1268,10 @@ declare function setup:add-range-element-attribute-indexes( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-range-element-attribute-indexes($admin-config, $database) - return - setup:add-range-element-attribute-indexes-R( - $admin-config, - $database, - $db-config/db:range-element-attribute-indexes/db:range-element-attribute-index) + setup:add-range-element-attribute-indexes-R( + setup:remove-existing-range-element-attribute-indexes($admin-config, $database), + $database, + $db-config/db:range-element-attribute-indexes/db:range-element-attribute-index) }; declare function setup:add-range-element-attribute-indexes-R( @@ -1211,13 +1317,12 @@ declare function setup:remove-existing-path-namespaces( return xdmp:set($admin-config, admin:database-delete-path-namespace($admin-config, $database, $index)) return - $admin-config (: admin:save-configuration-without-restart($admin-config) :)', + $admin-config', (xs:QName("database"), $database, xs:QName("admin-config"), $admin-config)) } catch($ex) { - xdmp:log($ex), if ($ex/error:code = "XDMP-UNDFUN") then $admin-config else if ($ex/error:code = "ADMIN-PATHNAMESPACEINUSE" and fn:not(setup:at-least-version("6.0-2"))) then fn:error(xs:QName("VERSION_NOT_SUPPORTED"), "Roxy does not support path namespaces for this version of MarkLogic. Use 6.0-2 or later.") @@ -1310,8 +1415,7 @@ declare function setup:remove-existing-range-path-indexes( $admin-config, admin:database-delete-range-path-index($admin-config, $database, $index)) return - $admin-config - (: admin:save-configuration-without-restart($admin-config) :)', + $admin-config', (xs:QName("database"), $database, xs:QName("admin-config"), $admin-config)) } @@ -1422,12 +1526,10 @@ declare function setup:add-element-word-lexicons( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-element-word-lexicons($admin-config, $database) - return - setup:add-element-word-lexicons-R( - $admin-config, - $database, - $db-config/db:element-word-lexicons/db:element-word-lexicon) + setup:add-element-word-lexicons-R( + setup:remove-existing-element-word-lexicons($admin-config, $database), + $database, + $db-config/db:element-word-lexicons/db:element-word-lexicon) }; declare function setup:add-element-word-lexicons-R( @@ -1444,6 +1546,16 @@ declare function setup:add-element-word-lexicons-R( $admin-config }; +declare function setup:validate-element-word-lexicons($admin-config, $database, $db-config) +{ + let $existing := admin:database-get-element-word-lexicons($admin-config, $database) + for $expected in $db-config/db:element-word-lexicons/db:element-word-lexicon + return + if ($existing[fn:deep-equal(., $expected)]) then () + else + setup:validation-fail(fn:concat("Database mismatched element word lexicon: ", $expected/db:localname)) +}; + declare function setup:remove-existing-element-attribute-word-lexicons( $admin-config as element(configuration), $database as xs:unsignedLong) as element(configuration) @@ -1461,12 +1573,10 @@ declare function setup:add-element-attribute-word-lexicons( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-element-attribute-word-lexicons($admin-config, $database) - return - setup:add-element-attribute-word-lexicons-R( - $admin-config, - $database, - $db-config/db:element-attribute-word-lexicons/db:element-attribute-word-lexicon) + setup:add-element-attribute-word-lexicons-R( + setup:remove-existing-element-attribute-word-lexicons($admin-config, $database), + $database, + $db-config/db:element-attribute-word-lexicons/db:element-attribute-word-lexicon) }; declare function setup:add-element-attribute-word-lexicons-R( @@ -1483,6 +1593,157 @@ declare function setup:add-element-attribute-word-lexicons-R( $admin-config }; +declare function setup:validate-element-attribute-word-lexicons($admin-config, $database, $db-config) +{ + let $existing := admin:database-get-element-attribute-word-lexicons($admin-config, $database) + for $expected in $db-config/db:element-attribute-word-lexicons/db:element-attribute-word-lexicon + return + if ($existing[fn:deep-equal(., $expected)]) then () + else + setup:validation-fail(fn:concat("Database mismatched element attribute word lexicon: ", $expected/db:localname)) +}; + +declare function setup:remove-existing-element-word-query-throughs( + $admin-config as element(configuration), + $database as xs:unsignedLong) as element(configuration) +{ + for $query-through in admin:database-get-element-word-query-throughs($admin-config, $database) + return + xdmp:set( + $admin-config, + admin:database-delete-element-word-query-through($admin-config, $database, $query-through)), + $admin-config +}; + +declare function setup:add-element-word-query-throughs( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $db-config as element(db:database)) as element(configuration) +{ + setup:add-element-word-query-throughs-R( + setup:remove-existing-element-word-query-throughs($admin-config, $database), + $database, + $db-config/db:element-word-query-throughs/db:element-word-query-through) +}; + +declare function setup:add-element-word-query-throughs-R( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $query-throughs as element(db:element-word-query-through)*) as element(configuration) +{ + if ($query-throughs) then + setup:add-element-word-query-throughs-R( + admin:database-add-element-word-query-through($admin-config, $database, $query-throughs[1]), + $database, + fn:subsequence($query-throughs, 2)) + else + $admin-config +}; + +declare function setup:validate-element-word-query-throughs($admin-config, $database, $db-config) +{ + let $existing := admin:database-get-element-word-query-throughs($admin-config, $database) + for $expected in $db-config/db:element-word-query-throughs/db:element-word-query-through + return + if ($existing[fn:deep-equal(., $expected)]) then () + else + setup:validation-fail(fn:concat("Database mismatched element word query through: ", $expected/db:localname)) +}; + +declare function setup:remove-existing-phrase-throughs( + $admin-config as element(configuration), + $database as xs:unsignedLong) as element(configuration) +{ + for $query-through in admin:database-get-phrase-throughs($admin-config, $database) + return + xdmp:set( + $admin-config, + admin:database-delete-phrase-through($admin-config, $database, $query-through)), + $admin-config +}; + +declare function setup:add-phrase-throughs( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $db-config as element(db:database)) as element(configuration) +{ + setup:add-phrase-throughs-R( + setup:remove-existing-phrase-throughs($admin-config, $database), + $database, + $db-config/db:phrase-throughs/db:phrase-through) +}; + +declare function setup:add-phrase-throughs-R( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $phrase-throughs as element(db:phrase-through)*) as element(configuration) +{ + if ($phrase-throughs) then + setup:add-phrase-throughs-R( + admin:database-add-phrase-through($admin-config, $database, $phrase-throughs[1]), + $database, + fn:subsequence($phrase-throughs, 2)) + else + $admin-config +}; + +declare function setup:validate-phrase-throughs($admin-config, $database, $db-config) +{ + let $existing := admin:database-get-phrase-throughs($admin-config, $database) + for $expected in $db-config/db:phrase-throughs/db:phrase-through + return + if ($existing[fn:deep-equal(., $expected)]) then () + else + setup:validation-fail(fn:concat("Database mismatched phrase through: ", $expected/db:localname)) +}; + +declare function setup:remove-existing-phrase-arounds( + $admin-config as element(configuration), + $database as xs:unsignedLong) as element(configuration) +{ + for $phrase-around in admin:database-get-phrase-arounds($admin-config, $database) + return + xdmp:set( + $admin-config, + admin:database-delete-phrase-around($admin-config, $database, $phrase-around)), + $admin-config +}; + +declare function setup:add-phrase-arounds( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $db-config as element(db:database)) as element(configuration) +{ + setup:add-phrase-arounds-R( + setup:remove-existing-phrase-arounds($admin-config, $database), + $database, + $db-config/db:phrase-arounds/db:phrase-around) +}; + +declare function setup:add-phrase-arounds-R( + $admin-config as element(configuration), + $database as xs:unsignedLong, + $phrase-arounds as element(db:phrase-around)*) as element(configuration) +{ + if ($phrase-arounds) then + setup:add-phrase-arounds-R( + admin:database-add-phrase-around($admin-config, $database, $phrase-arounds[1]), + $database, + fn:subsequence($phrase-arounds, 2)) + else + $admin-config +}; + +declare function setup:validate-phrase-arounds($admin-config, $database, $db-config) +{ + let $existing := admin:database-get-phrase-arounds($admin-config, $database) + for $expected in $db-config/db:phrase-arounds/db:phrase-around + return + if ($existing[fn:deep-equal(., $expected)]) then () + else + setup:validation-fail(fn:concat("Database mismatched phrase around: ", $expected/db:localname)) +}; + declare function setup:remove-existing-range-field-indexes( $admin-config as element(configuration), $database as xs:unsignedLong) as element(configuration) @@ -1520,12 +1781,10 @@ declare function setup:add-range-field-indexes( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-range-field-indexes($admin-config, $database) - return - setup:add-range-field-indexes-R( - $admin-config, - $database, - $db-config/db:range-field-indexes/db:range-field-index) + setup:add-range-field-indexes-R( + setup:remove-existing-range-field-indexes($admin-config, $database), + $database, + $db-config/db:range-field-indexes/db:range-field-index) }; declare function setup:add-range-field-indexes-R( @@ -1564,18 +1823,41 @@ declare function setup:remove-existing-geospatial-element-indexes( $admin-config }; +declare function setup:validate-range-field-indexes($admin-config, $database, $db-config) +{ + try + { + xdmp:eval(' + import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy"; + declare variable $admin-config external; + declare variable $database external; + + let $existing := admin:database-get-range-field-indexes($admin-config, $database) + for $expected in $db-config/db:range-field-indexes/db:range-field-index + return + if ($existing[fn:deep-equal(., $expected)]) then () + else + setup:validation-fail(fn:concat("Database mismatched range field index: ", $expected/db:field-name))', + (xs:QName("admin-config"), $admin-config, + xs:QName("database"), $database)) + } + catch($ex) + { + if ($ex/error:code = "XDMP-UNDFUN") then $admin-config + else + xdmp:rethrow() + } +}; declare function setup:add-geospatial-element-indexes( $admin-config as element(configuration), $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-geospatial-element-indexes($admin-config, $database) - return - setup:add-geospatial-element-indexes-R( - $admin-config, - $database, - $db-config/db:geospatial-element-indexes/db:geospatial-element-index) + setup:add-geospatial-element-indexes-R( + setup:remove-existing-geospatial-element-indexes($admin-config, $database), + $database, + $db-config/db:geospatial-element-indexes/db:geospatial-element-index) }; declare function setup:add-geospatial-element-indexes-R( @@ -1623,12 +1905,10 @@ declare function setup:add-geospatial-element-attribute-pair-indexes( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-geospatial-element-attribute-pair-indexes($admin-config, $database) - return - setup:add-geospatial-element-attribute-pair-indexes-R( - $admin-config, - $database, - $db-config/db:geospatial-element-attribute-pair-indexes/db:geospatial-element-attribute-pair-index) + setup:add-geospatial-element-attribute-pair-indexes-R( + setup:remove-existing-geospatial-element-attribute-pair-indexes($admin-config, $database), + $database, + $db-config/db:geospatial-element-attribute-pair-indexes/db:geospatial-element-attribute-pair-index) }; declare function setup:add-geospatial-element-attribute-pair-indexes-R( @@ -1675,12 +1955,10 @@ declare function setup:add-geospatial-element-pair-indexes( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-geospatial-element-pair-indexes($admin-config, $database) - return - setup:add-geospatial-element-pair-indexes-R( - $admin-config, - $database, - $db-config/db:geospatial-element-pair-indexes/db:geospatial-element-pair-index) + setup:add-geospatial-element-pair-indexes-R( + setup:remove-existing-geospatial-element-pair-indexes($admin-config, $database), + $database, + $db-config/db:geospatial-element-pair-indexes/db:geospatial-element-pair-index) }; declare function setup:add-geospatial-element-pair-indexes-R( @@ -1726,12 +2004,10 @@ declare function setup:add-geospatial-element-child-indexes( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config :=setup:remove-existing-geospatial-element-child-indexes($admin-config, $database) - return - setup:add-geospatial-element-child-indexes-R( - $admin-config, - $database, - $db-config/db:geospatial-element-child-indexes/db:geospatial-element-child-index) + setup:add-geospatial-element-child-indexes-R( + setup:remove-existing-geospatial-element-child-indexes($admin-config, $database), + $database, + $db-config/db:geospatial-element-child-indexes/db:geospatial-element-child-index) }; declare function setup:add-geospatial-element-child-indexes-R( @@ -1778,12 +2054,10 @@ declare function setup:add-word-lexicons( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-word-lexicons($admin-config, $database) - return - setup:add-word-lexicons-R( - $admin-config, - $database, - $db-config/db:word-lexicons/db:word-lexicon) + setup:add-word-lexicons-R( + setup:remove-existing-word-lexicons($admin-config, $database), + $database, + $db-config/db:word-lexicons/db:word-lexicon) }; declare function setup:add-word-lexicons-R( @@ -1793,7 +2067,10 @@ declare function setup:add-word-lexicons-R( { if ($collations) then setup:add-word-lexicons-R( - setup:safe-database-add-word-lexicon($admin-config, $database, $collations[1]), + admin:database-add-word-lexicon( + $admin-config, + $database, + admin:database-word-lexicon($collations[1])), $database, fn:subsequence($collations, 2)) else @@ -1813,18 +2090,6 @@ declare function setup:validate-word-lexicons( setup:validation-fail(fn:concat("Database missing word lexicon: ", $expected)) }; - -declare function setup:safe-database-add-word-lexicon( - $admin-config as element(configuration), - $database as xs:unsignedLong, - $collation as xs:string) as element(configuration) -{ - admin:database-add-word-lexicon( - $admin-config, - $database, - admin:database-word-lexicon($collation)) -}; - declare function setup:remove-existing-fragment-roots( $admin-config as element(configuration), $database as xs:unsignedLong) as element(configuration) @@ -1840,12 +2105,10 @@ declare function setup:add-fragment-roots( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-fragment-roots($admin-config, $database) - return - setup:add-fragment-roots-R( - $admin-config, - $database, - $db-config/db:fragment-roots/db:fragment-root) + setup:add-fragment-roots-R( + setup:remove-existing-fragment-roots($admin-config, $database), + $database, + $db-config/db:fragment-roots/db:fragment-root) }; declare function setup:add-fragment-roots-R( @@ -1895,12 +2158,10 @@ declare function setup:add-fragment-parents( $database as xs:unsignedLong, $db-config as element(db:database)) as element(configuration) { - let $admin-config := setup:remove-existing-fragment-parents($admin-config, $database) - return - setup:add-fragment-parents-R( - $admin-config, - $database, - $db-config/db:fragment-parents/db:fragment-parent) + setup:add-fragment-parents-R( + setup:remove-existing-fragment-parents($admin-config, $database), + $database, + $db-config/db:fragment-parents/db:fragment-parent) }; declare function setup:add-fragment-parents-R( @@ -1954,7 +2215,6 @@ declare function setup:remove-existing-word-query-excluded-elements( $admin-config as element(configuration), $database as xs:unsignedLong) as element(configuration) { - (: remove existing word query excluded elements first :) for $element in admin:database-get-word-query-excluded-elements($admin-config, $database) return xdmp:set( @@ -2238,26 +2498,15 @@ declare function setup:validate-word-query( ) }; -(: - if the triggers database is 0, set it to 0. - if the triggers database is set to an ID of another database in the import, - get its new ID and set it to that -:) declare function setup:set-triggers-database( $admin-config as element(configuration), $db-config as element(db:database), $database as xs:unsignedLong) as element(configuration) { - let $triggers-database-id := - if ($db-config/db:triggers-database/@name) then - xdmp:database($db-config/db:triggers-database/@name) - else - 0 - return - admin:database-set-triggers-database( - $admin-config, - $database, - $triggers-database-id) + admin:database-set-triggers-database( + $admin-config, + $database, + setup:get-triggers-database($db-config)) }; declare function setup:validate-triggers-database( @@ -2266,37 +2515,22 @@ declare function setup:validate-triggers-database( $database as xs:unsignedLong) { let $actual := admin:database-get-triggers-database($admin-config, $database) - let $expected := - if ($db-config/db:triggers-database/@name) then - xdmp:database($db-config/db:triggers-database/@name) - else - 0 + let $expected := setup:get-triggers-database($db-config) return if ($expected = $actual) then () else setup:validation-fail(fn:concat("Triggers database mismatch! ", $expected, " != ", $actual)) }; -(: - if the schema database is 0, set it to 0. - if the schema database is set to an ID of another database in the import, - get its new ID and set it to that -:) declare function setup:set-schema-database( $admin-config as element(configuration), $db-config as element(db:database), $database as xs:unsignedLong) as element(configuration) { - let $schema-database-id := - if ($db-config/db:schema-database/@name) then - xdmp:database($db-config/db:schema-database/@name) - else - $default-schemas - return - admin:database-set-schema-database( - $admin-config, - $database, - $schema-database-id) + admin:database-set-schema-database( + $admin-config, + $database, + setup:get-schema-database($db-config)) }; declare function setup:validate-schema-database( @@ -2305,37 +2539,22 @@ declare function setup:validate-schema-database( $database as xs:unsignedLong) { let $actual := admin:database-get-schema-database($admin-config, $database) - let $expected := - if ($db-config/db:schema-database/@name) then - xdmp:database($db-config/db:schema-database/@name) - else - $default-schemas + let $expected := setup:get-schema-database($db-config) return if ($expected = $actual) then () else setup:validation-fail(fn:concat("Schema database mismatch! ", $expected, " != ", $actual)) }; -(: - if the security database is 0, set it to 0. - if the security database is set to an ID of another database in the import, - get its new ID and set it to that -:) declare function setup:set-security-database( $admin-config as element(configuration), $db-config as element(db:database), $database as xs:unsignedLong) as element(configuration) { - let $security-database-id := - if ($db-config/db:security-database/@name) then - xdmp:database($db-config/db:security-database/@name) - else - $default-security - return - admin:database-set-security-database( - $admin-config, - $database, - $security-database-id) + admin:database-set-security-database( + $admin-config, + $database, + setup:get-security-database($db-config)) }; declare function setup:validate-security-database( @@ -2344,29 +2563,21 @@ declare function setup:validate-security-database( $database as xs:unsignedLong) { let $actual := admin:database-get-security-database($admin-config, $database) - let $expected := - if ($db-config/db:security-database/@name) then - xdmp:database($db-config/db:security-database/@name) - else - $default-security + let $expected := setup:get-security-database($db-config) return if ($expected = $actual) then () else setup:validation-fail(fn:concat("Security database mismatch! ", $expected, " != ", $actual)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Creation of app servers - ::) - declare function setup:create-appservers( $import-config as element(configuration)) as item()* { - for $http-config in $import-config//gr:http-servers/gr:http-server + for $http-config in $import-config/gr:http-servers/gr:http-server return setup:create-appserver($http-config), - for $xdbc-config in $import-config//gr:xdbc-servers/gr:xdbc-server + for $xdbc-config in $import-config/gr:xdbc-servers/gr:xdbc-server return setup:create-xdbcserver($xdbc-config) }; @@ -2374,11 +2585,11 @@ declare function setup:create-appservers( declare function setup:validate-appservers( $import-config as element(configuration)) as item()* { - for $http-config in $import-config//gr:http-servers/gr:http-server + for $http-config in $import-config/gr:http-servers/gr:http-server return setup:validate-appserver($http-config), - for $xdbc-config in $import-config//gr:xdbc-servers/gr:xdbc-server + for $xdbc-config in $import-config/gr:xdbc-servers/gr:xdbc-server return setup:validate-xdbcserver($xdbc-config) }; @@ -2391,34 +2602,20 @@ declare function setup:create-appserver( if (xdmp:servers()[xdmp:server-name(.) = $server-name]) then fn:concat("HTTP Server ", $server-name, " already exists, not recreated..") else - let $root := $server-config/gr:root[fn:string-length(fn:string(.)) > 0] - let $root := if ($root) then $root else "/" + let $root := ($server-config/gr:root[fn:string-length(fn:string(.)) > 0], "/")[1] let $port := xs:unsignedLong($server-config/gr:port) - let $is-webdav := xs:boolean($server-config/gr:webDAV) - let $database-id := - if ($server-config/gr:database/@name) then - xdmp:database($server-config/gr:database/@name) - else - 0 - let $modules-id := - if ($server-config/gr:modules/@name eq "filesystem") then - 0 - else if ($server-config/gr:modules/@name) then - xdmp:database($server-config/gr:modules/@name) - else - 0 - + let $database := setup:get-appserver-database($server-config) let $admin-config := admin:get-configuration() let $admin-config := - if ($is-webdav) then - (: Note: database id is stored as modules is for webdav servers :) + if (xs:boolean($server-config/gr:webDAV)) then + (: Note: database id is stored as modules for webdav servers :) admin:webdav-server-create( $admin-config, $default-group, $server-name, $root, $port, - $modules-id) + $database) else admin:http-server-create( $admin-config, @@ -2426,8 +2623,8 @@ declare function setup:create-appserver( $server-name, $root, $port, - $modules-id, - $database-id) + setup:get-appserver-modules-database($server-config), + $database) return ( if (admin:save-configuration-without-restart($admin-config)) then @@ -2455,32 +2652,15 @@ declare function setup:create-xdbcserver( if (xdmp:servers()[xdmp:server-name(.) = $server-name]) then fn:concat("XDBC Server ", $server-name, " already exists, not recreated..") else - let $root := $server-config/gr:root[fn:string-length(fn:string(.)) > 0] - let $root := if ($root) then $root else "/" - let $port := xs:unsignedLong($server-config/gr:port) - let $database-id := - if ($server-config/gr:database/@name) then - xdmp:database($server-config/gr:database/@name) - else - 0 - let $modules-id := - if ($server-config/gr:modules/@name eq "filesystem") then - 0 - else if ($server-config/gr:modules/@name) then - xdmp:database($server-config/gr:modules/@name) - else - 0 - - let $admin-config := admin:get-configuration() let $admin-config := admin:xdbc-server-create( - $admin-config, + admin:get-configuration(), $default-group, $server-name, - $root, - $port, - $modules-id, - $database-id) + ($server-config/gr:root[fn:string-length(fn:string(.)) > 0], "/")[1], + xs:unsignedLong($server-config/gr:port), + setup:get-appserver-modules-database($server-config), + setup:get-appserver-content-database($server-config)) return ( if (admin:save-configuration-without-restart($admin-config)) then @@ -2500,18 +2680,14 @@ declare function setup:validate-xdbcserver( setup:validation-fail(fn:concat("Missing XDBC server: ", $server-name)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Configuration of app servers - ::) - declare function setup:apply-appservers-settings( $import-config as element(configuration)) as item()* { - for $http-config in $import-config//gr:http-servers/gr:http-server + for $http-config in $import-config/gr:http-servers/gr:http-server return setup:configure-http-server($http-config), - for $xdbc-config in $import-config//gr:xdbc-servers/gr:xdbc-server + for $xdbc-config in $import-config/gr:xdbc-servers/gr:xdbc-server return setup:configure-xdbc-server($xdbc-config), @@ -2523,11 +2699,11 @@ declare function setup:apply-appservers-settings( declare function setup:validate-appservers-settings( $import-config as element(configuration)) as item()* { - for $http-config in $import-config//gr:http-servers/gr:http-server + for $http-config in $import-config/gr:http-servers/gr:http-server return setup:validate-http-server($http-config), - for $xdbc-config in $import-config//gr:xdbc-servers/gr:xdbc-server + for $xdbc-config in $import-config/gr:xdbc-servers/gr:xdbc-server return setup:validate-xdbc-server($xdbc-config), @@ -2540,125 +2716,10 @@ declare function setup:configure-http-server( $server-config as element(gr:http-server)) as item()* { let $server-name as xs:string? := $server-config/gr:http-server-name[fn:string-length(fn:string(.)) > 0] - let $server-id := xdmp:server($server-name) - let $admin-config := setup:configure-server($server-config, $server-id) + let $admin-config := setup:configure-server($server-config, xdmp:server($server-name), $http-server-settings) return ( - if (xdmp:eval(' - import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy"; - import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy"; - - declare namespace gr="http://marklogic.com/xdmp/group"; - declare namespace err="http://marklogic.com/xdmp/error"; - - declare variable $server-config as element() external; - declare variable $server-name as xs:string external; - declare variable $admin-config as element() external; - declare variable $server-id external; - declare variable $default-user external; - - let $default-user := - if ($server-config/gr:default-user/@name) then - xdmp:user($server-config/gr:default-user/@name) - else - $default-user - let $is-webdav := xs:boolean($server-config/gr:webDAV) - - (: reconnect databases in case the appserver already existed :) - let $database-id := - if ($server-config/gr:database/@name) then - xdmp:database($server-config/gr:database/@name) - else - 0 - let $modules-id := - if ($server-config/gr:modules/@name eq "filesystem") then - 0 - else if ($server-config/gr:modules/@name) then - xdmp:database($server-config/gr:modules/@name) - else - 0 - let $root := $server-config/gr:root[fn:string-length(fn:string(.)) > 0] - let $root := if ($root) then $root else "/" - - let $admin-config := - if ($is-webdav) then - admin:appserver-set-database($admin-config, $server-id, $modules-id) - else - admin:appserver-set-database($admin-config, $server-id, $database-id) - let $admin-config := - if ($is-webdav) then - $admin-config - else - admin:appserver-set-modules-database($admin-config, $server-id, $modules-id) - - let $admin-config := admin:appserver-set-root($admin-config, $server-id, $root) - - let $value := $server-config/gr:session-timeout[fn:string-length(fn:string(.)) > 0] - let $admin-config := - if ($value) then - admin:appserver-set-session-timeout($admin-config, $server-id, $value) - else - $admin-config - - let $value := $server-config/gr:static-expires[fn:string-length(fn:string(.)) > 0] - let $admin-config := - if ($value) then - admin:appserver-set-static-expires($admin-config, $server-id, $value) - else - $admin-config - - let $value := $server-config/gr:rewrite-resolves-globally[fn:string-length(fn:string(.)) > 0] - let $admin-config := - if ($value) then - xdmp:value("admin:appserver-set-rewrite-resolves-globally($admin-config, $server-id, $value)") - else - $admin-config - - let $admin-config := - admin:appserver-set-default-user($admin-config, $server-id, $default-user) - - let $admin-config := - if ($is-webdav) then - let $value := $server-config/gr:compute-content-length[fn:string-length(fn:string(.)) > 0] - return - if ($value) then - admin:appserver-set-compute-content-length($admin-config, $server-id, $value) - else - $admin-config - else - let $value := $server-config/gr:error-handler[fn:string-length(fn:string(.)) > 0] - let $admin-config := - if ($value) then - admin:appserver-set-error-handler($admin-config, $server-id, $value) - else - $admin-config - - let $value := $server-config/gr:url-rewriter[fn:string-length(fn:string(.)) > 0] - let $admin-config := - if ($value) then - admin:appserver-set-url-rewriter($admin-config, $server-id, $value) - else - $admin-config - - return $admin-config - - (: TODO ? - 0 - true - true - - ALL:!LOW:@STRENGTH - true - - :) - - return - admin:save-configuration-without-restart($admin-config)', - (xs:QName("server-config"), $server-config, - xs:QName("server-name"), $server-name, - xs:QName("admin-config"), $admin-config, - xs:QName("server-id"), $server-id, - xs:QName("default-user"), $default-user))) then + if (admin:save-configuration-without-restart($admin-config)) then xdmp:set($restart-needed, fn:true()) else (), fn:concat("HTTP Server ", $server-name, " settings applied succesfully.") @@ -2668,194 +2729,39 @@ declare function setup:configure-http-server( declare function setup:validate-http-server( $server-config as element(gr:http-server)) as item()* { - let $server-name as xs:string? := $server-config/gr:http-server-name[fn:string-length(fn:string(.)) > 0] - let $server-id := xdmp:server($server-name) - let $admin-config := admin:get-configuration() - let $default-user := - if ($server-config/gr:default-user/@name) then - xdmp:user($server-config/gr:default-user/@name) - else - $default-user - let $is-webdav := xs:boolean($server-config/gr:webDAV) - - (: reconnect databases in case the appserver already existed :) - let $database-id := - if ($server-config/gr:database/@name) then - xdmp:database($server-config/gr:database/@name) - else - 0 - let $modules-id := - if ($server-config/gr:modules/@name eq "filesystem") then - 0 - else if ($server-config/gr:modules/@name) then - xdmp:database($server-config/gr:modules/@name) - else - 0 - let $root := $server-config/gr:root[fn:string-length(fn:string(.)) > 0] - let $root := if ($root) then $root else "/" - - return - ( - setup:validate-server($server-config, $server-id), - - let $actual := admin:appserver-get-database($admin-config, $server-id) - return - if ($is-webdav) then - if ($modules-id = $actual) then () - else - setup:validation-fail(fn:concat("Invalid Appserver database: ", $modules-id, " != ", $actual)) - else - ( - if ($database-id = $actual) then () - else - setup:validation-fail(fn:concat("Invalid Appserver database: ", $database-id, " != ", $actual)), - - let $actual := admin:appserver-get-modules-database($admin-config, $server-id) - return - if ($actual = $modules-id) then () - else - setup:validation-fail(fn:concat("Invalid Appserver modules database: ", $modules-id, " != ", $actual)) - ), - - let $actual := admin:appserver-get-root($admin-config, $server-id) - return - if ($root = $actual) then () - else - setup:validation-fail(fn:concat("Appserver root mismatch: ", $root, " != ", $actual)), - - let $expected := $server-config/gr:session-timeout[fn:string-length(fn:string(.)) > 0] - let $actual := admin:appserver-get-session-timeout($admin-config, $server-id) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("Appserver session timeout mismatch: ", $expected, " != ", $actual)), - - let $expected := $server-config/gr:static-expires[fn:string-length(fn:string(.)) > 0] - let $actual := admin:appserver-get-static-expires($admin-config, $server-id) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("Appserver static expires mismatch: ", $expected, " != ", $actual)), - - let $actual := admin:appserver-get-default-user($admin-config, $server-id) - return - if ($default-user = $actual) then () - else - setup:validation-fail(fn:concat("Appserver default user mismatch: ", $default-user, " != ", $actual)), - - if ($is-webdav) then - let $expected := $server-config/gr:compute-content-length[fn:string-length(fn:string(.)) > 0] - let $actual := admin:appserver-get-compute-content-length($admin-config, $server-id) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("Appserver compute content length mismatch: ", $expected, " != ", $actual)) - else - ( - let $expected := $server-config/gr:error-handler[fn:string-length(fn:string(.)) > 0] - let $actual := admin:appserver-get-error-handler($admin-config, $server-id) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("Appserver error handler mismatch: ", $expected, " != ", $actual)), - - let $expected := $server-config/gr:url-rewriter[fn:string-length(fn:string(.)) > 0] - let $actual := admin:appserver-get-url-rewriter($admin-config, $server-id) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("Appserver url rewriter mismatch: ", $expected, " != ", $actual)) - ) - ) + setup:validate-server( + $server-config, + xdmp:server($server-config/gr:http-server-name[fn:string-length(fn:string(.)) > 0])) }; declare function setup:configure-xdbc-server( $server-config as element(gr:xdbc-server)) as item()* { let $server-name as xs:string? := $server-config/gr:xdbc-server-name[fn:string-length(fn:string(.)) > 0] + let $admin-config := setup:configure-server($server-config, xdmp:server($server-name), $xcc-server-settings) return - (: reconnect databases in case the appserver already existed :) - let $database-id := - if ($server-config/gr:database/@name) then - xdmp:database($server-config/gr:database/@name) - else - 0 - let $modules-id := - if ($server-config/gr:modules/@name eq "filesystem") then - 0 - else if ($server-config/gr:modules/@name) then - xdmp:database($server-config/gr:modules/@name) - else - 0 - let $server-id := xdmp:server($server-name) - let $admin-config := - admin:appserver-set-modules-database( - admin:appserver-set-database( - setup:configure-server($server-config, $server-id), - $server-id, - $database-id), - $server-id, - $modules-id) - return - ( - if (admin:save-configuration-without-restart($admin-config)) then - xdmp:set($restart-needed, fn:true()) - else (), - fn:concat("XDBC Server ", $server-name, " settings applied succesfully.") - ) + ( + if (admin:save-configuration-without-restart($admin-config)) then + xdmp:set($restart-needed, fn:true()) + else (), + fn:concat("XDBC Server ", $server-name, " settings applied succesfully.") + ) }; declare function setup:validate-xdbc-server( $server-config as element(gr:xdbc-server)) as item()* { - let $server-id := xdmp:server($server-config/gr:xdbc-server-name[fn:string-length(fn:string(.)) > 0]) - let $admin-config := admin:get-configuration() - return - ( - setup:validate-server($server-config, $server-id), - - let $expected := ($server-config/gr:database/@name/xdmp:database(.), 0)[1] - let $actual := admin:appserver-get-database($admin-config, $server-id) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("XDBC Server database mismatch: ", $expected, " != ", $actual)), - - let $expected := - if ($server-config/gr:modules/@name eq "filesystem") then - 0 - else if ($server-config/gr:modules/@name) then - xdmp:database($server-config/gr:modules/@name) - else - 0 - let $actual := admin:appserver-get-modules-database($admin-config, $server-id) - return - if ($expected = $actual) then () - else - setup:validation-fail(fn:concat("XDBC Server modules database mismatch: ", $expected, " != ", $actual)) - ) + setup:validate-server( + $server-config, + xdmp:server($server-config/gr:xdbc-server-name[fn:string-length(fn:string(.)) > 0])) }; declare function setup:configure-task-server( $server-config as element(gr:task-server)) as item()* { let $admin-config := admin:get-configuration() - let $settings := - - debug-allow - debug-threads - default-time-limit - log-errors - max-time-limit - post-commit-trigger-depth - pre-commit-trigger-depth - pre-commit-trigger-limit - profile-allow - queue-size - threads - let $apply-settings := - for $setting in $settings/*:setting + for $setting in $task-server-settings/*:setting let $value := fn:data(xdmp:value(fn:concat("$server-config/gr:", $setting))) where fn:exists($value) return @@ -2873,21 +2779,7 @@ declare function setup:validate-task-server( $server-config as element(gr:task-server)) as item()* { let $admin-config := admin:get-configuration() - let $settings := - - debug-allow - debug-threads - default-time-limit - log-errors - max-time-limit - post-commit-trigger-depth - pre-commit-trigger-depth - pre-commit-trigger-limit - profile-allow - queue-size - threads - - for $setting in $settings/*:setting + for $setting in $task-server-settings/*:setting let $expected := fn:data(xdmp:value(fn:concat("$server-config/gr:", $setting))) let $actual := xdmp:value(fn:concat("admin:taskserver-get-", $setting, "($admin-config, $default-group)")) where fn:exists($expected) @@ -2897,38 +2789,47 @@ declare function setup:validate-task-server( setup:validation-fail(fn:concat("Task Server ", $setting, " mismatch: ", $expected, " != ", $actual)) }; +declare function setup:get-appserver-privilege( + $server-config as element()) as xs:unsignedLong +{ + let $privilege as xs:string? := $server-config/gr:privilege[fn:string-length(fn:string(.)) > 0]/fn:string(.) + return + if ($privilege = "0") then 0 + else if ($privilege) then + let $id as xs:unsignedLong? := setup:get-privilege-by-name($privilege)/sec:privilege-id + return + if ($id) then $id + else + fn:error( + xs:QName("INVALID-PRIVILEGE"), + fn:concat( + "Invalid privilege '", + $privilege)) + else 0 +}; + +declare function admin:appserver-set-privilege2( + $config as element(configuration), + $appserver-id as xs:unsignedLong, + $value as xs:unsignedLong) +as element(configuration) +{ + if ($value = 0) then $config + else + admin:appserver-set-privilege($config, $appserver-id, $value) +}; + declare function setup:configure-server( $server-config as element(), - $server-id as xs:unsignedLong) as element(configuration) + $server-id as xs:unsignedLong, + $settings as element(settings)) as element(configuration) { let $admin-config := admin:get-configuration() - let $settings := - - last-login - display-last-login - backlog - threads - request-timeout - keep-alive-timeout - max-time-limit - default-time-limit - pre-commit-trigger-depth - pre-commit-trigger-limit - collation - authentication - concurrent-request-limit - log-errors - debug-allow - profile-allow - default-xquery-version - output-sgml-character-entities - output-encoding - let $apply-settings := for $setting in $settings/*:setting let $value := if ($setting/@value) then - fn:data(xdmp:value($setting/@value)) + xdmp:value($setting/@value) else fn:data(xdmp:value(fn:concat("$server-config/gr:", $setting, "[fn:string-length(fn:string(.)) > 0]"))) where (fn:exists($value)) @@ -2953,7 +2854,7 @@ declare function setup:configure-server( admin:group-namespace($same-prefix/gr:prefix, $same-prefix/gr:namespace-uri) else ()) return - (: Then add in any namespace whose prefix isn't already defined :) + (: Then add in any namespace whose prefix isn't already defined :) admin:appserver-add-namespace( $config, $server-id, @@ -2977,35 +2878,14 @@ declare function setup:validate-server( let $_ := let $actual := admin:appserver-get-last-login($admin-config, $server-id) let $expected := - if ($server-config/gr:last-login/@name) then - xdmp:database($server-config/gr:last-login/@name) + if (fn:data($server-config/gr:last-login/(@name|text()))) then + xdmp:database(fn:data($server-config/gr:last-login/(@name|text()))) else 0 return if ($actual = $expected) then () else setup:validation-fail(fn:concat("Appserver last-login mismatch: ", $expected, " != ", $actual)) - let $settings := - - display-last-login - backlog - threads - request-timeout - keep-alive-timeout - max-time-limit - default-time-limit - pre-commit-trigger-depth - pre-commit-trigger-limit - collation - authentication - concurrent-request-limit - log-errors - debug-allow - profile-allow - default-xquery-version - output-sgml-character-entities - output-encoding - - for $setting in $settings/*:setting + for $setting in $http-server-settings/*:setting let $expected := fn:data(xdmp:value(fn:concat("$server-config/gr:", $setting, "[fn:string-length(fn:string(.)) > 0]"))) let $actual := xdmp:value(fn:concat("admin:appserver-get-", $setting, "($admin-config, $server-id)")) where $expected @@ -3043,7 +2923,7 @@ declare function setup:create-privileges( "; action=", $action, "; kind=", $kind) ) - else () (: It's a match. No need to mess with it. :) + else () (: noop :) else ( (: Create this new privilege :) @@ -3082,7 +2962,7 @@ declare function setup:validate-privileges( $privilege-name, "; action=", $action, "; kind=", $kind)) - else () (: It's a match. :) + else () (: noop :) else setup:validation-fail(fn:concat("Missing privilege: ", $privilege-name)) }; @@ -3090,7 +2970,7 @@ declare function setup:validate-privileges( declare function setup:create-roles( $import-config as element(configuration)) { - for $role in $import-config//sec:roles/sec:role + for $role in $import-config/sec:roles/sec:role let $role-name as xs:string := $role/sec:role-name let $description as xs:string? := $role/sec:description let $role-names as xs:string* := $role/sec:role-names/sec:role-name @@ -3178,7 +3058,7 @@ declare function setup:create-roles( for $privilege in $privileges let $priv := setup:get-privilege-by-name($privilege/sec:privilege-name) let $validate-privilege := - if ($priv) then xdmp:log(text { "privilege is valid", $privilege/sec:privilege-name }) + if ($priv) then () else fn:error( xs:QName("INVALID-PRIVILEGE"), @@ -3230,7 +3110,6 @@ declare function setup:validate-roles( let $privileges as element(sec:privilege)* := $role/sec:privileges/sec:privilege let $amps as element(sec:amp)* := $role/sec:amps/* let $match := setup:get-roles(())/sec:role[sec:role-name = $role-name] - let $_ := xdmp:log($match) return (: if the role exists, then update it :) if ($match) then @@ -3247,7 +3126,7 @@ declare function setup:validate-roles( declare function setup:create-users($import-config as element(configuration)) { - for $user in $import-config//sec:users/sec:user + for $user in $import-config/sec:users/sec:user let $user-name as xs:string := $user/sec:user-name let $description as xs:string? := $user/sec:description let $password as xs:string := $user/sec:password @@ -3346,7 +3225,7 @@ declare function setup:create-users($import-config as element(configuration)) declare function setup:validate-users($import-config as element(configuration)) { - for $user in $import-config//sec:users/sec:user + for $user in $import-config/sec:users/sec:user let $user-name as xs:string := $user/sec:user-name let $description as xs:string? := $user/sec:description let $password as xs:string := $user/sec:password @@ -3364,9 +3243,6 @@ declare function setup:validate-users($import-config as element(configuration)) setup:validation-fail(fn:concat("Missing user: ", $user-name)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: - ::) declare function setup:create-amps($import-config) { let $existing-amps := setup:get-amps(()) @@ -3410,9 +3286,6 @@ declare function setup:validate-amps($import-config) setup:validation-fail(fn:concat("Missing amp: ", $amp/sec:local-name)) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Export configuration to XML - ::) declare function setup:get-configuration( $databases as xs:string*, $forests as xs:string*, @@ -3472,7 +3345,7 @@ declare function setup:get-app-servers($names as xs:string*) as element()* }; declare function setup:get-forests($names as xs:string*) as element(as:assignments) { - let $forests := setup:read-config-file("assignments.xml")/as:assignments + let $forests :=setup:read-config-file("assignments.xml")/as:assignments let $forests := $forests/as:assignment[as:forest-name = $names] where $forests return @@ -3511,6 +3384,72 @@ declare function setup:get-databases($names as xs:string*) as element(db:databas }; +declare function setup:get-appserver-modules-database($server-config as element()) as xs:unsignedLong +{ + let $modules as xs:string? := $server-config/gr:modules/(@name|text()) + return + if ($modules eq "filesystem") then 0 + else if ($modules) then xdmp:database($modules) + else 0 +}; + +declare function setup:get-appserver-content-database($server-config as element()) as xs:unsignedLong +{ + let $database as xs:string? := fn:data($server-config/gr:database/(@name|text())) + return + if ($database) then xdmp:database($database) + else 0 +}; + +declare function setup:get-appserver-database($server-config as element()) as xs:unsignedLong +{ + if (xs:boolean($server-config/gr:webDAV)) then + setup:get-appserver-modules-database($server-config) + else + setup:get-appserver-content-database($server-config) +}; + +declare function setup:get-last-login($server-config as element()) as xs:unsignedLong +{ + let $last-login as xs:string? := $server-config/gr:last-login/(@name|text()) + return + if ($last-login = ("filesystem", "0")) then 0 + else if ($last-login) then xdmp:database($last-login) + else 0 +}; + +declare function setup:get-triggers-database($db-config as element(db:database)) as xs:unsignedLong +{ + let $db-name := fn:data($db-config/db:triggers-database/(@name|text())) + return + if ($db-name) then xdmp:database($db-name) + else 0 +}; + +declare function setup:get-schema-database($db-config as element(db:database)) as xs:unsignedLong +{ + let $db-name := fn:data($db-config/db:schema-database/(@name|text())) + return + if ($db-name) then xdmp:database($db-name) + else $default-schemas +}; + +declare function setup:get-security-database($db-config as element(db:database)) as xs:unsignedLong +{ + let $db-name := fn:data($db-config/db:security-database/(@name|text())) + return + if ($db-name) then xdmp:database($db-name) + else $default-security +}; + +declare function setup:get-appserver-default-user($server-config as element()) as xs:unsignedLong +{ + let $user as xs:string? := fn:data($server-config/gr:default-user/(@name|text())) + return + if ($user) then xdmp:user($user) + else $default-user +}; + declare function setup:get-role-name($id as xs:unsignedLong) as xs:string? { xdmp:eval( 'import module namespace sec="http://marklogic.com/xdmp/security" at "/MarkLogic/security.xqy"; @@ -3720,16 +3659,12 @@ declare function setup:get-mimetypes($names as xs:string*) as element(mt:mimetyp }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Resolving IDs to names - ::) - declare function setup:resolve-database-id-to-name($node as element()) as element()? { if (fn:data($node) ne 0) then element {fn:node-name($node)} { - attribute {xs:QName("name")} { xdmp:database-name(fn:data($node)) } + xdmp:database-name(fn:data($node)) } else () }; @@ -3739,7 +3674,7 @@ declare function setup:resolve-forest-id-to-name($node as element()) as element( if (fn:data($node) ne 0) then element {fn:node-name($node)} { - attribute {xs:QName("name")} { xdmp:forest-name(fn:data($node)) } + xdmp:forest-name(fn:data($node)) } else () }; @@ -3749,7 +3684,7 @@ declare function setup:resolve-host-id-to-name($node as element()) as element()? if (fn:data($node) ne 0) then element {fn:node-name($node)} { - attribute {xs:QName("name")} { xdmp:host-name(fn:data($node)) } + xdmp:host-name(fn:data($node)) } else () }; @@ -3759,7 +3694,7 @@ declare function setup:resolve-user-id-to-name($node as element()) as element()? if (fn:data($node) ne 0) then element {fn:node-name($node)} { - attribute {xs:QName("name")} { setup:user-name(fn:data($node)) } + setup:user-name(fn:data($node)) } else () }; @@ -3769,8 +3704,7 @@ declare function setup:resolve-ids-to-names($nodes as item()*) as item()* for $node in $nodes return typeswitch ($node) - - (: App Server specific :) + (: App Server specific :) case element(gr:modules) return setup:resolve-database-id-to-name($node) @@ -3783,7 +3717,7 @@ declare function setup:resolve-ids-to-names($nodes as item()*) as item()* case element(gr:default-user) return setup:resolve-user-id-to-name($node) - (: Database specific :) + (: Database specific :) case element(db:security-database) return setup:resolve-database-id-to-name($node) @@ -3796,11 +3730,11 @@ declare function setup:resolve-ids-to-names($nodes as item()*) as item()* case element(db:forest-id) return setup:resolve-forest-id-to-name($node) - (: Forest specific :) + (: Forest specific :) case element(as:host) return setup:resolve-host-id-to-name($node) - (: Default :) + (: Default :) case element() return if ($node/node()) then element {fn:node-name($node)} @@ -3820,10 +3754,6 @@ declare function setup:resolve-ids-to-names($nodes as item()*) as item()* $node }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Stripping default properties - ::) - declare function setup:strip-default-properties-from-http-server( $node as element(gr:http-server)) as element(gr:http-server) { @@ -3915,10 +3845,6 @@ declare function setup:strip-default-properties-from-forest( } }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Accessing import-config - ::) - declare function setup:get-databases-from-config( $import-config as element(configuration)) as element(db:database)* { @@ -3930,7 +3856,7 @@ declare function setup:get-databases-from-config( $db/*, let $ignore := $db/*/fn:node-name(.) return - $import-config//db:databases/db:database[db:database-name eq $db/@import]/*[fn:not(fn:node-name(.) = $ignore)] + $import-config/db:databases/db:database[db:database-name eq $db/@import]/*[fn:not(fn:node-name(.) = $ignore)] } else $db @@ -3953,10 +3879,6 @@ declare function setup:get-forests-per-host-from-database-config( xs:positiveInteger("1") (: Default forests per host is 1 :) }; -(:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - :: Utility functions - ::) - declare function setup:at-least-version($target) { let $current := xdmp:version() @@ -3991,10 +3913,8 @@ declare function setup:read-config-file($filename as xs:string) as document-node declare function setup:user-name($user-id as xs:unsignedLong?) as xs:string { let $user-id := - if ($user-id) then - $user-id - else - fn:data(xdmp:get-request-user()) + if ($user-id) then $user-id + else fn:data(xdmp:get-request-user()) return xdmp:eval( 'xquery version "1.0-ml"; @@ -4008,463 +3928,6 @@ declare function setup:user-name($user-id as xs:unsignedLong?) as xs:string ) }; -declare function display:template($title, $main-content, $left-content) -{ - - - Cluster Configurator -- {$title} - - - - - -
-
-
- - { - $main-content - } - -
-
- - { - $left-content - } - -
-
-
- - - -}; - -declare function display:tab-bar($labels, $links, $index) -{ - ( - -
    - { - for $label at $i in $labels - return -
  • - { - element a - { - if ($i = $index) then - attribute class {"active"} - else - (), - attribute href {$links[$i]}, - $label - } - } -
  • - } -
-
, -


 

- ) -}; - -declare function display:dropdown($name, $options, $selected, $disabled) -{ - element select - { - attribute id {$name}, - attribute name {$name}, - - if ($disabled) then - attribute disabled {"disabled"} - else - (), - - for $option in $options - return - element option - { - attribute value {$option}, - if ($selected eq $option) then - attribute selected {"selected"} - else - (), - $option - } - } -}; - -declare function display:radio($name, $value, $selected) -{ - element input - { - attribute type {"radio"}, - attribute name {$name}, - attribute value {$value}, - - if ($value eq $selected) then - attribute checked {"checked"} - else - () - } -}; - -declare function display:vertical-spacer($n) -{ -

- { - for $i in (1 to $n) - return (" ",
) - } -

-}; - -declare function display:left-links() -{ -
-  
-  
-  
-

Export

-

Import

-
-}; - -declare function display:export-ui() -{ - let $databases := xdmp:get-request-field("databases", "") - let $forests := xdmp:get-request-field("forests", "") - let $servers := xdmp:get-request-field("servers", "") - let $user-ids as xs:unsignedLong* := - for $x in xdmp:get-request-field("users", ()) - return - xs:unsignedLong($x) - let $role-ids as xs:unsignedLong* := - for $x in xdmp:get-request-field("roles", ()) - return - xs:unsignedLong($x) - let $submit := xdmp:get-request-field("submit", "") - return - if ($submit eq "Export") then - let $config := setup:get-configuration($databases, $forests, $servers, $user-ids, $role-ids, ()) - let $type := xdmp:add-response-header("Content-Type", "text/xml") - let $disp := xdmp:add-response-header("Content-Disposition", "attachment; filename=config.xml") - return $config - else - display:template( - "Export Configuration", -
-
- - - - - - - - - -
-

Databases

- { - for $database-id in xdmp:databases() - let $database := xdmp:database-name($database-id) - order by $database - return (, $database,
) - } -
-

Forests

- { - for $forest-id in xdmp:forests() - let $forest := xdmp:forest-name($forest-id) - order by $forest - return (, $forest,
) - } -
-

App Servers

- { - for $server-id in xdmp:servers() - let $server := xdmp:server-name($server-id) - order by $server - return (, $server,
) - } -
-

Users

- { - for $user in xdmp:eval("/sec:user", (), - {xdmp:database("Security")} - ) - order by $user/sec:user-name - return (, $user/sec:user-name,
) - } -
-

Roles

- { - for $user in xdmp:eval("/sec:role", (), - {xdmp:database("Security")} - ) - order by $user/sec:role-name - return (, $user/sec:role-name,
) - } -
- - -
-
, - display:left-links() - ) -}; - declare function setup:validation-fail($message) { xdmp:log($message), diff --git a/deploy/test/data/ml4-config.xml b/deploy/test/data/ml4-config.xml index 03b342f9..c516eb32 100644 --- a/deploy/test/data/ml4-config.xml +++ b/deploy/test/data/ml4-config.xml @@ -20,11 +20,42 @@ @ml.app-port - @ml.modules-root - @ml.authentication-method - - @ml.url-rewriter - @ml.error-handler + 0 + false +
0.0.0.0
+ 256 + 32 + 30 + 5 + 3600 + 3600 + 600 + 3600 + 1000 + 10000 + http://marklogic.com/collation/ + digest + @ml.default-user + admin-ui + 0 + false + true + true + true + 1.0-ml + none + UTF-8 + /roxy/error.xqy + + + + /roxy/rewrite.xqy + + true + true + sixer + ALL:!LOW:@STRENGTH + true @ml.test-appserver @@ -61,10 +92,9 @@ - true - true - manual - false + true + @ml.content-db-security + en http://www.marklogic.com/ns/sample @@ -85,18 +115,52 @@ frag-parents2 - - http://marklogic.com/collation/ - http://marklogic.com/collation/codepoint - + + + http://schemas.microsoft.com/office/word/2003/wordml + p + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + p + + + + + http://www.w3.org/1999/xhtml + a abbr acronym b big br center cite code dfn em font i kbd q samp small span strong sub sup tt var + + + http://schemas.microsoft.com/office/word/2003/wordml + br cr fldChar fldData fldSimple hlink noBreakHyphen permEnd permStart pgNum proofErr r softHyphen sym t tab + + + http://schemas.microsoft.com/office/word/2003/auxHint + t + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + r t endnoteReference footnoteReference customXml hyperlink sdt sdtContent commentRangeEnd commentRangeStart bookmarkStart bookmarkEnd fldSimple instrText smartTag ins proofErr + + + http://marklogic.com/entity + person organization location gpe facility religion nationality credit-card-number email coordinate money percent id phone-number url utm date time + + + + + http://schemas.microsoft.com/office/word/2003/wordml + delInstrText delText endnote footnote instrText pict rPr + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + pPr rPr customXmlPr sdtPr commentReference del + + false - - http://marklogic.com/collation/ - http://marklogic.com/collation/it/S2/CU/T00BB/AS - decompounding true true @@ -137,16 +201,18 @@ - test true - + + http://marklogic.com/collation/ + http://marklogic.com/collation/codepoint + http://www.marklogic.com/ns/sample sample-included-element - 1.0 + 1 @@ -154,7 +220,7 @@ http://www.marklogic.com/ns/sample2 sample-included-element2 - 1.0 + 1 @@ -164,16 +230,10 @@ http://www.marklogic.com/ns/sample sample-excluded-element - - - http://www.marklogic.com/ns/sample2 sample-excluded-element2 - - - @@ -185,7 +245,7 @@ http://www.marklogic.com/ns/sample sample-included-element - 1.0 + 1 @@ -193,7 +253,7 @@ http://www.marklogic.com/ns/sample2 sample-included-element2 - 1.0 + 1 @@ -203,16 +263,10 @@ http://www.marklogic.com/ns/sample sample-excluded-element - - - http://www.marklogic.com/ns/sample2 sample-excluded-element2 - - - @@ -253,12 +307,6 @@ false - - - - - - http://www.marklogic.com/ns/sample @@ -374,16 +422,16 @@ - off + basic false false - false + true false - false - false - false + true + true + true false - false + true false false false @@ -392,13 +440,45 @@ false false false - + + http://marklogic.com/collation/ + http://marklogic.com/collation/codepoint + false false - false + true false - automatic + true + 5 + 0 + manual false + false + false + false + false + 32768 + 64 + 16 + 2 + 2 + fast + fast + 128 + 2 + false + false + facet-time + 256 + automatic + automatic + automatic + scaled-log + lower + 0 + 1024 + 2 + 0
@ml.test-modules-db-xml @@ -494,7 +574,7 @@ A user for the @ml.app-name application password - @ml.app-role + @ml.app-role @@ -504,7 +584,7 @@ A second user for the @ml.app-name application password2 - @ml.app-role2 + @ml.app-role2 diff --git a/deploy/test/data/ml5-config.xml b/deploy/test/data/ml5-config.xml index 3bc08feb..7f44ea36 100644 --- a/deploy/test/data/ml5-config.xml +++ b/deploy/test/data/ml5-config.xml @@ -20,11 +20,60 @@ @ml.app-port - @ml.modules-root - @ml.authentication-method - - @ml.url-rewriter - @ml.error-handler + 0 + false +
0.0.0.0
+ 256 + 32 + 30 + 5 + 3600 + 3600 + 600 + 3600 + 1000 + 10000 + http://marklogic.com/collation/ + digest + @ml.default-user + admin-ui + 0 + false + true + true + true + 1.0-ml + contemporaneous + none + UTF-8 + default + default + + + + + default + default + default + default + + none + default + omit + default + + default + /roxy/error.xqy + + + + /roxy/rewrite.xqy + + true + true + sixer + ALL:!LOW:@STRENGTH + true @ml.test-appserver @@ -61,10 +110,9 @@ - true - true - manual - false + true + @ml.content-db-security + en http://www.marklogic.com/ns/sample @@ -85,18 +133,52 @@ frag-parents2 - - http://marklogic.com/collation/ - http://marklogic.com/collation/codepoint - + + + http://schemas.microsoft.com/office/word/2003/wordml + p + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + p + + + + + http://www.w3.org/1999/xhtml + a abbr acronym b big br center cite code dfn em font i kbd q samp small span strong sub sup tt var + + + http://schemas.microsoft.com/office/word/2003/wordml + br cr fldChar fldData fldSimple hlink noBreakHyphen permEnd permStart pgNum proofErr r softHyphen sym t tab + + + http://schemas.microsoft.com/office/word/2003/auxHint + t + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + r t endnoteReference footnoteReference customXml hyperlink sdt sdtContent commentRangeEnd commentRangeStart bookmarkStart bookmarkEnd fldSimple instrText smartTag ins proofErr + + + http://marklogic.com/entity + person organization location gpe facility religion nationality credit-card-number email coordinate money percent id phone-number url utm date time + + + + + http://schemas.microsoft.com/office/word/2003/wordml + delInstrText delText endnote footnote instrText pict rPr + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + pPr rPr customXmlPr sdtPr commentReference del + + false - - http://marklogic.com/collation/ - http://marklogic.com/collation/it/S2/CU/T00BB/AS - decompounding true true @@ -143,16 +225,18 @@ - test true - + + http://marklogic.com/collation/ + http://marklogic.com/collation/codepoint + http://www.marklogic.com/ns/sample sample-included-element - 1.0 + 1 @@ -160,7 +244,7 @@ http://www.marklogic.com/ns/sample2 sample-included-element2 - 1.0 + 1 @@ -191,7 +275,7 @@ http://www.marklogic.com/ns/sample sample-included-element - 1.0 + 1 @@ -199,7 +283,7 @@ http://www.marklogic.com/ns/sample2 sample-included-element2 - 1.0 + 1 @@ -392,31 +476,67 @@ - off + basic false false - false + true false - false - false - false + true + true + true false - false + true false false + false + false false false false false false false - + + http://marklogic.com/collation/ + http://marklogic.com/collation/codepoint + false false - false + true false - automatic + true + 5 + 0 + manual false + false + false + false + false + 32768 + 64 + 16 + 2 + 2 + 1024 + fast + fast + 128 + 2 + false + false + false + facet-time + 256 + automatic + automatic + automatic + scaled-log + lower + 0 + 1024 + 2 + 0
@ml.test-modules-db-xml @@ -512,7 +632,7 @@ A user for the @ml.app-name application password - @ml.app-role + @ml.app-role @@ -522,7 +642,7 @@ A second user for the @ml.app-name application password2 - @ml.app-role2 + @ml.app-role2 diff --git a/deploy/test/data/ml6-config.xml b/deploy/test/data/ml6-config.xml index a221962f..d57c26c6 100644 --- a/deploy/test/data/ml6-config.xml +++ b/deploy/test/data/ml6-config.xml @@ -20,11 +20,61 @@ @ml.app-port - @ml.modules-root - @ml.authentication-method - - @ml.url-rewriter - @ml.error-handler + 0 + false +
0.0.0.0
+ 256 + 32 + 30 + 5 + 3600 + 3600 + 600 + 3600 + 1000 + 10000 + http://marklogic.com/collation/ + digest + @ml.default-user + admin-ui + 0 + false + true + true + true + 1.0-ml + contemporaneous + none + UTF-8 + default + default + + + + + default + default + default + default + + none + default + omit + default + + default + /roxy/error.xqy + + + + /roxy/rewrite.xqy + true + + true + true + sixer + ALL:!LOW:@STRENGTH + true @ml.test-appserver @@ -61,10 +111,9 @@ - true - true - manual - false + true + @ml.content-db-security + en http://www.marklogic.com/ns/sample @@ -85,18 +134,52 @@ frag-parents2 - - http://marklogic.com/collation/ - http://marklogic.com/collation/codepoint - + + + http://schemas.microsoft.com/office/word/2003/wordml + p + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + p + + + + + http://www.w3.org/1999/xhtml + a abbr acronym b big br center cite code dfn em font i kbd q samp small span strong sub sup tt var + + + http://schemas.microsoft.com/office/word/2003/wordml + br cr fldChar fldData fldSimple hlink noBreakHyphen permEnd permStart pgNum proofErr r softHyphen sym t tab + + + http://schemas.microsoft.com/office/word/2003/auxHint + t + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + r t endnoteReference footnoteReference customXml hyperlink sdt sdtContent commentRangeEnd commentRangeStart bookmarkStart bookmarkEnd fldSimple instrText smartTag ins proofErr + + + http://marklogic.com/entity + person organization location gpe facility religion nationality credit-card-number email coordinate money percent id phone-number url utm date time + + + + + http://schemas.microsoft.com/office/word/2003/wordml + delInstrText delText endnote footnote instrText pict rPr + + + http://schemas.openxmlformats.org/wordprocessingml/2006/main + pPr rPr customXmlPr sdtPr commentReference del + + false - - http://marklogic.com/collation/ - http://marklogic.com/collation/it/S2/CU/T00BB/AS - decompounding true true @@ -143,16 +226,18 @@ - test true - + + http://marklogic.com/collation/ + http://marklogic.com/collation/codepoint + http://www.marklogic.com/ns/sample sample-included-element - 1.0 + 1 @@ -160,7 +245,7 @@ http://www.marklogic.com/ns/sample2 sample-included-element2 - 1.0 + 1 @@ -191,7 +276,7 @@ http://www.marklogic.com/ns/sample sample-included-element - 1.0 + 1 @@ -199,7 +284,7 @@ http://www.marklogic.com/ns/sample2 sample-included-element2 - 1.0 + 1 @@ -428,31 +513,67 @@ - off + basic false false - false + true false - false - false - false + true + true + true false - false + true false false + false + false false false false false false false - + + http://marklogic.com/collation/ + http://marklogic.com/collation/codepoint + false false - false + true false - automatic + true + 5 + 0 + manual false + false + false + false + false + 32768 + 64 + 16 + 2 + 2 + 1024 + fast + fast + 128 + 2 + false + false + false + facet-time + 256 + automatic + automatic + automatic + scaled-log + lower + 0 + 1024 + 2 + 0
@ml.test-modules-db-xml @@ -548,7 +669,7 @@ A user for the @ml.app-name application password - @ml.app-role + @ml.app-role @@ -558,7 +679,7 @@ A second user for the @ml.app-name application password2 - @ml.app-role2 + @ml.app-role2