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);.}.