357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
|
;; return the target db handle so it can be used
;;
(define (db:cache-for-read-only source target #!key (use-last-update #f))
(if (and (hash-table-ref/default *global-db-store* target #f)
(>= (file-modification-time target)(file-modification-time source)))
(hash-table-ref *global-db-store* target)
(let* ((toppath (launch:setup))
(targ-db-last-mod (if (common:file-exists? target)
(file-modification-time target)
0))
(cache-db (or (hash-table-ref/default *global-db-store* target #f)
(db:open-megatest-db path: target)))
(source-db (db:open-megatest-db path: source))
(curr-time (current-seconds))
(res '())
(last-update (if use-last-update (cons "last_update" targ-db-last-mod) #f)))
(db:sync-tables (db:sync-main-list source-db) last-update source-db cache-db)
|
>
|
>
|
|
|
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
|
;; return the target db handle so it can be used
;;
(define (db:cache-for-read-only source target #!key (use-last-update #f))
(if (and (hash-table-ref/default *global-db-store* target #f)
(>= (file-modification-time target)(file-modification-time source)))
(hash-table-ref *global-db-store* target)
(let* ((toppath (launch:setup))
(targ-db-last-mod (db:get-sqlite3-mod-time target))
;; (if (common:file-exists? target)
;; BUG: This needs to include wal mode stuff .shm etc.
;; (file-modification-time target)
;; 0))
(cache-db (or (hash-table-ref/default *global-db-store* target #f)
(db:open-megatest-db path: target)))
(source-db (db:open-megatest-db path: source))
(curr-time (current-seconds))
(res '())
(last-update (if use-last-update (cons "last_update" targ-db-last-mod) #f)))
(db:sync-tables (db:sync-main-list source-db) last-update source-db cache-db)
|
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
|
;; megatest-db
;; (conc cache-dir "/" fname)
;; use-last-update: #t)))
;; (thread-start! th1)
;; (apply proc cache-db params)
;; ))))
(define (db:all-db-sync dbstruct)
(let* ((dbdat (db:open-db dbstruct #f db:initialize-main-db))
(data-synced 0) ;; count of changed records
(tmp-area (common:get-db-tmp-area))
(dbfiles (glob (conc tmp-area"/.megatest/*.db")))
(sync-durations (make-hash-table))
(no-sync-db (db:open-no-sync-db)))
(for-each
(lambda (file) ;; tmp db file
(debug:print-info 3 *default-log-port* "file: " file)
(let* ((fname (conc (pathname-file file) ".db")) ;; fname is tmp db file
(wal-file (conc fname "-wal"))
(shm-file (conc fname "-shm"))
(fulln (conc *toppath*"/.megatest/"fname)) ;; fulln is nfs db name
(wal-time (if (file-exists? wal-file)
(file-modification-time wal-file)
0))
(shm-time (if (file-exists? shm-file)
(file-modification-time shm-file)
0))
(time1 (if (file-exists? file) ;; time1 is the max itime of the tmp db, -wal and -shm files.
(max (file-modification-time file) wal-time shm-time)
(begin
(debug:print-info 2 *default-log-port* "Sync - I do not see file "file)
1)))
(time2 (if (file-exists? fulln) ;; time2 is nfs file time
(file-modification-time fulln)
(begin
(debug:print-info 2 *default-log-port* "Sync - I do not see file "fulln)
0)))
(changed (> (- time1 time2) (+ (random 5) 1))) ;; it has been at some few seconds since last synced
(changed10 (> (- time1 time2) 10)) ;; it has been at least ten seconds since sync'd
(jfile-exists (file-exists? (conc file"-journal"))) ;; i.e. are we busy?
(do-cp (cond
((not (file-exists? fulln)) ;; shouldn't happen, but this might recover
(cons #t (conc "File "fulln" not found! Copying "fname" to "fulln)))
((and (not jfile-exists) changed)
|
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
>
|
|
|
|
|
|
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
|
;; megatest-db
;; (conc cache-dir "/" fname)
;; use-last-update: #t)))
;; (thread-start! th1)
;; (apply proc cache-db params)
;; ))))
(define (db:get-sqlite3-mod-time fname)
(let* ((wal-file (conc fname "-wal"))
(shm-file (conc fname "-shm"))
(get-mtime (lambda (f)
(if (and (file-exists? f)
(file-read-access? f))
(file-modification-time f)
0))))
(max (get-mtime fname)
(get-mtime wal-file)
(get-mtime shm-file))))
(define (db:all-db-sync dbstruct)
(let* ((dbdat (db:open-db dbstruct #f db:initialize-main-db))
(data-synced 0) ;; count of changed records
(tmp-area (common:get-db-tmp-area))
(dbfiles (glob (conc tmp-area"/.megatest/*.db")))
(sync-durations (make-hash-table))
(no-sync-db (db:open-no-sync-db)))
(for-each
(lambda (file) ;; tmp db file
(debug:print-info 3 *default-log-port* "file: " file)
(let* ((fname (conc (pathname-file file) ".db")) ;; fname is tmp db file
(wal-file (conc fname "-wal"))
(shm-file (conc fname "-shm"))
(fulln (conc *toppath*"/.megatest/"fname)) ;; fulln is nfs db name
(wal-time (if (file-exists? wal-file)
(file-modification-time wal-file)
0))
(shm-time (if (file-exists? shm-file)
(file-modification-time shm-file)
0))
(time1 (db:get-sqlite3-mod-time file))
;; (if (file-exists? file) ;; time1 is the max itime of the tmp db, -wal and -shm files.
;; (max (file-modification-time file) wal-time shm-time)
;; (begin
;; (debug:print-info 2 *default-log-port* "Sync - I do not see file "file)
;; 1)))
(time2 (db:get-sqlite3-mod-time fulln))
;; (if (file-exists? fulln) ;; time2 is nfs file time
;; (file-modification-time fulln)
;; (begin
;; (debug:print-info 2 *default-log-port* "Sync - I do not see file "fulln)
;; 0)))
(changed (> (- time1 time2) (+ (random 5) 1))) ;; it has been at some few seconds since last synced
(changed10 (> (- time1 time2) 10)) ;; it has been at least ten seconds since sync'd
(jfile-exists (file-exists? (conc file"-journal"))) ;; i.e. are we busy?
(do-cp (cond
((not (file-exists? fulln)) ;; shouldn't happen, but this might recover
(cons #t (conc "File "fulln" not found! Copying "fname" to "fulln)))
((and (not jfile-exists) changed)
|