Fossil

Hex Artifact Content
Login

Artifact a00ad3df48e45af4de8f6064f8cc3cc8d2b09fa46d7882d5adfd2ed938b345bf:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 31 38 20 44 2e 20 52 69 63 68  (c) 2018 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20   Simplified BSD 
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a  License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32   known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22  -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63   or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65  stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69   hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a  ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79   but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f   warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c  ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a  ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69  ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f  ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70  r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75  urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66  thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64  ormation:.**   d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20  rh@hwaci.com.** 
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61    http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a  ci.com/drh/.**.*
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
0250: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0260: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0270: 64 20 74 6f 20 6d 61 6e 61 67 65 20 61 20 62 61  d to manage a ba
0280: 63 6b 67 72 6f 75 6e 64 20 70 72 6f 63 65 73 73  ckground process
0290: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 63 63 75 72  es that.** occur
02a0: 20 61 66 74 65 72 20 75 73 65 72 20 69 6e 74 65   after user inte
02b0: 72 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  raction with the
02c0: 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20 45 78   repository.  Ex
02d0: 61 6d 70 6c 65 73 20 6f 66 0a 2a 2a 20 62 61 63  amples of.** bac
02e0: 6b 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73 69  koffice processi
02f0: 6e 67 20 69 6e 63 6c 75 64 65 73 3a 0a 2a 2a 0a  ng includes:.**.
0300: 2a 2a 20 20 20 20 2a 20 20 53 65 6e 64 69 6e 67  **    *  Sending
0310: 20 61 6c 65 72 74 73 20 61 6e 64 20 6e 6f 74 69   alerts and noti
0320: 66 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  fications.**    
0330: 2a 20 20 50 72 6f 63 65 73 73 69 6e 67 20 74 68  *  Processing th
0340: 65 20 65 6d 61 69 6c 20 71 75 65 75 65 0a 2a 2a  e email queue.**
0350: 20 20 20 20 2a 20 20 48 61 6e 64 6c 69 6e 67 20      *  Handling 
0360: 70 6f 73 74 2d 72 65 63 65 69 76 65 20 68 6f 6f  post-receive hoo
0370: 6b 73 0a 2a 2a 20 20 20 20 2a 20 20 41 75 74 6f  ks.**    *  Auto
0380: 6d 61 74 69 63 61 6c 6c 79 20 73 79 6e 63 69 6e  matically syncin
0390: 67 20 74 6f 20 70 65 65 72 20 72 65 70 6f 73 69  g to peer reposi
03a0: 74 6f 72 69 65 73 0a 2a 2a 0a 2a 2a 20 42 61 63  tories.**.** Bac
03b0: 6b 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73 69  koffice processi
03c0: 6e 67 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  ng is automatica
03d0: 6c 6c 79 20 73 74 61 72 74 65 64 20 77 68 65 6e  lly started when
03e0: 65 76 65 72 20 74 68 65 72 65 20 61 72 65 0a 2a  ever there are.*
03f0: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
0400: 20 72 65 70 6f 73 69 74 6f 72 79 2e 20 20 54 68   repository.  Th
0410: 65 20 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f  e backoffice pro
0420: 63 65 73 73 20 64 69 65 73 20 6f 66 66 20 61 66  cess dies off af
0430: 74 65 72 0a 2a 2a 20 61 20 70 65 72 69 6f 64 20  ter.** a period 
0440: 6f 66 20 69 6e 61 63 74 69 76 69 74 79 2e 0a 2a  of inactivity..*
0450: 2a 0a 2a 2a 20 53 74 65 70 73 20 61 72 65 20 74  *.** Steps are t
0460: 61 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 74  aken to ensure t
0470: 68 61 74 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  hat only a singl
0480: 65 20 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f  e backoffice pro
0490: 63 65 73 73 20 69 73 0a 2a 2a 20 72 75 6e 6e 69  cess is.** runni
04a0: 6e 67 20 61 74 20 61 20 74 69 6d 65 2e 20 20 4f  ng at a time.  O
04b0: 74 68 65 72 77 69 73 65 2c 20 74 68 65 72 65 20  therwise, there 
04c0: 63 6f 75 6c 64 20 62 65 20 72 61 63 65 20 63 6f  could be race co
04d0: 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a  nditions that.**
04e0: 20 63 61 75 73 65 20 61 64 76 65 72 73 65 20 65   cause adverse e
04f0: 66 66 65 63 74 73 20 73 75 63 68 20 61 73 20 6d  ffects such as m
0500: 75 6c 74 69 70 6c 65 20 61 6c 65 72 74 73 20 66  ultiple alerts f
0510: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 68 61 6e  or the same chan
0520: 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  ges..**.** At th
0530: 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 77 65 20  e same time, we 
0540: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 61 20 62 61  do not want a ba
0550: 63 6b 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73  ckoffice process
0560: 20 74 6f 20 72 75 6e 20 66 6f 72 65 76 65 72 2e   to run forever.
0570: 0a 2a 2a 20 42 61 63 6b 6f 66 66 69 63 65 20 70  .** Backoffice p
0580: 72 6f 63 65 73 73 65 73 20 73 68 6f 75 6c 64 20  rocesses should 
0590: 64 69 65 20 6f 66 66 20 61 66 74 65 72 20 64 6f  die off after do
05a0: 69 6e 67 20 77 68 61 74 65 76 65 72 20 77 6f 72  ing whatever wor
05b0: 6b 20 74 68 65 79 20 6e 65 65 64 0a 2a 2a 20 74  k they need.** t
05c0: 6f 20 64 6f 2e 20 20 49 6e 20 74 68 69 73 20 77  o do.  In this w
05d0: 61 79 2c 20 77 65 20 61 76 6f 69 64 20 68 61 76  ay, we avoid hav
05e0: 69 6e 67 20 6c 6f 74 73 20 6f 66 20 69 64 6c 65  ing lots of idle
05f0: 20 70 72 6f 63 65 73 73 65 73 20 69 6e 20 74 68   processes in th
0600: 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 61 62  e.** process tab
0610: 6c 65 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 69 6e  le, doing nothin
0620: 67 20 6f 6e 20 72 61 72 65 6c 79 20 61 63 63 65  g on rarely acce
0630: 73 73 65 64 20 72 65 70 6f 73 69 74 6f 72 69 65  ssed repositorie
0640: 73 2c 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  s, and.** if the
0650: 20 46 6f 73 73 69 6c 20 62 69 6e 61 72 79 20 69   Fossil binary i
0660: 73 20 75 70 64 61 74 65 64 20 6f 6e 20 61 20 73  s updated on a s
0670: 79 73 74 65 6d 2c 20 74 68 65 20 62 61 63 6b 6f  ystem, the backo
0680: 66 66 69 63 65 20 70 72 6f 63 65 73 73 65 73 0a  ffice processes.
0690: 2a 2a 20 77 69 6c 6c 20 72 65 73 74 61 72 74 20  ** will restart 
06a0: 75 73 69 6e 67 20 74 68 65 20 6e 65 77 20 62 69  using the new bi
06b0: 6e 61 72 79 20 61 75 74 6f 6d 61 74 69 63 61 6c  nary automatical
06c0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 61 6e 79  ly..**.** At any
06d0: 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 74   point in time t
06e0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
06f0: 74 20 6d 6f 73 74 20 74 77 6f 20 62 61 63 6b 6f  t most two backo
0700: 66 66 69 63 65 20 70 72 6f 63 65 73 73 65 73 2e  ffice processes.
0710: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 6d  .** There is a m
0720: 61 69 6e 20 70 72 6f 63 65 73 73 20 74 68 61 74  ain process that
0730: 20 69 73 20 64 6f 69 6e 67 20 74 68 65 20 61 63   is doing the ac
0740: 74 75 61 6c 6c 79 20 77 6f 72 6b 2c 20 61 6e 64  tually work, and
0750: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 20 73   there is.** a s
0760: 65 63 6f 6e 64 20 73 74 61 6e 64 2d 62 79 20 70  econd stand-by p
0770: 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 77  rocess that is w
0780: 61 69 74 69 6e 67 20 66 6f 72 20 74 68 65 20 6d  aiting for the m
0790: 61 69 6e 20 70 72 6f 63 65 73 73 20 74 6f 20 66  ain process to f
07a0: 69 6e 69 73 68 0a 2a 2a 20 61 6e 64 20 74 68 61  inish.** and tha
07b0: 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
07c0: 65 20 6d 61 69 6e 20 70 72 6f 63 65 73 73 20 61  e main process a
07d0: 66 74 65 72 20 61 20 64 65 6c 61 79 2e 0a 2a 2a  fter a delay..**
07e0: 0a 2a 2a 20 41 66 74 65 72 20 61 6e 79 20 73 75  .** After any su
07f0: 63 63 65 73 73 66 75 6c 20 77 65 62 20 70 61 67  ccessful web pag
0800: 65 20 72 65 70 6c 79 2c 20 74 68 65 20 62 61 63  e reply, the bac
0810: 6b 6f 66 66 69 63 65 5f 63 68 65 63 6b 5f 69 66  koffice_check_if
0820: 5f 6e 65 65 64 65 64 28 29 0a 2a 2a 20 72 6f 75  _needed().** rou
0830: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
0840: 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 63 68   That routine ch
0850: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 62  ecks to see if b
0860: 6f 74 68 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  oth one or both 
0870: 6f 66 0a 2a 2a 20 74 68 65 20 62 61 63 6b 6f 66  of.** the backof
0880: 66 69 63 65 20 70 72 6f 63 65 73 73 65 73 20 61  fice processes a
0890: 72 65 20 61 6c 72 65 61 64 79 20 72 75 6e 6e 69  re already runni
08a0: 6e 67 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ng.  That routin
08b0: 65 20 72 65 6d 65 6d 62 65 72 73 20 74 68 65 0a  e remembers the.
08c0: 2a 2a 20 73 74 61 74 75 73 20 69 6e 20 61 20 67  ** status in a g
08d0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 2e 0a  lobal variable..
08e0: 2a 2a 0a 2a 2a 20 4c 61 74 65 72 2c 20 61 66 74  **.** Later, aft
08f0: 65 72 20 74 68 65 20 72 65 70 6f 73 69 74 6f 72  er the repositor
0900: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c  y database is cl
0910: 6f 73 65 64 2c 20 74 68 65 0a 2a 2a 20 62 61 63  osed, the.** bac
0920: 6b 6f 66 66 69 63 65 5f 72 75 6e 5f 69 66 5f 6e  koffice_run_if_n
0930: 65 65 64 65 64 28 29 20 72 6f 75 74 69 6e 65 20  eeded() routine 
0940: 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 74  is called.  If t
0950: 68 65 20 70 72 69 6f 72 20 63 61 6c 6c 0a 2a 2a  he prior call.**
0960: 20 74 6f 20 62 61 63 6b 6f 66 66 69 63 65 5f 63   to backoffice_c
0970: 68 65 63 6b 5f 69 66 5f 6e 65 65 64 65 64 28 29  heck_if_needed()
0980: 20 69 6e 64 69 63 61 74 65 64 20 74 68 61 74 20   indicated that 
0990: 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f 63 65  backoffice proce
09a0: 73 73 69 6e 67 0a 2a 2a 20 6d 69 67 68 74 20 62  ssing.** might b
09b0: 65 20 72 65 71 75 69 72 65 64 2c 20 74 68 65 20  e required, the 
09c0: 72 75 6e 5f 69 66 5f 6e 65 65 64 65 64 28 29 20  run_if_needed() 
09d0: 61 74 74 65 6d 70 74 73 20 74 6f 20 6b 69 63 6b  attempts to kick
09e0: 20 6f 66 66 20 61 20 62 61 63 6b 6f 66 66 69 63   off a backoffic
09f0: 65 0a 2a 2a 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  e.** process..**
0a00: 0a 2a 2a 20 41 6c 6c 20 77 6f 72 6b 20 70 65 72  .** All work per
0a10: 66 6f 72 6d 61 6e 63 65 20 62 79 20 74 68 65 20  formance by the 
0a20: 62 61 63 6b 6f 66 66 69 63 65 20 69 73 20 69 6e  backoffice is in
0a30: 20 74 68 65 20 62 61 63 6b 6f 66 66 69 63 65 5f   the backoffice_
0a40: 77 6f 72 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  work().** routin
0a50: 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
0a60: 64 28 5f 57 49 4e 33 32 29 0a 23 20 69 66 20 64  d(_WIN32).# if d
0a70: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 49  efined(_WIN32_WI
0a80: 4e 4e 54 29 0a 23 20 20 75 6e 64 65 66 20 5f 57  NNT).#  undef _W
0a90: 49 4e 33 32 5f 57 49 4e 4e 54 0a 23 20 65 6e 64  IN32_WINNT.# end
0aa0: 69 66 0a 23 20 64 65 66 69 6e 65 20 5f 57 49 4e  if.# define _WIN
0ab0: 33 32 5f 57 49 4e 4e 54 20 30 78 35 30 31 0a 23  32_WINNT 0x501.#
0ac0: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 22  endif.#include "
0ad0: 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75  config.h".#inclu
0ae0: 64 65 20 22 62 61 63 6b 6f 66 66 69 63 65 2e 68  de "backoffice.h
0af0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  ".#include <time
0b00: 2e 68 3e 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .h>.#if defined(
0b10: 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64  _WIN32).# includ
0b20: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 20  e <windows.h>.# 
0b30: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
0b40: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 70 72 6f  >.# include <pro
0b50: 63 65 73 73 2e 68 3e 0a 23 20 69 66 20 64 65 66  cess.h>.# if def
0b60: 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f  ined(__MINGW32__
0b70: 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 77 63  ).#  include <wc
0b80: 68 61 72 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23  har.h>.# endif.#
0b90: 20 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 28   define GETPID (
0ba0: 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
0bb0: 6f 63 65 73 73 49 64 0a 23 65 6c 73 65 0a 23 20  ocessId.#else.# 
0bc0: 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e  include <unistd.
0bd0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  h>.# include <sy
0be0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 20 69 6e 63  s/types.h>.# inc
0bf0: 6c 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a  lude <signal.h>.
0c00: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0c10: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0c20: 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 20 69 6e 63  ys/time.h>.# inc
0c30: 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72  lude <sys/resour
0c40: 63 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  ce.h>.# include 
0c50: 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65 66 69  <fcntl.h>.# defi
0c60: 6e 65 20 47 45 54 50 49 44 20 67 65 74 70 69 64  ne GETPID getpid
0c70: 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65  .#endif.#include
0c80: 20 3c 74 69 6d 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a   <time.h>../*.**
0c90: 20 54 68 65 20 42 4b 4f 46 43 45 5f 4c 45 41 53   The BKOFCE_LEAS
0ca0: 45 5f 54 49 4d 45 20 69 73 20 74 68 65 20 61 6d  E_TIME is the am
0cb0: 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 66 6f 72  ount of time for
0cc0: 20 77 68 69 63 68 20 61 20 73 69 6e 67 6c 65 20   which a single 
0cd0: 62 61 63 6b 6f 66 66 69 63 65 0a 2a 2a 20 70 72  backoffice.** pr
0ce0: 6f 63 65 73 73 69 6e 67 20 72 75 6e 20 69 73 20  ocessing run is 
0cf0: 76 61 6c 69 64 2e 20 20 45 61 63 68 20 62 61 63  valid.  Each bac
0d00: 6b 6f 66 66 69 63 65 20 72 75 6e 20 6d 6f 6e 6f  koffice run mono
0d10: 70 6f 6c 69 7a 65 73 20 74 68 65 20 6c 65 61 73  polizes the leas
0d20: 65 20 66 6f 72 0a 2a 2a 20 61 74 20 6c 65 61 73  e for.** at leas
0d30: 74 20 74 68 69 73 20 61 6d 6f 75 6e 74 20 6f 66  t this amount of
0d40: 20 74 69 6d 65 2e 20 20 48 6f 70 65 66 75 6c 6c   time.  Hopefull
0d50: 79 20 61 6c 6c 20 62 61 63 6b 6f 66 66 69 63 65  y all backoffice
0d60: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 0a 2a   processing is.*
0d70: 2a 20 66 69 6e 69 73 68 65 64 20 6d 75 63 68 20  * finished much 
0d80: 66 61 73 74 65 72 20 74 68 61 6e 20 74 68 69 73  faster than this
0d90: 20 2d 20 75 73 75 61 6c 6c 79 20 69 6e 20 6c 65   - usually in le
0da0: 73 73 20 74 68 61 6e 20 61 20 73 65 63 6f 6e 64  ss than a second
0db0: 2e 20 20 42 75 74 0a 2a 2a 20 72 65 67 61 72 64  .  But.** regard
0dc0: 6c 65 73 73 20 6f 66 20 68 6f 77 20 6c 6f 6e 67  less of how long
0dd0: 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e   each invocation
0de0: 20 6c 61 73 74 73 2c 20 73 75 63 63 65 73 73 69   lasts, successi
0df0: 76 65 20 62 61 63 6b 6f 66 66 69 63 65 20 72 75  ve backoffice ru
0e00: 6e 73 0a 2a 2a 20 6d 75 73 74 20 62 65 20 73 70  ns.** must be sp
0e10: 61 63 65 64 20 6f 75 74 20 62 79 20 61 74 20 6c  aced out by at l
0e20: 65 61 73 74 20 74 68 69 73 20 6d 75 63 68 20 74  east this much t
0e30: 69 6d 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ime..*/.#define 
0e40: 42 4b 4f 46 43 45 5f 4c 45 41 53 45 5f 54 49 4d  BKOFCE_LEASE_TIM
0e50: 45 20 20 20 36 30 20 20 20 20 2f 2a 20 4c 65 6e  E   60    /* Len
0e60: 67 74 68 20 6f 66 20 6c 65 61 73 65 20 76 61 6c  gth of lease val
0e70: 69 64 69 74 79 20 69 6e 20 73 65 63 6f 6e 64 73  idity in seconds
0e80: 20 2a 2f 0a 0a 23 69 66 20 4c 4f 43 41 4c 5f 49   */..#if LOCAL_I
0e90: 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20 41  NTERFACE./*.** A
0ea0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0eb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0ec0: 63 74 20 64 65 73 63 72 69 62 65 73 20 61 20 6c  ct describes a l
0ed0: 65 61 73 65 20 6f 6e 20 74 68 65 20 62 61 63 6b  ease on the back
0ee0: 6f 66 66 69 63 65 0a 2a 2a 20 70 72 6f 63 65 73  office.** proces
0ef0: 73 69 6e 67 20 74 69 6d 65 73 6c 6f 74 2e 20 20  sing timeslot.  
0f00: 54 68 69 73 20 6c 65 61 73 65 20 69 73 20 75 73  This lease is us
0f10: 65 64 20 74 6f 20 68 65 6c 70 20 65 6e 73 75 72  ed to help ensur
0f20: 65 20 74 68 61 74 20 6e 6f 20 6d 6f 72 65 20 74  e that no more t
0f30: 68 61 6e 0a 2a 2a 20 6f 6e 65 20 70 72 6f 63 65  han.** one proce
0f40: 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 62 61  ss is running ba
0f50: 63 6b 6f 66 66 69 63 65 20 61 74 20 61 20 74 69  ckoffice at a ti
0f60: 6d 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 65  me..*/.struct Le
0f70: 61 73 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ase {.  sqlite3_
0f80: 75 69 6e 74 36 34 20 69 64 43 75 72 72 65 6e 74  uint64 idCurrent
0f90: 3b 20 2f 2a 20 70 72 6f 63 65 73 73 20 49 44 20  ; /* process ID 
0fa0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
0fb0: 6c 65 61 73 65 20 68 6f 6c 64 65 72 20 2a 2f 0a  lease holder */.
0fc0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
0fd0: 20 74 6d 43 75 72 72 65 6e 74 3b 20 2f 2a 20 45   tmCurrent; /* E
0fe0: 78 70 69 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  xpiration of the
0ff0: 20 63 75 72 72 65 6e 74 20 6c 65 61 73 65 20 2a   current lease *
1000: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  /.  sqlite3_uint
1010: 36 34 20 69 64 4e 65 78 74 3b 20 20 20 20 2f 2a  64 idNext;    /*
1020: 20 70 72 6f 63 65 73 73 20 49 44 20 66 6f 72 20   process ID for 
1030: 74 68 65 20 6e 65 78 74 20 6c 65 61 73 65 20 68  the next lease h
1040: 6f 6c 64 65 72 20 6f 6e 20 71 75 65 75 65 20 2a  older on queue *
1050: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74  /.  sqlite3_uint
1060: 36 34 20 74 6d 4e 65 78 74 3b 20 20 20 20 2f 2a  64 tmNext;    /*
1070: 20 45 78 70 69 72 61 74 69 6f 6e 20 6f 66 20 74   Expiration of t
1080: 68 65 20 6e 65 78 74 20 6c 65 61 73 65 20 2a 2f  he next lease */
1090: 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a  .};.#endif../***
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4c 6f 63 61  ********.** Loca
10f0: 6c 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  l state variable
1100: 73 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 6f 20 70  s.**.** Set to p
1110: 72 65 76 65 6e 74 20 62 61 63 6b 6f 66 66 69 63  revent backoffic
1120: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 72 6f  e processing fro
1130: 6d 20 65 76 65 72 20 65 6e 74 65 72 69 6e 67 20  m ever entering 
1140: 73 6c 65 65 70 20 6f 72 0a 2a 2a 20 6f 74 68 65  sleep or.** othe
1150: 72 77 69 73 65 20 74 61 6b 69 6e 67 20 61 20 6c  rwise taking a l
1160: 6f 6e 67 20 74 69 6d 65 20 74 6f 20 63 6f 6d 70  ong time to comp
1170: 6c 65 74 65 2e 20 20 53 65 74 20 74 68 69 73 20  lete.  Set this 
1180: 77 68 65 6e 20 61 20 75 73 65 72 2d 76 69 73 69  when a user-visi
1190: 62 6c 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 6d  ble.** process m
11a0: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 77 61 69  ight need to wai
11b0: 74 20 66 6f 72 20 62 61 63 6b 6f 66 66 69 63 65  t for backoffice
11c0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f   to complete..*/
11d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b  .static int back
11e0: 6f 66 66 69 63 65 4e 6f 44 65 6c 61 79 20 3d 20  officeNoDelay = 
11f0: 30 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  0;../* This vari
1200: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
1210: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
1220: 61 62 61 73 65 20 6f 6e 20 77 68 69 63 68 20 62  abase on which b
1230: 61 63 6b 6f 66 66 69 63 65 0a 2a 2a 20 73 68 6f  ackoffice.** sho
1240: 75 6c 64 20 72 75 6e 20 69 66 20 62 61 63 6b 6f  uld run if backo
1250: 66 66 69 63 65 20 70 72 6f 63 65 73 73 20 69 73  ffice process is
1260: 20 6e 65 65 64 65 64 2e 20 20 49 74 20 69 73 20   needed.  It is 
1270: 73 65 74 20 62 79 20 74 68 65 0a 2a 2a 20 62 61  set by the.** ba
1280: 63 6b 6f 66 66 69 63 65 5f 63 68 65 63 6b 5f 69  ckoffice_check_i
1290: 66 5f 6e 65 65 64 65 64 28 29 20 72 6f 75 74 69  f_needed() routi
12a0: 6e 65 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  ne which must be
12b0: 20 72 75 6e 20 77 68 69 6c 65 20 74 68 65 20 64   run while the d
12c0: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
12d0: 69 73 20 6f 70 65 6e 2e 20 20 4c 61 74 65 72 2c  is open.  Later,
12e0: 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
12f0: 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ase is closed, t
1300: 68 65 0a 2a 2a 20 62 61 63 6b 6f 66 66 69 63 65  he.** backoffice
1310: 5f 72 75 6e 5f 69 66 5f 6e 65 65 64 65 64 28 29  _run_if_needed()
1320: 20 77 69 6c 6c 20 63 6f 6e 73 75 6c 74 20 74 68   will consult th
1330: 69 73 20 76 61 72 69 61 62 6c 65 20 74 6f 20 73  is variable to s
1340: 65 65 20 69 66 20 69 74 0a 2a 2a 20 73 68 6f 75  ee if it.** shou
1350: 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ld be a no-op..*
1360: 2a 0a 2a 2a 20 54 68 65 20 6d 61 67 69 63 20 73  *.** The magic s
1370: 74 72 69 6e 67 20 22 78 22 20 69 6e 20 74 68 69  tring "x" in thi
1380: 73 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73  s variable means
1390: 20 22 64 6f 20 6e 6f 74 20 72 75 6e 20 74 68 65   "do not run the
13a0: 20 62 61 63 6b 6f 66 66 69 63 65 22 2e 0a 2a 2f   backoffice"..*/
13b0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 62 61  .static char *ba
13c0: 63 6b 6f 66 66 69 63 65 44 62 20 3d 20 30 3b 0a  ckofficeDb = 0;.
13d0: 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 62 61 63 6b 6f  ./*.** Log backo
13e0: 66 66 69 63 65 20 61 63 74 69 76 69 74 79 20 74  ffice activity t
13f0: 6f 20 61 20 66 69 6c 65 20 6e 61 6d 65 64 20 68  o a file named h
1400: 65 72 65 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ere.  If not NUL
1410: 4c 2c 20 74 68 69 73 0a 2a 2a 20 6f 76 65 72 72  L, this.** overr
1420: 69 64 65 73 20 74 68 65 20 22 62 61 63 6b 6f 66  ides the "backof
1430: 66 69 63 65 2d 6c 6f 67 66 69 6c 65 22 20 73 65  fice-logfile" se
1440: 74 74 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  tting of the dat
1450: 61 62 61 73 65 2e 20 20 49 66 20 4e 55 4c 4c 2c  abase.  If NULL,
1460: 0a 2a 2a 20 74 68 65 20 22 62 61 63 6b 6f 66 66  .** the "backoff
1470: 69 63 65 2d 6c 6f 67 66 69 6c 65 22 20 73 65 74  ice-logfile" set
1480: 74 69 6e 67 20 69 73 20 75 73 65 64 20 69 6e 73  ting is used ins
1490: 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tead..*/.static 
14a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 61 63 6b  const char *back
14b0: 6f 66 66 69 63 65 4c 6f 67 66 69 6c 65 20 3d 20  officeLogfile = 
14c0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  0;../*.** Write 
14d0: 74 68 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 20  the log message 
14e0: 69 6e 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 66  into this open f
14f0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  ile..*/.static F
1500: 49 4c 45 20 2a 62 61 63 6b 6f 66 66 69 63 65 46  ILE *backofficeF
1510: 49 4c 45 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ILE = 0;../*.** 
1520: 57 72 69 74 65 20 62 61 63 6b 6f 66 66 69 63 65  Write backoffice
1530: 20 6c 6f 67 20 6d 65 73 73 61 67 65 73 20 6f 6e   log messages on
1540: 20 74 68 69 73 20 42 4c 4f 42 2e 20 74 6f 20 74   this BLOB. to t
1550: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 3a 0a  his connection:.
1560: 2a 2f 0a 73 74 61 74 69 63 20 42 6c 6f 62 20 2a  */.static Blob *
1570: 62 61 63 6b 6f 66 66 69 63 65 42 6c 6f 62 20 3d  backofficeBlob =
1580: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 6e 2d 7a   0;../*.** Non-z
1590: 65 72 6f 20 66 6f 72 20 65 78 74 72 61 20 6c 6f  ero for extra lo
15a0: 67 67 69 6e 67 20 64 65 74 61 69 6c 2e 0a 2a 2f  gging detail..*/
15b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b  .static int back
15c0: 6f 66 66 69 63 65 4c 6f 67 44 65 74 61 69 6c 20  officeLogDetail 
15d0: 3d 20 30 3b 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20  = 0;../* End of 
15e0: 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 73 0a  state variables.
15f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
1640: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1650: 6f 6e 20 65 6d 69 74 73 20 61 20 64 69 61 67 6e  on emits a diagn
1660: 6f 73 74 69 63 20 6d 65 73 73 61 67 65 20 72 65  ostic message re
1670: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 70 72 6f  lated to the pro
1680: 63 65 73 73 69 6e 67 20 69 6e 0a 2a 2a 20 74 68  cessing in.** th
1690: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 23 69  is module..*/.#i
16a0: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
16b0: 29 0a 23 20 64 65 66 69 6e 65 20 42 4b 4f 46 43  ).# define BKOFC
16c0: 45 5f 41 4c 57 41 59 53 5f 54 52 41 43 45 20 20  E_ALWAYS_TRACE  
16d0: 20 28 31 29 0a 65 78 74 65 72 6e 20 76 6f 69 64   (1).extern void
16e0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
16f0: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
1700: 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 23   char *, int);.#
1710: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 42 4b  else.# define BK
1720: 4f 46 43 45 5f 41 4c 57 41 59 53 5f 54 52 41 43  OFCE_ALWAYS_TRAC
1730: 45 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 73  E   (0).#endif.s
1740: 74 61 74 69 63 20 76 6f 69 64 20 62 61 63 6b 6f  tatic void backo
1750: 66 66 69 63 65 54 72 61 63 65 28 63 6f 6e 73 74  fficeTrace(const
1760: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1770: 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  ...){.  char *zM
1780: 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 42 4b  sg = 0;.  if( BK
1790: 4f 46 43 45 5f 41 4c 57 41 59 53 5f 54 52 41 43  OFCE_ALWAYS_TRAC
17a0: 45 20 7c 7c 20 67 2e 66 41 6e 79 54 72 61 63 65  E || g.fAnyTrace
17b0: 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
17c0: 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  ap;.    va_start
17d0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
17e0: 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
17f0: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
1800: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
1810: 65 6e 64 28 61 70 29 3b 0a 23 69 66 20 64 65 66  end(ap);.#if def
1820: 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20  ined(_WIN32).   
1830: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
1840: 72 69 74 65 5f 64 65 62 75 67 28 7a 4d 73 67 2c  rite_debug(zMsg,
1850: 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d   -1);.#endif.  }
1860: 0a 20 20 69 66 28 20 67 2e 66 41 6e 79 54 72 61  .  if( g.fAnyTra
1870: 63 65 20 29 20 66 70 72 69 6e 74 66 28 73 74 64  ce ) fprintf(std
1880: 65 72 72 2c 20 22 25 73 22 2c 20 7a 4d 73 67 29  err, "%s", zMsg)
1890: 3b 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 20 73  ;.  if( zMsg ) s
18a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67  qlite3_free(zMsg
18b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e  );.}../*.** Do n
18c0: 6f 74 20 61 6c 6c 6f 77 20 62 61 63 6b 6f 66 66  ot allow backoff
18d0: 69 63 65 20 70 72 6f 63 65 73 73 65 73 20 74 6f  ice processes to
18e0: 20 73 6c 65 65 70 20 77 61 69 74 69 6e 67 20 6f   sleep waiting o
18f0: 6e 20 61 20 74 69 6d 65 73 6c 6f 74 2e 0a 2a 2a  n a timeslot..**
1900: 20 54 68 65 79 20 6d 75 73 74 20 65 69 74 68 65   They must eithe
1910: 72 20 64 6f 20 74 68 65 69 72 20 77 6f 72 6b 20  r do their work 
1920: 69 6d 6d 65 64 69 61 74 65 6c 79 20 6f 72 20 65  immediately or e
1930: 78 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20  xit..**.** In a 
1940: 70 65 72 66 65 63 74 20 77 6f 72 6c 64 2c 20 74  perfect world, t
1950: 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 77 6f  his interface wo
1960: 75 6c 64 20 6e 6f 74 20 65 78 69 73 74 2c 20 61  uld not exist, a
1970: 73 20 74 68 65 72 65 20 77 6f 75 6c 64 0a 2a 2a  s there would.**
1980: 20 6e 65 76 65 72 20 62 65 20 61 20 70 72 6f 62   never be a prob
1990: 6c 65 6d 20 77 69 74 68 20 77 61 69 74 69 6e 67  lem with waiting
19a0: 20 62 61 63 6b 6f 66 66 69 63 65 20 74 68 72 65   backoffice thre
19b0: 61 64 73 2e 20 20 42 75 74 20 69 6e 20 73 6f 6d  ads.  But in som
19c0: 65 20 63 61 73 65 73 0a 2a 2a 20 61 20 62 61 63  e cases.** a bac
19d0: 6b 6f 66 66 69 63 65 20 77 69 6c 6c 20 64 65 6c  koffice will del
19e0: 61 79 20 61 20 55 49 20 74 68 72 65 61 64 2c 20  ay a UI thread, 
19f0: 73 6f 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  so we don't want
1a00: 20 74 68 65 6d 20 74 6f 20 72 75 6e 20 66 6f 72   them to run for
1a10: 0a 2a 2a 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  .** longer than 
1a20: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  needed..*/.void 
1a30: 62 61 63 6b 6f 66 66 69 63 65 5f 6e 6f 5f 64 65  backoffice_no_de
1a40: 6c 61 79 28 76 6f 69 64 29 7b 0a 20 20 62 61 63  lay(void){.  bac
1a50: 6b 6f 66 66 69 63 65 4e 6f 44 65 6c 61 79 20 3d  kofficeNoDelay =
1a60: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65   1;.}../*.** Sle
1a70: 65 70 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  eps for the spec
1a80: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
1a90: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2d 4f 52  milliseconds -OR
1aa0: 2d 20 75 6e 74 69 6c 20 69 6e 74 65 72 72 75 70  - until interrup
1ab0: 74 65 64 0a 2a 2a 20 62 79 20 61 6e 6f 74 68 65  ted.** by anothe
1ac0: 72 20 74 68 72 65 61 64 20 28 69 66 20 73 75 70  r thread (if sup
1ad0: 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 75 6e  ported by the un
1ae0: 64 65 72 6c 79 69 6e 67 20 70 6c 61 74 66 6f 72  derlying platfor
1af0: 6d 29 2e 20 20 4e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  m).  Non-zero.**
1b00: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
1b10: 64 20 69 66 20 74 68 65 20 73 6c 65 65 70 20 77  d if the sleep w
1b20: 61 73 20 69 6e 74 65 72 72 75 70 74 65 64 2e 0a  as interrupted..
1b30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
1b40: 63 6b 6f 66 66 69 63 65 53 6c 65 65 70 28 69 6e  ckofficeSleep(in
1b50: 74 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  t milliseconds){
1b60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1b70: 4e 33 32 29 0a 20 20 61 73 73 65 72 74 28 20 6d  N32).  assert( m
1b80: 69 6c 6c 69 73 65 63 6f 6e 64 73 3e 3d 30 20 29  illiseconds>=0 )
1b90: 3b 0a 20 20 69 66 28 20 53 6c 65 65 70 45 78 28  ;.  if( SleepEx(
1ba0: 28 44 57 4f 52 44 29 6d 69 6c 6c 69 73 65 63 6f  (DWORD)milliseco
1bb0: 6e 64 73 2c 20 54 52 55 45 29 3d 3d 57 41 49 54  nds, TRUE)==WAIT
1bc0: 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29  _IO_COMPLETION )
1bd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1be0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69    }.#else.  sqli
1bf0: 74 65 33 5f 73 6c 65 65 70 28 6d 69 6c 6c 69 73  te3_sleep(millis
1c00: 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a  econds);.#endif.
1c10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1c20: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 75 6e 73  *.** Parse a uns
1c30: 69 67 6e 65 64 20 36 34 2d 62 69 74 20 69 6e 74  igned 64-bit int
1c40: 65 67 65 72 20 66 72 6f 6d 20 61 20 73 74 72 69  eger from a stri
1c50: 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  ng.  Return a po
1c60: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
1c70: 63 68 61 72 61 63 74 65 72 20 6f 66 20 7a 5b 5d  character of z[]
1c80: 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 66 74   that occurs aft
1c90: 65 72 20 74 68 65 20 69 6e 74 65 67 65 72 2e 0a  er the integer..
1ca0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1cb0: 63 68 61 72 20 2a 62 61 63 6b 6f 66 66 69 63 65  char *backoffice
1cc0: 50 61 72 73 65 49 6e 74 28 63 6f 6e 73 74 20 63  ParseInt(const c
1cd0: 68 61 72 20 2a 7a 2c 20 73 71 6c 69 74 65 33 5f  har *z, sqlite3_
1ce0: 75 69 6e 74 36 34 20 2a 70 56 61 6c 29 7b 0a 20  uint64 *pVal){. 
1cf0: 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66   *pVal = 0;.  if
1d00: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
1d10: 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 6f 73 73  0;.  while( foss
1d20: 69 6c 5f 69 73 73 70 61 63 65 28 7a 5b 30 5d 29  il_isspace(z[0])
1d30: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 77 68 69   ){ z++; }.  whi
1d40: 6c 65 28 20 66 6f 73 73 69 6c 5f 69 73 64 69 67  le( fossil_isdig
1d50: 69 74 28 7a 5b 30 5d 29 20 29 7b 0a 20 20 20 20  it(z[0]) ){.    
1d60: 2a 70 56 61 6c 20 3d 20 28 2a 70 56 61 6c 29 2a  *pVal = (*pVal)*
1d70: 31 30 20 2b 20 7a 5b 30 5d 20 2d 20 27 30 27 3b  10 + z[0] - '0';
1d80: 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    z++;.  }.  
1d90: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  return z;.}../*.
1da0: 2a 2a 20 52 65 61 64 20 74 68 65 20 22 62 61 63  ** Read the "bac
1db0: 6b 6f 66 66 69 63 65 22 20 70 72 6f 70 65 72 74  koffice" propert
1dc0: 79 20 61 6e 64 20 70 61 72 73 65 20 69 74 20 69  y and parse it i
1dd0: 6e 74 6f 20 61 20 4c 65 61 73 65 20 6f 62 6a 65  nto a Lease obje
1de0: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  ct..**.** The ba
1df0: 63 6b 6f 66 66 69 63 65 20 70 72 6f 70 65 72 74  ckoffice propert
1e00: 79 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 73 74  y should consist
1e10: 20 6f 66 20 66 6f 75 72 20 69 6e 74 65 67 65 72   of four integer
1e20: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
1e30: 20 50 72 6f 63 65 73 73 20 49 44 20 66 6f 72 20   Process ID for 
1e40: 74 68 65 20 61 63 74 69 76 65 20 62 61 63 6b 6f  the active backo
1e50: 66 66 69 63 65 20 70 72 6f 63 65 73 73 2e 0a 2a  ffice process..*
1e60: 2a 20 20 20 20 28 32 29 20 20 54 69 6d 65 20 28  *    (2)  Time (
1e70: 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
1e80: 37 30 29 20 66 6f 72 20 77 68 65 6e 20 74 68 65  70) for when the
1e90: 20 61 63 74 69 76 65 20 62 61 63 6b 6f 66 66 69   active backoffi
1ea0: 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6c 65  ce.**         le
1eb0: 61 73 65 20 65 78 70 69 72 65 73 2e 0a 2a 2a 20  ase expires..** 
1ec0: 20 20 20 28 33 29 20 20 50 72 6f 63 65 73 73 20     (3)  Process 
1ed0: 49 44 20 66 6f 72 20 74 68 65 20 6f 6e 2d 64 65  ID for the on-de
1ee0: 63 6b 20 62 61 63 6b 6f 66 66 69 63 65 20 70 72  ck backoffice pr
1ef0: 6f 63 65 73 73 2e 0a 2a 2a 20 20 20 20 28 34 29  ocess..**    (4)
1f00: 20 20 54 69 6d 65 20 77 68 65 6e 20 74 68 65 20    Time when the 
1f10: 6f 6e 2d 64 65 63 6b 20 70 72 6f 63 65 73 73 20  on-deck process 
1f20: 73 68 6f 75 6c 64 20 65 78 70 69 72 65 2e 0a 2a  should expire..*
1f30: 2a 0a 2a 2a 20 4e 6f 20 6f 74 68 65 72 20 70 72  *.** No other pr
1f40: 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 73 74 61  ocess should sta
1f50: 72 74 20 61 63 74 69 76 65 20 62 61 63 6b 6f 66  rt active backof
1f60: 66 69 63 65 20 70 72 6f 63 65 73 73 69 6e 67 20  fice processing 
1f70: 75 6e 74 69 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  until.** process
1f80: 20 28 31 29 20 6e 6f 20 6c 6f 6e 67 65 72 20 65   (1) no longer e
1f90: 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 63 75  xists and the cu
1fa0: 72 72 65 6e 74 20 74 69 6d 65 20 65 78 63 65 65  rrent time excee
1fb0: 64 73 20 28 32 29 2e 0a 2a 2f 0a 73 74 61 74 69  ds (2)..*/.stati
1fc0: 63 20 76 6f 69 64 20 62 61 63 6b 6f 66 66 69 63  c void backoffic
1fd0: 65 52 65 61 64 4c 65 61 73 65 28 4c 65 61 73 65  eReadLease(Lease
1fe0: 20 2a 70 4c 65 61 73 65 29 7b 0a 20 20 53 74 6d   *pLease){.  Stm
1ff0: 74 20 71 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4c  t q;.  memset(pL
2000: 65 61 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ease, 0, sizeof(
2010: 2a 70 4c 65 61 73 65 29 29 3b 0a 20 20 64 62 5f  *pLease));.  db_
2020: 75 6e 70 72 6f 74 65 63 74 28 50 52 4f 54 45 43  unprotect(PROTEC
2030: 54 5f 43 4f 4e 46 49 47 29 3b 0a 20 20 64 62 5f  T_CONFIG);.  db_
2040: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
2050: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 72  ECT value FROM r
2060: 65 70 6f 73 69 74 6f 72 79 2e 63 6f 6e 66 69 67  epository.config
2070: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2080: 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
2090: 27 62 61 63 6b 6f 66 66 69 63 65 27 22 29 3b 0a  'backoffice'");.
20a0: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
20b0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
20c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
20d0: 2a 7a 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  *z = db_column_t
20e0: 65 78 74 28 26 71 2c 30 29 3b 0a 20 20 20 20 7a  ext(&q,0);.    z
20f0: 20 3d 20 62 61 63 6b 6f 66 66 69 63 65 50 61 72   = backofficePar
2100: 73 65 49 6e 74 28 7a 2c 20 26 70 4c 65 61 73 65  seInt(z, &pLease
2110: 2d 3e 69 64 43 75 72 72 65 6e 74 29 3b 0a 20 20  ->idCurrent);.  
2120: 20 20 7a 20 3d 20 62 61 63 6b 6f 66 66 69 63 65    z = backoffice
2130: 50 61 72 73 65 49 6e 74 28 7a 2c 20 26 70 4c 65  ParseInt(z, &pLe
2140: 61 73 65 2d 3e 74 6d 43 75 72 72 65 6e 74 29 3b  ase->tmCurrent);
2150: 0a 20 20 20 20 7a 20 3d 20 62 61 63 6b 6f 66 66  .    z = backoff
2160: 69 63 65 50 61 72 73 65 49 6e 74 28 7a 2c 20 26  iceParseInt(z, &
2170: 70 4c 65 61 73 65 2d 3e 69 64 4e 65 78 74 29 3b  pLease->idNext);
2180: 0a 20 20 20 20 62 61 63 6b 6f 66 66 69 63 65 50  .    backofficeP
2190: 61 72 73 65 49 6e 74 28 7a 2c 20 26 70 4c 65 61  arseInt(z, &pLea
21a0: 73 65 2d 3e 74 6d 4e 65 78 74 29 3b 0a 20 20 7d  se->tmNext);.  }
21b0: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
21c0: 71 29 3b 0a 20 20 64 62 5f 70 72 6f 74 65 63 74  q);.  db_protect
21d0: 5f 70 6f 70 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _pop();.}../*.**
21e0: 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
21f0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2200: 68 6f 77 20 6c 6f 6e 67 20 69 74 20 68 61 73 20  how long it has 
2210: 62 65 65 6e 20 73 69 6e 63 65 20 74 68 65 0a 2a  been since the.*
2220: 2a 20 6c 61 73 74 20 62 61 63 6b 6f 66 66 69 63  * last backoffic
2230: 65 20 72 75 6e 2e 20 20 54 68 65 20 73 74 72 69  e run.  The stri
2240: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
2250: 72 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f  rom fossil_mallo
2260: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 62 61  c()..*/.char *ba
2270: 63 6b 6f 66 66 69 63 65 5f 6c 61 73 74 5f 72 75  ckoffice_last_ru
2280: 6e 28 76 6f 69 64 29 7b 0a 20 20 4c 65 61 73 65  n(void){.  Lease
2290: 20 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69   x;.  sqlite3_ui
22a0: 6e 74 36 34 20 74 6d 4e 6f 77 3b 0a 20 20 64 6f  nt64 tmNow;.  do
22b0: 75 62 6c 65 20 72 41 67 65 3b 0a 20 20 62 61 63  uble rAge;.  bac
22c0: 6b 6f 66 66 69 63 65 52 65 61 64 4c 65 61 73 65  kofficeReadLease
22d0: 28 26 78 29 3b 0a 20 20 74 6d 4e 6f 77 20 3d 20  (&x);.  tmNow = 
22e0: 74 69 6d 65 28 30 29 3b 0a 20 20 69 66 28 20 78  time(0);.  if( x
22f0: 2e 74 6d 43 75 72 72 65 6e 74 3d 3d 30 20 29 7b  .tmCurrent==0 ){
2300: 0a 20 20 20 20 72 65 74 75 72 6e 20 66 6f 73 73  .    return foss
2310: 69 6c 5f 73 74 72 64 75 70 28 22 6e 65 76 65 72  il_strdup("never
2320: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 6d  ");.  }.  if( tm
2330: 4e 6f 77 3c 3d 28 78 2e 74 6d 43 75 72 72 65 6e  Now<=(x.tmCurren
2340: 74 2d 42 4b 4f 46 43 45 5f 4c 45 41 53 45 5f 54  t-BKOFCE_LEASE_T
2350: 49 4d 45 29 20 29 7b 0a 20 20 20 20 72 65 74 75  IME) ){.    retu
2360: 72 6e 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70  rn fossil_strdup
2370: 28 22 6d 6f 6d 65 6e 74 73 20 61 67 6f 22 29 3b  ("moments ago");
2380: 0a 20 20 7d 0a 20 20 72 41 67 65 20 3d 20 28 74  .  }.  rAge = (t
2390: 6d 4e 6f 77 20 2d 20 28 78 2e 74 6d 43 75 72 72  mNow - (x.tmCurr
23a0: 65 6e 74 2d 42 4b 4f 46 43 45 5f 4c 45 41 53 45  ent-BKOFCE_LEASE
23b0: 5f 54 49 4d 45 29 29 2f 38 36 34 30 30 2e 30 3b  _TIME))/86400.0;
23c0: 0a 20 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74  .  return mprint
23d0: 66 28 22 25 7a 20 61 67 6f 22 2c 20 68 75 6d 61  f("%z ago", huma
23e0: 6e 5f 72 65 61 64 61 62 6c 65 5f 61 67 65 28 72  n_readable_age(r
23f0: 41 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Age));.}../*.** 
2400: 57 72 69 74 65 20 61 20 6c 65 61 73 65 20 74 6f  Write a lease to
2410: 20 74 68 65 20 62 61 63 6b 6f 66 66 69 63 65 20   the backoffice 
2420: 70 72 6f 70 65 72 74 79 0a 2a 2f 0a 73 74 61 74  property.*/.stat
2430: 69 63 20 76 6f 69 64 20 62 61 63 6b 6f 66 66 69  ic void backoffi
2440: 63 65 57 72 69 74 65 4c 65 61 73 65 28 4c 65 61  ceWriteLease(Lea
2450: 73 65 20 2a 70 4c 65 61 73 65 29 7b 0a 20 20 64  se *pLease){.  d
2460: 62 5f 75 6e 70 72 6f 74 65 63 74 28 50 52 4f 54  b_unprotect(PROT
2470: 45 43 54 5f 43 4f 4e 46 49 47 29 3b 0a 20 20 64  ECT_CONFIG);.  d
2480: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20  b_multi_exec(.  
2490: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
24a0: 72 65 70 6f 73 69 74 6f 72 79 2e 63 6f 6e 66 69  repository.confi
24b0: 67 28 6e 61 6d 65 2c 76 61 6c 75 65 2c 6d 74 69  g(name,value,mti
24c0: 6d 65 29 22 0a 20 20 20 20 22 20 56 41 4c 55 45  me)".    " VALUE
24d0: 53 28 27 62 61 63 6b 6f 66 66 69 63 65 27 2c 27  S('backoffice','
24e0: 25 6c 6c 64 20 25 6c 6c 64 20 25 6c 6c 64 20 25  %lld %lld %lld %
24f0: 6c 6c 64 27 2c 6e 6f 77 28 29 29 22 2c 0a 20 20  lld',now())",.  
2500: 20 20 70 4c 65 61 73 65 2d 3e 69 64 43 75 72 72    pLease->idCurr
2510: 65 6e 74 2c 20 70 4c 65 61 73 65 2d 3e 74 6d 43  ent, pLease->tmC
2520: 75 72 72 65 6e 74 2c 0a 20 20 20 20 70 4c 65 61  urrent,.    pLea
2530: 73 65 2d 3e 69 64 4e 65 78 74 2c 20 70 4c 65 61  se->idNext, pLea
2540: 73 65 2d 3e 74 6d 4e 65 78 74 29 3b 0a 20 20 64  se->tmNext);.  d
2550: 62 5f 70 72 6f 74 65 63 74 5f 70 6f 70 28 29 3b  b_protect_pop();
2560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2570: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73 70  to see if the sp
2580: 65 63 69 66 69 65 64 20 57 69 6e 33 32 20 70 72  ecified Win32 pr
2590: 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 61  ocess is still a
25a0: 6c 69 76 65 2e 20 20 49 74 0a 2a 2a 20 73 68 6f  live.  It.** sho
25b0: 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61  uld be noted tha
25c0: 74 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 66  t even if this f
25d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
25e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 0a 2a 2a  non-zero, the.**
25f0: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 64 69 65   process may die
2600: 20 62 65 66 6f 72 65 20 61 6e 6f 74 68 65 72 20   before another 
2610: 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 69 74 20  operation on it 
2620: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 64  can be completed
2630: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
2640: 28 5f 57 49 4e 33 32 29 0a 23 69 66 6e 64 65 66  (_WIN32).#ifndef
2650: 20 50 52 4f 43 45 53 53 5f 51 55 45 52 59 5f 4c   PROCESS_QUERY_L
2660: 49 4d 49 54 45 44 5f 49 4e 46 4f 52 4d 41 54 49  IMITED_INFORMATI
2670: 4f 4e 0a 23 20 20 64 65 66 69 6e 65 20 50 52 4f  ON.#  define PRO
2680: 43 45 53 53 5f 51 55 45 52 59 5f 4c 49 4d 49 54  CESS_QUERY_LIMIT
2690: 45 44 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 20  ED_INFORMATION  
26a0: 28 30 78 31 30 30 30 29 0a 23 65 6e 64 69 66 0a  (0x1000).#endif.
26b0: 73 74 61 74 69 63 20 69 6e 74 20 62 61 63 6b 6f  static int backo
26c0: 66 66 69 63 65 57 69 6e 33 32 50 72 6f 63 65 73  fficeWin32Proces
26d0: 73 45 78 69 73 74 73 28 44 57 4f 52 44 20 64 77  sExists(DWORD dw
26e0: 50 72 6f 63 65 73 73 49 64 29 7b 0a 20 20 48 41  ProcessId){.  HA
26f0: 4e 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a 20  NDLE hProcess;. 
2700: 20 68 50 72 6f 63 65 73 73 20 3d 20 4f 70 65 6e   hProcess = Open
2710: 50 72 6f 63 65 73 73 28 50 52 4f 43 45 53 53 5f  Process(PROCESS_
2720: 51 55 45 52 59 5f 4c 49 4d 49 54 45 44 5f 49 4e  QUERY_LIMITED_IN
2730: 46 4f 52 4d 41 54 49 4f 4e 2c 46 41 4c 53 45 2c  FORMATION,FALSE,
2740: 64 77 50 72 6f 63 65 73 73 49 64 29 3b 0a 20 20  dwProcessId);.  
2750: 69 66 28 20 68 50 72 6f 63 65 73 73 3d 3d 4e 55  if( hProcess==NU
2760: 4c 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LL ) return 0;. 
2770: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 50 72   CloseHandle(hPr
2780: 6f 63 65 73 73 29 3b 0a 20 20 72 65 74 75 72 6e  ocess);.  return
2790: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
27a0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
27b0: 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
27c0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 69  identified by pi
27d0: 64 20 69 73 20 61 6c 69 76 65 2e 20 20 49 66 0a  d is alive.  If.
27e0: 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  ** we cannot pro
27f0: 76 65 20 74 68 61 74 20 74 68 65 20 70 72 6f 63  ve that the proc
2800: 65 73 73 20 69 73 20 64 65 61 64 2c 20 72 65 74  ess is dead, ret
2810: 75 72 6e 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61  urn true..*/.sta
2820: 74 69 63 20 69 6e 74 20 62 61 63 6b 6f 66 66 69  tic int backoffi
2830: 63 65 50 72 6f 63 65 73 73 45 78 69 73 74 73 28  ceProcessExists(
2840: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 70  sqlite3_uint64 p
2850: 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
2860: 28 5f 57 49 4e 33 32 29 0a 20 20 72 65 74 75 72  (_WIN32).  retur
2870: 6e 20 70 69 64 3e 30 20 26 26 20 62 61 63 6b 6f  n pid>0 && backo
2880: 66 66 69 63 65 57 69 6e 33 32 50 72 6f 63 65 73  fficeWin32Proces
2890: 73 45 78 69 73 74 73 28 28 44 57 4f 52 44 29 70  sExists((DWORD)p
28a0: 69 64 29 21 3d 30 3b 0a 23 65 6c 73 65 0a 20 20  id)!=0;.#else.  
28b0: 72 65 74 75 72 6e 20 70 69 64 3e 30 20 26 26 20  return pid>0 && 
28c0: 6b 69 6c 6c 28 28 70 69 64 5f 74 29 70 69 64 2c  kill((pid_t)pid,
28d0: 20 30 29 3d 3d 30 3b 0a 23 65 6e 64 69 66 0a 7d   0)==0;.#endif.}
28e0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
28f0: 20 73 65 65 20 69 66 20 74 68 65 20 70 72 6f 63   see if the proc
2900: 65 73 73 20 69 64 65 6e 74 69 66 69 65 64 20 62  ess identified b
2910: 79 20 70 69 64 20 68 61 73 20 66 69 6e 69 73 68  y pid has finish
2920: 65 64 2e 20 20 49 66 0a 2a 2a 20 77 65 20 63 61  ed.  If.** we ca
2930: 6e 6e 6f 74 20 70 72 6f 76 65 20 74 68 61 74 20  nnot prove that 
2940: 74 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  the process is s
2950: 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 2c 20 72 65  till running, re
2960: 74 75 72 6e 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  turn true..*/.st
2970: 61 74 69 63 20 69 6e 74 20 62 61 63 6b 6f 66 66  atic int backoff
2980: 69 63 65 50 72 6f 63 65 73 73 44 6f 6e 65 28 73  iceProcessDone(s
2990: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 70 69  qlite3_uint64 pi
29a0: 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
29b0: 5f 57 49 4e 33 32 29 0a 20 20 72 65 74 75 72 6e  _WIN32).  return
29c0: 20 70 69 64 3c 3d 30 20 7c 7c 20 62 61 63 6b 6f   pid<=0 || backo
29d0: 66 66 69 63 65 57 69 6e 33 32 50 72 6f 63 65 73  fficeWin32Proces
29e0: 73 45 78 69 73 74 73 28 28 44 57 4f 52 44 29 70  sExists((DWORD)p
29f0: 69 64 29 3d 3d 30 3b 0a 23 65 6c 73 65 0a 20 20  id)==0;.#else.  
2a00: 72 65 74 75 72 6e 20 70 69 64 3c 3d 30 20 7c 7c  return pid<=0 ||
2a10: 20 6b 69 6c 6c 28 28 70 69 64 5f 74 29 70 69 64   kill((pid_t)pid
2a20: 2c 20 30 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  , 0)!=0;.#endif.
2a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a40: 61 20 70 72 6f 63 65 73 73 20 69 64 20 6e 75 6d  a process id num
2a50: 62 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72  ber for the curr
2a60: 65 6e 74 20 70 72 6f 63 65 73 73 0a 2a 2f 0a 73  ent process.*/.s
2a70: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 75 69  tatic sqlite3_ui
2a80: 6e 74 36 34 20 62 61 63 6b 6f 66 66 69 63 65 50  nt64 backofficeP
2a90: 72 6f 63 65 73 73 49 64 28 76 6f 69 64 29 7b 0a  rocessId(void){.
2aa0: 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65    return (sqlite
2ab0: 33 5f 75 69 6e 74 36 34 29 47 45 54 50 49 44 28  3_uint64)GETPID(
2ac0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d  );.}.../*.** COM
2ad0: 4d 41 4e 44 3a 20 74 65 73 74 2d 70 72 6f 63 65  MAND: test-proce
2ae0: 73 73 2d 69 64 0a 2a 2a 0a 2a 2a 20 55 73 61 67  ss-id.**.** Usag
2af0: 65 3a 20 25 66 6f 73 73 69 6c 20 5b 2d 2d 73 6c  e: %fossil [--sl
2b00: 65 65 70 20 4e 5d 20 50 52 4f 43 45 53 53 2d 49  eep N] PROCESS-I
2b10: 44 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 53 68 6f 77  D ....**.** Show
2b20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
2b30: 63 65 73 73 20 69 64 2c 20 61 6e 64 20 61 6c 73  cess id, and als
2b40: 6f 20 74 65 6c 6c 20 77 68 65 74 68 65 72 20 6f  o tell whether o
2b50: 72 20 6e 6f 74 20 61 6c 6c 20 6f 74 68 65 72 0a  r not all other.
2b60: 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 49 44 73  ** processes IDs
2b70: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
2b80: 6c 69 6e 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  line are running
2b90: 20 6f 72 20 6e 6f 74 2e 20 20 49 66 20 74 68 65   or not.  If the
2ba0: 20 2d 2d 73 6c 65 65 70 20 4e 0a 2a 2a 20 6f 70   --sleep N.** op
2bb0: 74 69 6f 6e 20 69 73 20 70 72 6f 76 69 64 65 2c  tion is provide,
2bc0: 20 74 68 65 6e 20 73 6c 65 65 70 20 66 6f 72 20   then sleep for 
2bd0: 4e 20 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  N seconds before
2be0: 20 65 78 69 74 69 6e 67 2e 0a 2a 2f 0a 76 6f 69   exiting..*/.voi
2bf0: 64 20 74 65 73 74 5f 70 72 6f 63 65 73 73 5f 69  d test_process_i
2c00: 64 5f 63 6f 6d 6d 61 6e 64 28 76 6f 69 64 29 7b  d_command(void){
2c10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c20: 53 6c 65 65 70 20 3d 20 66 69 6e 64 5f 6f 70 74  Sleep = find_opt
2c30: 69 6f 6e 28 22 73 6c 65 65 70 22 2c 30 2c 31 29  ion("sleep",0,1)
2c40: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 76 65 72  ;.  int i;.  ver
2c50: 69 66 79 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73 28  ify_all_options(
2c60: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e  );.  fossil_prin
2c70: 74 28 22 50 72 6f 63 65 73 73 49 44 20 66 6f 72  t("ProcessID for
2c80: 20 74 68 69 73 20 70 72 6f 63 65 73 73 3a 20 25   this process: %
2c90: 6c 6c 64 5c 6e 22 2c 20 62 61 63 6b 6f 66 66 69  lld\n", backoffi
2ca0: 63 65 50 72 6f 63 65 73 73 49 64 28 29 29 3b 0a  ceProcessId());.
2cb0: 20 20 69 66 28 20 7a 53 6c 65 65 70 20 29 20 73    if( zSleep ) s
2cc0: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30  qlite3_sleep(100
2cd0: 30 2a 61 74 6f 69 28 7a 53 6c 65 65 70 29 29 3b  0*atoi(zSleep));
2ce0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e  .  for(i=2; i<g.
2cf0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
2d00: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 78  sqlite3_uint64 x
2d10: 20 3d 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74   = (sqlite3_uint
2d20: 36 34 29 61 74 6f 69 28 67 2e 61 72 67 76 5b 69  64)atoi(g.argv[i
2d30: 5d 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70  ]);.    fossil_p
2d40: 72 69 6e 74 28 22 50 72 6f 63 65 73 73 49 64 20  rint("ProcessId 
2d50: 25 6c 6c 64 3a 20 65 78 69 73 74 73 20 25 64 20  %lld: exists %d 
2d60: 64 6f 6e 65 20 25 64 5c 6e 22 2c 0a 20 20 20 20  done %d\n",.    
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 2c 20               x, 
2d80: 62 61 63 6b 6f 66 66 69 63 65 50 72 6f 63 65 73  backofficeProces
2d90: 73 45 78 69 73 74 73 28 78 29 2c 0a 20 20 20 20  sExists(x),.    
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 62 61 63 6b 6f 66 66 69 63 65 50 72 6f 63 65 73  backofficeProces
2dc0: 73 44 6f 6e 65 28 78 29 29 3b 0a 20 20 7d 0a 7d  sDone(x));.  }.}
2dd0: 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a  ../*.** COMMAND:
2de0: 20 74 65 73 74 2d 62 61 63 6b 6f 66 66 69 63 65   test-backoffice
2df0: 2d 6c 65 61 73 65 0a 2a 2a 0a 2a 2a 20 55 73 61  -lease.**.** Usa
2e00: 67 65 3a 20 25 66 6f 73 73 69 6c 20 74 65 73 74  ge: %fossil test
2e10: 2d 62 61 63 6b 6f 66 66 69 63 65 2d 6c 65 61 73  -backoffice-leas
2e20: 65 20 3f 2d 2d 72 65 73 65 74 3f 0a 2a 2a 0a 2a  e ?--reset?.**.*
2e30: 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f  * Print out info
2e40: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
2e50: 65 20 62 61 63 6b 6f 66 66 69 63 65 20 22 6c 65  e backoffice "le
2e60: 61 73 65 22 20 65 6e 74 72 79 20 69 6e 20 74 68  ase" entry in th
2e70: 65 0a 2a 2a 20 63 6f 6e 66 69 67 20 74 61 62 6c  e.** config tabl
2e80: 65 20 74 68 61 74 20 63 6f 6e 74 72 6f 6c 73 20  e that controls 
2e90: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
2ea0: 61 63 6b 6f 66 66 69 63 65 20 73 68 6f 75 6c 64  ackoffice should
2eb0: 20 72 75 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   run..**.** If t
2ec0: 68 65 20 2d 2d 72 65 73 65 74 20 6f 70 74 69 6f  he --reset optio
2ed0: 6e 20 69 73 20 67 69 76 65 6e 2c 20 74 68 65 20  n is given, the 
2ee0: 62 61 63 6b 6f 66 66 69 63 65 20 6c 65 61 73 65  backoffice lease
2ef0: 20 69 73 20 72 65 73 65 74 2e 0a 2a 2a 20 54 68   is reset..** Th
2f00: 65 20 75 73 65 20 6f 66 20 74 68 65 20 2d 2d 72  e use of the --r
2f10: 65 73 65 74 20 6f 70 74 69 6f 6e 20 63 61 6e 20  eset option can 
2f20: 62 65 20 64 69 73 72 75 70 74 69 76 65 2e 20 20  be disruptive.  
2f30: 49 74 20 63 61 6e 20 63 61 75 73 65 20 74 77 6f  It can cause two
2f40: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 62 61 63 6b  .** or more back
2f50: 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73 65 73  office processes
2f60: 20 74 6f 20 62 65 20 72 75 6e 20 73 69 6d 75 6c   to be run simul
2f70: 74 61 6e 65 6f 75 73 6c 79 2e 20 20 55 73 65 20  taneously.  Use 
2f80: 69 74 20 77 69 74 68 0a 2a 2a 20 63 61 75 74 69  it with.** cauti
2f90: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74  on..*/.void test
2fa0: 5f 62 61 63 6b 6f 66 66 69 63 65 5f 6c 65 61 73  _backoffice_leas
2fb0: 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  e(void){.  sqlit
2fc0: 65 33 5f 69 6e 74 36 34 20 74 6d 4e 6f 77 20 3d  e3_int64 tmNow =
2fd0: 20 74 69 6d 65 28 30 29 3b 0a 20 20 4c 65 61 73   time(0);.  Leas
2fe0: 65 20 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  e x;.  const cha
2ff0: 72 20 2a 7a 4c 65 61 73 65 3b 0a 20 20 64 62 5f  r *zLease;.  db_
3000: 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65  find_and_open_re
3010: 70 6f 73 69 74 6f 72 79 28 30 2c 30 29 3b 0a 20  pository(0,0);. 
3020: 20 69 66 28 20 66 69 6e 64 5f 6f 70 74 69 6f 6e   if( find_option
3030: 28 22 72 65 73 65 74 22 2c 30 2c 30 29 21 3d 30  ("reset",0,0)!=0
3040: 20 29 7b 0a 20 20 20 20 64 62 5f 75 6e 70 72 6f   ){.    db_unpro
3050: 74 65 63 74 28 50 52 4f 54 45 43 54 5f 43 4f 4e  tect(PROTECT_CON
3060: 46 49 47 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c  FIG);.    db_mul
3070: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 22  ti_exec(.      "
3080: 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65 70 6f  DELETE FROM repo
3090: 73 69 74 6f 72 79 2e 63 6f 6e 66 69 67 20 57 48  sitory.config WH
30a0: 45 52 45 20 6e 61 6d 65 3d 27 62 61 63 6b 6f 66  ERE name='backof
30b0: 66 69 63 65 27 22 0a 20 20 20 20 29 3b 0a 20 20  fice'".    );.  
30c0: 20 20 64 62 5f 70 72 6f 74 65 63 74 5f 70 6f 70    db_protect_pop
30d0: 28 29 3b 0a 20 20 7d 0a 20 20 76 65 72 69 66 79  ();.  }.  verify
30e0: 5f 61 6c 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a  _all_options();.
30f0: 20 20 7a 4c 65 61 73 65 20 3d 20 64 62 5f 67 65    zLease = db_ge
3100: 74 28 22 62 61 63 6b 6f 66 66 69 63 65 22 2c 22  t("backoffice","
3110: 22 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69  ");.  fossil_pri
3120: 6e 74 28 22 6e 6f 77 3a 20 20 20 20 20 20 20 20  nt("now:        
3130: 25 6c 6c 64 5c 6e 22 2c 20 74 6d 4e 6f 77 29 3b  %lld\n", tmNow);
3140: 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28  .  fossil_print(
3150: 22 6c 65 61 73 65 3a 20 20 20 20 20 20 5c 22 25  "lease:      \"%
3160: 73 5c 22 5c 6e 22 2c 20 7a 4c 65 61 73 65 29 3b  s\"\n", zLease);
3170: 0a 20 20 62 61 63 6b 6f 66 66 69 63 65 52 65 61  .  backofficeRea
3180: 64 4c 65 61 73 65 28 26 78 29 3b 0a 20 20 66 6f  dLease(&x);.  fo
3190: 73 73 69 6c 5f 70 72 69 6e 74 28 22 69 64 43 75  ssil_print("idCu
31a0: 72 72 65 6e 74 3a 20 20 25 2d 32 30 6c 6c 64 22  rrent:  %-20lld"
31b0: 2c 20 78 2e 69 64 43 75 72 72 65 6e 74 29 3b 0a  , x.idCurrent);.
31c0: 20 20 69 66 28 20 62 61 63 6b 6f 66 66 69 63 65    if( backoffice
31d0: 50 72 6f 63 65 73 73 45 78 69 73 74 73 28 78 2e  ProcessExists(x.
31e0: 69 64 43 75 72 72 65 6e 74 29 20 29 20 66 6f 73  idCurrent) ) fos
31f0: 73 69 6c 5f 70 72 69 6e 74 28 22 20 28 65 78 69  sil_print(" (exi
3200: 73 74 73 29 22 29 3b 0a 20 20 69 66 28 20 62 61  sts)");.  if( ba
3210: 63 6b 6f 66 66 69 63 65 50 72 6f 63 65 73 73 44  ckofficeProcessD
3220: 6f 6e 65 28 78 2e 69 64 43 75 72 72 65 6e 74 29  one(x.idCurrent)
3230: 20 29 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28   ) fossil_print(
3240: 22 20 28 64 6f 6e 65 29 22 29 3b 0a 20 20 66 6f  " (done)");.  fo
3250: 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e 22 29  ssil_print("\n")
3260: 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74  ;.  fossil_print
3270: 28 22 74 6d 43 75 72 72 65 6e 74 3a 20 20 25 2d  ("tmCurrent:  %-
3280: 32 30 6c 6c 64 22 2c 20 78 2e 74 6d 43 75 72 72  20lld", x.tmCurr
3290: 65 6e 74 29 3b 0a 20 20 69 66 28 20 78 2e 74 6d  ent);.  if( x.tm
32a0: 43 75 72 72 65 6e 74 3e 30 20 29 7b 0a 20 20 20  Current>0 ){.   
32b0: 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20   fossil_print(" 
32c0: 28 6e 6f 77 25 2b 64 29 5c 6e 22 2c 78 2e 74 6d  (now%+d)\n",x.tm
32d0: 43 75 72 72 65 6e 74 2d 74 6d 4e 6f 77 29 3b 0a  Current-tmNow);.
32e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 73    }else{.    fos
32f0: 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e 22 29 3b  sil_print("\n");
3300: 0a 20 20 7d 0a 20 20 66 6f 73 73 69 6c 5f 70 72  .  }.  fossil_pr
3310: 69 6e 74 28 22 69 64 4e 65 78 74 3a 20 20 20 20  int("idNext:    
3320: 20 25 2d 32 30 6c 6c 64 22 2c 20 78 2e 69 64 4e   %-20lld", x.idN
3330: 65 78 74 29 3b 0a 20 20 69 66 28 20 62 61 63 6b  ext);.  if( back
3340: 6f 66 66 69 63 65 50 72 6f 63 65 73 73 45 78 69  officeProcessExi
3350: 73 74 73 28 78 2e 69 64 4e 65 78 74 29 20 29 20  sts(x.idNext) ) 
3360: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 20 28  fossil_print(" (
3370: 65 78 69 73 74 73 29 22 29 3b 0a 20 20 69 66 28  exists)");.  if(
3380: 20 62 61 63 6b 6f 66 66 69 63 65 50 72 6f 63 65   backofficeProce
3390: 73 73 44 6f 6e 65 28 78 2e 69 64 4e 65 78 74 29  ssDone(x.idNext)
33a0: 20 29 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28   ) fossil_print(
33b0: 22 20 28 64 6f 6e 65 29 22 29 3b 0a 20 20 66 6f  " (done)");.  fo
33c0: 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 6e 22 29  ssil_print("\n")
33d0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74  ;.  fossil_print
33e0: 28 22 74 6d 4e 65 78 74 3a 20 20 20 20 20 25 2d  ("tmNext:     %-
33f0: 32 30 6c 6c 64 22 2c 20 78 2e 74 6d 4e 65 78 74  20lld", x.tmNext
3400: 29 3b 0a 20 20 69 66 28 20 78 2e 74 6d 4e 65 78  );.  if( x.tmNex
3410: 74 3e 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  t>0 ){.    fossi
3420: 6c 5f 70 72 69 6e 74 28 22 20 28 6e 6f 77 25 2b  l_print(" (now%+
3430: 64 29 5c 6e 22 2c 78 2e 74 6d 4e 65 78 74 2d 74  d)\n",x.tmNext-t
3440: 6d 4e 6f 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mNow);.  }else{.
3450: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
3460: 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ("\n");.  }.}../
3470: 2a 0a 2a 2a 20 49 66 20 62 61 63 6b 6f 66 66 69  *.** If backoffi
3480: 63 65 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ce processing is
3490: 20 6e 65 65 64 65 64 20 73 65 74 20 74 68 65 20   needed set the 
34a0: 62 61 63 6b 6f 66 66 69 63 65 44 62 20 76 61 72  backofficeDb var
34b0: 69 61 62 6c 65 20 74 6f 20 74 68 65 0a 2a 2a 20  iable to the.** 
34c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
34d0: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 6e  base file.  If n
34e0: 6f 20 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f  o backoffice pro
34f0: 63 65 73 73 69 6e 67 20 69 73 20 6e 65 65 64 65  cessing is neede
3500: 64 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  d,.** this routi
3510: 6e 65 20 6d 61 6b 65 73 20 6e 6f 20 63 68 61 6e  ne makes no chan
3520: 67 65 73 20 74 6f 20 73 74 61 74 65 2e 0a 2a 2f  ges to state..*/
3530: 0a 76 6f 69 64 20 62 61 63 6b 6f 66 66 69 63 65  .void backoffice
3540: 5f 63 68 65 63 6b 5f 69 66 5f 6e 65 65 64 65 64  _check_if_needed
3550: 28 76 6f 69 64 29 7b 0a 20 20 4c 65 61 73 65 20  (void){.  Lease 
3560: 78 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  x;.  sqlite3_uin
3570: 74 36 34 20 74 6d 4e 6f 77 3b 0a 0a 20 20 69 66  t64 tmNow;..  if
3580: 28 20 62 61 63 6b 6f 66 66 69 63 65 44 62 20 29  ( backofficeDb )
3590: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 67   return;.  if( g
35a0: 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65  .zRepositoryName
35b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
35c0: 69 66 28 20 67 2e 64 62 3d 3d 30 20 29 20 72 65  if( g.db==0 ) re
35d0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 64 62 5f  turn;.  if( !db_
35e0: 74 61 62 6c 65 5f 65 78 69 73 74 73 28 22 72 65  table_exists("re
35f0: 70 6f 73 69 74 6f 72 79 22 2c 22 63 6f 6e 66 69  pository","confi
3600: 67 22 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  g") ) return;.  
3610: 69 66 28 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65  if( db_get_boole
3620: 61 6e 28 22 62 61 63 6b 6f 66 66 69 63 65 2d 64  an("backoffice-d
3630: 69 73 61 62 6c 65 22 2c 30 29 20 29 20 72 65 74  isable",0) ) ret
3640: 75 72 6e 3b 0a 20 20 74 6d 4e 6f 77 20 3d 20 74  urn;.  tmNow = t
3650: 69 6d 65 28 30 29 3b 0a 20 20 62 61 63 6b 6f 66  ime(0);.  backof
3660: 66 69 63 65 52 65 61 64 4c 65 61 73 65 28 26 78  ficeReadLease(&x
3670: 29 3b 0a 20 20 69 66 28 20 78 2e 74 6d 4e 65 78  );.  if( x.tmNex
3680: 74 3e 3d 74 6d 4e 6f 77 20 26 26 20 62 61 63 6b  t>=tmNow && back
3690: 6f 66 66 69 63 65 50 72 6f 63 65 73 73 45 78 69  officeProcessExi
36a0: 73 74 73 28 78 2e 69 64 4e 65 78 74 29 20 29 7b  sts(x.idNext) ){
36b0: 0a 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20  .    /* Another 
36c0: 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f 63 65  backoffice proce
36d0: 73 73 20 69 73 20 61 6c 72 65 61 64 79 20 71 75  ss is already qu
36e0: 65 75 65 64 20 75 70 20 74 6f 20 72 75 6e 2e 20  eued up to run. 
36f0: 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   This.    ** pro
3700: 63 65 73 73 20 64 6f 65 73 20 6e 6f 74 20 6e 65  cess does not ne
3710: 65 64 20 74 6f 20 64 6f 20 61 6e 79 20 62 61 63  ed to do any bac
3720: 6b 6f 66 66 69 63 65 20 77 6f 72 6b 2e 20 2a 2f  koffice work. */
3730: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3740: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20  else{.    /* We 
3750: 6e 65 65 64 20 74 6f 20 72 75 6e 20 62 61 63 6b  need to run back
3760: 75 70 20 74 6f 20 62 65 20 28 61 74 20 61 20 6d  up to be (at a m
3770: 69 6e 69 6d 75 6d 29 20 6f 6e 2d 64 65 63 6b 20  inimum) on-deck 
3780: 2a 2f 0a 20 20 20 20 62 61 63 6b 6f 66 66 69 63  */.    backoffic
3790: 65 44 62 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72  eDb = fossil_str
37a0: 64 75 70 28 67 2e 7a 52 65 70 6f 73 69 74 6f 72  dup(g.zRepositor
37b0: 79 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  yName);.  }.}../
37c0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  *.** Call this r
37d0: 6f 75 74 69 6e 65 20 74 6f 20 64 69 73 61 62 6c  outine to disabl
37e0: 65 20 62 61 63 6b 6f 66 66 69 63 65 0a 2a 2f 0a  e backoffice.*/.
37f0: 76 6f 69 64 20 62 61 63 6b 6f 66 66 69 63 65 5f  void backoffice_
3800: 64 69 73 61 62 6c 65 28 76 6f 69 64 29 7b 0a 20  disable(void){. 
3810: 20 62 61 63 6b 6f 66 66 69 63 65 44 62 20 3d 20   backofficeDb = 
3820: 22 78 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  "x";.}../*.** Ch
3830: 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 20 70  eck for errors p
3840: 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20  rior to running 
3850: 62 61 63 6b 6f 66 66 69 63 65 5f 74 68 72 65 61  backoffice_threa
3860: 64 28 29 20 6f 72 20 62 61 63 6b 6f 66 66 69 63  d() or backoffic
3870: 65 5f 72 75 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  e_run()..*/.stat
3880: 69 63 20 76 6f 69 64 20 62 61 63 6b 6f 66 66 69  ic void backoffi
3890: 63 65 5f 65 72 72 6f 72 5f 63 68 65 63 6b 5f 6f  ce_error_check_o
38a0: 6e 65 28 69 6e 74 20 2a 70 4f 6e 63 65 29 7b 0a  ne(int *pOnce){.
38b0: 20 20 69 66 28 20 2a 70 4f 6e 63 65 20 29 7b 0a    if( *pOnce ){.
38c0: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63      fossil_panic
38d0: 28 22 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73  ("multiple calls
38e0: 20 74 6f 20 62 61 63 6b 6f 66 66 69 63 65 28 29   to backoffice()
38f0: 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 4f 6e 63 65  ");.  }.  *pOnce
3900: 20 3d 20 31 3b 0a 20 20 69 66 28 20 67 2e 64 62   = 1;.  if( g.db
3910: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  ==0 ){.    fossi
3920: 6c 5f 70 61 6e 69 63 28 22 64 61 74 61 62 61 73  l_panic("databas
3930: 65 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72 20 62  e not open for b
3940: 61 63 6b 6f 66 66 69 63 65 20 70 72 6f 63 65 73  ackoffice proces
3950: 73 69 6e 67 22 29 3b 0a 20 20 7d 0a 20 20 69 66  sing");.  }.  if
3960: 28 20 64 62 5f 74 72 61 6e 73 61 63 74 69 6f 6e  ( db_transaction
3970: 5f 6e 65 73 74 69 6e 67 5f 64 65 70 74 68 28 29  _nesting_depth()
3980: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  !=0 ){.    fossi
3990: 6c 5f 70 61 6e 69 63 28 22 74 72 61 6e 73 61 63  l_panic("transac
39a0: 74 69 6f 6e 20 25 73 20 6e 6f 74 20 63 6c 6f 73  tion %s not clos
39b0: 65 64 20 70 72 69 6f 72 20 74 6f 20 62 61 63 6b  ed prior to back
39c0: 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73 69 6e  office processin
39d0: 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g",.            
39e0: 20 20 20 20 20 64 62 5f 74 72 61 6e 73 61 63 74       db_transact
39f0: 69 6f 6e 5f 73 74 61 72 74 5f 70 6f 69 6e 74 28  ion_start_point(
3a00: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68  ));.  }.}../* Th
3a10: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 6c  is is the main l
3a20: 6f 6f 70 20 66 6f 72 20 62 61 63 6b 6f 66 66 69  oop for backoffi
3a30: 63 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ce processing..*
3a40: 2a 0a 2a 2a 20 49 66 20 61 6e 6f 74 68 65 72 20  *.** If another 
3a50: 70 72 6f 63 65 73 73 20 69 73 20 61 6c 72 65 61  process is alrea
3a60: 64 79 20 77 6f 72 6b 69 6e 67 20 61 73 20 74 68  dy working as th
3a70: 65 20 63 75 72 72 65 6e 74 20 62 61 63 6b 6f 66  e current backof
3a80: 66 69 63 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  fice and.** the 
3a90: 6f 6e 2d 64 65 63 6b 20 62 61 63 6b 6f 66 66 69  on-deck backoffi
3aa0: 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ce, then this ro
3ab0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 76 65  utine returns ve
3ac0: 72 79 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 77 69  ry quickly.** wi
3ad0: 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
3ae0: 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  work..**.** If n
3af0: 6f 20 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f  o backoffice pro
3b00: 63 65 73 73 65 73 20 61 72 65 20 72 75 6e 6e 69  cesses are runni
3b10: 6e 67 20 61 74 20 61 6c 6c 2c 20 74 68 69 73 20  ng at all, this 
3b20: 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 0a  routine becomes.
3b30: 2a 2a 20 74 68 65 20 6d 61 69 6e 20 62 61 63 6b  ** the main back
3b40: 6f 66 66 69 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  office..**.** If
3b50: 20 61 20 70 72 69 6d 61 72 79 20 62 61 63 6b 6f   a primary backo
3b60: 66 66 69 63 65 20 69 73 20 72 75 6e 6e 69 6e 67  ffice is running
3b70: 2c 20 62 75 74 20 61 6e 20 6f 6e 2d 64 65 63 6b  , but an on-deck
3b80: 20 62 61 63 6b 6f 66 66 69 63 65 20 69 73 0a 2a   backoffice is.*
3b90: 2a 20 6e 65 65 64 65 64 2c 20 74 68 69 73 20 72  * needed, this r
3ba0: 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 74  outine becomes t
3bb0: 68 61 74 20 6f 6e 2d 64 65 63 6b 20 62 61 63 6b  hat on-deck back
3bc0: 6f 66 66 69 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  office..*/.stati
3bd0: 63 20 76 6f 69 64 20 62 61 63 6b 6f 66 66 69 63  c void backoffic
3be0: 65 5f 74 68 72 65 61 64 28 76 6f 69 64 29 7b 0a  e_thread(void){.
3bf0: 20 20 4c 65 61 73 65 20 78 3b 0a 20 20 73 71 6c    Lease x;.  sql
3c00: 69 74 65 33 5f 75 69 6e 74 36 34 20 74 6d 4e 6f  ite3_uint64 tmNo
3c10: 77 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e  w;.  sqlite3_uin
3c20: 74 36 34 20 69 64 53 65 6c 66 3b 0a 20 20 69 6e  t64 idSelf;.  in
3c30: 74 20 6c 61 73 74 57 61 72 6e 69 6e 67 20 3d 20  t lastWarning = 
3c40: 30 3b 0a 20 20 69 6e 74 20 77 61 72 6e 69 6e 67  0;.  int warning
3c50: 44 65 6c 61 79 20 3d 20 33 30 3b 0a 20 20 73 74  Delay = 30;.  st
3c60: 61 74 69 63 20 69 6e 74 20 6f 6e 63 65 20 3d 20  atic int once = 
3c70: 30 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0;..  if( sqlite
3c80: 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 67 2e  3_db_readonly(g.
3c90: 64 62 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b  db, 0) ) return;
3ca0: 0a 20 20 69 66 28 20 64 62 5f 69 73 5f 70 72 6f  .  if( db_is_pro
3cb0: 74 65 63 74 65 64 28 50 52 4f 54 45 43 54 5f 52  tected(PROTECT_R
3cc0: 45 41 44 4f 4e 4c 59 29 20 29 20 72 65 74 75 72  EADONLY) ) retur
3cd0: 6e 3b 0a 20 20 67 2e 7a 50 68 61 73 65 20 3d 20  n;.  g.zPhase = 
3ce0: 22 62 61 63 6b 6f 66 66 69 63 65 22 3b 0a 20 20  "backoffice";.  
3cf0: 62 61 63 6b 6f 66 66 69 63 65 5f 65 72 72 6f 72  backoffice_error
3d00: 5f 63 68 65 63 6b 5f 6f 6e 65 28 26 6f 6e 63 65  _check_one(&once
3d10: 29 3b 0a 20 20 69 64 53 65 6c 66 20 3d 20 62 61  );.  idSelf = ba
3d20: 63 6b 6f 66 66 69 63 65 50 72 6f 63 65 73 73 49  ckofficeProcessI
3d30: 64 28 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  d();.  while(1){
3d40: 0a 20 20 20 20 74 6d 4e 6f 77 20 3d 20 74 69 6d  .    tmNow = tim
3d50: 65 28 30 29 3b 0a 20 20 20 20 64 62 5f 62 65 67  e(0);.    db_beg
3d60: 69 6e 5f 77 72 69 74 65 28 29 3b 0a 20 20 20 20  in_write();.    
3d70: 62 61 63 6b 6f 66 66 69 63 65 52 65 61 64 4c 65  backofficeReadLe
3d80: 61 73 65 28 26 78 29 3b 0a 20 20 20 20 69 66 28  ase(&x);.    if(
3d90: 20 78 2e 74 6d 4e 65 78 74 3e 3d 74 6d 4e 6f 77   x.tmNext>=tmNow
3da0: 0a 20 20 20 20 20 26 26 20 78 2e 69 64 4e 65 78  .     && x.idNex
3db0: 74 21 3d 69 64 53 65 6c 66 0a 20 20 20 20 20 26  t!=idSelf.     &
3dc0: 26 20 62 61 63 6b 6f 66 66 69 63 65 50 72 6f 63  & backofficeProc
3dd0: 65 73 73 45 78 69 73 74 73 28 78 2e 69 64 4e 65  essExists(x.idNe
3de0: 78 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  xt).    ){.     
3df0: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 62 61 63 6b   /* Another back
3e00: 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73 20 69  office process i
3e10: 73 20 61 6c 72 65 61 64 79 20 71 75 65 75 65 64  s already queued
3e20: 20 75 70 20 74 6f 20 72 75 6e 2e 20 20 54 68 69   up to run.  Thi
3e30: 73 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  s.      ** proce
3e40: 73 73 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  ss does not need
3e50: 20 74 6f 20 64 6f 20 61 6e 79 20 62 61 63 6b 6f   to do any backo
3e60: 66 66 69 63 65 20 77 6f 72 6b 20 61 6e 64 20 63  ffice work and c
3e70: 61 6e 20 73 74 6f 70 0a 20 20 20 20 20 20 2a 2a  an stop.      **
3e80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 2a 2f   immediately. */
3e90: 0a 20 20 20 20 20 20 64 62 5f 65 6e 64 5f 74 72  .      db_end_tr
3ea0: 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20  ansaction(0);.  
3eb0: 20 20 20 20 62 61 63 6b 6f 66 66 69 63 65 54 72      backofficeTr
3ec0: 61 63 65 28 22 2f 2a 2a 2a 2a 2a 20 42 61 63 6b  ace("/***** Back
3ed0: 6f 66 66 69 63 65 20 50 72 6f 63 65 73 73 69 6e  office Processin
3ee0: 67 20 4e 6f 74 20 4e 65 65 64 65 64 20 49 6e 20  g Not Needed In 
3ef0: 25 64 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20  %d *****/\n",.  
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 20 47 45 54 50 49 44 28 29 29 3b 0a 20      GETPID());. 
3f20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3f30: 7d 0a 20 20 20 20 69 66 28 20 78 2e 74 6d 43 75  }.    if( x.tmCu
3f40: 72 72 65 6e 74 3c 74 6d 4e 6f 77 20 26 26 20 62  rrent<tmNow && b
3f50: 61 63 6b 6f 66 66 69 63 65 50 72 6f 63 65 73 73  ackofficeProcess
3f60: 44 6f 6e 65 28 78 2e 69 64 43 75 72 72 65 6e 74  Done(x.idCurrent
3f70: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
3f80: 69 73 20 70 72 6f 63 65 73 73 20 63 61 6e 20 73  is process can s
3f90: 74 61 72 74 20 64 6f 69 6e 67 20 62 61 63 6b 6f  tart doing backo
3fa0: 66 66 69 63 65 20 77 6f 72 6b 20 69 6d 6d 65 64  ffice work immed
3fb0: 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20  iately */.      
3fc0: 78 2e 69 64 43 75 72 72 65 6e 74 20 3d 20 69 64  x.idCurrent = id
3fd0: 53 65 6c 66 3b 0a 20 20 20 20 20 20 78 2e 74 6d  Self;.      x.tm
3fe0: 43 75 72 72 65 6e 74 20 3d 20 74 6d 4e 6f 77 20  Current = tmNow 
3ff0: 2b 20 42 4b 4f 46 43 45 5f 4c 45 41 53 45 5f 54  + BKOFCE_LEASE_T
4000: 49 4d 45 3b 0a 20 20 20 20 20 20 78 2e 69 64 4e  IME;.      x.idN
4010: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 78  ext = 0;.      x
4020: 2e 74 6d 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  .tmNext = 0;.   
4030: 20 20 20 62 61 63 6b 6f 66 66 69 63 65 57 72 69     backofficeWri
4040: 74 65 4c 65 61 73 65 28 26 78 29 3b 0a 20 20 20  teLease(&x);.   
4050: 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61     db_end_transa
4060: 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20 20 20  ction(0);.      
4070: 62 61 63 6b 6f 66 66 69 63 65 54 72 61 63 65 28  backofficeTrace(
4080: 22 2f 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 42 61  "/***** Begin Ba
4090: 63 6b 6f 66 66 69 63 65 20 50 72 6f 63 65 73 73  ckoffice Process
40a0: 69 6e 67 20 25 64 20 2a 2a 2a 2a 2a 2f 5c 6e 22  ing %d *****/\n"
40b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
40c0: 20 20 20 20 20 20 20 20 47 45 54 50 49 44 28 29          GETPID()
40d0: 29 3b 0a 20 20 20 20 20 20 62 61 63 6b 6f 66 66  );.      backoff
40e0: 69 63 65 5f 77 6f 72 6b 28 29 3b 0a 20 20 20 20  ice_work();.    
40f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4100: 20 20 20 69 66 28 20 62 61 63 6b 6f 66 66 69 63     if( backoffic
4110: 65 4e 6f 44 65 6c 61 79 20 7c 7c 20 64 62 5f 67  eNoDelay || db_g
4120: 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 62 61 63 6b  et_boolean("back
4130: 6f 66 66 69 63 65 2d 6e 6f 64 65 6c 61 79 22 2c  office-nodelay",
4140: 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  0) ){.      /* I
4150: 66 20 74 68 65 20 6e 6f 2d 64 65 6c 61 79 20 66  f the no-delay f
4160: 6c 61 67 20 69 73 20 73 65 74 2c 20 65 78 69 74  lag is set, exit
4170: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 61 74   immediately rat
4180: 68 65 72 20 74 68 61 6e 20 71 75 65 75 69 6e 67  her than queuing
4190: 0a 20 20 20 20 20 20 2a 2a 20 75 70 2e 20 20 41  .      ** up.  A
41a0: 73 73 75 6d 65 20 74 68 61 74 20 73 6f 6d 65 20  ssume that some 
41b0: 66 75 74 75 72 65 20 72 65 71 75 65 73 74 20 77  future request w
41c0: 69 6c 6c 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 61  ill come along a
41d0: 6e 64 20 68 61 6e 64 6c 65 20 61 6e 79 0a 20 20  nd handle any.  
41e0: 20 20 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 79      ** necessary
41f0: 20 62 61 63 6b 6f 66 66 69 63 65 20 77 6f 72 6b   backoffice work
4200: 2e 20 2a 2f 0a 20 20 20 20 20 20 64 62 5f 65 6e  . */.      db_en
4210: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29  d_transaction(0)
4220: 3b 0a 20 20 20 20 20 20 62 61 63 6b 6f 66 66 69  ;.      backoffi
4230: 63 65 54 72 61 63 65 28 0a 20 20 20 20 20 20 20  ceTrace(.       
4240: 20 20 20 20 22 2f 2a 2a 2a 2a 2a 20 42 61 63 6b      "/***** Back
4250: 6f 66 66 69 63 65 20 4e 6f 2d 44 65 6c 61 79 20  office No-Delay 
4260: 45 78 69 74 20 46 6f 72 20 25 64 20 2a 2a 2a 2a  Exit For %d ****
4270: 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  */\n",.         
4280: 20 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20 20    GETPID());.   
4290: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 70 72 6f 63      /* This proc
42b0: 65 73 73 20 6e 65 65 64 73 20 74 6f 20 71 75 65  ess needs to que
42c0: 75 65 20 75 70 20 61 6e 64 20 77 61 69 74 20 66  ue up and wait f
42d0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
42e0: 65 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 65  ease.    ** to e
42f0: 78 70 69 72 65 20 62 65 66 6f 72 65 20 63 6f 6e  xpire before con
4300: 74 69 6e 75 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  tinuing. */.    
4310: 78 2e 69 64 4e 65 78 74 20 3d 20 69 64 53 65 6c  x.idNext = idSel
4320: 66 3b 0a 20 20 20 20 78 2e 74 6d 4e 65 78 74 20  f;.    x.tmNext 
4330: 3d 20 28 74 6d 4e 6f 77 3e 78 2e 74 6d 43 75 72  = (tmNow>x.tmCur
4340: 72 65 6e 74 20 3f 20 74 6d 4e 6f 77 20 3a 20 78  rent ? tmNow : x
4350: 2e 74 6d 43 75 72 72 65 6e 74 29 20 2b 20 42 4b  .tmCurrent) + BK
4360: 4f 46 43 45 5f 4c 45 41 53 45 5f 54 49 4d 45 3b  OFCE_LEASE_TIME;
4370: 0a 20 20 20 20 62 61 63 6b 6f 66 66 69 63 65 57  .    backofficeW
4380: 72 69 74 65 4c 65 61 73 65 28 26 78 29 3b 0a 20  riteLease(&x);. 
4390: 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61     db_end_transa
43a0: 63 74 69 6f 6e 28 30 29 3b 0a 20 20 20 20 62 61  ction(0);.    ba
43b0: 63 6b 6f 66 66 69 63 65 54 72 61 63 65 28 22 2f  ckofficeTrace("/
43c0: 2a 2a 2a 2a 2a 20 42 61 63 6b 6f 66 66 69 63 65  ***** Backoffice
43d0: 20 4f 6e 2d 64 65 63 6b 20 25 64 20 2a 2a 2a 2a   On-deck %d ****
43e0: 2a 2f 5c 6e 22 2c 20 20 47 45 54 50 49 44 28 29  */\n",  GETPID()
43f0: 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 74 6d 43  );.    if( x.tmC
4400: 75 72 72 65 6e 74 20 3e 3d 20 74 6d 4e 6f 77 20  urrent >= tmNow 
4410: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 61 63  ){.      if( bac
4420: 6b 6f 66 66 69 63 65 53 6c 65 65 70 28 31 30 30  kofficeSleep(100
4430: 30 2a 28 78 2e 74 6d 43 75 72 72 65 6e 74 20 2d  0*(x.tmCurrent -
4440: 20 74 6d 4e 6f 77 20 2b 20 31 29 29 20 29 7b 0a   tmNow + 1)) ){.
4450: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
4460: 6c 65 65 70 20 77 61 73 20 69 6e 74 65 72 72 75  leep was interru
4470: 70 74 65 64 20 62 79 20 61 20 73 69 67 6e 61 6c  pted by a signal
4480: 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68   from another th
4490: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  read. */.       
44a0: 20 62 61 63 6b 6f 66 66 69 63 65 54 72 61 63 65   backofficeTrace
44b0: 28 22 2f 2a 2a 2a 2a 2a 20 42 61 63 6b 6f 66 66  ("/***** Backoff
44c0: 69 63 65 20 49 6e 74 65 72 72 75 70 74 20 25 64  ice Interrupt %d
44d0: 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 47 45 54 50   *****/\n", GETP
44e0: 49 44 28 29 29 3b 0a 20 20 20 20 20 20 20 20 64  ID());.        d
44f0: 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  b_end_transactio
4500: 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  n(0);.        br
4510: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
4530: 28 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  ( (sqlite3_uint6
4540: 34 29 28 6c 61 73 74 57 61 72 6e 69 6e 67 2b 77  4)(lastWarning+w
4550: 61 72 6e 69 6e 67 44 65 6c 61 79 29 20 3c 20 74  arningDelay) < t
4560: 6d 4e 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  mNow ){.        
4570: 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 0a  fossil_warning(.
4580: 20 20 20 20 20 20 20 20 20 20 20 22 62 61 63 6b             "back
4590: 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73 20 25  office process %
45a0: 6c 6c 64 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e  lld still runnin
45b0: 67 20 61 66 74 65 72 20 25 64 20 73 65 63 6f 6e  g after %d secon
45c0: 64 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ds",.           
45d0: 78 2e 69 64 43 75 72 72 65 6e 74 2c 20 28 69 6e  x.idCurrent, (in
45e0: 74 29 28 42 4b 4f 46 43 45 5f 4c 45 41 53 45 5f  t)(BKOFCE_LEASE_
45f0: 54 49 4d 45 20 2b 20 74 6d 4e 6f 77 20 2d 20 78  TIME + tmNow - x
4600: 2e 74 6d 43 75 72 72 65 6e 74 29 29 3b 0a 20 20  .tmCurrent));.  
4610: 20 20 20 20 20 20 6c 61 73 74 57 61 72 6e 69 6e        lastWarnin
4620: 67 20 3d 20 74 6d 4e 6f 77 3b 0a 20 20 20 20 20  g = tmNow;.     
4630: 20 20 20 77 61 72 6e 69 6e 67 44 65 6c 61 79 20     warningDelay 
4640: 2a 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  *= 2;.      }.  
4650: 20 20 20 20 69 66 28 20 62 61 63 6b 6f 66 66 69      if( backoffi
4660: 63 65 53 6c 65 65 70 28 31 30 30 30 29 20 29 7b  ceSleep(1000) ){
4670: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
4680: 73 6c 65 65 70 20 77 61 73 20 69 6e 74 65 72 72  sleep was interr
4690: 75 70 74 65 64 20 62 79 20 61 20 73 69 67 6e 61  upted by a signa
46a0: 6c 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  l from another t
46b0: 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20  hread. */.      
46c0: 20 20 62 61 63 6b 6f 66 66 69 63 65 54 72 61 63    backofficeTrac
46d0: 65 28 22 2f 2a 2a 2a 2a 2a 20 42 61 63 6b 6f 66  e("/***** Backof
46e0: 66 69 63 65 20 49 6e 74 65 72 72 75 70 74 20 25  fice Interrupt %
46f0: 64 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 47 45 54  d *****/\n", GET
4700: 50 49 44 28 29 29 3b 0a 20 20 20 20 20 20 20 20  PID());.        
4710: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
4720: 6f 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 62  on(0);.        b
4730: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4740: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
4760: 64 20 74 6f 20 61 20 6d 65 73 73 61 67 65 20 74  d to a message t
4770: 6f 20 74 68 65 20 62 61 63 6b 6f 66 66 69 63 65  o the backoffice
4780: 20 6c 6f 67 2c 20 69 66 20 74 68 65 20 6c 6f 67   log, if the log
4790: 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 76 6f 69   is open..*/.voi
47a0: 64 20 62 61 63 6b 6f 66 66 69 63 65 5f 6c 6f 67  d backoffice_log
47b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
47c0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
47d0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
47e0: 62 61 63 6b 6f 66 66 69 63 65 42 6c 6f 62 3d 3d  backofficeBlob==
47f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62 6c  0 ) return;.  bl
4800: 6f 62 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 62  ob_append_char(b
4810: 61 63 6b 6f 66 66 69 63 65 42 6c 6f 62 2c 20 27  ackofficeBlob, '
4820: 20 27 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ');.  va_start(
4830: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
4840: 62 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28 62 61  blob_vappendf(ba
4850: 63 6b 6f 66 66 69 63 65 42 6c 6f 62 2c 20 7a 46  ckofficeBlob, zF
4860: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
4870: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 23 69 66  _end(ap);.}..#if
4880: 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   !defined(_WIN32
4890: 29 0a 2f 2a 0a 2a 2a 20 43 61 70 74 75 72 65 20  )./*.** Capture 
48a0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 69 67 6e  routine for sign
48b0: 61 6c 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  als while runnin
48c0: 67 20 62 61 63 6b 6f 66 66 69 63 65 2e 0a 2a 2f  g backoffice..*/
48d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 61 63  .static void bac
48e0: 6b 6f 66 66 69 63 65 5f 73 69 67 6e 61 6c 5f 68  koffice_signal_h
48f0: 61 6e 64 6c 65 72 28 69 6e 74 20 73 69 67 29 7b  andler(int sig){
4900: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4910: 53 69 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  Sig = 0;.  if( s
4920: 69 67 3d 3d 53 49 47 53 45 47 56 20 29 20 7a 53  ig==SIGSEGV ) zS
4930: 69 67 20 3d 20 22 53 49 47 53 45 47 56 22 3b 0a  ig = "SIGSEGV";.
4940: 20 20 69 66 28 20 73 69 67 3d 3d 53 49 47 46 50    if( sig==SIGFP
4950: 45 20 29 20 20 7a 53 69 67 20 3d 20 22 53 49 47  E )  zSig = "SIG
4960: 46 50 45 22 3b 0a 20 20 69 66 28 20 73 69 67 3d  FPE";.  if( sig=
4970: 3d 53 49 47 41 42 52 54 20 29 20 7a 53 69 67 20  =SIGABRT ) zSig 
4980: 3d 20 22 53 49 47 41 42 52 54 22 3b 0a 20 20 69  = "SIGABRT";.  i
4990: 66 28 20 73 69 67 3d 3d 53 49 47 49 4c 4c 20 29  f( sig==SIGILL )
49a0: 20 20 7a 53 69 67 20 3d 20 22 53 49 47 49 4c 4c    zSig = "SIGILL
49b0: 22 3b 0a 20 20 69 66 28 20 7a 53 69 67 3d 3d 30  ";.  if( zSig==0
49c0: 20 29 7b 0a 20 20 20 20 62 61 63 6b 6f 66 66 69   ){.    backoffi
49d0: 63 65 5f 6c 6f 67 28 22 73 69 67 6e 61 6c 2d 25  ce_log("signal-%
49e0: 64 22 2c 20 73 69 67 29 3b 0a 20 20 7d 65 6c 73  d", sig);.  }els
49f0: 65 7b 0a 20 20 20 20 62 61 63 6b 6f 66 66 69 63  e{.    backoffic
4a00: 65 5f 6c 6f 67 28 22 25 73 22 2c 20 7a 53 69 67  e_log("%s", zSig
4a10: 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  );.  }.  fprintf
4a20: 28 62 61 63 6b 6f 66 66 69 63 65 46 49 4c 45 2c  (backofficeFILE,
4a30: 20 22 25 73 5c 6e 22 2c 20 62 6c 6f 62 5f 73 74   "%s\n", blob_st
4a40: 72 28 62 61 63 6b 6f 66 66 69 63 65 42 6c 6f 62  r(backofficeBlob
4a50: 29 29 3b 0a 20 20 66 66 6c 75 73 68 28 62 61 63  ));.  fflush(bac
4a60: 6b 6f 66 66 69 63 65 46 49 4c 45 29 3b 0a 20 20  kofficeFILE);.  
4a70: 65 78 69 74 28 31 29 3b 0a 7d 0a 23 65 6e 64 69  exit(1);.}.#endi
4a80: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
4a90: 5f 57 49 4e 33 32 29 0a 2f 2a 0a 2a 2a 20 43 6f  _WIN32)./*.** Co
4aa0: 6e 76 65 72 74 20 61 20 73 74 72 75 63 74 20 74  nvert a struct t
4ab0: 69 6d 65 76 61 6c 20 69 6e 74 6f 20 61 6e 20 69  imeval into an i
4ac0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
4ad0: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 0a 2a 2f   microseconds.*/
4ae0: 0a 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 6e  .static long lon
4af0: 67 20 69 6e 74 20 74 76 6d 73 28 73 74 72 75 63  g int tvms(struc
4b00: 74 20 74 69 6d 65 76 61 6c 20 2a 70 29 7b 0a 20  t timeval *p){. 
4b10: 20 72 65 74 75 72 6e 20 28 28 6c 6f 6e 67 20 6c   return ((long l
4b20: 6f 6e 67 20 69 6e 74 29 70 2d 3e 74 76 5f 73 65  ong int)p->tv_se
4b30: 63 29 2a 31 30 30 30 30 30 30 20 2b 20 28 6c 6f  c)*1000000 + (lo
4b40: 6e 67 20 6c 6f 6e 67 20 69 6e 74 29 70 2d 3e 74  ng long int)p->t
4b50: 76 5f 75 73 65 63 3b 0a 7d 0a 23 65 6e 64 69 66  v_usec;.}.#endif
4b60: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
4b70: 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20 64 6f  utine runs to do
4b80: 20 74 68 65 20 62 61 63 6b 6f 66 66 69 63 65 20   the backoffice 
4b90: 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 57 68 65  processing.  Whe
4ba0: 6e 20 61 64 64 69 6e 67 20 6e 65 77 0a 2a 2a 20  n adding new.** 
4bb0: 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f 63 65  backoffice proce
4bc0: 73 73 69 6e 67 20 74 61 73 6b 73 2c 20 61 64 64  ssing tasks, add
4bd0: 20 74 68 65 6d 20 68 65 72 65 2e 0a 2a 2f 0a 76   them here..*/.v
4be0: 6f 69 64 20 62 61 63 6b 6f 66 66 69 63 65 5f 77  oid backoffice_w
4bf0: 6f 72 6b 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20  ork(void){.  /* 
4c00: 4c 6f 67 20 74 68 65 20 62 61 63 6b 6f 66 66 69  Log the backoffi
4c10: 63 65 20 72 75 6e 20 66 6f 72 20 74 65 73 74 69  ce run for testi
4c20: 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 46 6f  ng purposes.  Fo
4c30: 72 20 70 72 6f 64 75 63 74 69 6f 6e 20 64 65 70  r production dep
4c40: 6c 6f 79 6d 65 6e 74 73 0a 20 20 2a 2a 20 74 68  loyments.  ** th
4c50: 65 20 22 62 61 63 6b 6f 66 66 69 63 65 2d 6c 6f  e "backoffice-lo
4c60: 67 66 69 6c 65 22 20 70 72 6f 70 65 72 74 79 20  gfile" property 
4c70: 73 68 6f 75 6c 64 20 62 65 20 75 6e 73 65 74 20  should be unset 
4c80: 61 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  and the followin
4c90: 67 20 63 6f 64 65 0a 20 20 2a 2a 20 73 68 6f 75  g code.  ** shou
4ca0: 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 2a  ld be a no-op. *
4cb0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4cc0: 7a 4c 6f 67 20 3d 20 62 61 63 6b 6f 66 66 69 63  zLog = backoffic
4cd0: 65 4c 6f 67 66 69 6c 65 3b 0a 20 20 42 6c 6f 62  eLogfile;.  Blob
4ce0: 20 6c 6f 67 3b 0a 20 20 69 6e 74 20 6e 54 68 69   log;.  int nThi
4cf0: 73 3b 0a 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20  s;.  int nTotal 
4d00: 3d 20 30 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  = 0;.#if !define
4d10: 64 28 5f 57 49 4e 33 32 29 0a 20 20 73 74 72 75  d(_WIN32).  stru
4d20: 63 74 20 74 69 6d 65 76 61 6c 20 73 53 74 61 72  ct timeval sStar
4d30: 74 2c 20 73 45 6e 64 3b 0a 23 65 6e 64 69 66 0a  t, sEnd;.#endif.
4d40: 20 20 69 66 28 20 7a 4c 6f 67 3d 3d 30 20 29 20    if( zLog==0 ) 
4d50: 7a 4c 6f 67 20 3d 20 64 62 5f 67 65 74 28 22 62  zLog = db_get("b
4d60: 61 63 6b 6f 66 66 69 63 65 2d 6c 6f 67 66 69 6c  ackoffice-logfil
4d70: 65 22 2c 30 29 3b 0a 20 20 69 66 28 20 7a 4c 6f  e",0);.  if( zLo
4d80: 67 20 26 26 20 7a 4c 6f 67 5b 30 5d 20 26 26 20  g && zLog[0] && 
4d90: 28 62 61 63 6b 6f 66 66 69 63 65 46 49 4c 45 20  (backofficeFILE 
4da0: 3d 20 66 6f 73 73 69 6c 5f 66 6f 70 65 6e 28 7a  = fossil_fopen(z
4db0: 4c 6f 67 2c 22 61 22 29 29 21 3d 30 20 29 7b 0a  Log,"a"))!=0 ){.
4dc0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
4dd0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f  har *zName = db_
4de0: 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d  get("project-nam
4df0: 65 22 2c 30 29 3b 0a 23 69 66 20 21 64 65 66 69  e",0);.#if !defi
4e00: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20  ned(_WIN32).    
4e10: 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 53  gettimeofday(&sS
4e20: 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 73 69  tart, 0);.    si
4e30: 67 6e 61 6c 28 53 49 47 53 45 47 56 2c 20 62 61  gnal(SIGSEGV, ba
4e40: 63 6b 6f 66 66 69 63 65 5f 73 69 67 6e 61 6c 5f  ckoffice_signal_
4e50: 68 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 73 69  handler);.    si
4e60: 67 6e 61 6c 28 53 49 47 41 42 52 54 2c 20 62 61  gnal(SIGABRT, ba
4e70: 63 6b 6f 66 66 69 63 65 5f 73 69 67 6e 61 6c 5f  ckoffice_signal_
4e80: 68 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 73 69  handler);.    si
4e90: 67 6e 61 6c 28 53 49 47 46 50 45 2c 20 62 61 63  gnal(SIGFPE, bac
4ea0: 6b 6f 66 66 69 63 65 5f 73 69 67 6e 61 6c 5f 68  koffice_signal_h
4eb0: 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 73 69 67  andler);.    sig
4ec0: 6e 61 6c 28 53 49 47 49 4c 4c 2c 20 62 61 63 6b  nal(SIGILL, back
4ed0: 6f 66 66 69 63 65 5f 73 69 67 6e 61 6c 5f 68 61  office_signal_ha
4ee0: 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20  ndler);.#endif. 
4ef0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
4f00: 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ){.      zName =
4f10: 20 28 63 68 61 72 2a 29 66 69 6c 65 5f 74 61 69   (char*)file_tai
4f20: 6c 28 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e  l(g.zRepositoryN
4f30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
4f40: 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65  zName==0 ) zName
4f50: 20 3d 20 22 28 75 6e 6e 61 6d 65 64 29 22 3b 0a   = "(unnamed)";.
4f60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f70: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20   /* Convert all 
4f80: 73 70 61 63 65 73 20 69 6e 20 74 68 65 20 22 70  spaces in the "p
4f90: 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 20 69 6e 74  roject-name" int
4fa0: 6f 20 64 61 73 68 65 73 20 2a 2f 0a 20 20 20 20  o dashes */.    
4fb0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
4fc0: 5b 69 5d 3b 20 69 2b 2b 29 7b 20 69 66 28 20 7a  [i]; i++){ if( z
4fd0: 4e 61 6d 65 5b 69 5d 3d 3d 27 20 27 20 29 20 7a  Name[i]==' ' ) z
4fe0: 4e 61 6d 65 5b 69 5d 20 3d 20 27 2d 27 3b 20 7d  Name[i] = '-'; }
4ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f  .    }.    blob_
5000: 69 6e 69 74 28 26 6c 6f 67 2c 20 30 2c 20 30 29  init(&log, 0, 0)
5010: 3b 0a 20 20 20 20 62 61 63 6b 6f 66 66 69 63 65  ;.    backoffice
5020: 42 6c 6f 62 20 3d 20 26 6c 6f 67 3b 0a 20 20 20  Blob = &log;.   
5030: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 6c   blob_appendf(&l
5040: 6f 67 2c 20 22 25 73 20 25 73 22 2c 20 64 62 5f  og, "%s %s", db_
5050: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
5060: 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 22  datetime('now')"
5070: 29 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  ), zName);.  }..
5080: 20 20 2f 2a 20 48 65 72 65 20 69 73 20 77 68 65    /* Here is whe
5090: 72 65 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f  re the actual wo
50a0: 72 6b 20 6f 66 20 74 68 65 20 62 61 63 6b 6f 66  rk of the backof
50b0: 66 69 63 65 20 68 61 70 70 65 6e 73 20 2a 2f 0a  fice happens */.
50c0: 20 20 6e 54 68 69 73 20 3d 20 61 6c 65 72 74 5f    nThis = alert_
50d0: 62 61 63 6b 6f 66 66 69 63 65 28 30 29 3b 0a 20  backoffice(0);. 
50e0: 20 69 66 28 20 6e 54 68 69 73 20 29 7b 20 62 61   if( nThis ){ ba
50f0: 63 6b 6f 66 66 69 63 65 5f 6c 6f 67 28 22 25 64  ckoffice_log("%d
5100: 20 61 6c 65 72 74 73 22 2c 20 6e 54 68 69 73 29   alerts", nThis)
5110: 3b 20 6e 54 6f 74 61 6c 20 2b 3d 20 6e 54 68 69  ; nTotal += nThi
5120: 73 3b 20 7d 0a 20 20 6e 54 68 69 73 20 3d 20 68  s; }.  nThis = h
5130: 6f 6f 6b 5f 62 61 63 6b 6f 66 66 69 63 65 28 29  ook_backoffice()
5140: 3b 0a 20 20 69 66 28 20 6e 54 68 69 73 20 29 7b  ;.  if( nThis ){
5150: 20 62 61 63 6b 6f 66 66 69 63 65 5f 6c 6f 67 28   backoffice_log(
5160: 22 25 64 20 68 6f 6f 6b 73 22 2c 20 6e 54 68 69  "%d hooks", nThi
5170: 73 29 3b 20 6e 54 6f 74 61 6c 20 2b 3d 20 6e 54  s); nTotal += nT
5180: 68 69 73 3b 20 7d 0a 0a 20 20 2f 2a 20 43 6c 6f  his; }..  /* Clo
5190: 73 65 20 74 68 65 20 6c 6f 67 20 2a 2f 0a 20 20  se the log */.  
51a0: 69 66 28 20 62 61 63 6b 6f 66 66 69 63 65 46 49  if( backofficeFI
51b0: 4c 45 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 54  LE ){.    if( nT
51c0: 6f 74 61 6c 20 7c 7c 20 62 61 63 6b 6f 66 66 69  otal || backoffi
51d0: 63 65 4c 6f 67 44 65 74 61 69 6c 20 29 7b 0a 20  ceLogDetail ){. 
51e0: 20 20 20 20 20 69 66 28 20 6e 54 6f 74 61 6c 3d       if( nTotal=
51f0: 3d 30 20 29 20 62 61 63 6b 6f 66 66 69 63 65 5f  =0 ) backoffice_
5200: 6c 6f 67 28 22 6e 6f 2d 6f 70 22 29 3b 0a 23 69  log("no-op");.#i
5210: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f !defined(_WIN3
5220: 32 29 0a 20 20 20 20 20 20 67 65 74 74 69 6d 65  2).      gettime
5230: 6f 66 64 61 79 28 26 73 45 6e 64 2c 30 29 3b 0a  ofday(&sEnd,0);.
5240: 20 20 20 20 20 20 62 61 63 6b 6f 66 66 69 63 65        backoffice
5250: 5f 6c 6f 67 28 22 65 6c 61 70 73 65 2d 74 69 6d  _log("elapse-tim
5260: 65 20 25 64 20 75 73 22 2c 20 74 76 6d 73 28 26  e %d us", tvms(&
5270: 73 45 6e 64 29 20 2d 20 74 76 6d 73 28 26 73 53  sEnd) - tvms(&sS
5280: 74 61 72 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  tart));.#endif. 
5290: 20 20 20 20 20 66 70 72 69 6e 74 66 28 62 61 63       fprintf(bac
52a0: 6b 6f 66 66 69 63 65 46 49 4c 45 2c 20 22 25 73  kofficeFILE, "%s
52b0: 5c 6e 22 2c 20 62 6c 6f 62 5f 73 74 72 28 62 61  \n", blob_str(ba
52c0: 63 6b 6f 66 66 69 63 65 42 6c 6f 62 29 29 3b 0a  ckofficeBlob));.
52d0: 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
52e0: 28 62 61 63 6b 6f 66 66 69 63 65 46 49 4c 45 29  (backofficeFILE)
52f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
5300: 4f 4d 4d 41 4e 44 3a 20 62 61 63 6b 6f 66 66 69  OMMAND: backoffi
5310: 63 65 2a 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  ce*.**.** Usage:
5320: 20 25 66 6f 73 73 69 6c 20 62 61 63 6b 6f 66 66   %fossil backoff
5330: 69 63 65 20 5b 4f 50 54 49 4f 4e 53 2e 2e 2e 5d  ice [OPTIONS...]
5340: 20 5b 52 45 50 4f 53 49 54 4f 52 49 45 53 2e 2e   [REPOSITORIES..
5350: 2e 5d 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 62 61 63  .].**.** Run bac
5360: 6b 6f 66 66 69 63 65 20 70 72 6f 63 65 73 73 69  koffice processi
5370: 6e 67 20 6f 6e 20 74 68 65 20 72 65 70 6f 73 69  ng on the reposi
5380: 74 6f 72 69 65 73 20 6c 69 73 74 65 64 2e 20 20  tories listed.  
5390: 49 66 20 6e 6f 0a 2a 2a 20 72 65 70 6f 73 69 74  If no.** reposit
53a0: 6f 72 79 20 69 73 20 73 70 65 63 69 66 69 65 64  ory is specified
53b0: 2c 20 72 75 6e 20 69 74 20 6f 6e 20 74 68 65 20  , run it on the 
53c0: 72 65 70 6f 73 69 74 6f 72 79 20 6f 66 20 74 68  repository of th
53d0: 65 20 6c 6f 63 61 6c 20 63 68 65 63 6b 2d 6f 75  e local check-ou
53e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 69  t..**.** This mi
53f0: 67 68 74 20 62 65 20 64 6f 6e 65 20 62 79 20 61  ght be done by a
5400: 20 63 72 6f 6e 20 6a 6f 62 20 6f 72 20 73 69 6d   cron job or sim
5410: 69 6c 61 72 20 74 6f 20 6d 61 6b 65 20 73 75 72  ilar to make sur
5420: 65 20 62 61 63 6b 6f 66 66 69 63 65 0a 2a 2a 20  e backoffice.** 
5430: 70 72 6f 63 65 73 73 69 6e 67 20 68 61 70 70 65  processing happe
5440: 6e 73 20 70 65 72 69 6f 64 69 63 61 6c 6c 79 2e  ns periodically.
5450: 20 20 4f 72 2c 20 74 68 65 20 2d 2d 70 6f 6c 6c    Or, the --poll
5460: 20 6f 70 74 69 6f 6e 20 63 61 6e 20 62 65 20 75   option can be u
5470: 73 65 64 0a 2a 2a 20 74 6f 20 72 75 6e 20 74 68  sed.** to run th
5480: 69 73 20 63 6f 6d 6d 61 6e 64 20 61 73 20 61 20  is command as a 
5490: 64 61 65 6d 6f 6e 20 74 68 61 74 20 77 69 6c 6c  daemon that will
54a0: 20 70 65 72 69 6f 64 69 63 61 6c 6c 79 20 69 6e   periodically in
54b0: 76 6f 6b 65 20 62 61 63 6b 6f 66 66 69 63 65 0a  voke backoffice.
54c0: 2a 2a 20 6f 6e 20 61 20 63 6f 6c 6c 65 63 74 69  ** on a collecti
54d0: 6f 6e 20 6f 66 20 72 65 70 6f 73 69 74 6f 72 69  on of repositori
54e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 6c  es..**.** If onl
54f0: 79 20 61 20 73 69 6e 67 6c 65 20 72 65 70 6f 73  y a single repos
5500: 69 74 6f 72 79 20 69 73 20 6e 61 6d 65 64 20 61  itory is named a
5510: 6e 64 20 2d 2d 70 6f 6c 6c 20 69 73 20 6f 6d 69  nd --poll is omi
5520: 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a  tted, then the.*
5530: 2a 20 62 61 63 6b 6f 66 66 69 63 65 20 77 6f 72  * backoffice wor
5540: 6b 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 72 6f  k is done in-pro
5550: 63 65 73 73 2e 20 20 42 75 74 20 69 66 20 74 68  cess.  But if th
5560: 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65  ere are multiple
5570: 20 72 65 70 6f 73 69 74 6f 72 69 65 73 0a 2a 2a   repositories.**
5580: 20 6f 72 20 69 66 20 2d 2d 70 6f 6c 6c 20 69 73   or if --poll is
5590: 20 75 73 65 64 2c 20 61 20 73 65 70 61 72 61 74   used, a separat
55a0: 65 20 73 75 62 2d 70 72 6f 63 65 73 73 20 69 73  e sub-process is
55b0: 20 73 74 61 72 74 65 64 20 66 6f 72 20 65 61 63   started for eac
55c0: 68 20 70 6f 6c 6c 20 6f 66 0a 2a 2a 20 65 61 63  h poll of.** eac
55d0: 68 20 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2a  h repository..**
55e0: 0a 2a 2a 20 53 74 61 6e 64 61 72 64 20 6f 70 74  .** Standard opt
55f0: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2d  ions:.**.**    -
5600: 2d 64 65 62 75 67 20 20 20 20 20 20 20 20 20 20  -debug          
5610: 20 20 20 20 20 20 20 53 68 6f 77 20 77 68 61 74         Show what
5620: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73   this command is
5630: 20 64 6f 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 20 20   doing.**.**    
5640: 2d 2d 6c 6f 67 66 69 6c 65 20 46 49 4c 45 20 20  --logfile FILE  
5650: 20 20 20 20 20 20 20 20 41 70 70 65 6e 64 20 61          Append a
5660: 20 6c 6f 67 20 6f 66 20 62 61 63 6b 6f 66 66 69   log of backoffi
5670: 63 65 20 61 63 74 69 6f 6e 73 20 6f 6e 74 6f 20  ce actions onto 
5680: 46 49 4c 45 0a 2a 2a 0a 2a 2a 20 20 20 20 2d 2d  FILE.**.**    --
5690: 6d 69 6e 20 4e 20 20 20 20 20 20 20 20 20 20 20  min N           
56a0: 20 20 20 20 20 20 57 68 65 6e 20 70 6f 6c 6c 69        When polli
56b0: 6e 67 2c 20 69 6e 76 6f 6b 65 20 62 61 63 6b 6f  ng, invoke backo
56c0: 66 66 69 63 65 20 61 74 20 6c 65 61 73 74 0a 2a  ffice at least.*
56d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 63               onc
56f0: 65 20 65 76 65 72 79 20 4e 20 73 65 63 6f 6e 64  e every N second
5700: 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65  s even if the re
5710: 70 6f 73 69 74 6f 72 79 0a 2a 2a 20 20 20 20 20  pository.**     
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 20 20 6e 65 76 65 72 20 63 68 61         never cha
5740: 6e 67 65 73 2e 20 20 30 20 6f 72 20 6e 65 67 61  nges.  0 or nega
5750: 74 69 76 65 20 6d 65 61 6e 73 20 64 69 73 61 62  tive means disab
5760: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 74 68 69 73 20 66 65 61 74 75 72 65 2e 20 20   this feature.  
5790: 44 65 66 61 75 6c 74 3a 20 33 36 30 30 20 28 6f  Default: 3600 (o
57a0: 6e 63 65 20 70 65 72 20 68 6f 75 72 29 2e 0a 2a  nce per hour)..*
57b0: 2a 0a 2a 2a 20 20 20 20 2d 2d 70 6f 6c 6c 20 4e  *.**    --poll N
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 52 65 70 65 61 74 20 62 61 63 6b 6f 66 66 69 63  Repeat backoffic
57e0: 65 20 63 61 6c 6c 73 20 66 6f 72 20 72 65 70 6f  e calls for repo
57f0: 73 69 74 6f 72 69 65 73 20 74 68 61 74 0a 2a 2a  sitories that.**
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e              chan
5820: 67 65 20 69 6e 20 61 70 70 72 6f 78 69 6d 61 74  ge in approximat
5830: 65 6c 79 20 4e 2d 73 65 63 6f 6e 64 20 69 6e 74  ely N-second int
5840: 65 72 76 61 6c 73 2e 0a 2a 2a 20 20 20 20 20 20  ervals..**      
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 20 4e 20 6c 65 73 73 20 74 68 61        N less tha
5870: 6e 20 31 20 74 75 72 6e 73 20 70 6f 6c 6c 69 6e  n 1 turns pollin
5880: 67 20 6f 66 66 20 28 74 68 65 20 64 65 66 61 75  g off (the defau
5890: 6c 74 29 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  lt)..**         
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 20 52 65 63 6f 6d 6d 65 6e 64 65 64 20 70     Recommended p
58c0: 6f 6c 6c 69 6e 67 20 69 6e 74 65 72 76 61 6c 3a  olling interval:
58d0: 20 36 30 20 73 65 63 6f 6e 64 73 2e 0a 2a 2a 0a   60 seconds..**.
58e0: 2a 2a 20 20 20 20 2d 2d 74 72 61 63 65 20 20 20  **    --trace   
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 6e                En
5900: 61 62 6c 65 20 64 65 62 75 67 67 69 6e 67 20 6f  able debugging o
5910: 75 74 70 75 74 20 6f 6e 20 73 74 64 65 72 72 0a  utput on stderr.
5920: 2a 2a 0a 2a 2a 20 4f 70 74 69 6f 6e 73 20 69 6e  **.** Options in
5930: 74 65 6e 64 65 64 20 66 6f 72 20 69 6e 74 65 72  tended for inter
5940: 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 20 77 68 69  nal use only whi
5950: 63 68 20 6d 61 79 20 63 68 61 6e 67 65 20 6f 72  ch may change or
5960: 20 62 65 0a 2a 2a 20 64 69 73 63 6f 6e 74 69 6e   be.** discontin
5970: 75 65 64 20 69 6e 20 66 75 74 75 72 65 20 72 65  ued in future re
5980: 6c 65 61 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  leases:.**.**   
5990: 20 2d 2d 6e 6f 64 65 6c 61 79 20 20 20 20 20 20   --nodelay      
59a0: 20 20 20 20 20 20 20 20 20 44 6f 20 6e 6f 74 20           Do not 
59b0: 71 75 65 75 65 20 75 70 20 6f 72 20 77 61 69 74  queue up or wait
59c0: 20 66 6f 72 20 61 20 62 61 63 6b 6f 66 66 69 63   for a backoffic
59d0: 65 20 6a 6f 62 0a 2a 2a 20 20 20 20 20 20 20 20  e job.**        
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 74 6f 20 63 6f 6d 70 6c 65 74 65 2e      to complete.
5a00: 20 49 66 20 6e 6f 20 77 6f 72 6b 20 69 73 20 61   If no work is a
5a10: 76 61 69 6c 61 62 6c 65 20 6f 72 20 69 66 0a 2a  vailable or if.*
5a20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 61 63               bac
5a40: 6b 6f 66 66 69 63 65 20 68 61 73 20 72 75 6e 20  koffice has run 
5a50: 72 65 63 65 6e 74 6c 79 2c 20 72 65 74 75 72 6e  recently, return
5a60: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2a   immediately..**
5a70: 0a 2a 2a 20 20 20 20 2d 2d 6e 6f 6c 65 61 73 65  .**    --nolease
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
5a90: 6c 77 61 79 73 20 72 75 6e 20 62 61 63 6b 6f 66  lways run backof
5aa0: 66 69 63 65 2c 20 65 76 65 6e 20 69 66 20 74 68  fice, even if th
5ab0: 65 72 65 20 69 73 20 61 20 6c 65 61 73 65 0a 2a  ere is a lease.*
5ac0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
5ae0: 66 6c 69 63 74 2e 20 20 54 68 69 73 20 6f 70 74  flict.  This opt
5af0: 69 6f 6e 20 69 6d 70 6c 69 65 73 20 2d 2d 6e 6f  ion implies --no
5b00: 64 65 6c 61 79 2e 20 20 54 68 69 73 0a 2a 2a 20  delay.  This.** 
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f             optio
5b30: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 73 65  n is added to se
5b40: 63 6f 6e 64 61 72 79 20 62 61 63 6b 6f 66 66 69  condary backoffi
5b50: 63 65 20 63 6f 6d 6d 61 6e 64 73 0a 2a 2a 20 20  ce commands.**  
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
5b80: 72 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  re invoked by th
5b90: 65 20 2d 2d 70 6f 6c 6c 20 6f 70 74 69 6f 6e 2e  e --poll option.
5ba0: 0a 2a 2f 0a 76 6f 69 64 20 62 61 63 6b 6f 66 66  .*/.void backoff
5bb0: 69 63 65 5f 63 6f 6d 6d 61 6e 64 28 76 6f 69 64  ice_command(void
5bc0: 29 7b 0a 20 20 69 6e 74 20 6e 50 6f 6c 6c 3b 0a  ){.  int nPoll;.
5bd0: 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 63 6f    int nMin;.  co
5be0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 6c 6c 3b  nst char *zPoll;
5bf0: 0a 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20  .  int bDebug = 
5c00: 30 3b 0a 20 20 69 6e 74 20 62 4e 6f 4c 65 61 73  0;.  int bNoLeas
5c10: 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
5c20: 64 20 69 6e 74 20 6e 43 6d 64 20 3d 20 30 3b 0a  d int nCmd = 0;.
5c30: 20 20 69 66 28 20 66 69 6e 64 5f 6f 70 74 69 6f    if( find_optio
5c40: 6e 28 22 74 72 61 63 65 22 2c 30 2c 30 29 21 3d  n("trace",0,0)!=
5c50: 30 20 29 20 67 2e 66 41 6e 79 54 72 61 63 65 20  0 ) g.fAnyTrace 
5c60: 3d 20 31 3b 0a 20 20 69 66 28 20 66 69 6e 64 5f  = 1;.  if( find_
5c70: 6f 70 74 69 6f 6e 28 22 6e 6f 64 65 6c 61 79 22  option("nodelay"
5c80: 2c 30 2c 30 29 21 3d 30 20 29 20 62 61 63 6b 6f  ,0,0)!=0 ) backo
5c90: 66 66 69 63 65 4e 6f 44 65 6c 61 79 20 3d 20 31  fficeNoDelay = 1
5ca0: 3b 0a 20 20 62 61 63 6b 6f 66 66 69 63 65 4c 6f  ;.  backofficeLo
5cb0: 67 66 69 6c 65 20 3d 20 66 69 6e 64 5f 6f 70 74  gfile = find_opt
5cc0: 69 6f 6e 28 22 6c 6f 67 66 69 6c 65 22 2c 30 2c  ion("logfile",0,
5cd0: 31 29 3b 0a 20 20 7a 50 6f 6c 6c 20 3d 20 66 69  1);.  zPoll = fi
5ce0: 6e 64 5f 6f 70 74 69 6f 6e 28 22 70 6f 6c 6c 22  nd_option("poll"
5cf0: 2c 30 2c 31 29 3b 0a 20 20 6e 50 6f 6c 6c 20 3d  ,0,1);.  nPoll =
5d00: 20 7a 50 6f 6c 6c 20 3f 20 61 74 6f 69 28 7a 50   zPoll ? atoi(zP
5d10: 6f 6c 6c 29 20 3a 20 30 3b 0a 20 20 7a 50 6f 6c  oll) : 0;.  zPol
5d20: 6c 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  l = find_option(
5d30: 22 6d 69 6e 22 2c 30 2c 31 29 3b 0a 20 20 6e 4d  "min",0,1);.  nM
5d40: 69 6e 20 3d 20 7a 50 6f 6c 6c 20 3f 20 61 74 6f  in = zPoll ? ato
5d50: 69 28 7a 50 6f 6c 6c 29 20 3a 20 33 36 30 30 3b  i(zPoll) : 3600;
5d60: 0a 20 20 62 44 65 62 75 67 20 3d 20 66 69 6e 64  .  bDebug = find
5d70: 5f 6f 70 74 69 6f 6e 28 22 64 65 62 75 67 22 2c  _option("debug",
5d80: 30 2c 30 29 21 3d 30 3b 0a 20 20 62 4e 6f 4c 65  0,0)!=0;.  bNoLe
5d90: 61 73 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f  ase = find_optio
5da0: 6e 28 22 6e 6f 6c 65 61 73 65 22 2c 30 2c 30 29  n("nolease",0,0)
5db0: 21 3d 30 3b 0a 0a 20 20 2f 2a 20 53 69 6c 65 6e  !=0;..  /* Silen
5dc0: 74 6c 79 20 63 6f 6e 73 75 6d 65 20 74 68 65 20  tly consume the 
5dd0: 2d 52 20 6f 72 20 2d 2d 72 65 70 6f 73 69 74 6f  -R or --reposito
5de0: 72 79 20 66 6c 61 67 2c 20 6c 65 61 76 69 6e 67  ry flag, leaving
5df0: 20 62 65 68 69 6e 64 20 69 74 73 0a 20 20 2a 2a   behind its.  **
5e00: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
5e10: 69 73 20 66 6f 72 20 6c 65 67 61 63 79 20 63 6f  is for legacy co
5e20: 6d 70 61 74 69 62 69 6c 69 74 79 2e 20 4f 6c 64  mpatibility. Old
5e30: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  er versions of t
5e40: 68 65 0a 20 20 2a 2a 20 62 61 63 6b 6f 66 66 69  he.  ** backoffi
5e50: 63 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20  ce command only 
5e60: 72 61 6e 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  ran on a single 
5e70: 72 65 70 6f 73 69 74 6f 72 79 20 74 68 61 74 20  repository that 
5e80: 77 61 73 20 73 70 65 63 69 66 69 65 64 0a 20 20  was specified.  
5e90: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 2d 52 20  ** using the -R 
5ea0: 6f 70 74 69 6f 6e 2e 20 2a 2f 0a 20 20 28 76 6f  option. */.  (vo
5eb0: 69 64 29 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22  id)find_option("
5ec0: 72 65 70 6f 73 69 74 6f 72 79 22 2c 22 52 22 2c  repository","R",
5ed0: 30 29 3b 0a 0a 20 20 76 65 72 69 66 79 5f 61 6c  0);..  verify_al
5ee0: 6c 5f 6f 70 74 69 6f 6e 73 28 29 3b 0a 20 20 69  l_options();.  i
5ef0: 66 28 20 67 2e 61 72 67 63 3e 33 20 7c 7c 20 6e  f( g.argc>3 || n
5f00: 50 6f 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  Poll>0 ){.    /*
5f10: 20 45 69 74 68 65 72 20 74 68 65 72 65 20 61 72   Either there ar
5f20: 65 20 6d 75 6c 74 69 70 6c 65 20 72 65 70 6f 73  e multiple repos
5f30: 69 74 6f 72 69 65 73 20 6e 61 6d 65 64 20 6f 6e  itories named on
5f40: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   the command-lin
5f50: 65 0a 20 20 20 20 2a 2a 20 6f 72 20 77 65 20 61  e.    ** or we a
5f60: 72 65 20 70 6f 6c 6c 69 6e 67 2e 20 20 49 6e 20  re polling.  In 
5f70: 65 69 74 68 65 72 20 63 61 73 65 2c 20 65 61 63  either case, eac
5f80: 68 20 62 61 63 6b 6f 66 66 69 63 65 20 73 68 6f  h backoffice sho
5f90: 75 6c 64 20 62 65 20 72 75 6e 0a 20 20 20 20 2a  uld be run.    *
5fa0: 2a 20 75 73 69 6e 67 20 61 20 73 65 70 61 72 61  * using a separa
5fb0: 74 65 20 73 75 62 2d 70 72 6f 63 65 73 73 20 2a  te sub-process *
5fc0: 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  /.    int i;.   
5fd0: 20 74 69 6d 65 5f 74 20 69 4e 6f 77 20 3d 20 30   time_t iNow = 0
5fe0: 3b 0a 20 20 20 20 74 69 6d 65 5f 74 20 69 78 3b  ;.    time_t ix;
5ff0: 0a 20 20 20 20 69 36 34 20 2a 61 4c 61 73 74 52  .    i64 *aLastR
6000: 75 6e 20 3d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c  un = fossil_mall
6010: 6f 63 28 20 73 69 7a 65 6f 66 28 69 36 34 29 2a  oc( sizeof(i64)*
6020: 67 2e 61 72 67 63 20 29 3b 0a 20 20 20 20 6d 65  g.argc );.    me
6030: 6d 73 65 74 28 61 4c 61 73 74 52 75 6e 2c 20 30  mset(aLastRun, 0
6040: 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 2a 67 2e  , sizeof(i64)*g.
6050: 61 72 67 63 20 29 3b 0a 20 20 20 20 77 68 69 6c  argc );.    whil
6060: 65 28 20 31 20 2f 2a 20 65 78 69 74 20 76 69 61  e( 1 /* exit via
6070: 20 22 62 72 65 61 6b 3b 22 20 2a 2f 29 7b 0a 20   "break;" */){. 
6080: 20 20 20 20 20 74 69 6d 65 5f 74 20 69 4e 65 78       time_t iNex
6090: 74 20 3d 20 74 69 6d 65 28 30 29 3b 0a 20 20 20  t = time(0);.   
60a0: 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e     for(i=2; i<g.
60b0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
60c0: 20 20 20 20 42 6c 6f 62 20 63 6d 64 3b 0a 20 20      Blob cmd;.  
60d0: 20 20 20 20 20 20 69 66 28 20 21 66 69 6c 65 5f        if( !file_
60e0: 69 73 66 69 6c 65 28 67 2e 61 72 67 76 5b 69 5d  isfile(g.argv[i]
60f0: 2c 20 45 78 74 46 49 4c 45 29 20 29 7b 0a 20 20  , ExtFILE) ){.  
6100: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
6110: 3b 20 20 2f 2a 20 52 65 70 6f 20 6e 6f 20 6c 6f  ;  /* Repo no lo
6120: 6e 67 65 72 20 65 78 69 73 74 73 2e 20 20 49 67  nger exists.  Ig
6130: 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  nore it. */.    
6140: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6150: 28 20 69 4e 6f 77 0a 20 20 20 20 20 20 20 20 20  ( iNow.         
6160: 26 26 20 69 4e 6f 77 3e 66 69 6c 65 5f 6d 74 69  && iNow>file_mti
6170: 6d 65 28 67 2e 61 72 67 76 5b 69 5d 2c 20 45 78  me(g.argv[i], Ex
6180: 74 46 49 4c 45 29 0a 20 20 20 20 20 20 20 20 20  tFILE).         
6190: 26 26 20 28 6e 4d 69 6e 3c 3d 30 20 7c 7c 20 61  && (nMin<=0 || a
61a0: 4c 61 73 74 52 75 6e 5b 69 5d 2b 6e 4d 69 6e 3e  LastRun[i]+nMin>
61b0: 69 4e 6f 77 29 0a 20 20 20 20 20 20 20 20 29 7b  iNow).        ){
61c0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
61d0: 6e 75 65 3b 20 20 2f 2a 20 4e 6f 74 20 79 65 74  nue;  /* Not yet
61e0: 20 74 69 6d 65 20 74 6f 20 72 75 6e 20 74 68 69   time to run thi
61f0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20  s one */.       
6200: 20 7d 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f   }.        blob_
6210: 69 6e 69 74 28 26 63 6d 64 2c 20 30 2c 20 30 29  init(&cmd, 0, 0)
6220: 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61  ;.        blob_a
6230: 70 70 65 6e 64 5f 65 73 63 61 70 65 64 5f 61 72  ppend_escaped_ar
6240: 67 28 26 63 6d 64 2c 20 67 2e 6e 61 6d 65 4f 66  g(&cmd, g.nameOf
6250: 45 78 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Exe, 1);.       
6260: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 6d   blob_append(&cm
6270: 64 2c 20 22 20 62 61 63 6b 6f 66 66 69 63 65 20  d, " backoffice 
6280: 2d 2d 6e 6f 64 65 6c 61 79 22 2c 20 2d 31 29 3b  --nodelay", -1);
6290: 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 2e 66  .        if( g.f
62a0: 41 6e 79 54 72 61 63 65 20 29 7b 0a 20 20 20 20  AnyTrace ){.    
62b0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
62c0: 64 28 26 63 6d 64 2c 20 22 20 2d 2d 74 72 61 63  d(&cmd, " --trac
62d0: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  e", -1);.       
62e0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 62   }.        if( b
62f0: 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 20  Debug ){.       
6300: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
6310: 63 6d 64 2c 20 22 20 2d 2d 64 65 62 75 67 22 2c  cmd, " --debug",
6320: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
6330: 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 6f 6c          if( nPol
6340: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>0 ){.         
6350: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 6d   blob_append(&cm
6360: 64 2c 20 22 20 2d 2d 6e 6f 6c 65 61 73 65 22 2c  d, " --nolease",
6370: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
6380: 20 20 20 20 20 20 20 20 69 66 28 20 62 61 63 6b          if( back
6390: 6f 66 66 69 63 65 4c 6f 67 66 69 6c 65 20 29 7b  officeLogfile ){
63a0: 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  .          blob_
63b0: 61 70 70 65 6e 64 28 26 63 6d 64 2c 20 22 20 2d  append(&cmd, " -
63c0: 2d 6c 6f 67 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  -logfile", -1);.
63d0: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61            blob_a
63e0: 70 70 65 6e 64 5f 65 73 63 61 70 65 64 5f 61 72  ppend_escaped_ar
63f0: 67 28 26 63 6d 64 2c 20 62 61 63 6b 6f 66 66 69  g(&cmd, backoffi
6400: 63 65 4c 6f 67 66 69 6c 65 2c 20 31 29 3b 0a 20  ceLogfile, 1);. 
6410: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6420: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 65 73 63   blob_append_esc
6430: 61 70 65 64 5f 61 72 67 28 26 63 6d 64 2c 20 67  aped_arg(&cmd, g
6440: 2e 61 72 67 76 5b 69 5d 2c 20 31 29 3b 0a 20 20  .argv[i], 1);.  
6450: 20 20 20 20 20 20 6e 43 6d 64 2b 2b 3b 0a 20 20        nCmd++;.  
6460: 20 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67        if( bDebug
6470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
6480: 73 73 69 6c 5f 70 72 69 6e 74 28 22 43 4f 4d 4d  ssil_print("COMM
6490: 41 4e 44 5b 25 75 5d 3a 20 25 73 5c 6e 22 2c 20  AND[%u]: %s\n", 
64a0: 6e 43 6d 64 2c 20 62 6c 6f 62 5f 73 74 72 28 26  nCmd, blob_str(&
64b0: 63 6d 64 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  cmd));.        }
64c0: 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f  .        fossil_
64d0: 73 79 73 74 65 6d 28 62 6c 6f 62 5f 73 74 72 28  system(blob_str(
64e0: 26 63 6d 64 29 29 3b 0a 20 20 20 20 20 20 20 20  &cmd));.        
64f0: 61 4c 61 73 74 52 75 6e 5b 69 5d 20 3d 20 69 4e  aLastRun[i] = iN
6500: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f  ext;.        blo
6510: 62 5f 72 65 73 65 74 28 26 63 6d 64 29 3b 0a 20  b_reset(&cmd);. 
6520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6530: 20 6e 50 6f 6c 6c 3c 31 20 29 20 62 72 65 61 6b   nPoll<1 ) break
6540: 3b 0a 20 20 20 20 20 20 69 4e 6f 77 20 3d 20 69  ;.      iNow = i
6550: 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 78 20 3d  Next;.      ix =
6560: 20 74 69 6d 65 28 30 29 3b 0a 20 20 20 20 20 20   time(0);.      
6570: 69 66 28 20 69 78 20 3c 20 69 4e 6f 77 2b 6e 50  if( ix < iNow+nP
6580: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oll ){.        s
6590: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 53  qlite3_int64 nMS
65a0: 20 3d 20 28 69 4e 6f 77 20 2b 20 6e 50 6f 6c 6c   = (iNow + nPoll
65b0: 20 2d 20 69 78 29 2a 31 30 30 30 3b 0a 20 20 20   - ix)*1000;.   
65c0: 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67 20       if( bDebug 
65d0: 29 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 53  )fossil_print("S
65e0: 4c 45 45 50 3a 20 25 6c 6c 64 5c 6e 22 2c 20 6e  LEEP: %lld\n", n
65f0: 4d 53 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  MS);.        sql
6600: 69 74 65 33 5f 73 6c 65 65 70 28 28 69 6e 74 29  ite3_sleep((int)
6610: 6e 4d 53 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nMS);.      }.  
6620: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
6630: 20 2f 2a 20 4e 6f 74 20 70 6f 6c 6c 69 6e 67 20   /* Not polling 
6640: 61 6e 64 20 6f 6e 6c 79 20 6f 6e 65 20 72 65 70  and only one rep
6650: 6f 73 69 74 6f 72 79 20 6e 61 6d 65 64 2e 20 20  ository named.  
6660: 42 61 63 6b 6f 66 66 69 63 65 20 69 73 20 72 75  Backoffice is ru
6670: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 20 62 79  n.    ** once by
6680: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 77   this process, w
6690: 68 69 63 68 20 74 68 65 6e 20 65 78 69 74 73 20  hich then exits 
66a0: 2a 2f 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67  */.    if( g.arg
66b0: 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 67 2e  c==3 ){.      g.
66c0: 7a 52 65 70 6f 73 69 74 6f 72 79 4f 70 74 69 6f  zRepositoryOptio
66d0: 6e 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20  n = g.argv[2];. 
66e0: 20 20 20 20 20 67 2e 61 72 67 63 2d 2d 3b 0a 20       g.argc--;. 
66f0: 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 64     }.    db_find
6700: 5f 61 6e 64 5f 6f 70 65 6e 5f 72 65 70 6f 73 69  _and_open_reposi
6710: 74 6f 72 79 28 30 2c 30 29 3b 0a 20 20 20 20 69  tory(0,0);.    i
6720: 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20 20  f( bDebug ){.   
6730: 20 20 20 62 61 63 6b 6f 66 66 69 63 65 4c 6f 67     backofficeLog
6740: 44 65 74 61 69 6c 20 3d 20 31 3b 0a 20 20 20 20  Detail = 1;.    
6750: 7d 0a 20 20 20 20 69 66 28 20 62 4e 6f 4c 65 61  }.    if( bNoLea
6760: 73 65 20 29 7b 0a 20 20 20 20 20 20 62 61 63 6b  se ){.      back
6770: 6f 66 66 69 63 65 5f 77 6f 72 6b 28 29 3b 0a 20  office_work();. 
6780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6790: 62 61 63 6b 6f 66 66 69 63 65 5f 74 68 72 65 61  backoffice_threa
67a0: 64 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  d();.    }.  }.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
67c0: 74 68 65 20 6d 61 69 6e 20 69 6e 74 65 72 66 61  the main interfa
67d0: 63 65 20 74 6f 20 62 61 63 6b 6f 66 66 69 63 65  ce to backoffice
67e0: 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74 20 6f   from the rest o
67f0: 66 20 74 68 65 20 73 79 73 74 65 6d 2e 0a 2a 2a  f the system..**
6800: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 61   This routine la
6810: 75 6e 63 68 65 73 20 65 69 74 68 65 72 20 62 61  unches either ba
6820: 63 6b 6f 66 66 69 63 65 5f 74 68 72 65 61 64 28  ckoffice_thread(
6830: 29 20 64 69 72 65 63 74 6c 79 20 6f 72 20 61 73  ) directly or as
6840: 20 61 0a 2a 2a 20 73 75 62 70 72 6f 63 65 73 73   a.** subprocess
6850: 2e 0a 2a 2f 0a 76 6f 69 64 20 62 61 63 6b 6f 66  ..*/.void backof
6860: 66 69 63 65 5f 72 75 6e 5f 69 66 5f 6e 65 65 64  fice_run_if_need
6870: 65 64 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  ed(void){.  if( 
6880: 62 61 63 6b 6f 66 66 69 63 65 44 62 3d 3d 30 20  backofficeDb==0 
6890: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
68a0: 73 74 72 63 6d 70 28 62 61 63 6b 6f 66 66 69 63  strcmp(backoffic
68b0: 65 44 62 2c 22 78 22 29 3d 3d 30 20 29 20 72 65  eDb,"x")==0 ) re
68c0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 67 2e 64 62  turn;.  if( g.db
68d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
68e0: 20 67 2e 72 65 70 6f 73 69 74 6f 72 79 4f 70 65   g.repositoryOpe
68f0: 6e 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20  n ) return;.#if 
6900: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
6910: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
6920: 20 20 20 69 6e 74 70 74 72 5f 74 20 78 3b 0a 20     intptr_t x;. 
6930: 20 20 20 63 68 61 72 20 2a 61 72 67 76 5b 34 5d     char *argv[4]
6940: 3b 0a 20 20 20 20 77 63 68 61 72 5f 74 20 2a 61  ;.    wchar_t *a
6950: 78 5b 35 5d 3b 0a 20 20 20 20 61 72 67 76 5b 30  x[5];.    argv[0
6960: 5d 20 3d 20 67 2e 6e 61 6d 65 4f 66 45 78 65 3b  ] = g.nameOfExe;
6970: 0a 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 22  .    argv[1] = "
6980: 62 61 63 6b 6f 66 66 69 63 65 22 3b 0a 20 20 20  backoffice";.   
6990: 20 61 72 67 76 5b 32 5d 20 3d 20 22 2d 52 22 3b   argv[2] = "-R";
69a0: 0a 20 20 20 20 61 72 67 76 5b 33 5d 20 3d 20 62  .    argv[3] = b
69b0: 61 63 6b 6f 66 66 69 63 65 44 62 3b 0a 20 20 20  ackofficeDb;.   
69c0: 20 61 78 5b 34 5d 20 3d 20 30 3b 0a 20 20 20 20   ax[4] = 0;.    
69d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 33 3b 20 69  for(i=0; i<=3; i
69e0: 2b 2b 29 20 61 78 5b 69 5d 20 3d 20 66 6f 73 73  ++) ax[i] = foss
69f0: 69 6c 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f  il_utf8_to_unico
6a00: 64 65 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  de(argv[i]);.   
6a10: 20 78 20 3d 20 5f 77 73 70 61 77 6e 76 28 5f 50   x = _wspawnv(_P
6a20: 5f 4e 4f 57 41 49 54 2c 20 61 78 5b 30 5d 2c 20  _NOWAIT, ax[0], 
6a30: 28 63 6f 6e 73 74 20 77 63 68 61 72 5f 74 20 2a  (const wchar_t *
6a40: 20 63 6f 6e 73 74 20 2a 29 61 78 29 3b 0a 20 20   const *)ax);.  
6a50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 33 3b    for(i=0; i<=3;
6a60: 20 69 2b 2b 29 20 66 6f 73 73 69 6c 5f 75 6e 69   i++) fossil_uni
6a70: 63 6f 64 65 5f 66 72 65 65 28 61 78 5b 69 5d 29  code_free(ax[i])
6a80: 3b 0a 20 20 20 20 62 61 63 6b 6f 66 66 69 63 65  ;.    backoffice
6a90: 54 72 61 63 65 28 0a 20 20 20 20 20 20 22 2f 2a  Trace(.      "/*
6aa0: 2a 2a 2a 2a 20 53 75 62 70 72 6f 63 65 73 73 20  **** Subprocess 
6ab0: 25 64 20 63 72 65 61 74 65 73 20 62 61 63 6b 6f  %d creates backo
6ac0: 66 66 69 63 65 20 63 68 69 6c 64 20 25 6c 75 20  ffice child %lu 
6ad0: 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20  *****/\n",.     
6ae0: 20 47 45 54 50 49 44 28 29 2c 20 47 65 74 50 72   GETPID(), GetPr
6af0: 6f 63 65 73 73 49 64 28 28 48 41 4e 44 4c 45 29  ocessId((HANDLE)
6b00: 78 29 29 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d  x));.    if( x>=
6b10: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
6b20: 23 65 6c 73 65 20 2f 2a 20 75 6e 69 78 20 2a 2f  #else /* unix */
6b30: 0a 20 20 7b 0a 20 20 20 20 70 69 64 5f 74 20 70  .  {.    pid_t p
6b40: 69 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20  id = fork();.   
6b50: 20 69 66 28 20 70 69 64 3e 30 20 29 7b 0a 20 20   if( pid>0 ){.  
6b60: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
6b70: 68 65 20 70 61 72 65 6e 74 20 69 6e 20 61 20 73  he parent in a s
6b80: 75 63 63 65 73 73 66 75 6c 20 66 6f 72 6b 28 29  uccessful fork()
6b90: 2e 20 20 52 65 74 75 72 6e 20 69 6d 6d 65 64 69  .  Return immedi
6ba0: 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  ately. */.      
6bb0: 62 61 63 6b 6f 66 66 69 63 65 54 72 61 63 65 28  backofficeTrace(
6bc0: 0a 20 20 20 20 20 20 20 20 22 2f 2a 2a 2a 2a 2a  .        "/*****
6bd0: 20 53 75 62 70 72 6f 63 65 73 73 20 25 64 20 63   Subprocess %d c
6be0: 72 65 61 74 65 73 20 62 61 63 6b 6f 66 66 69 63  reates backoffic
6bf0: 65 20 63 68 69 6c 64 20 25 64 20 2a 2a 2a 2a 2a  e child %d *****
6c00: 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 47 45  /\n",.        GE
6c10: 54 50 49 44 28 29 2c 20 28 69 6e 74 29 70 69 64  TPID(), (int)pid
6c20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
6c30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6c40: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  id==0 ){.      /
6c50: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 68  * This is the ch
6c60: 69 6c 64 20 6f 66 20 61 20 73 75 63 63 65 73 73  ild of a success
6c70: 66 75 6c 20 66 6f 72 6b 28 29 2e 20 20 52 75 6e  ful fork().  Run
6c80: 20 62 61 63 6b 6f 66 66 69 63 65 2e 20 2a 2f 0a   backoffice. */.
6c90: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
6ca0: 20 20 20 73 65 74 73 69 64 28 29 3b 0a 20 20 20     setsid();.   
6cb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 32     for(i=0; i<=2
6cc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6cd0: 63 6c 6f 73 65 28 69 29 3b 0a 20 20 20 20 20 20  close(i);.      
6ce0: 20 20 6f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c    open("/dev/nul
6cf0: 6c 22 2c 20 4f 5f 52 44 57 52 29 3b 0a 20 20 20  l", O_RDWR);.   
6d00: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
6d10: 3d 33 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b  =3; i<100; i++){
6d20: 20 63 6c 6f 73 65 28 69 29 3b 20 7d 0a 20 20 20   close(i); }.   
6d30: 20 20 20 67 2e 66 44 65 62 75 67 20 3d 20 30 3b     g.fDebug = 0;
6d40: 0a 20 20 20 20 20 20 67 2e 68 74 74 70 49 6e 20  .      g.httpIn 
6d50: 3d 20 30 3b 0a 20 20 20 20 20 20 67 2e 68 74 74  = 0;.      g.htt
6d60: 70 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pOut = 0;.      
6d70: 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f  db_open_reposito
6d80: 72 79 28 62 61 63 6b 6f 66 66 69 63 65 44 62 29  ry(backofficeDb)
6d90: 3b 0a 20 20 20 20 20 20 62 61 63 6b 6f 66 66 69  ;.      backoffi
6da0: 63 65 44 62 20 3d 20 22 78 22 3b 0a 20 20 20 20  ceDb = "x";.    
6db0: 20 20 62 61 63 6b 6f 66 66 69 63 65 5f 74 68 72    backoffice_thr
6dc0: 65 61 64 28 29 3b 0a 20 20 20 20 20 20 64 62 5f  ead();.      db_
6dd0: 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20  close(1);.      
6de0: 62 61 63 6b 6f 66 66 69 63 65 54 72 61 63 65 28  backofficeTrace(
6df0: 22 2f 2a 2a 2a 2a 2a 20 42 61 63 6b 6f 66 66 69  "/***** Backoffi
6e00: 63 65 20 43 68 69 6c 64 20 25 64 20 65 78 69 74  ce Child %d exit
6e10: 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 47 45 54  s *****/\n", GET
6e20: 50 49 44 28 29 29 3b 0a 20 20 20 20 20 20 65 78  PID());.      ex
6e30: 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(0);.    }.   
6e40: 20 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28   fossil_warning(
6e50: 22 62 61 63 6b 6f 66 66 69 63 65 20 70 72 6f 63  "backoffice proc
6e60: 65 73 73 20 25 64 20 66 6f 72 6b 20 66 61 69 6c  ess %d fork fail
6e70: 65 64 2c 20 65 72 72 6e 6f 20 25 64 22 2c 20 47  ed, errno %d", G
6e80: 45 54 50 49 44 28 29 2c 0a 20 20 20 20 20 20 20  ETPID(),.       
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6e              errn
6ea0: 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  o);.  }.#endif. 
6eb0: 20 2f 2a 20 46 6f 72 6b 28 29 20 66 61 69 6c 65   /* Fork() faile
6ec0: 64 20 6f 72 20 69 73 20 75 6e 61 76 61 69 6c 61  d or is unavaila
6ed0: 62 6c 65 2e 20 20 52 75 6e 20 62 61 63 6b 6f 66  ble.  Run backof
6ee0: 66 69 63 65 20 69 6e 20 74 68 69 73 20 70 72 6f  fice in this pro
6ef0: 63 65 73 73 2c 20 62 75 74 0a 20 20 2a 2a 20 64  cess, but.  ** d
6f00: 6f 20 73 6f 20 77 69 74 68 20 74 68 65 20 6e 6f  o so with the no
6f10: 2d 64 65 6c 61 79 20 73 65 74 74 69 6e 67 2e 0a  -delay setting..
6f20: 20 20 2a 2f 0a 20 20 62 61 63 6b 6f 66 66 69 63    */.  backoffic
6f30: 65 4e 6f 44 65 6c 61 79 20 3d 20 31 3b 0a 20 20  eNoDelay = 1;.  
6f40: 64 62 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f  db_open_reposito
6f50: 72 79 28 62 61 63 6b 6f 66 66 69 63 65 44 62 29  ry(backofficeDb)
6f60: 3b 0a 20 20 62 61 63 6b 6f 66 66 69 63 65 44 62  ;.  backofficeDb
6f70: 20 3d 20 22 78 22 3b 0a 20 20 62 61 63 6b 6f 66   = "x";.  backof
6f80: 66 69 63 65 5f 74 68 72 65 61 64 28 29 3b 0a 20  fice_thread();. 
6f90: 20 64 62 5f 63 6c 6f 73 65 28 31 29 3b 0a 7d 0a   db_close(1);.}.