Skip to content

Instantly share code, notes, and snippets.

@grantmacken
Last active February 15, 2019 15:32
Show Gist options
  • Save grantmacken/8950792 to your computer and use it in GitHub Desktop.
Save grantmacken/8950792 to your computer and use it in GitHub Desktop.
a existdb trigger which syncs localhost to remotehost ( http://markup.co.nz/archive/2014/02/12/publishing-posts )
xquery version "3.0";
module namespace trigger = "http://exist-db.org/xquery/trigger";
declare namespace xhtml = "http://www.w3.org/1999/xhtml";
declare namespace atom = "http://www.w3.org/2005/Atom";
declare namespace repo="http://exist-db.org/xquery/repo";
import module namespace system = "http://exist-db.org/xquery/system";
import module namespace util = "http://exist-db.org/xquery/util";
import module namespace xmldb = "http://exist-db.org/xquery/xmldb";
import module namespace http = "http://expath.org/ns/http-client";
(:
http://localhost:8080/exist/apps/doc/triggers.xml
https://www.ibm.com/developerworks/library/x-expath/
:)
declare function trigger:update-remote( $uri as xs:anyURI ) {
let $priority := 'info'
let $message1 := 'mu:update ' || $uri
let $base := substring-before($uri , '/archive/')
let $app-root := substring-before( system:get-module-load-path() ,'/module')
let $permissions := doc(concat($app-root, "/repo.xml"))/repo:meta/repo:permissions
let $username := $permissions/@user/string()
let $password := $permissions/@password/string()
let $priority := 'info'
let $local := 'http://localhost:8080'
let $rest := '/exist/rest'
let $urlLocal := $local || $rest || $base || '/uri.xml'
let $message1 := 'mu:update ' || $urlLocal
let $reqPut :=
<http:request href="{ $urlLocal }"
method="put"
username="{ $username }"
password="{ $password }"
auth-method="basic"
send-authorization="true"
status-only="true"
timeout="2">
<http:header name = "Connection" value = "close"/>
<http:body media-type="application/xml"/>
</http:request>
let $link := <link href="{$uri}" />
let $put := http:send-request( $reqPut , (), $link)
let $message := concat($put/@status/string(), ': ' ,$put/@message/string())
let $log := (util:log($priority,$link), util:log($priority, $message))
let $eval := util:eval-async(xs:anyURI('local-to-remote.xq'))
return ()
};
declare function trigger:after-create-document($uri as xs:anyURI) {
trigger:update-remote($uri)
};
declare function trigger:after-update-document($uri as xs:anyURI) {
trigger:update-remote($uri)
};
xquery version "3.0";
declare namespace xhtml = "http://www.w3.org/1999/xhtml";
declare namespace atom = "http://www.w3.org/2005/Atom";
declare namespace repo="http://exist-db.org/xquery/repo";
import module namespace system = "http://exist-db.org/xquery/system";
import module namespace util = "http://exist-db.org/xquery/util";
import module namespace xmldb = "http://exist-db.org/xquery/xmldb";
import module namespace http = "http://expath.org/ns/http-client";
import module namespace request="http://exist-db.org/xquery/request";
import module namespace session = "http://exist-db.org/xquery/session";
let $app-root := substring-before( system:get-module-load-path() ,'/module')
let $permissions := doc(concat($app-root, "/repo.xml"))/repo:meta/repo:permissions
let $username := $permissions/@user/string()
let $password := $permissions/@password/string()
let $uri := doc(concat($app-root, "/data/uri.xml"))//@href/string()
let $local-ip := doc(concat($app-root, "/data/hosts.xml"))//local/string()
let $remote-ip := doc(concat($app-root, "/data/hosts.xml"))//remote/string()
let $local := 'http://localhost:8080'
let $remote := 'http://120.138.18.126:8080'
let $rest := '/exist/rest'
let $urlLocal := $local || $rest || $uri
let $urlRemote := $remote || $rest || $uri
let $reqGet := <http:request href="{ $urlLocal }"
method="get"
username="{ $username }"
password="{ $password }"
auth-method="basic"
send-authorization="true"
timeout="4"
>
<http:header name = "Connection"
value = "close"/>
</http:request>
let $reqPut := <http:request href="{ $urlRemote }"
method="put"
username="{ $username }"
password="{ $password }"
auth-method="basic"
send-authorization="true"
timeout="10"
>
<http:header name = "Connection"
value = "close"/>
<http:body media-type="application/xml"/>
</http:request>
let $reqGetRemote := <http:request href="{ $urlRemote }"
method="get"
username="{ $username }"
password="{ $password }"
auth-method="basic"
send-authorization="false"
timeout="4"
>
<http:header name = "Connection"
value = "close"/>
</http:request>
let $inDoc := http:send-request($reqGet)[2]
let $outDoc := http:send-request( $reqPut , (), $inDoc)
return (http:send-request($reqGetRemote))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment