xquery version "1.0"; declare namespace session="http://exist-db.org/xquery/session"; declare namespace request="http://exist-db.org/xquery/request"; declare namespace util="http://exist-db.org/xquery/util"; declare namespace i18n="http://apache.org/cocoon/i18n/2.1"; declare namespace xmldb="http://exist-db.org/xquery/xmldb"; import module namespace ristenutil="http://www.risten.no/shared/util" at "../xquery/ristenutil.xqm"; (: Save an existing entry, with new sense for the new term record :) declare function local:saveExistingEntry($centerid as xs:string) as element() { let $lang := request:get-parameter("lang", ""), $rawentry := request:get-parameter("entry", ""), $pos := request:get-parameter("pos", ""), $entry := ristenutil:cleanEntry( $rawentry ), (: The class codes are coming directly if adding to an exising record: :) $topT := request:get-parameter("top", ""), $midT := request:get-parameter("mid", ""), $botmT := request:get-parameter("botm", ""), (: The class codes are coming indirectly through this one if it is a new record: :) $class := request:get-parameter("class", ""), $top := if ($topT = "") then (: If the request param is empty, then it is a new rec :) substring($class, 1, 1) else $topT, $mid := if ($midT = "") then if (contains($class, '-') ) then substring-before($class, "-") else $class else $midT, $botm := if ($botmT = "") then if (contains($class, '-') ) then substring-after($class, "-") else "" else $botmT, $langid := ristenutil:makeTermID($entry, $pos) let $user := session:get-attribute("user" ), $pass := session:get-attribute("password"), $coll := "/db/ordbase/terms/SD-terms", $doc := ristenutil:get-doc($lang), $db := concat('xmldb:exist://',$coll) let $date := ristenutil:dateTime() (: $collection should refer to the collection, not the document in the collecion! :) let $collection := xmldb:collection( $db, $user, $pass) (: The document reference needs to include the collection path even though it is given in the $collection argument in the xmldb:update command (below). :) let $langupdate := {$date} (: execute the XUpdate: :) let $dummy := xmldb:update($collection, $langupdate) return

Database: {$db}
ID: {$centerid}
LangID: {$langid}
Oppslag: {$entry}
XUpdate: {$langupdate}
Lagra!

}; (: Save an edited entry, the grammar part common to all senses: :) declare function local:saveNewEntry($centerid as xs:string) as element() { let $lang := request:get-parameter("lang", ""), $rawentry := request:get-parameter("entry", ""), $pos := request:get-parameter("pos", ""), $entry := ristenutil:cleanEntry( $rawentry ), (: The class codes are coming directly if adding to an exising record: :) $topT := request:get-parameter("top", ""), $midT := request:get-parameter("mid", ""), $botmT := request:get-parameter("botm", ""), (: The class codes are coming indirectly through this one if it is a new record: :) $class := request:get-parameter("class", ""), $top := if ($topT = "") then (: If the request param is empty, then it is a new rec :) substring($class, 1, 1) else $topT, $mid := if ($midT = "") then if (contains($class, '-') ) then substring-before($class, "-") else $class else $midT, $botm := if ($botmT = "") then if (contains($class, '-') ) then substring-after($class, "-") else "" else $botmT, $langid := ristenutil:makeTermID($entry, $pos) let $user := session:get-attribute("user" ), $pass := session:get-attribute("password"), $coll := "/db/ordbase/terms/SD-terms", $doc := ristenutil:get-doc($lang), $cntrdoc := "/db/ordbase/terms/SD-terms/termcenter.xml", $db := concat('xmldb:exist://',$coll) let $date := ristenutil:dateTime() (: $collection should refer to the collection, not the document in the collecion! :) let $collection := xmldb:collection( $db, $user, $pass) (: The document reference needs to include the collection path even though it is given in the $collection argument in the xmldb:update command (below). :) let $langupdate := {$langid} {$entry} {$date} let $dummy := xmldb:update($collection, $langupdate) return

Database: {$db}
ID: {$centerid}
Oppslag: {$entry}
XUpdate: {$langupdate}
Result: {$dummy}
Lagra!

}; (: Create a new Term Record entry: :) declare function local:saveNewCenter() as xs:integer { let $centerid := ristenutil:newID(), $lang := request:get-parameter("lang", ""), $rawentry := request:get-parameter("entry", ""), $pos := request:get-parameter("pos", ""), $entry := ristenutil:cleanEntry( $rawentry ), $class := request:get-parameter("class", ""), $top := substring( $class, 1, 1), $mid := if (contains($class, '-') ) then substring-before($class, "-") else $class, $botm := if (contains($class, '-') ) then substring-after($class, "-") else "", $langid := ristenutil:makeTermID($entry, $pos) let $user := session:get-attribute("user"), $collID := session:get-attribute("collection"), $doc := ristenutil:get-doc-path($collID, "termcenter.xml"), $docref := document($doc) let $date := ristenutil:dateTime(), $comment := concat("Created this record, added entry for ", $lang), $xiref := concat("terms-", $lang, ".xml", "#xpointer(//entry[@id='", $langid, "'])" ) let $newnode := return if (0 > $centerid) then $centerid else util:exclusive-lock($docref, local:save-new-center-record($centerid, $newnode, $doc, $date) ) }; declare function local:save-new-center-record($centerid as xs:integer, $newnode as element(), $doc as xs:string, $date as xs:string) as xs:integer { let $result := if ( document($doc)//entry[@id = $centerid] ) then -2 else ( (# exist:batch-transaction #) { update insert $newnode into document($doc)/termCenter, update value document($doc)/termCenter/@last-update with $date } ) return if ( $result = -2 ) then $result else $centerid }; (: Create filter expression from query term, field and mode :) declare function local:filter-expr($record as xs:string) as xs:string { let $pos := request:get-parameter("pos", "S"), $newrec := ristenutil:makeTermID($record, $pos) let $t := concat("'", $newrec, "'") return concat("@id &= ", $t) }; (: Assemble the query string :) declare function local:build-query($record as xs:string, $entrylang as xs:string) as xs:string { let $expr := local:filter-expr($record), $doc := ristenutil:get-doc($entrylang) return concat("for $r in document('", $doc, "')//entry[", $expr, "] return $r") }; (: Check for the existence of the new entry: :) declare function local:check-exists($entry as xs:string, $entrylang as xs:string) as xs:boolean { let $query := local:build-query($entry, $entrylang), $hits := util:eval( $query ), $count := count($hits) return if ( $count = 0 ) then false() else true() }; (: Main function - retrieves some request attributes, forks further processing to other defined functions depending on the retrieved values :) declare function local:main() as element()+ { let $entrylang := request:get-parameter("lang", ""), $rawentry := request:get-parameter("entry", ""), $pos := request:get-parameter("pos", ""), $entry := ristenutil:cleanEntry( $rawentry ), $class := request:get-parameter("class", "") let $l := session:set-attribute("newreclang", $entrylang), $p := session:set-attribute("newrecpos", $pos), $c := session:set-attribute("class", $class) let $centerid := local:saveNewCenter() let $exists := local:check-exists($entry, $entrylang) return if ($centerid < 0) then if ($centerid = -2) then

IDAlreadyInUseError

else

ERROR! The new record failed to get added!

else if( $exists ) then let $savedentry := local:saveExistingEntry($centerid), $query := local:build-query($entry, $entrylang), $hits := util:eval( $query ) return ( (:

The result: {$savedentry}

, :) ristenutil:display($entrylang, $hits) ) else let $savedentry := local:saveNewEntry($centerid), $query := local:build-query($entry, $entrylang), $hits := util:eval( $query ) return if (empty($hits)) then (

ERROR! The new record {$centerid} was not found!

,

Contact the webmaster!

) else ( (: DEBUG:

Your search query:

,

The save result: {$saveresult}

,

The article does exist: {$exists}

, :) ristenutil:display($entrylang, $hits) ) };
{ let $start := util:system-time() return ( local:main(),

SearchTime { round-half-to-even( seconds-from-duration( util:system-time()-$start) , 3)}

) }