103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
-
+
+
-
+
+
|
;; start-server-find-port ;; gotta have a server port ready from the very begining
;; udata - all the connection info, captain, server, ulex db etc. MUST BE PASSED IN
;; dbpath - full path and filename of the db to talk to or a symbol naming the db?
;; callname - the remote call to execute
;; params - parameters to pass to the remote call
;;
(define (remote-call udata dbpath dbtype callname . params)
(define (remote-call udata dbpath dbtype callname params)
(start-server-find-port udata) ;; ensure we have a local server
(find-or-setup-captain udata)
;; look at connect, process-request, send, send-receive
(let-values (((cookie-key host-port)(get-db-owner udata dbpath dbtype)))
(if (and cookie-key host-port)
(send-receive udata host-port callname cookie-key params)))
(send-receive udata host-port callname cookie-key params)
#f)))
;;======================================================================
;; KEY FUNCTIONS - THESE ARE TOO BE EXPOSED AND USED
;;======================================================================
;; connection setup and management functions
|
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
|
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
-
+
-
+
+
|
(let* ((host-port (udat-captain-host-port udata)))
(if host-port
(let* ((cookie (make-cookie udata))
(msg #f) ;; (conc dbname " " dbtype))
(params `(,dbname ,dbtype))
(res (send udata host-port 'db-owner cookie msg
params: params retval: #t)))
(match (string-split res)
(match (and res (string-split res))
((retcookie owner-host-port)
(values (equal? retcookie cookie) owner-host-port))))
(values (equal? retcookie cookie) owner-host-port))
(else (values #f #f))))
(values #f -1))))
;; called in ulex-handler to dispatch work, called on the workers side
;; calls (proc params data)
;; returns result with cookie
;;
;; pdat is the info of the caller, used to send the result data
|
538
539
540
541
542
543
544
545
546
547
548
549
550
551
|
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
|
+
+
|
(udat-my-port udata) "-"
(udat-my-pid udata) "-"
newcnum)))
;; create a tcp listener and return a populated udat struct with
;; my port, address, hostname, pid etc.
;; return #f if fail to find a port to allocate.
;;
;; does not actually start a server thread
;;
;; if udata-in is #f create the record
;; if there is already a serv-listener return the udata
;;
(define (start-server-find-port udata-in #!optional (port 4242)(tries 0))
(let ((udata (or udata-in (make-udat))))
(if (udat-serv-listener udata) ;; TODO - add check that the listener is alive and ready?
|