xquery version "1.0-ml"; module namespace pin = 'http://davidcassel.net/pins/pin-model'; (: TODO: the URIs should have the username -- /pins/{username}/{hash}.xml :) declare private function pin:build-pin($name, $loc-label, $lat, $long, $desc, $date, $notes) { {$name} { if ($lat ne '') then {$lat} else (), if ($long ne '') then {$long} else () } { if (fn:exists($date) and $date != '') then {$date} else () } {$desc} {$notes} }; declare function pin:add-pin($name, $loc-label, $lat, $long, $desc, $date, $notes) { let $pin := pin:build-pin($name,$loc-label,$lat,$long,$desc,$date,$notes) let $uri := fn:concat("/pins/", xdmp:hash64($pin), ".xml") let $insert := xdmp:eval("declare variable $uri external; declare variable $pin external; xdmp:document-insert($uri,$pin)", (xs:QName("uri"), $uri, xs:QName("pin"), $pin)) return $uri }; declare function pin:update-pin($uri, $name, $loc-label, $lat, $long, $desc, $date, $notes) { let $log := xdmp:log(text{"updating", $uri}) let $pin := pin:build-pin($name,$loc-label,$lat,$long,$desc,$date,$notes) let $update := xdmp:eval("declare variable $uri external; declare variable $pin external; xdmp:node-replace(fn:doc($uri)/pin, $pin)", (xs:QName("uri"), $uri, xs:QName("pin"), $pin)) return $uri };