Fossil

Hex Artifact Content
Login

Artifact a3292eb98393a1dbfdeaea3fdca09c7dd3b97ae185003fbbb28ccb7f0ea0b33f:


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 30 38 20 44 2e 20 52 69 63 68  (c) 2008 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 72 65 70 6f  d to manage repo
0280: 73 69 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 61  sitory configura
0290: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  tions..**.** By 
02a0: 22 72 65 70 6f 73 69 74 6f 72 79 20 63 6f 6e 66  "repository conf
02b0: 69 67 75 72 65 22 20 77 65 20 6d 65 61 6e 20 74  igure" we mean t
02c0: 68 65 20 6c 6f 63 61 6c 20 73 74 61 74 65 20 6f  he local state o
02d0: 66 20 61 20 72 65 70 6f 73 69 74 6f 72 79 0a 2a  f a repository.*
02e0: 2a 20 64 69 73 74 69 6e 63 74 20 66 72 6f 6d 20  * distinct from 
02f0: 74 68 65 20 76 65 72 73 69 6f 6e 65 64 20 66 69  the versioned fi
0300: 6c 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  les..*/.#include
0310: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
0320: 6c 75 64 65 20 22 63 6f 6e 66 69 67 75 72 65 2e  lude "configure.
0330: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h".#include <ass
0340: 65 72 74 2e 68 3e 0a 0a 23 69 66 20 49 4e 54 45  ert.h>..#if INTE
0350: 52 46 41 43 45 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  RFACE./*.** Conf
0360: 69 67 75 72 61 74 69 6f 6e 20 74 72 61 6e 73 66  iguration transf
0370: 65 72 73 20 6f 63 63 75 72 20 69 6e 20 67 72 6f  ers occur in gro
0380: 75 70 73 2e 20 20 54 68 65 73 65 20 61 72 65 20  ups.  These are 
0390: 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 67  the allowed.** g
03a0: 72 6f 75 70 69 6e 67 73 3a 0a 2a 2f 0a 23 64 65  roupings:.*/.#de
03b0: 66 69 6e 65 20 43 4f 4e 46 49 47 53 45 54 5f 43  fine CONFIGSET_C
03c0: 53 53 20 20 20 20 20 20 20 30 78 30 30 30 30 30  SS       0x00000
03d0: 31 20 20 20 20 20 2f 2a 20 53 74 79 6c 65 20 73  1     /* Style s
03e0: 68 65 65 74 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  heet only */.#de
03f0: 66 69 6e 65 20 43 4f 4e 46 49 47 53 45 54 5f 53  fine CONFIGSET_S
0400: 4b 49 4e 20 20 20 20 20 20 30 78 30 30 30 30 30  KIN      0x00000
0410: 32 20 20 20 20 20 2f 2a 20 57 57 57 20 69 6e 74  2     /* WWW int
0420: 65 72 66 61 63 65 20 61 70 70 65 61 72 61 6e 63  erface appearanc
0430: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4e  e */.#define CON
0440: 46 49 47 53 45 54 5f 54 4b 54 20 20 20 20 20 20  FIGSET_TKT      
0450: 20 30 78 30 30 30 30 30 34 20 20 20 20 20 2f 2a   0x000004     /*
0460: 20 54 69 63 6b 65 74 20 63 6f 6e 66 69 67 75 72   Ticket configur
0470: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ation */.#define
0480: 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a 20   CONFIGSET_PROJ 
0490: 20 20 20 20 20 30 78 30 30 30 30 30 38 20 20 20       0x000008   
04a0: 20 20 2f 2a 20 50 72 6f 6a 65 63 74 20 6e 61 6d    /* Project nam
04b0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4e  e */.#define CON
04c0: 46 49 47 53 45 54 5f 53 48 55 4e 20 20 20 20 20  FIGSET_SHUN     
04d0: 20 30 78 30 30 30 30 31 30 20 20 20 20 20 2f 2a   0x000010     /*
04e0: 20 53 68 75 6e 20 73 65 74 74 69 6e 67 73 20 2a   Shun settings *
04f0: 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4e 46 49 47  /.#define CONFIG
0500: 53 45 54 5f 55 53 45 52 20 20 20 20 20 20 30 78  SET_USER      0x
0510: 30 30 30 30 32 30 20 20 20 20 20 2f 2a 20 54 68  000020     /* Th
0520: 65 20 55 53 45 52 20 74 61 62 6c 65 20 2a 2f 0a  e USER table */.
0530: 23 64 65 66 69 6e 65 20 43 4f 4e 46 49 47 53 45  #define CONFIGSE
0540: 54 5f 41 44 44 52 20 20 20 20 20 20 30 78 30 30  T_ADDR      0x00
0550: 30 30 34 30 20 20 20 20 20 2f 2a 20 54 68 65 20  0040     /* The 
0560: 43 4f 4e 43 45 41 4c 45 44 20 74 61 62 6c 65 20  CONCEALED table 
0570: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4e 46 49  */.#define CONFI
0580: 47 53 45 54 5f 58 46 45 52 20 20 20 20 20 20 30  GSET_XFER      0
0590: 78 30 30 30 30 38 30 20 20 20 20 20 2f 2a 20 54  x000080     /* T
05a0: 72 61 6e 73 66 65 72 20 63 6f 6e 66 69 67 75 72  ransfer configur
05b0: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ation */.#define
05c0: 20 43 4f 4e 46 49 47 53 45 54 5f 41 4c 49 41 53   CONFIGSET_ALIAS
05d0: 20 20 20 20 20 30 78 30 30 30 31 30 30 20 20 20       0x000100   
05e0: 20 20 2f 2a 20 55 52 4c 20 41 6c 69 61 73 65 73    /* URL Aliases
05f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4e 46   */.#define CONF
0600: 49 47 53 45 54 5f 53 43 52 49 42 45 52 20 20 20  IGSET_SCRIBER   
0610: 30 78 30 30 30 32 30 30 20 20 20 20 20 2f 2a 20  0x000200     /* 
0620: 45 6d 61 69 6c 20 73 75 62 73 63 72 69 62 65 72  Email subscriber
0630: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4e  s */.#define CON
0640: 46 49 47 53 45 54 5f 41 4c 4c 20 20 20 20 20 20  FIGSET_ALL      
0650: 20 30 78 30 30 30 33 66 66 20 20 20 20 20 2f 2a   0x0003ff     /*
0660: 20 45 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 0a   Everything */..
0670: 23 64 65 66 69 6e 65 20 43 4f 4e 46 49 47 53 45  #define CONFIGSE
0680: 54 5f 4f 56 45 52 57 52 49 54 45 20 30 78 31 30  T_OVERWRITE 0x10
0690: 30 30 30 30 20 20 20 20 20 2f 2a 20 43 61 75 73  0000     /* Caus
06a0: 65 73 20 6f 76 65 72 77 72 69 74 65 20 69 6e 73  es overwrite ins
06b0: 74 65 61 64 20 6f 66 20 6d 65 72 67 65 20 2a 2f  tead of merge */
06c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 73  ../*.** This mas
06d0: 6b 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68  k is used for th
06e0: 65 20 63 6f 6d 6d 6f 6e 20 54 48 31 20 63 6f 6e  e common TH1 con
06f0: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69  figuration setti
0700: 6e 67 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 0a  ngs (i.e. those.
0710: 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  ** that are not 
0720: 73 70 65 63 69 66 69 63 20 74 6f 20 6f 6e 65 20  specific to one 
0730: 70 61 72 74 69 63 75 6c 61 72 20 73 75 62 73 79  particular subsy
0740: 73 74 65 6d 2c 20 73 75 63 68 20 61 73 20 74 68  stem, such as th
0750: 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 73 75  e transfer.** su
0760: 62 73 79 73 74 65 6d 29 2e 0a 2a 2f 0a 23 64 65  bsystem)..*/.#de
0770: 66 69 6e 65 20 43 4f 4e 46 49 47 53 45 54 5f 54  fine CONFIGSET_T
0780: 48 31 20 20 20 20 20 20 20 28 43 4f 4e 46 49 47  H1       (CONFIG
0790: 53 45 54 5f 53 4b 49 4e 7c 43 4f 4e 46 49 47 53  SET_SKIN|CONFIGS
07a0: 45 54 5f 54 4b 54 7c 43 4f 4e 46 49 47 53 45 54  ET_TKT|CONFIGSET
07b0: 5f 58 46 45 52 29 0a 0a 23 65 6e 64 69 66 20 2f  _XFER)..#endif /
07c0: 2a 20 49 4e 54 45 52 46 41 43 45 20 2a 2f 0a 0a  * INTERFACE */..
07d0: 2f 2a 0a 2a 2a 20 4e 61 6d 65 73 20 6f 66 20 74  /*.** Names of t
07e0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
07f0: 20 73 65 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20   sets.*/.static 
0800: 73 74 72 75 63 74 20 7b 0a 20 20 63 6f 6e 73 74  struct {.  const
0810: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
0820: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
0830: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
0840: 20 2a 2f 0a 20 20 69 6e 74 20 67 72 6f 75 70 4d   */.  int groupM
0850: 61 73 6b 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  ask;       /* Ma
0860: 73 6b 20 66 6f 72 20 74 68 61 74 20 63 6f 6e 66  sk for that conf
0870: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20 2a 2f  iguration set */
0880: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0890: 48 65 6c 70 3b 20 20 20 2f 2a 20 57 68 61 74 20  Help;   /* What 
08a0: 69 74 20 64 6f 65 73 20 2a 2f 0a 7d 20 61 47 72  it does */.} aGr
08b0: 6f 75 70 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  oupName[] = {.  
08c0: 7b 20 22 2f 65 6d 61 69 6c 22 2c 20 20 20 20 20  { "/email",     
08d0: 20 20 43 4f 4e 46 49 47 53 45 54 5f 41 44 44 52    CONFIGSET_ADDR
08e0: 2c 20 20 22 43 6f 6e 63 65 61 6c 65 64 20 65 6d  ,  "Concealed em
08f0: 61 69 6c 20 61 64 64 72 65 73 73 65 73 20 69 6e  ail addresses in
0900: 20 74 69 63 6b 65 74 73 22 20 7d 2c 0a 20 20 7b   tickets" },.  {
0910: 20 22 2f 70 72 6f 6a 65 63 74 22 2c 20 20 20 20   "/project",    
0920: 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a 2c   CONFIGSET_PROJ,
0930: 20 20 22 50 72 6f 6a 65 63 74 20 6e 61 6d 65 20    "Project name 
0940: 61 6e 64 20 64 65 73 63 72 69 70 74 69 6f 6e 22  and description"
0950: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0960: 22 2f 73 6b 69 6e 22 2c 20 20 20 20 20 20 20 20  "/skin",        
0970: 43 4f 4e 46 49 47 53 45 54 5f 53 4b 49 4e 20 7c  CONFIGSET_SKIN |
0980: 20 43 4f 4e 46 49 47 53 45 54 5f 43 53 53 2c 0a   CONFIGSET_CSS,.
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 20 20 20 22 57 65 62 20 69 6e 74 65 72 66       "Web interf
09c0: 61 63 65 20 61 70 70 65 61 72 61 6e 63 65 20 73  ace appearance s
09d0: 65 74 74 69 6e 67 73 22 20 20 20 20 7d 2c 0a 20  ettings"    },. 
09e0: 20 7b 20 22 2f 63 73 73 22 2c 20 20 20 20 20 20   { "/css",      
09f0: 20 20 20 43 4f 4e 46 49 47 53 45 54 5f 43 53 53     CONFIGSET_CSS
0a00: 2c 20 20 20 22 53 74 79 6c 65 20 73 68 65 65 74  ,   "Style sheet
0a10: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
0a20: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
0a30: 7b 20 22 2f 73 68 75 6e 22 2c 20 20 20 20 20 20  { "/shun",      
0a40: 20 20 43 4f 4e 46 49 47 53 45 54 5f 53 48 55 4e    CONFIGSET_SHUN
0a50: 2c 20 20 22 4c 69 73 74 20 6f 66 20 73 68 75 6e  ,  "List of shun
0a60: 6e 65 64 20 61 72 74 69 66 61 63 74 73 22 20 20  ned artifacts"  
0a70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b            },.  {
0a80: 20 22 2f 74 69 63 6b 65 74 22 2c 20 20 20 20 20   "/ticket",     
0a90: 20 43 4f 4e 46 49 47 53 45 54 5f 54 4b 54 2c 20   CONFIGSET_TKT, 
0aa0: 20 20 22 54 69 63 6b 65 74 20 73 65 74 75 70 22    "Ticket setup"
0ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0ac0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20           },.  { 
0ad0: 22 2f 75 73 65 72 22 2c 20 20 20 20 20 20 20 20  "/user",        
0ae0: 43 4f 4e 46 49 47 53 45 54 5f 55 53 45 52 2c 20  CONFIGSET_USER, 
0af0: 20 22 55 73 65 72 73 20 61 6e 64 20 70 72 69 76   "Users and priv
0b00: 69 6c 65 67 65 20 73 65 74 74 69 6e 67 73 22 20  ilege settings" 
0b10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22          },.  { "
0b20: 2f 78 66 65 72 22 2c 20 20 20 20 20 20 20 20 43  /xfer",        C
0b30: 4f 4e 46 49 47 53 45 54 5f 58 46 45 52 2c 20 20  ONFIGSET_XFER,  
0b40: 22 54 72 61 6e 73 66 65 72 20 73 65 74 75 70 22  "Transfer setup"
0b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
0b60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 2f         },.  { "/
0b70: 61 6c 69 61 73 22 2c 20 20 20 20 20 20 20 43 4f  alias",       CO
0b80: 4e 46 49 47 53 45 54 5f 41 4c 49 41 53 2c 20 22  NFIGSET_ALIAS, "
0b90: 55 52 4c 20 41 6c 69 61 73 65 73 22 2c 20 20 20  URL Aliases",   
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 7d 2c 0a 20 20 7b 20 22 2f 73        },.  { "/s
0bc0: 75 62 73 63 72 69 62 65 72 22 2c 20 20 43 4f 4e  ubscriber",  CON
0bd0: 46 49 47 53 45 54 5f 53 43 52 49 42 45 52 2c 22  FIGSET_SCRIBER,"
0be0: 45 6d 61 69 6c 20 6e 6f 74 69 66 69 63 61 74 69  Email notificati
0bf0: 6f 6e 20 73 75 62 73 63 72 69 62 65 72 20 6c 69  on subscriber li
0c00: 73 74 22 20 20 7d 2c 0a 20 20 7b 20 22 2f 61 6c  st"  },.  { "/al
0c10: 6c 22 2c 20 20 20 20 20 20 20 20 20 43 4f 4e 46  l",         CONF
0c20: 49 47 53 45 54 5f 41 4c 4c 2c 20 20 20 22 41 6c  IGSET_ALL,   "Al
0c30: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 22 20  l of the above" 
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 20 7d 2c 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a      },.};.../*.*
0c60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0c70: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 73 65 74  is a list of set
0c80: 74 69 6e 67 73 20 74 68 61 74 20 77 65 20 61 72  tings that we ar
0c90: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 2a 2a 20  e willing to.** 
0ca0: 74 72 61 6e 73 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  transfer..**.** 
0cb0: 53 65 74 74 69 6e 67 20 6e 61 6d 65 73 20 74 68  Setting names th
0cc0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 6e  at begin with an
0cd0: 20 61 6c 70 68 61 62 65 74 69 63 20 63 68 61 72   alphabetic char
0ce0: 61 63 74 65 72 73 20 72 65 66 65 72 20 74 6f 0a  acters refer to.
0cf0: 2a 2a 20 73 69 6e 67 6c 65 20 65 6e 74 72 69 65  ** single entrie
0d00: 73 20 69 6e 20 74 68 65 20 43 4f 4e 46 49 47 20  s in the CONFIG 
0d10: 74 61 62 6c 65 2e 20 20 53 65 74 74 69 6e 67 20  table.  Setting 
0d20: 6e 61 6d 65 73 20 74 68 61 74 20 62 65 67 69 6e  names that begin
0d30: 20 77 69 74 68 0a 2a 2a 20 22 40 22 20 61 72 65   with.** "@" are
0d40: 20 66 6f 72 20 73 70 65 63 69 61 6c 20 70 72 6f   for special pro
0d50: 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  cessing..*/.stat
0d60: 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 63 6f  ic struct {.  co
0d70: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
0d80: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
0d90: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
0da0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
0db0: 6e 74 20 67 72 6f 75 70 4d 61 73 6b 3b 20 20 20  nt groupMask;   
0dc0: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6e      /* Which con
0dd0: 66 69 67 20 67 72 6f 75 70 73 20 69 73 20 69 74  fig groups is it
0de0: 20 70 61 72 74 20 6f 66 20 2a 2f 0a 7d 20 61 43   part of */.} aC
0df0: 6f 6e 66 69 67 5b 5d 20 3d 20 7b 0a 20 20 7b 20  onfig[] = {.  { 
0e00: 22 63 73 73 22 2c 20 20 20 20 20 20 20 20 20 20  "css",          
0e10: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47            CONFIG
0e20: 53 45 54 5f 43 53 53 20 20 7d 2c 0a 20 20 7b 20  SET_CSS  },.  { 
0e30: 22 68 65 61 64 65 72 22 2c 20 20 20 20 20 20 20  "header",       
0e40: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47            CONFIG
0e50: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0e60: 22 66 6f 6f 74 65 72 22 2c 20 20 20 20 20 20 20  "footer",       
0e70: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47            CONFIG
0e80: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0e90: 22 64 65 74 61 69 6c 73 22 2c 20 20 20 20 20 20  "details",      
0ea0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47            CONFIG
0eb0: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0ec0: 22 6c 6f 67 6f 2d 6d 69 6d 65 74 79 70 65 22 2c  "logo-mimetype",
0ed0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47            CONFIG
0ee0: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0ef0: 22 6c 6f 67 6f 2d 69 6d 61 67 65 22 2c 20 20 20  "logo-image",   
0f00: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47            CONFIG
0f10: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0f20: 22 62 61 63 6b 67 72 6f 75 6e 64 2d 6d 69 6d 65  "background-mime
0f30: 74 79 70 65 22 2c 20 20 20 20 43 4f 4e 46 49 47  type",    CONFIG
0f40: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0f50: 22 62 61 63 6b 67 72 6f 75 6e 64 2d 69 6d 61 67  "background-imag
0f60: 65 22 2c 20 20 20 20 20 20 20 43 4f 4e 46 49 47  e",       CONFIG
0f70: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0f80: 22 74 69 6d 65 6c 69 6e 65 2d 62 6c 6f 63 6b 2d  "timeline-block-
0f90: 6d 61 72 6b 75 70 22 2c 20 20 43 4f 4e 46 49 47  markup",  CONFIG
0fa0: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0fb0: 22 74 69 6d 65 6c 69 6e 65 2d 6d 61 78 2d 63 6f  "timeline-max-co
0fc0: 6d 6d 65 6e 74 22 2c 20 20 20 43 4f 4e 46 49 47  mment",   CONFIG
0fd0: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
0fe0: 22 74 69 6d 65 6c 69 6e 65 2d 70 6c 61 69 6e 74  "timeline-plaint
0ff0: 65 78 74 22 2c 20 20 20 20 20 43 4f 4e 46 49 47  ext",     CONFIG
1000: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
1010: 22 61 64 75 6e 69 74 22 2c 20 20 20 20 20 20 20  "adunit",       
1020: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47            CONFIG
1030: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
1040: 22 61 64 75 6e 69 74 2d 6f 6d 69 74 2d 69 66 2d  "adunit-omit-if-
1050: 61 64 6d 69 6e 22 2c 20 20 20 43 4f 4e 46 49 47  admin",   CONFIG
1060: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
1070: 22 61 64 75 6e 69 74 2d 6f 6d 69 74 2d 69 66 2d  "adunit-omit-if-
1080: 75 73 65 72 22 2c 20 20 20 20 43 4f 4e 46 49 47  user",    CONFIG
1090: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
10a0: 22 73 69 74 65 6d 61 70 2d 64 6f 63 69 64 78 22  "sitemap-docidx"
10b0: 2c 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47  ,         CONFIG
10c0: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
10d0: 22 73 69 74 65 6d 61 70 2d 64 6f 77 6e 6c 6f 61  "sitemap-downloa
10e0: 64 22 2c 20 20 20 20 20 20 20 43 4f 4e 46 49 47  d",       CONFIG
10f0: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
1100: 22 73 69 74 65 6d 61 70 2d 6c 69 63 65 6e 73 65  "sitemap-license
1110: 22 2c 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47  ",        CONFIG
1120: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 20 20 7b 20  SET_SKIN },.  { 
1130: 22 73 69 74 65 6d 61 70 2d 63 6f 6e 74 61 63 74  "sitemap-contact
1140: 22 2c 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47  ",        CONFIG
1150: 53 45 54 5f 53 4b 49 4e 20 7d 2c 0a 0a 23 69 66  SET_SKIN },..#if
1160: 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c  def FOSSIL_ENABL
1170: 45 5f 54 48 31 5f 44 4f 43 53 0a 20 20 7b 20 22  E_TH1_DOCS.  { "
1180: 74 68 31 2d 64 6f 63 73 22 2c 20 20 20 20 20 20  th1-docs",      
1190: 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49 47 53           CONFIGS
11a0: 45 54 5f 54 48 31 20 7d 2c 0a 23 65 6e 64 69 66  ET_TH1 },.#endif
11b0: 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45  .#ifdef FOSSIL_E
11c0: 4e 41 42 4c 45 5f 54 48 31 5f 48 4f 4f 4b 53 0a  NABLE_TH1_HOOKS.
11d0: 20 20 7b 20 22 74 68 31 2d 68 6f 6f 6b 73 22 2c    { "th1-hooks",
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
11f0: 4e 46 49 47 53 45 54 5f 54 48 31 20 7d 2c 0a 23  NFIGSET_TH1 },.#
1200: 65 6e 64 69 66 0a 20 20 7b 20 22 74 68 31 2d 73  endif.  { "th1-s
1210: 65 74 75 70 22 2c 20 20 20 20 20 20 20 20 20 20  etup",          
1220: 20 20 20 20 43 4f 4e 46 49 47 53 45 54 5f 54 48      CONFIGSET_TH
1230: 31 20 7d 2c 0a 20 20 7b 20 22 74 68 31 2d 75 72  1 },.  { "th1-ur
1240: 69 2d 72 65 67 65 78 70 22 2c 20 20 20 20 20 20  i-regexp",      
1250: 20 20 20 43 4f 4e 46 49 47 53 45 54 5f 54 48 31     CONFIGSET_TH1
1260: 20 7d 2c 0a 0a 23 69 66 64 65 66 20 46 4f 53 53   },..#ifdef FOSS
1270: 49 4c 5f 45 4e 41 42 4c 45 5f 54 43 4c 0a 20 20  IL_ENABLE_TCL.  
1280: 7b 20 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20  { "tcl",        
1290: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46              CONF
12a0: 49 47 53 45 54 5f 54 48 31 20 7d 2c 0a 20 20 7b  IGSET_TH1 },.  {
12b0: 20 22 74 63 6c 2d 73 65 74 75 70 22 2c 20 20 20   "tcl-setup",   
12c0: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 46 49             CONFI
12d0: 47 53 45 54 5f 54 48 31 20 7d 2c 0a 23 65 6e 64  GSET_TH1 },.#end
12e0: 69 66 0a 0a 20 20 7b 20 22 70 72 6f 6a 65 63 74  if..  { "project
12f0: 2d 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 20  -name",         
1300: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1310: 20 7d 2c 0a 20 20 7b 20 22 73 68 6f 72 74 2d 70   },.  { "short-p
1320: 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20 20 20  roject-name",   
1330: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1340: 20 7d 2c 0a 20 20 7b 20 22 70 72 6f 6a 65 63 74   },.  { "project
1350: 2d 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 20  -description",  
1360: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1370: 20 7d 2c 0a 20 20 7b 20 22 69 6e 64 65 78 2d 70   },.  { "index-p
1380: 61 67 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  age",           
1390: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
13a0: 20 7d 2c 0a 20 20 7b 20 22 6d 61 6e 69 66 65 73   },.  { "manifes
13b0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
13c0: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
13d0: 20 7d 2c 0a 20 20 7b 20 22 62 69 6e 61 72 79 2d   },.  { "binary-
13e0: 67 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  glob",          
13f0: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1400: 20 7d 2c 0a 20 20 7b 20 22 63 6c 65 61 6e 2d 67   },.  { "clean-g
1410: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
1420: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1430: 20 7d 2c 0a 20 20 7b 20 22 69 67 6e 6f 72 65 2d   },.  { "ignore-
1440: 67 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  glob",          
1450: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1460: 20 7d 2c 0a 20 20 7b 20 22 6b 65 65 70 2d 67 6c   },.  { "keep-gl
1470: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
1480: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1490: 20 7d 2c 0a 20 20 7b 20 22 63 72 6c 66 2d 67 6c   },.  { "crlf-gl
14a0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
14b0: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
14c0: 20 7d 2c 0a 20 20 7b 20 22 63 72 6e 6c 2d 67 6c   },.  { "crnl-gl
14d0: 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
14e0: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
14f0: 20 7d 2c 0a 20 20 7b 20 22 65 6e 63 6f 64 69 6e   },.  { "encodin
1500: 67 2d 67 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  g-glob",        
1510: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1520: 20 7d 2c 0a 20 20 7b 20 22 65 6d 70 74 79 2d 64   },.  { "empty-d
1530: 69 72 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  irs",           
1540: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1550: 20 7d 2c 0a 20 20 7b 20 22 61 6c 6c 6f 77 2d 73   },.  { "allow-s
1560: 79 6d 6c 69 6e 6b 73 22 2c 20 20 20 20 20 20 20  ymlinks",       
1570: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1580: 20 7d 2c 0a 20 20 7b 20 22 64 6f 74 66 69 6c 65   },.  { "dotfile
1590: 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
15a0: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
15b0: 20 7d 2c 0a 20 20 7b 20 22 70 61 72 65 6e 74 2d   },.  { "parent-
15c0: 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20 20  project-code",  
15d0: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
15e0: 20 7d 2c 0a 20 20 7b 20 22 70 61 72 65 6e 74 2d   },.  { "parent-
15f0: 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20 20  project-name",  
1600: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1610: 20 7d 2c 0a 20 20 7b 20 22 68 61 73 68 2d 70 6f   },.  { "hash-po
1620: 6c 69 63 79 22 2c 20 20 20 20 20 20 20 20 20 20  licy",          
1630: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1640: 20 7d 2c 0a 20 20 7b 20 22 63 6f 6d 6d 65 6e 74   },.  { "comment
1650: 2d 66 6f 72 6d 61 74 22 2c 20 20 20 20 20 20 20  -format",       
1660: 20 20 43 4f 4e 46 49 47 53 45 54 5f 50 52 4f 4a    CONFIGSET_PROJ
1670: 20 7d 2c 0a 0a 23 69 66 64 65 66 20 46 4f 53 53   },..#ifdef FOSS
1680: 49 4c 5f 45 4e 41 42 4c 45 5f 4c 45 47 41 43 59  IL_ENABLE_LEGACY
1690: 5f 4d 56 5f 52 4d 0a 20 20 7b 20 22 6d 76 2d 72  _MV_RM.  { "mv-r
16a0: 6d 2d 66 69 6c 65 73 22 2c 20 20 20 20 20 20 20  m-files",       
16b0: 20 20 20 20 20 43 4f 4e 46 49 47 53 45 54 5f 50       CONFIGSET_P
16c0: 52 4f 4a 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20  ROJ },.#endif.. 
16d0: 20 7b 20 22 74 69 63 6b 65 74 2d 74 61 62 6c 65   { "ticket-table
16e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e  ",           CON
16f0: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
1700: 20 7b 20 22 74 69 63 6b 65 74 2d 63 6f 6d 6d 6f   { "ticket-commo
1710: 6e 22 2c 20 20 20 20 20 20 20 20 20 20 43 4f 4e  n",          CON
1720: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
1730: 20 7b 20 22 74 69 63 6b 65 74 2d 63 68 61 6e 67   { "ticket-chang
1740: 65 22 2c 20 20 20 20 20 20 20 20 20 20 43 4f 4e  e",          CON
1750: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
1760: 20 7b 20 22 74 69 63 6b 65 74 2d 6e 65 77 70 61   { "ticket-newpa
1770: 67 65 22 2c 20 20 20 20 20 20 20 20 20 43 4f 4e  ge",         CON
1780: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
1790: 20 7b 20 22 74 69 63 6b 65 74 2d 76 69 65 77 70   { "ticket-viewp
17a0: 61 67 65 22 2c 20 20 20 20 20 20 20 20 43 4f 4e  age",        CON
17b0: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
17c0: 20 7b 20 22 74 69 63 6b 65 74 2d 65 64 69 74 70   { "ticket-editp
17d0: 61 67 65 22 2c 20 20 20 20 20 20 20 20 43 4f 4e  age",        CON
17e0: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
17f0: 20 7b 20 22 74 69 63 6b 65 74 2d 72 65 70 6f 72   { "ticket-repor
1800: 74 6c 69 73 74 22 2c 20 20 20 20 20 20 43 4f 4e  tlist",      CON
1810: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
1820: 20 7b 20 22 74 69 63 6b 65 74 2d 72 65 70 6f 72   { "ticket-repor
1830: 74 2d 74 65 6d 70 6c 61 74 65 22 2c 20 43 4f 4e  t-template", CON
1840: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
1850: 20 7b 20 22 74 69 63 6b 65 74 2d 6b 65 79 2d 74   { "ticket-key-t
1860: 65 6d 70 6c 61 74 65 22 2c 20 20 20 20 43 4f 4e  emplate",    CON
1870: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
1880: 20 7b 20 22 74 69 63 6b 65 74 2d 74 69 74 6c 65   { "ticket-title
1890: 2d 65 78 70 72 22 2c 20 20 20 20 20 20 43 4f 4e  -expr",      CON
18a0: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
18b0: 20 7b 20 22 74 69 63 6b 65 74 2d 63 6c 6f 73 65   { "ticket-close
18c0: 64 2d 65 78 70 72 22 2c 20 20 20 20 20 43 4f 4e  d-expr",     CON
18d0: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 20  FIGSET_TKT  },. 
18e0: 20 7b 20 22 40 72 65 70 6f 72 74 66 6d 74 22 2c   { "@reportfmt",
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
1900: 46 49 47 53 45 54 5f 54 4b 54 20 20 7d 2c 0a 0a  FIGSET_TKT  },..
1910: 20 20 7b 20 22 40 75 73 65 72 22 2c 20 20 20 20    { "@user",    
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
1930: 4e 46 49 47 53 45 54 5f 55 53 45 52 20 7d 2c 0a  NFIGSET_USER },.
1940: 0a 20 20 7b 20 22 40 63 6f 6e 63 65 61 6c 65 64  .  { "@concealed
1950: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 43  ",             C
1960: 4f 4e 46 49 47 53 45 54 5f 41 44 44 52 20 7d 2c  ONFIGSET_ADDR },
1970: 0a 0a 20 20 7b 20 22 40 73 68 75 6e 22 2c 20 20  ..  { "@shun",  
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 43 4f 4e 46 49 47 53 45 54 5f 53 48 55 4e 20 7d  CONFIGSET_SHUN }
19a0: 2c 0a 0a 20 20 7b 20 22 40 61 6c 69 61 73 22 2c  ,..  { "@alias",
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 43 4f 4e 46 49 47 53 45 54 5f 41 4c 49 41 53   CONFIGSET_ALIAS
19d0: 20 7d 2c 0a 0a 20 20 7b 20 22 40 73 75 62 73 63   },..  { "@subsc
19e0: 72 69 62 65 72 22 2c 20 20 20 20 20 20 20 20 20  riber",         
19f0: 20 20 20 43 4f 4e 46 49 47 53 45 54 5f 53 43 52     CONFIGSET_SCR
1a00: 49 42 45 52 20 7d 2c 0a 0a 20 20 7b 20 22 78 66  IBER },..  { "xf
1a10: 65 72 2d 63 6f 6d 6d 6f 6e 2d 73 63 72 69 70 74  er-common-script
1a20: 22 2c 20 20 20 20 20 43 4f 4e 46 49 47 53 45 54  ",     CONFIGSET
1a30: 5f 58 46 45 52 20 7d 2c 0a 20 20 7b 20 22 78 66  _XFER },.  { "xf
1a40: 65 72 2d 70 75 73 68 2d 73 63 72 69 70 74 22 2c  er-push-script",
1a50: 20 20 20 20 20 20 20 43 4f 4e 46 49 47 53 45 54         CONFIGSET
1a60: 5f 58 46 45 52 20 7d 2c 0a 20 20 7b 20 22 78 66  _XFER },.  { "xf
1a70: 65 72 2d 63 6f 6d 6d 69 74 2d 73 63 72 69 70 74  er-commit-script
1a80: 22 2c 20 20 20 20 20 43 4f 4e 46 49 47 53 45 54  ",     CONFIGSET
1a90: 5f 58 46 45 52 20 7d 2c 0a 20 20 7b 20 22 78 66  _XFER },.  { "xf
1aa0: 65 72 2d 74 69 63 6b 65 74 2d 73 63 72 69 70 74  er-ticket-script
1ab0: 22 2c 20 20 20 20 20 43 4f 4e 46 49 47 53 45 54  ",     CONFIGSET
1ac0: 5f 58 46 45 52 20 7d 2c 0a 0a 7d 3b 0a 73 74 61  _XFER },..};.sta
1ad0: 74 69 63 20 69 6e 74 20 69 43 6f 6e 66 69 67 20  tic int iConfig 
1ae0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  = 0;../*.** Retu
1af0: 72 6e 20 6e 61 6d 65 20 6f 66 20 66 69 72 73 74  rn name of first
1b00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
1b10: 72 6f 70 65 72 74 79 20 6d 61 74 63 68 69 6e 67  roperty matching
1b20: 20 74 68 65 20 67 69 76 65 6e 20 6d 61 73 6b 2e   the given mask.
1b30: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1b40: 63 6f 6e 66 69 67 75 72 65 5f 66 69 72 73 74 5f  configure_first_
1b50: 6e 61 6d 65 28 69 6e 74 20 69 4d 61 73 6b 29 7b  name(int iMask){
1b60: 0a 20 20 69 43 6f 6e 66 69 67 20 3d 20 30 3b 0a  .  iConfig = 0;.
1b70: 20 20 72 65 74 75 72 6e 20 63 6f 6e 66 69 67 75    return configu
1b80: 72 65 5f 6e 65 78 74 5f 6e 61 6d 65 28 69 4d 61  re_next_name(iMa
1b90: 73 6b 29 3b 0a 7d 0a 63 6f 6e 73 74 20 63 68 61  sk);.}.const cha
1ba0: 72 20 2a 63 6f 6e 66 69 67 75 72 65 5f 6e 65 78  r *configure_nex
1bb0: 74 5f 6e 61 6d 65 28 69 6e 74 20 69 4d 61 73 6b  t_name(int iMask
1bc0: 29 7b 0a 20 20 69 66 28 20 69 43 6f 6e 66 69 67  ){.  if( iConfig
1bd0: 3d 3d 30 20 26 26 20 28 69 4d 61 73 6b 20 26 20  ==0 && (iMask & 
1be0: 43 4f 4e 46 49 47 53 45 54 5f 41 4c 4c 29 3d 3d  CONFIGSET_ALL)==
1bf0: 43 4f 4e 46 49 47 53 45 54 5f 41 4c 4c 20 29 7b  CONFIGSET_ALL ){
1c00: 0a 20 20 20 20 69 43 6f 6e 66 69 67 20 3d 20 63  .    iConfig = c
1c10: 6f 75 6e 74 28 61 47 72 6f 75 70 4e 61 6d 65 29  ount(aGroupName)
1c20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 2f 61  ;.    return "/a
1c30: 6c 6c 22 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ll";.  }.  while
1c40: 28 20 69 43 6f 6e 66 69 67 3c 63 6f 75 6e 74 28  ( iConfig<count(
1c50: 61 47 72 6f 75 70 4e 61 6d 65 29 2d 31 20 29 7b  aGroupName)-1 ){
1c60: 0a 20 20 20 20 69 66 28 20 61 47 72 6f 75 70 4e  .    if( aGroupN
1c70: 61 6d 65 5b 69 43 6f 6e 66 69 67 5d 2e 67 72 6f  ame[iConfig].gro
1c80: 75 70 4d 61 73 6b 20 26 20 69 4d 61 73 6b 20 29  upMask & iMask )
1c90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
1ca0: 47 72 6f 75 70 4e 61 6d 65 5b 69 43 6f 6e 66 69  GroupName[iConfi
1cb0: 67 2b 2b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  g++].zName;.    
1cc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f  }else{.      iCo
1cd0: 6e 66 69 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nfig++;.    }.  
1ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1cf0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1d00: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
1d10: 69 6e 67 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ing that contain
1d20: 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20  s the RHS of an 
1d30: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 74  IN operator.** t
1d40: 68 61 74 20 77 69 6c 6c 20 73 65 6c 65 63 74 20  hat will select 
1d50: 43 4f 4e 46 49 47 20 74 61 62 6c 65 20 6e 61 6d  CONFIG table nam
1d60: 65 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74  es that are part
1d70: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
1d80: 61 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6d 61  ation.** that ma
1d90: 74 63 68 65 73 20 69 4d 61 74 63 68 2e 0a 2a 2f  tches iMatch..*/
1da0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e  .const char *con
1db0: 66 69 67 75 72 65 5f 69 6e 6f 70 5f 72 68 73 28  figure_inop_rhs(
1dc0: 69 6e 74 20 69 4d 61 73 6b 29 7b 0a 20 20 42 6c  int iMask){.  Bl
1dd0: 6f 62 20 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ob x;.  int i;. 
1de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
1df0: 70 20 3d 20 22 22 3b 0a 0a 20 20 62 6c 6f 62 5f  p = "";..  blob_
1e00: 7a 65 72 6f 28 26 78 29 3b 0a 20 20 62 6c 6f 62  zero(&x);.  blob
1e10: 5f 61 70 70 65 6e 64 5f 73 71 6c 28 26 78 2c 20  _append_sql(&x, 
1e20: 22 28 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  "(");.  for(i=0;
1e30: 20 69 3c 63 6f 75 6e 74 28 61 43 6f 6e 66 69 67   i<count(aConfig
1e40: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
1e50: 20 28 61 43 6f 6e 66 69 67 5b 69 5d 2e 67 72 6f   (aConfig[i].gro
1e60: 75 70 4d 61 73 6b 20 26 20 69 4d 61 73 6b 29 3d  upMask & iMask)=
1e70: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1e80: 20 20 20 69 66 28 20 61 43 6f 6e 66 69 67 5b 69     if( aConfig[i
1e90: 5d 2e 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 40 27 20  ].zName[0]=='@' 
1ea0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1eb0: 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28  blob_append_sql(
1ec0: 26 78 2c 20 22 25 73 27 25 71 27 22 2c 20 7a 53  &x, "%s'%q'", zS
1ed0: 65 70 2f 2a 73 61 66 65 2d 66 6f 72 2d 25 73 2a  ep/*safe-for-%s*
1ee0: 2f 2c 20 61 43 6f 6e 66 69 67 5b 69 5d 2e 7a 4e  /, aConfig[i].zN
1ef0: 61 6d 65 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  ame);.    zSep =
1f00: 20 22 2c 22 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62   ",";.  }.  blob
1f10: 5f 61 70 70 65 6e 64 5f 73 71 6c 28 26 78 2c 20  _append_sql(&x, 
1f20: 22 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  ")");.  return b
1f30: 6c 6f 62 5f 73 71 6c 5f 74 65 78 74 28 26 78 29  lob_sql_text(&x)
1f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1f50: 6e 20 74 68 65 20 6d 61 73 6b 20 66 6f 72 20 74  n the mask for t
1f60: 68 65 20 6e 61 6d 65 64 20 63 6f 6e 66 69 67 75  he named configu
1f70: 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  ration parameter
1f80: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1f90: 20 73 61 66 65 6c 79 20 65 78 70 6f 72 74 65 64   safely exported
1fa0: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1fb0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
1fc0: 6e 6f 74 20 73 61 66 65 20 74 6f 20 65 78 70 6f  not safe to expo
1fd0: 72 74 2e 0a 2a 2a 0a 2a 2a 20 22 53 61 66 65 22  rt..**.** "Safe"
1fe0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
1ff0: 20 70 61 72 61 67 72 61 70 68 20 6d 65 61 6e 73   paragraph means
2000: 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 20   the permission 
2010: 69 73 20 67 72 61 6e 74 65 64 20 74 6f 0a 2a 2a  is granted to.**
2020: 20 65 78 70 6f 72 74 20 74 68 65 20 70 72 6f 70   export the prop
2030: 65 72 74 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  erty.  In other 
2040: 77 6f 72 64 73 2c 20 74 68 65 20 72 65 71 75 65  words, the reque
2050: 73 74 69 6e 67 20 73 69 64 65 20 68 61 73 20 70  sting side has p
2060: 72 65 73 65 6e 74 65 64 0a 2a 2a 20 6c 6f 67 69  resented.** logi
2070: 6e 20 63 72 65 64 65 6e 74 69 61 6c 73 20 61 6e  n credentials an
2080: 64 20 68 61 73 20 73 75 66 66 69 63 69 65 6e 74  d has sufficient
2090: 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 74 6f   capabilities to
20a0: 20 61 63 63 65 73 73 20 74 68 65 20 72 65 71 75   access the requ
20b0: 65 73 74 65 64 0a 2a 2a 20 69 6e 66 6f 72 6d 61  ested.** informa
20c0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 63 6f 6e  tion..*/.int con
20d0: 66 69 67 75 72 65 5f 69 73 5f 65 78 70 6f 72 74  figure_is_export
20e0: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  able(const char 
20f0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
2100: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  ;.  int n = strl
2110: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  en(zName);.  if(
2120: 20 6e 3e 32 20 26 26 20 7a 4e 61 6d 65 5b 30 5d   n>2 && zName[0]
2130: 3d 3d 27 5c 27 27 20 26 26 20 7a 4e 61 6d 65 5b  =='\'' && zName[
2140: 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  n-1]=='\'' ){.  
2150: 20 20 7a 4e 61 6d 65 2b 2b 3b 0a 20 20 20 20 6e    zName++;.    n
2160: 20 2d 3d 20 32 3b 0a 20 20 7d 0a 20 20 66 6f 72   -= 2;.  }.  for
2170: 28 69 3d 30 3b 20 69 3c 63 6f 75 6e 74 28 61 43  (i=0; i<count(aC
2180: 6f 6e 66 69 67 29 3b 20 69 2b 2b 29 7b 0a 20 20  onfig); i++){.  
2190: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e    if( strncmp(zN
21a0: 61 6d 65 2c 20 61 43 6f 6e 66 69 67 5b 69 5d 2e  ame, aConfig[i].
21b0: 7a 4e 61 6d 65 2c 20 6e 29 3d 3d 30 20 26 26 20  zName, n)==0 && 
21c0: 61 43 6f 6e 66 69 67 5b 69 5d 2e 7a 4e 61 6d 65  aConfig[i].zName
21d0: 5b 6e 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [n]==0 ){.      
21e0: 69 6e 74 20 6d 20 3d 20 61 43 6f 6e 66 69 67 5b  int m = aConfig[
21f0: 69 5d 2e 67 72 6f 75 70 4d 61 73 6b 3b 0a 20 20  i].groupMask;.  
2200: 20 20 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e      if( !g.perm.
2210: 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  Admin ){.       
2220: 20 6d 20 26 3d 20 7e 28 43 4f 4e 46 49 47 53 45   m &= ~(CONFIGSE
2230: 54 5f 55 53 45 52 7c 43 4f 4e 46 49 47 53 45 54  T_USER|CONFIGSET
2240: 5f 53 43 52 49 42 45 52 29 3b 0a 20 20 20 20 20  _SCRIBER);.     
2250: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 67 2e   }.      if( !g.
2260: 70 65 72 6d 2e 52 64 41 64 64 72 20 29 7b 0a 20  perm.RdAddr ){. 
2270: 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 43 4f 4e         m &= ~CON
2280: 46 49 47 53 45 54 5f 41 44 44 52 3b 0a 20 20 20  FIGSET_ADDR;.   
2290: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
22a0: 6e 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n m;.    }.  }. 
22b0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61   if( strncmp(zNa
22c0: 6d 65 2c 20 22 77 61 6c 69 61 73 3a 2f 22 2c 20  me, "walias:/", 
22d0: 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  8)==0 ){.    ret
22e0: 75 72 6e 20 43 4f 4e 46 49 47 53 45 54 5f 41 4c  urn CONFIGSET_AL
22f0: 49 41 53 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IAS;.  }.  retur
2300: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  n 0;.}../*.** A 
2310: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 63 6f 6e 66  mask of all conf
2320: 69 67 75 72 61 74 69 6f 6e 20 74 61 62 6c 65 73  iguration tables
2330: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
2340: 72 65 73 65 74 20 61 6c 72 65 61 64 79 2e 0a 2a  reset already..*
2350: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
2360: 66 69 67 48 61 73 42 65 65 6e 52 65 73 65 74 20  figHasBeenReset 
2370: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 73 6b  = 0;../*.** Mask
2380: 20 6f 66 20 6d 6f 64 69 66 69 65 64 20 63 6f 6e   of modified con
2390: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 73 0a  figuration sets.
23a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
23b0: 62 75 69 6c 64 4d 61 73 6b 20 3d 20 30 3b 0a 0a  buildMask = 0;..
23c0: 2f 2a 0a 2a 2a 20 52 65 62 75 69 6c 64 20 61 75  /*.** Rebuild au
23d0: 78 69 6c 69 61 72 79 20 74 61 62 6c 65 73 20 61  xiliary tables a
23e0: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 63 6f  s required by co
23f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 68 61 6e  nfiguration chan
2400: 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6f 6e  ges..*/.void con
2410: 66 69 67 75 72 65 5f 72 65 62 75 69 6c 64 28 76  figure_rebuild(v
2420: 6f 69 64 29 7b 0a 20 20 69 66 28 20 72 65 62 75  oid){.  if( rebu
2430: 69 6c 64 4d 61 73 6b 20 26 20 43 4f 4e 46 49 47  ildMask & CONFIG
2440: 53 45 54 5f 54 4b 54 20 29 7b 0a 20 20 20 20 74  SET_TKT ){.    t
2450: 69 63 6b 65 74 5f 72 65 62 75 69 6c 64 28 29 3b  icket_rebuild();
2460: 0a 20 20 7d 0a 20 20 72 65 62 75 69 6c 64 4d 61  .  }.  rebuildMa
2470: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sk = 0;.}../*.**
2480: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2490: 7a 5b 5d 20 69 73 20 6e 6f 74 20 61 20 22 73 61  z[] is not a "sa
24a0: 66 65 22 20 53 51 4c 20 74 6f 6b 65 6e 2e 20 20  fe" SQL token.  
24b0: 41 20 73 61 66 65 20 74 6f 6b 65 6e 20 69 73 20  A safe token is 
24c0: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
24d0: 2a 20 20 20 41 20 73 74 72 69 6e 67 20 6c 69 74  *   A string lit
24e0: 65 72 61 6c 0a 2a 2a 20 20 20 2a 20 20 20 41 20  eral.**   *   A 
24f0: 62 6c 6f 62 20 6c 69 74 65 72 61 6c 0a 2a 2a 20  blob literal.** 
2500: 20 20 2a 20 20 20 41 6e 20 69 6e 74 65 67 65 72    *   An integer
2510: 20 6c 69 74 65 72 61 6c 20 20 28 6e 6f 20 66 6c   literal  (no fl
2520: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 29 0a 2a 2a  oating point).**
2530: 20 20 20 2a 20 20 20 4e 55 4c 4c 0a 2a 2f 0a 73     *   NULL.*/.s
2540: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 53 71  tatic int safeSq
2550: 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  l(const char *z)
2560: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
2570: 20 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30   z==0 || z[0]==0
2580: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2590: 66 28 20 28 7a 5b 30 5d 3d 3d 27 78 27 20 7c 7c  f( (z[0]=='x' ||
25a0: 20 7a 5b 30 5d 3d 3d 27 58 27 29 20 26 26 20 7a   z[0]=='X') && z
25b0: 5b 31 5d 3d 3d 27 5c 27 27 20 29 20 7a 2b 2b 3b  [1]=='\'' ) z++;
25c0: 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 27  .  if( z[0]=='\'
25d0: 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ' ){.    for(i=1
25e0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
25f0: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
2600: 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b  '' ){.        i+
2610: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  +;.        if( z
2620: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 20 63 6f 6e  [i]=='\'' ){ con
2630: 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 20  tinue; }.       
2640: 20 72 65 74 75 72 6e 20 7a 5b 69 5d 3d 3d 30 3b   return z[i]==0;
2650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2660: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2670: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 63  else{.    char c
2680: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28  ;.    for(i=0; (
2690: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b  c = z[i])!=0; i+
26a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66  +){.      if( !f
26b0: 6f 73 73 69 6c 5f 69 73 61 6c 6e 75 6d 28 63 29  ossil_isalnum(c)
26c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
26d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26e0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
26f0: 72 6e 20 74 72 75 65 20 69 66 20 7a 5b 5d 20 63  rn true if z[] c
2700: 6f 6e 73 69 73 74 73 20 6f 66 20 6e 6f 74 68 69  onsists of nothi
2710: 6e 67 20 62 75 74 20 64 69 67 69 74 73 0a 2a 2f  ng but digits.*/
2720: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 66 65  .static int safe
2730: 49 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Int(const char *
2740: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  z){.  int i;.  i
2750: 66 28 20 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d  f( z==0 || z[0]=
2760: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2770: 20 66 6f 72 28 69 3d 30 3b 20 66 6f 73 73 69 6c   for(i=0; fossil
2780: 5f 69 73 64 69 67 69 74 28 7a 5b 69 5d 29 3b 20  _isdigit(z[i]); 
2790: 69 2b 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  i++){}.  return 
27a0: 7a 5b 69 5d 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  z[i]==0;.}../*.*
27b0: 2a 20 50 72 6f 63 65 73 73 20 61 20 73 69 6e 67  * Process a sing
27c0: 6c 65 20 22 63 6f 6e 66 69 67 22 20 63 61 72 64  le "config" card
27d0: 20 72 65 63 65 69 76 65 64 20 66 72 6f 6d 20 74   received from t
27e0: 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 6f 66  he other side of
27f0: 20 61 0a 2a 2a 20 73 79 6e 63 20 73 65 73 73 69   a.** sync sessi
2800: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4d 61 73 6b 20 63  on..**.** Mask c
2810: 6f 6e 73 69 73 74 73 20 6f 66 20 6f 6e 65 20 6f  onsists of one o
2820: 72 20 6d 6f 72 65 20 43 4f 4e 46 49 47 53 45 54  r more CONFIGSET
2830: 5f 2a 20 76 61 6c 75 65 73 20 4f 52 65 64 20 74  _* values ORed t
2840: 6f 67 65 74 68 65 72 2c 20 74 6f 0a 2a 2a 20 64  ogether, to.** d
2850: 65 73 69 67 6e 61 74 65 20 77 68 61 74 20 74 79  esignate what ty
2860: 70 65 73 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  pes of configura
2870: 74 69 6f 6e 20 77 65 20 61 72 65 20 61 6c 6c 6f  tion we are allo
2880: 77 65 64 20 74 6f 20 72 65 63 65 69 76 65 2e 0a  wed to receive..
2890: 2a 2a 0a 2a 2a 20 4e 45 57 20 46 4f 52 4d 41 54  **.** NEW FORMAT
28a0: 3a 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73  :.**.** zName is
28b0: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
28c0: 20 20 20 22 2f 63 6f 6e 66 69 67 22 2c 20 22 2f     "/config", "/
28d0: 75 73 65 72 22 2c 20 20 22 2f 73 68 75 6e 22 2c  user",  "/shun",
28e0: 20 22 2f 72 65 70 6f 72 74 66 6d 74 22 2c 20 22   "/reportfmt", "
28f0: 2f 63 6f 6e 63 65 61 6c 65 64 22 2c 0a 2a 2a 20  /concealed",.** 
2900: 20 20 20 20 22 2f 73 75 62 73 63 72 69 62 65 72      "/subscriber
2910: 22 2c 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 69  ",.**.** zName i
2920: 6e 64 69 63 61 74 65 73 20 74 68 65 20 74 61 62  ndicates the tab
2930: 6c 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  le that holds th
2940: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2950: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 65 69 6e  information bein
2960: 67 0a 2a 2a 20 74 72 61 6e 73 66 65 72 72 65 64  g.** transferred
2970: 2e 20 20 70 43 6f 6e 74 65 6e 74 20 69 73 20 61  .  pContent is a
2980: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
2990: 73 69 73 74 20 6f 66 20 61 6c 74 65 72 6e 61 74  sist of alternat
29a0: 69 6e 67 20 46 6f 73 73 69 6c 0a 2a 2a 20 61 6e  ing Fossil.** an
29b0: 64 20 53 51 4c 20 74 6f 6b 65 6e 73 2e 20 20 54  d SQL tokens.  T
29c0: 68 65 20 46 69 72 73 74 20 74 6f 6b 65 6e 20 69  he First token i
29d0: 73 20 61 20 74 69 6d 65 73 74 61 6d 70 20 69 6e  s a timestamp in
29e0: 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
29f0: 39 37 30 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  970..** The seco
2a00: 6e 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 72  nd token is a pr
2a10: 69 6d 61 72 79 20 6b 65 79 20 66 6f 72 20 74 68  imary key for th
2a20: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
2a30: 65 64 20 62 79 20 7a 4e 61 6d 65 2e 20 20 49 66  ed by zName.  If
2a40: 0a 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 69  .** The entry wi
2a50: 74 68 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  th the correspon
2a60: 64 69 6e 67 20 70 72 69 6d 61 72 79 20 6b 65 79  ding primary key
2a70: 20 65 78 69 73 74 73 20 61 6e 64 20 68 61 73 20   exists and has 
2a80: 61 20 6d 6f 72 65 20 72 65 63 65 6e 74 0a 2a 2a  a more recent.**
2a90: 20 6d 74 69 6d 65 2c 20 74 68 65 6e 20 6e 6f 74   mtime, then not
2aa0: 68 69 6e 67 20 68 61 70 70 65 6e 73 2e 20 20 49  hing happens.  I
2ab0: 66 20 74 68 65 20 65 6e 74 72 79 20 64 6f 65 73  f the entry does
2ac0: 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 66   not exist or if
2ad0: 20 69 74 20 68 61 73 0a 2a 2a 20 61 6e 20 6f 6c   it has.** an ol
2ae0: 64 65 72 20 6d 74 69 6d 65 2c 20 74 68 65 6e 20  der mtime, then 
2af0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 64 65 73 63  the content desc
2b00: 72 69 62 65 64 20 62 79 20 73 75 62 73 65 71 75  ribed by subsequ
2b10: 65 6e 74 20 74 6f 6b 65 6e 20 70 61 69 72 73 20  ent token pairs 
2b20: 69 73 0a 2a 2a 20 69 6e 73 65 72 74 65 64 2e 20  is.** inserted. 
2b30: 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   The first eleme
2b40: 6e 74 20 6f 66 20 65 61 63 68 20 74 6f 6b 65 6e  nt of each token
2b50: 20 70 61 69 72 20 69 73 20 61 20 63 6f 6c 75 6d   pair is a colum
2b60: 6e 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 74 68  n name and.** th
2b70: 65 20 73 65 63 6f 6e 64 20 69 73 20 69 74 73 20  e second is its 
2b80: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  value..**.** In 
2b90: 6f 76 65 72 76 69 65 77 2c 20 77 65 20 68 61 76  overview, we hav
2ba0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 41 4d 45  e:.**.**    NAME
2bb0: 20 20 20 20 20 20 20 20 43 4f 4e 54 45 4e 54 0a          CONTENT.
2bc0: 2a 2a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 20 20 20  **    -------   
2bd0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
2c10: 20 20 20 20 2f 63 6f 6e 66 69 67 20 20 20 20 20      /config     
2c20: 24 4d 54 49 4d 45 20 24 4e 41 4d 45 20 76 61 6c  $MTIME $NAME val
2c30: 75 65 20 24 56 41 4c 55 45 0a 2a 2a 20 20 20 20  ue $VALUE.**    
2c40: 2f 75 73 65 72 20 20 20 20 20 20 20 24 4d 54 49  /user       $MTI
2c50: 4d 45 20 24 4c 4f 47 49 4e 20 70 77 20 24 56 41  ME $LOGIN pw $VA
2c60: 4c 55 45 20 63 61 70 20 24 56 41 4c 55 45 20 69  LUE cap $VALUE i
2c70: 6e 66 6f 20 24 56 41 4c 55 45 20 70 68 6f 74 6f  nfo $VALUE photo
2c80: 20 24 56 41 4c 55 45 0a 2a 2a 20 20 20 20 2f 73   $VALUE.**    /s
2c90: 68 75 6e 20 20 20 20 20 20 20 24 4d 54 49 4d 45  hun       $MTIME
2ca0: 20 24 55 55 49 44 20 73 63 6f 6d 20 24 56 41 4c   $UUID scom $VAL
2cb0: 55 45 0a 2a 2a 20 20 20 20 2f 72 65 70 6f 72 74  UE.**    /report
2cc0: 66 6d 74 20 20 24 4d 54 49 4d 45 20 24 54 49 54  fmt  $MTIME $TIT
2cd0: 4c 45 20 6f 77 6e 65 72 20 24 56 41 4c 55 45 20  LE owner $VALUE 
2ce0: 63 6f 6c 73 20 24 56 41 4c 55 45 20 73 71 6c 63  cols $VALUE sqlc
2cf0: 6f 64 65 20 24 56 41 4c 55 45 0a 2a 2a 20 20 20  ode $VALUE.**   
2d00: 20 2f 63 6f 6e 63 65 61 6c 65 64 20 20 24 4d 54   /concealed  $MT
2d10: 49 4d 45 20 24 48 41 53 48 20 63 6f 6e 74 65 6e  IME $HASH conten
2d20: 74 20 24 56 41 4c 55 45 0a 2a 2a 20 20 20 20 2f  t $VALUE.**    /
2d30: 73 75 62 73 63 72 69 62 65 72 20 24 53 4d 54 49  subscriber $SMTI
2d40: 4d 45 20 24 53 45 4d 41 49 4c 20 73 75 6e 61 6d  ME $SEMAIL sunam
2d50: 65 20 24 56 20 2e 2e 2e 0a 2a 2f 0a 76 6f 69 64  e $V ....*/.void
2d60: 20 63 6f 6e 66 69 67 75 72 65 5f 72 65 63 65 69   configure_recei
2d70: 76 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ve(const char *z
2d80: 4e 61 6d 65 2c 20 42 6c 6f 62 20 2a 70 43 6f 6e  Name, Blob *pCon
2d90: 74 65 6e 74 2c 20 69 6e 74 20 67 72 6f 75 70 4d  tent, int groupM
2da0: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 63 68 65 63  ask){.  int chec
2db0: 6b 4d 61 73 6b 3b 20 20 20 2f 2a 20 4d 61 73 6b  kMask;   /* Mask
2dc0: 73 20 66 6f 72 20 77 68 69 63 68 20 77 65 20 6d  s for which we m
2dd0: 75 73 74 20 66 69 72 73 74 20 63 68 65 63 6b 20  ust first check 
2de0: 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62  existance of tab
2df0: 6c 65 73 20 2a 2f 0a 0a 20 20 63 68 65 63 6b 4d  les */..  checkM
2e00: 61 73 6b 20 3d 20 43 4f 4e 46 49 47 53 45 54 5f  ask = CONFIGSET_
2e10: 53 43 52 49 42 45 52 3b 0a 20 20 69 66 28 20 7a  SCRIBER;.  if( z
2e20: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a  Name[0]=='/' ){.
2e30: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
2e40: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 63 68 61  ormat */.    cha
2e50: 72 20 2a 61 7a 54 6f 6b 65 6e 5b 32 34 5d 3b 0a  r *azToken[24];.
2e60: 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d      int nToken =
2e70: 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 2c 20   0;.    int ii, 
2e80: 6a 6a 3b 0a 20 20 20 20 69 6e 74 20 74 68 69 73  jj;.    int this
2e90: 4d 61 73 6b 3b 0a 20 20 20 20 42 6c 6f 62 20 6e  Mask;.    Blob n
2ea0: 61 6d 65 2c 20 76 61 6c 75 65 2c 20 73 71 6c 3b  ame, value, sql;
2eb0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2ec0: 74 20 73 74 72 75 63 74 20 72 65 63 65 69 76 65  t struct receive
2ed0: 54 79 70 65 20 7b 0a 20 20 20 20 20 20 63 6f 6e  Type {.      con
2ee0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
2ef0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
2f00: 67 75 72 61 74 69 6f 6e 20 6b 65 79 20 66 6f 72  guration key for
2f10: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
2f20: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2f30: 2a 7a 50 72 69 6d 4b 65 79 3b 20 20 20 20 20 20  *zPrimKey;      
2f40: 2f 2a 20 50 72 69 6d 61 72 79 20 6b 65 79 20 63  /* Primary key c
2f50: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 69  olumn */.      i
2f60: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
2f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f80: 62 65 72 20 6f 66 20 64 61 74 61 20 66 69 65 6c  ber of data fiel
2f90: 64 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ds */.      cons
2fa0: 74 20 63 68 61 72 20 2a 61 7a 46 69 65 6c 64 5b  t char *azField[
2fb0: 36 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20  6];    /* Names 
2fc0: 6f 66 20 74 68 65 20 64 61 74 61 20 66 69 65 6c  of the data fiel
2fd0: 64 73 20 2a 2f 0a 20 20 20 20 7d 20 61 54 79 70  ds */.    } aTyp
2fe0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  e[] = {.      { 
2ff0: 22 2f 63 6f 6e 66 69 67 22 2c 20 20 20 20 22 6e  "/config",    "n
3000: 61 6d 65 22 2c 20 20 31 2c 20 7b 20 22 76 61 6c  ame",  1, { "val
3010: 75 65 22 2c 20 30 2c 30 2c 30 2c 30 2c 30 20 7d  ue", 0,0,0,0,0 }
3020: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
3030: 20 20 20 20 7b 20 22 40 75 73 65 72 22 2c 20 20      { "@user",  
3040: 20 20 20 20 22 6c 6f 67 69 6e 22 2c 20 34 2c 20      "login", 4, 
3050: 7b 20 22 70 77 22 2c 22 63 61 70 22 2c 22 69 6e  { "pw","cap","in
3060: 66 6f 22 2c 22 70 68 6f 74 6f 22 2c 30 2c 30 7d  fo","photo",0,0}
3070: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 40 73 68   },.      { "@sh
3080: 75 6e 22 2c 20 20 20 20 20 20 22 75 75 69 64 22  un",      "uuid"
3090: 2c 20 20 31 2c 20 7b 20 22 73 63 6f 6d 22 2c 20  ,  1, { "scom", 
30a0: 30 2c 30 2c 30 2c 30 2c 30 7d 20 20 20 20 20 20  0,0,0,0,0}      
30b0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
30c0: 7b 20 22 40 72 65 70 6f 72 74 66 6d 74 22 2c 20  { "@reportfmt", 
30d0: 22 74 69 74 6c 65 22 2c 20 33 2c 20 7b 20 22 6f  "title", 3, { "o
30e0: 77 6e 65 72 22 2c 22 63 6f 6c 73 22 2c 22 73 71  wner","cols","sq
30f0: 6c 63 6f 64 65 22 2c 30 2c 30 2c 30 7d 7d 2c 0a  lcode",0,0,0}},.
3100: 20 20 20 20 20 20 7b 20 22 40 63 6f 6e 63 65 61        { "@concea
3110: 6c 65 64 22 2c 20 22 68 61 73 68 22 2c 20 20 31  led", "hash",  1
3120: 2c 20 7b 20 22 63 6f 6e 74 65 6e 74 22 2c 20 30  , { "content", 0
3130: 2c 30 2c 30 2c 30 2c 30 20 7d 20 20 20 20 20 20  ,0,0,0,0 }      
3140: 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 40     },.      { "@
3150: 73 75 62 73 63 72 69 62 65 72 22 2c 22 73 65 6d  subscriber","sem
3160: 61 69 6c 22 2c 36 2c 0a 20 20 20 20 20 20 20 20  ail",6,.        
3170: 20 7b 20 22 73 75 6e 61 6d 65 22 2c 22 73 64 69   { "suname","sdi
3180: 67 65 73 74 22 2c 22 73 64 6f 6e 6f 74 63 61 6c  gest","sdonotcal
3190: 6c 22 2c 22 73 73 75 62 22 2c 22 73 63 74 69 6d  l","ssub","sctim
31a0: 65 22 2c 22 73 6d 69 70 22 7d 20 20 20 20 20 20  e","smip"}      
31b0: 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 0a 20 20     },.    };..  
31c0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
31d0: 72 65 63 65 69 76 65 54 79 70 65 20 69 6e 20 61  receiveType in a
31e0: 54 79 70 65 5b 69 69 5d 20 2a 2f 0a 20 20 20 20  Type[ii] */.    
31f0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 63 6f 75  for(ii=0; ii<cou
3200: 6e 74 28 61 54 79 70 65 29 3b 20 69 69 2b 2b 29  nt(aType); ii++)
3210: 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6f 73 73  {.      if( foss
3220: 69 6c 5f 73 74 72 63 6d 70 28 26 61 54 79 70 65  il_strcmp(&aType
3230: 5b 69 69 5d 2e 7a 4e 61 6d 65 5b 31 5d 2c 26 7a  [ii].zName[1],&z
3240: 4e 61 6d 65 5b 31 5d 29 3d 3d 30 20 29 20 62 72  Name[1])==0 ) br
3250: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
3260: 66 28 20 69 69 3e 3d 63 6f 75 6e 74 28 61 54 79  f( ii>=count(aTy
3270: 70 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pe) ) return;.. 
3280: 20 20 20 77 68 69 6c 65 28 20 62 6c 6f 62 5f 74     while( blob_t
3290: 6f 6b 65 6e 28 70 43 6f 6e 74 65 6e 74 2c 20 26  oken(pContent, &
32a0: 6e 61 6d 65 29 20 26 26 20 62 6c 6f 62 5f 73 71  name) && blob_sq
32b0: 6c 74 6f 6b 65 6e 28 70 43 6f 6e 74 65 6e 74 2c  ltoken(pContent,
32c0: 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   &value) ){.    
32d0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 62 6c 6f 62    char *z = blob
32e0: 5f 74 65 72 6d 69 6e 61 74 65 28 26 6e 61 6d 65  _terminate(&name
32f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 61  );.      if( !sa
3300: 66 65 53 71 6c 28 7a 29 20 29 20 72 65 74 75 72  feSql(z) ) retur
3310: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  n;.      if( nTo
3320: 6b 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ken>0 ){.       
3330: 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 61 54   for(jj=0; jj<aT
3340: 79 70 65 5b 69 69 5d 2e 6e 46 69 65 6c 64 3b 20  ype[ii].nField; 
3350: 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  jj++){.         
3360: 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63   if( fossil_strc
3370: 6d 70 28 61 54 79 70 65 5b 69 69 5d 2e 61 7a 46  mp(aType[ii].azF
3380: 69 65 6c 64 5b 6a 6a 5d 2c 20 7a 29 3d 3d 30 20  ield[jj], z)==0 
3390: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
33a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
33b0: 6a 3e 3d 61 54 79 70 65 5b 69 69 5d 2e 6e 46 69  j>=aType[ii].nFi
33c0: 65 6c 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  eld ) continue;.
33d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
33e0: 20 20 20 20 20 69 66 28 20 21 73 61 66 65 49 6e       if( !safeIn
33f0: 74 28 7a 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  t(z) ) return;. 
3400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 7a 54       }.      azT
3410: 6f 6b 65 6e 5b 6e 54 6f 6b 65 6e 2b 2b 5d 20 3d  oken[nToken++] =
3420: 20 7a 3b 0a 20 20 20 20 20 20 61 7a 54 6f 6b 65   z;.      azToke
3430: 6e 5b 6e 54 6f 6b 65 6e 2b 2b 5d 20 3d 20 7a 20  n[nToken++] = z 
3440: 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 65  = blob_terminate
3450: 28 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (&value);.      
3460: 69 66 28 20 21 73 61 66 65 53 71 6c 28 7a 29 20  if( !safeSql(z) 
3470: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
3480: 69 66 28 20 6e 54 6f 6b 65 6e 3e 3d 63 6f 75 6e  if( nToken>=coun
3490: 74 28 61 7a 54 6f 6b 65 6e 29 2d 31 20 29 20 62  t(azToken)-1 ) b
34a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
34b0: 69 66 28 20 6e 54 6f 6b 65 6e 3c 32 20 29 20 72  if( nToken<2 ) r
34c0: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 61  eturn;.    if( a
34d0: 54 79 70 65 5b 69 69 5d 2e 7a 4e 61 6d 65 5b 30  Type[ii].zName[0
34e0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
34f0: 74 68 69 73 4d 61 73 6b 20 3d 20 63 6f 6e 66 69  thisMask = confi
3500: 67 75 72 65 5f 69 73 5f 65 78 70 6f 72 74 61 62  gure_is_exportab
3510: 6c 65 28 61 7a 54 6f 6b 65 6e 5b 31 5d 29 3b 0a  le(azToken[1]);.
3520: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3530: 20 74 68 69 73 4d 61 73 6b 20 3d 20 63 6f 6e 66   thisMask = conf
3540: 69 67 75 72 65 5f 69 73 5f 65 78 70 6f 72 74 61  igure_is_exporta
3550: 62 6c 65 28 61 54 79 70 65 5b 69 69 5d 2e 7a 4e  ble(aType[ii].zN
3560: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
3570: 69 66 28 20 28 74 68 69 73 4d 61 73 6b 20 26 20  if( (thisMask & 
3580: 67 72 6f 75 70 4d 61 73 6b 29 3d 3d 30 20 29 20  groupMask)==0 ) 
3590: 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20  return;.    if( 
35a0: 28 74 68 69 73 4d 61 73 6b 20 26 20 63 68 65 63  (thisMask & chec
35b0: 6b 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  kMask)!=0 ){.   
35c0: 20 20 20 69 66 28 20 28 74 68 69 73 4d 61 73 6b     if( (thisMask
35d0: 20 26 20 43 4f 4e 46 49 47 53 45 54 5f 53 43 52   & CONFIGSET_SCR
35e0: 49 42 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  IBER)!=0 ){.    
35f0: 20 20 20 20 61 6c 65 72 74 5f 73 63 68 65 6d 61      alert_schema
3600: 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
3610: 20 20 20 63 68 65 63 6b 4d 61 73 6b 20 26 3d 20     checkMask &= 
3620: 7e 74 68 69 73 4d 61 73 6b 3b 0a 20 20 20 20 7d  ~thisMask;.    }
3630: 0a 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ..    blob_zero(
3640: 26 73 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 67  &sql);.    if( g
3650: 72 6f 75 70 4d 61 73 6b 20 26 20 43 4f 4e 46 49  roupMask & CONFI
3660: 47 53 45 54 5f 4f 56 45 52 57 52 49 54 45 20 29  GSET_OVERWRITE )
3670: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 74 68 69  {.      if( (thi
3680: 73 4d 61 73 6b 20 26 20 63 6f 6e 66 69 67 48 61  sMask & configHa
3690: 73 42 65 65 6e 52 65 73 65 74 29 3d 3d 30 20 26  sBeenReset)==0 &
36a0: 26 20 61 54 79 70 65 5b 69 69 5d 2e 7a 4e 61 6d  & aType[ii].zNam
36b0: 65 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  e[0]!='/' ){.   
36c0: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78       db_multi_ex
36d0: 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ec("DELETE FROM 
36e0: 5c 22 25 77 5c 22 22 2c 20 26 61 54 79 70 65 5b  \"%w\"", &aType[
36f0: 69 69 5d 2e 7a 4e 61 6d 65 5b 31 5d 29 3b 0a 20  ii].zName[1]);. 
3700: 20 20 20 20 20 20 20 63 6f 6e 66 69 67 48 61 73         configHas
3710: 42 65 65 6e 52 65 73 65 74 20 7c 3d 20 74 68 69  BeenReset |= thi
3720: 73 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  sMask;.      }. 
3730: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
3740: 5f 73 71 6c 28 26 73 71 6c 2c 20 22 52 45 50 4c  _sql(&sql, "REPL
3750: 41 43 45 20 49 4e 54 4f 20 22 29 3b 0a 20 20 20  ACE INTO ");.   
3760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 6c   }else{.      bl
3770: 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28 26 73  ob_append_sql(&s
3780: 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 49  ql, "INSERT OR I
3790: 47 4e 4f 52 45 20 49 4e 54 4f 20 22 29 3b 0a 20  GNORE INTO ");. 
37a0: 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70     }.    blob_ap
37b0: 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 20 22  pend_sql(&sql, "
37c0: 5c 22 25 77 5c 22 28 5c 22 25 77 5c 22 2c 6d 74  \"%w\"(\"%w\",mt
37d0: 69 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 26  ime",.         &
37e0: 7a 4e 61 6d 65 5b 31 5d 2c 20 61 54 79 70 65 5b  zName[1], aType[
37f0: 69 69 5d 2e 7a 50 72 69 6d 4b 65 79 29 3b 0a 20  ii].zPrimKey);. 
3800: 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74     if( fossil_st
3810: 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 22 2f 73 75  ricmp(zName,"/su
3820: 62 73 63 72 69 62 65 72 22 29 3d 3d 30 20 29 20  bscriber")==0 ) 
3830: 61 6c 65 72 74 5f 73 63 68 65 6d 61 28 30 29 3b  alert_schema(0);
3840: 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 32 3b 20 6a  .    for(jj=2; j
3850: 6a 3c 6e 54 6f 6b 65 6e 3b 20 6a 6a 2b 3d 32 29  j<nToken; jj+=2)
3860: 7b 0a 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  {.       blob_ap
3870: 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 20 22  pend_sql(&sql, "
3880: 2c 5c 22 25 77 5c 22 22 2c 20 61 7a 54 6f 6b 65  ,\"%w\"", azToke
3890: 6e 5b 6a 6a 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  n[jj]);.    }.  
38a0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71    blob_append_sq
38b0: 6c 28 26 73 71 6c 2c 22 29 20 56 41 4c 55 45 53  l(&sql,") VALUES
38c0: 28 25 73 2c 25 73 22 2c 0a 20 20 20 20 20 20 20  (%s,%s",.       
38d0: 61 7a 54 6f 6b 65 6e 5b 31 5d 20 2f 2a 73 61 66  azToken[1] /*saf
38e0: 65 2d 66 6f 72 2d 25 73 2a 2f 2c 20 61 7a 54 6f  e-for-%s*/, azTo
38f0: 6b 65 6e 5b 30 5d 2f 2a 73 61 66 65 2d 66 6f 72  ken[0]/*safe-for
3900: 2d 25 73 2a 2f 29 3b 0a 20 20 20 20 66 6f 72 28  -%s*/);.    for(
3910: 6a 6a 3d 32 3b 20 6a 6a 3c 6e 54 6f 6b 65 6e 3b  jj=2; jj<nToken;
3920: 20 6a 6a 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20   jj+=2){.       
3930: 62 6c 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28  blob_append_sql(
3940: 26 73 71 6c 2c 20 22 2c 25 73 22 2c 20 61 7a 54  &sql, ",%s", azT
3950: 6f 6b 65 6e 5b 6a 6a 2b 31 5d 20 2f 2a 73 61 66  oken[jj+1] /*saf
3960: 65 2d 66 6f 72 2d 25 73 2a 2f 29 3b 0a 20 20 20  e-for-%s*/);.   
3970: 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f   }.    db_multi_
3980: 65 78 65 63 28 22 25 73 29 22 2c 20 62 6c 6f 62  exec("%s)", blob
3990: 5f 73 71 6c 5f 74 65 78 74 28 26 73 71 6c 29 29  _sql_text(&sql))
39a0: 3b 0a 20 20 20 20 69 66 28 20 64 62 5f 63 68 61  ;.    if( db_cha
39b0: 6e 67 65 73 28 29 3d 3d 30 20 29 7b 0a 20 20 20  nges()==0 ){.   
39c0: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73     blob_reset(&s
39d0: 71 6c 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  ql);.      blob_
39e0: 61 70 70 65 6e 64 5f 73 71 6c 28 26 73 71 6c 2c  append_sql(&sql,
39f0: 20 22 55 50 44 41 54 45 20 5c 22 25 77 5c 22 20   "UPDATE \"%w\" 
3a00: 53 45 54 20 6d 74 69 6d 65 3d 25 73 22 2c 0a 20  SET mtime=%s",. 
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 20 20 20 26 7a 4e 61 6d 65 5b 31 5d 2c 20       &zName[1], 
3a30: 61 7a 54 6f 6b 65 6e 5b 30 5d 2f 2a 73 61 66 65  azToken[0]/*safe
3a40: 2d 66 6f 72 2d 25 73 2a 2f 29 3b 0a 20 20 20 20  -for-%s*/);.    
3a50: 20 20 66 6f 72 28 6a 6a 3d 32 3b 20 6a 6a 3c 6e    for(jj=2; jj<n
3a60: 54 6f 6b 65 6e 3b 20 6a 6a 2b 3d 32 29 7b 0a 20  Token; jj+=2){. 
3a70: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
3a80: 6e 64 5f 73 71 6c 28 26 73 71 6c 2c 20 22 2c 20  nd_sql(&sql, ", 
3a90: 5c 22 25 77 5c 22 3d 25 73 22 2c 0a 20 20 20 20  \"%w\"=%s",.    
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 20 20 20 61 7a 54 6f 6b 65 6e 5b 6a 6a 5d 2c      azToken[jj],
3ac0: 20 61 7a 54 6f 6b 65 6e 5b 6a 6a 2b 31 5d 2f 2a   azToken[jj+1]/*
3ad0: 73 61 66 65 2d 66 6f 72 2d 25 73 2a 2f 29 3b 0a  safe-for-%s*/);.
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 6c        }.      bl
3af0: 6f 62 5f 61 70 70 65 6e 64 5f 73 71 6c 28 26 73  ob_append_sql(&s
3b00: 71 6c 2c 20 22 20 57 48 45 52 45 20 5c 22 25 77  ql, " WHERE \"%w
3b10: 5c 22 3d 25 73 20 41 4e 44 20 6d 74 69 6d 65 3c  \"=%s AND mtime<
3b20: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
3b30: 20 20 20 20 20 20 20 20 61 54 79 70 65 5b 69 69          aType[ii
3b40: 5d 2e 7a 50 72 69 6d 4b 65 79 2c 20 61 7a 54 6f  ].zPrimKey, azTo
3b50: 6b 65 6e 5b 31 5d 2f 2a 73 61 66 65 2d 66 6f 72  ken[1]/*safe-for
3b60: 2d 25 73 2a 2f 2c 0a 20 20 20 20 20 20 20 20 20  -%s*/,.         
3b70: 20 20 20 20 20 20 20 20 20 20 61 7a 54 6f 6b 65            azToke
3b80: 6e 5b 30 5d 2f 2a 73 61 66 65 2d 66 6f 72 2d 25  n[0]/*safe-for-%
3b90: 73 2a 2f 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d  s*/);.      db_m
3ba0: 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22 2c 20  ulti_exec("%s", 
3bb0: 62 6c 6f 62 5f 73 71 6c 5f 74 65 78 74 28 26 73  blob_sql_text(&s
3bc0: 71 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ql));.    }.    
3bd0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 71 6c 29  blob_reset(&sql)
3be0: 3b 0a 20 20 20 20 72 65 62 75 69 6c 64 4d 61 73  ;.    rebuildMas
3bf0: 6b 20 7c 3d 20 74 68 69 73 4d 61 73 6b 3b 0a 20  k |= thisMask;. 
3c00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63   }.}../*.** Proc
3c10: 65 73 73 20 61 20 66 69 6c 65 20 66 75 6c 6c 20  ess a file full 
3c20: 6f 66 20 22 63 6f 6e 66 69 67 22 20 63 61 72 64  of "config" card
3c30: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6f 6e 66 69  s..*/.void confi
3c40: 67 75 72 65 5f 72 65 63 65 69 76 65 5f 61 6c 6c  gure_receive_all
3c50: 28 42 6c 6f 62 20 2a 70 49 6e 2c 20 69 6e 74 20  (Blob *pIn, int 
3c60: 67 72 6f 75 70 4d 61 73 6b 29 7b 0a 20 20 42 6c  groupMask){.  Bl
3c70: 6f 62 20 6c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e  ob line;.  int n
3c80: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 73 69 7a  Token;.  int siz
3c90: 65 3b 0a 20 20 42 6c 6f 62 20 61 54 6f 6b 65 6e  e;.  Blob aToken
3ca0: 5b 34 5d 3b 0a 0a 20 20 63 6f 6e 66 69 67 48 61  [4];..  configHa
3cb0: 73 42 65 65 6e 52 65 73 65 74 20 3d 20 30 3b 0a  sBeenReset = 0;.
3cc0: 20 20 77 68 69 6c 65 28 20 62 6c 6f 62 5f 6c 69    while( blob_li
3cd0: 6e 65 28 70 49 6e 2c 20 26 6c 69 6e 65 29 20 29  ne(pIn, &line) )
3ce0: 7b 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 62  {.    if( blob_b
3cf0: 75 66 66 65 72 28 26 6c 69 6e 65 29 5b 30 5d 3d  uffer(&line)[0]=
3d00: 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='#' ) continue;
3d10: 0a 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 62 6c  .    nToken = bl
3d20: 6f 62 5f 74 6f 6b 65 6e 69 7a 65 28 26 6c 69 6e  ob_tokenize(&lin
3d30: 65 2c 20 61 54 6f 6b 65 6e 2c 20 63 6f 75 6e 74  e, aToken, count
3d40: 28 61 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 69  (aToken));.    i
3d50: 66 28 20 62 6c 6f 62 5f 65 71 28 26 61 54 6f 6b  f( blob_eq(&aTok
3d60: 65 6e 5b 30 5d 2c 22 63 6f 6e 66 69 67 22 29 0a  en[0],"config").
3d70: 20 20 20 20 20 26 26 20 6e 54 6f 6b 65 6e 3d 3d       && nToken==
3d80: 33 0a 20 20 20 20 20 26 26 20 62 6c 6f 62 5f 69  3.     && blob_i
3d90: 73 5f 69 6e 74 28 26 61 54 6f 6b 65 6e 5b 32 5d  s_int(&aToken[2]
3da0: 2c 20 26 73 69 7a 65 29 0a 20 20 20 20 29 7b 0a  , &size).    ){.
3db0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
3dc0: 20 2a 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 73   *zName = blob_s
3dd0: 74 72 28 26 61 54 6f 6b 65 6e 5b 31 5d 29 3b 0a  tr(&aToken[1]);.
3de0: 20 20 20 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65        Blob conte
3df0: 6e 74 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a  nt;.      blob_z
3e00: 65 72 6f 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20  ero(&content);. 
3e10: 20 20 20 20 20 62 6c 6f 62 5f 65 78 74 72 61 63       blob_extrac
3e20: 74 28 70 49 6e 2c 20 73 69 7a 65 2c 20 26 63 6f  t(pIn, size, &co
3e30: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 67 2e  ntent);.      g.
3e40: 70 65 72 6d 2e 41 64 6d 69 6e 20 3d 20 67 2e 70  perm.Admin = g.p
3e50: 65 72 6d 2e 52 64 41 64 64 72 20 3d 20 31 3b 0a  erm.RdAddr = 1;.
3e60: 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 65 5f        configure_
3e70: 72 65 63 65 69 76 65 28 7a 4e 61 6d 65 2c 20 26  receive(zName, &
3e80: 63 6f 6e 74 65 6e 74 2c 20 67 72 6f 75 70 4d 61  content, groupMa
3e90: 73 6b 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  sk);.      blob_
3ea0: 72 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b  reset(&content);
3eb0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 73 65 65 6b  .      blob_seek
3ec0: 28 70 49 6e 2c 20 31 2c 20 42 4c 4f 42 5f 53 45  (pIn, 1, BLOB_SE
3ed0: 45 4b 5f 43 55 52 29 3b 0a 20 20 20 20 7d 0a 20  EK_CUR);.    }. 
3ee0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e   }.}.../*.** Sen
3ef0: 64 20 22 63 6f 6e 66 69 67 22 20 63 61 72 64 73  d "config" cards
3f00: 20 75 73 69 6e 67 20 74 68 65 20 6e 65 77 20 66   using the new f
3f10: 6f 72 6d 61 74 20 66 6f 72 20 61 6c 6c 20 65 6c  ormat for all el
3f20: 65 6d 65 6e 74 73 20 6f 66 20 61 20 67 72 6f 75  ements of a grou
3f30: 70 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 72  p.** that have r
3f40: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2e  ecently changed.
3f50: 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 67 6f  .**.** Output go
3f60: 65 73 20 69 6e 74 6f 20 70 4f 75 74 2e 20 20 54  es into pOut.  T
3f70: 68 65 20 67 72 6f 75 70 4d 61 73 6b 20 69 64 65  he groupMask ide
3f80: 6e 74 69 66 69 65 73 20 74 68 65 20 67 72 6f 75  ntifies the grou
3f90: 70 28 73 29 20 74 6f 20 62 65 20 73 65 6e 74 2e  p(s) to be sent.
3fa0: 0a 2a 2a 20 53 65 6e 64 20 6f 6e 6c 79 20 65 6e  .** Send only en
3fb0: 74 72 69 65 73 20 77 68 6f 73 65 20 74 69 6d 65  tries whose time
3fc0: 73 74 61 6d 70 20 69 73 20 6c 61 74 65 72 20 74  stamp is later t
3fd0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
3fe0: 69 53 74 61 72 74 2e 0a 2a 2a 0a 2a 2a 20 52 65  iStart..**.** Re
3ff0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
4000: 6f 66 20 63 61 72 64 73 20 73 65 6e 74 2e 0a 2a  of cards sent..*
4010: 2f 0a 69 6e 74 20 63 6f 6e 66 69 67 75 72 65 5f  /.int configure_
4020: 73 65 6e 64 5f 67 72 6f 75 70 28 0a 20 20 42 6c  send_group(.  Bl
4030: 6f 62 20 2a 70 4f 75 74 2c 20 20 20 20 20 20 20  ob *pOut,       
4040: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
4050: 6f 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 20  output here */. 
4060: 20 69 6e 74 20 67 72 6f 75 70 4d 61 73 6b 2c 20   int groupMask, 
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4080: 6b 20 6f 66 20 67 72 6f 75 70 73 20 74 6f 20 62  k of groups to b
4090: 65 20 73 65 6e 64 20 2a 2f 0a 20 20 73 71 6c 69  e send */.  sqli
40a0: 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74  te3_int64 iStart
40b0: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 72 69       /* Only wri
40c0: 74 65 20 76 61 6c 75 65 73 20 63 68 61 6e 67 65  te values change
40d0: 64 20 73 69 6e 63 65 20 74 68 69 73 20 74 69 6d  d since this tim
40e0: 65 20 2a 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71  e */.){.  Stmt q
40f0: 3b 0a 20 20 42 6c 6f 62 20 72 65 63 3b 0a 20 20  ;.  Blob rec;.  
4100: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e 43  int ii;.  int nC
4110: 61 72 64 20 3d 20 30 3b 0a 0a 20 20 62 6c 6f 62  ard = 0;..  blob
4120: 5f 7a 65 72 6f 28 26 72 65 63 29 3b 0a 20 20 69  _zero(&rec);.  i
4130: 66 28 20 67 72 6f 75 70 4d 61 73 6b 20 26 20 43  f( groupMask & C
4140: 4f 4e 46 49 47 53 45 54 5f 53 48 55 4e 20 29 7b  ONFIGSET_SHUN ){
4150: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
4160: 26 71 2c 20 22 53 45 4c 45 43 54 20 6d 74 69 6d  &q, "SELECT mtim
4170: 65 2c 20 71 75 6f 74 65 28 75 75 69 64 29 2c 20  e, quote(uuid), 
4180: 71 75 6f 74 65 28 73 63 6f 6d 29 20 46 52 4f 4d  quote(scom) FROM
4190: 20 73 68 75 6e 22 0a 20 20 20 20 20 20 20 20 20   shun".         
41a0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
41b0: 45 20 6d 74 69 6d 65 3e 3d 25 6c 6c 64 22 2c 20  E mtime>=%lld", 
41c0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 77 68 69  iStart);.    whi
41d0: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
41e0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
41f0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
4200: 66 28 26 72 65 63 2c 22 25 73 20 25 73 20 73 63  f(&rec,"%s %s sc
4210: 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  om %s",.        
4220: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
4230: 71 2c 20 30 29 2c 0a 20 20 20 20 20 20 20 20 64  q, 0),.        d
4240: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
4250: 2c 20 31 29 2c 0a 20 20 20 20 20 20 20 20 64 62  , 1),.        db
4260: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
4270: 20 32 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   2).      );.   
4280: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
4290: 70 4f 75 74 2c 20 22 63 6f 6e 66 69 67 20 2f 73  pOut, "config /s
42a0: 68 75 6e 20 25 64 5c 6e 25 73 5c 6e 22 2c 0a 20  hun %d\n%s\n",. 
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 62 6c 6f 62 5f 73 69 7a 65 28 26 72 65 63    blob_size(&rec
42d0: 29 2c 20 62 6c 6f 62 5f 73 74 72 28 26 72 65 63  ), blob_str(&rec
42e0: 29 29 3b 0a 20 20 20 20 20 20 6e 43 61 72 64 2b  ));.      nCard+
42f0: 2b 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65  +;.      blob_re
4300: 73 65 74 28 26 72 65 63 29 3b 0a 20 20 20 20 7d  set(&rec);.    }
4310: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .    db_finalize
4320: 28 26 71 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (&q);.  }.  if( 
4330: 67 72 6f 75 70 4d 61 73 6b 20 26 20 43 4f 4e 46  groupMask & CONF
4340: 49 47 53 45 54 5f 55 53 45 52 20 29 7b 0a 20 20  IGSET_USER ){.  
4350: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
4360: 20 22 53 45 4c 45 43 54 20 6d 74 69 6d 65 2c 20   "SELECT mtime, 
4370: 71 75 6f 74 65 28 6c 6f 67 69 6e 29 2c 20 71 75  quote(login), qu
4380: 6f 74 65 28 70 77 29 2c 20 71 75 6f 74 65 28 63  ote(pw), quote(c
4390: 61 70 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20  ap),".          
43a0: 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
43b0: 20 71 75 6f 74 65 28 69 6e 66 6f 29 2c 20 71 75   quote(info), qu
43c0: 6f 74 65 28 70 68 6f 74 6f 29 20 46 52 4f 4d 20  ote(photo) FROM 
43d0: 75 73 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  user".          
43e0: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
43f0: 20 6d 74 69 6d 65 3e 3d 25 6c 6c 64 22 2c 20 69   mtime>=%lld", i
4400: 53 74 61 72 74 29 3b 0a 20 20 20 20 77 68 69 6c  Start);.    whil
4410: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
4420: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
4430: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
4440: 28 26 72 65 63 2c 22 25 73 20 25 73 20 70 77 20  (&rec,"%s %s pw 
4450: 25 73 20 63 61 70 20 25 73 20 69 6e 66 6f 20 25  %s cap %s info %
4460: 73 20 70 68 6f 74 6f 20 25 73 22 2c 0a 20 20 20  s photo %s",.   
4470: 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74       db_column_t
4480: 65 78 74 28 26 71 2c 20 30 29 2c 0a 20 20 20 20  ext(&q, 0),.    
4490: 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65      db_column_te
44a0: 78 74 28 26 71 2c 20 31 29 2c 0a 20 20 20 20 20  xt(&q, 1),.     
44b0: 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78     db_column_tex
44c0: 74 28 26 71 2c 20 32 29 2c 0a 20 20 20 20 20 20  t(&q, 2),.      
44d0: 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74    db_column_text
44e0: 28 26 71 2c 20 33 29 2c 0a 20 20 20 20 20 20 20  (&q, 3),.       
44f0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
4500: 26 71 2c 20 34 29 2c 0a 20 20 20 20 20 20 20 20  &q, 4),.        
4510: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
4520: 71 2c 20 35 29 0a 20 20 20 20 20 20 29 3b 0a 20  q, 5).      );. 
4530: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
4540: 66 28 70 4f 75 74 2c 20 22 63 6f 6e 66 69 67 20  f(pOut, "config 
4550: 2f 75 73 65 72 20 25 64 5c 6e 25 73 5c 6e 22 2c  /user %d\n%s\n",
4560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4570: 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28 26 72      blob_size(&r
4580: 65 63 29 2c 20 62 6c 6f 62 5f 73 74 72 28 26 72  ec), blob_str(&r
4590: 65 63 29 29 3b 0a 20 20 20 20 20 20 6e 43 61 72  ec));.      nCar
45a0: 64 2b 2b 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  d++;.      blob_
45b0: 72 65 73 65 74 28 26 72 65 63 29 3b 0a 20 20 20  reset(&rec);.   
45c0: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
45d0: 7a 65 28 26 71 29 3b 0a 20 20 7d 0a 20 20 69 66  ze(&q);.  }.  if
45e0: 28 20 67 72 6f 75 70 4d 61 73 6b 20 26 20 43 4f  ( groupMask & CO
45f0: 4e 46 49 47 53 45 54 5f 54 4b 54 20 29 7b 0a 20  NFIGSET_TKT ){. 
4600: 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71     db_prepare(&q
4610: 2c 20 22 53 45 4c 45 43 54 20 6d 74 69 6d 65 2c  , "SELECT mtime,
4620: 20 71 75 6f 74 65 28 74 69 74 6c 65 29 2c 20 71   quote(title), q
4630: 75 6f 74 65 28 6f 77 6e 65 72 29 2c 20 71 75 6f  uote(owner), quo
4640: 74 65 28 63 6f 6c 73 29 2c 22 0a 20 20 20 20 20  te(cols),".     
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4660: 20 20 20 20 20 20 71 75 6f 74 65 28 73 71 6c 63        quote(sqlc
4670: 6f 64 65 29 20 46 52 4f 4d 20 72 65 70 6f 72 74  ode) FROM report
4680: 66 6d 74 22 0a 20 20 20 20 20 20 20 20 20 20 20  fmt".           
4690: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
46a0: 6d 74 69 6d 65 3e 3d 25 6c 6c 64 22 2c 20 69 53  mtime>=%lld", iS
46b0: 74 61 72 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  tart);.    while
46c0: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
46d0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
46e0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
46f0: 26 72 65 63 2c 22 25 73 20 25 73 20 6f 77 6e 65  &rec,"%s %s owne
4700: 72 20 25 73 20 63 6f 6c 73 20 25 73 20 73 71 6c  r %s cols %s sql
4710: 63 6f 64 65 20 25 73 22 2c 0a 20 20 20 20 20 20  code %s",.      
4720: 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74    db_column_text
4730: 28 26 71 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  (&q, 0),.       
4740: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
4750: 26 71 2c 20 31 29 2c 0a 20 20 20 20 20 20 20 20  &q, 1),.        
4760: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
4770: 71 2c 20 32 29 2c 0a 20 20 20 20 20 20 20 20 64  q, 2),.        d
4780: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
4790: 2c 20 33 29 2c 0a 20 20 20 20 20 20 20 20 64 62  , 3),.        db
47a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
47b0: 20 34 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   4).      );.   
47c0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
47d0: 70 4f 75 74 2c 20 22 63 6f 6e 66 69 67 20 2f 72  pOut, "config /r
47e0: 65 70 6f 72 74 66 6d 74 20 25 64 5c 6e 25 73 5c  eportfmt %d\n%s\
47f0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
4800: 20 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65         blob_size
4810: 28 26 72 65 63 29 2c 20 62 6c 6f 62 5f 73 74 72  (&rec), blob_str
4820: 28 26 72 65 63 29 29 3b 0a 20 20 20 20 20 20 6e  (&rec));.      n
4830: 43 61 72 64 2b 2b 3b 0a 20 20 20 20 20 20 62 6c  Card++;.      bl
4840: 6f 62 5f 72 65 73 65 74 28 26 72 65 63 29 3b 0a  ob_reset(&rec);.
4850: 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e      }.    db_fin
4860: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d 0a 20  alize(&q);.  }. 
4870: 20 69 66 28 20 67 72 6f 75 70 4d 61 73 6b 20 26   if( groupMask &
4880: 20 43 4f 4e 46 49 47 53 45 54 5f 41 44 44 52 20   CONFIGSET_ADDR 
4890: 29 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72  ){.    db_prepar
48a0: 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 6d 74  e(&q, "SELECT mt
48b0: 69 6d 65 2c 20 71 75 6f 74 65 28 68 61 73 68 29  ime, quote(hash)
48c0: 2c 20 71 75 6f 74 65 28 63 6f 6e 74 65 6e 74 29  , quote(content)
48d0: 20 46 52 4f 4d 20 63 6f 6e 63 65 61 6c 65 64 22   FROM concealed"
48e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
48f0: 20 20 20 20 22 20 57 48 45 52 45 20 6d 74 69 6d      " WHERE mtim
4900: 65 3e 3d 25 6c 6c 64 22 2c 20 69 53 74 61 72 74  e>=%lld", iStart
4910: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62  );.    while( db
4920: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
4930: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 62  E_ROW ){.      b
4940: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 72 65 63  lob_appendf(&rec
4950: 2c 22 25 73 20 25 73 20 63 6f 6e 74 65 6e 74 20  ,"%s %s content 
4960: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 64 62 5f  %s",.        db_
4970: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4980: 30 29 2c 0a 20 20 20 20 20 20 20 20 64 62 5f 63  0),.        db_c
4990: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
49a0: 29 2c 0a 20 20 20 20 20 20 20 20 64 62 5f 63 6f  ),.        db_co
49b0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
49c0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
49d0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75  blob_appendf(pOu
49e0: 74 2c 20 22 63 6f 6e 66 69 67 20 2f 63 6f 6e 63  t, "config /conc
49f0: 65 61 6c 65 64 20 25 64 5c 6e 25 73 5c 6e 22 2c  ealed %d\n%s\n",
4a00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a10: 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28 26 72      blob_size(&r
4a20: 65 63 29 2c 20 62 6c 6f 62 5f 73 74 72 28 26 72  ec), blob_str(&r
4a30: 65 63 29 29 3b 0a 20 20 20 20 20 20 6e 43 61 72  ec));.      nCar
4a40: 64 2b 2b 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  d++;.      blob_
4a50: 72 65 73 65 74 28 26 72 65 63 29 3b 0a 20 20 20  reset(&rec);.   
4a60: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
4a70: 7a 65 28 26 71 29 3b 0a 20 20 7d 0a 20 20 69 66  ze(&q);.  }.  if
4a80: 28 20 67 72 6f 75 70 4d 61 73 6b 20 26 20 43 4f  ( groupMask & CO
4a90: 4e 46 49 47 53 45 54 5f 41 4c 49 41 53 20 29 7b  NFIGSET_ALIAS ){
4aa0: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
4ab0: 26 71 2c 20 22 53 45 4c 45 43 54 20 6d 74 69 6d  &q, "SELECT mtim
4ac0: 65 2c 20 71 75 6f 74 65 28 6e 61 6d 65 29 2c 20  e, quote(name), 
4ad0: 71 75 6f 74 65 28 76 61 6c 75 65 29 20 46 52 4f  quote(value) FRO
4ae0: 4d 20 63 6f 6e 66 69 67 22 0a 20 20 20 20 20 20  M config".      
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
4b00: 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27  HERE name GLOB '
4b10: 77 61 6c 69 61 73 3a 2f 2a 27 20 41 4e 44 20 6d  walias:/*' AND m
4b20: 74 69 6d 65 3e 3d 25 6c 6c 64 22 2c 20 69 53 74  time>=%lld", iSt
4b30: 61 72 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  art);.    while(
4b40: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
4b50: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
4b60: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
4b70: 72 65 63 2c 22 25 73 20 25 73 20 76 61 6c 75 65  rec,"%s %s value
4b80: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 64 62   %s",.        db
4b90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
4ba0: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 64 62 5f   0),.        db_
4bb0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4bc0: 31 29 2c 0a 20 20 20 20 20 20 20 20 64 62 5f 63  1),.        db_c
4bd0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32  olumn_text(&q, 2
4be0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
4bf0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f   blob_appendf(pO
4c00: 75 74 2c 20 22 63 6f 6e 66 69 67 20 2f 63 6f 6e  ut, "config /con
4c10: 66 69 67 20 25 64 5c 6e 25 73 5c 6e 22 2c 0a 20  fig %d\n%s\n",. 
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 62 6c 6f 62 5f 73 69 7a 65 28 26 72 65 63    blob_size(&rec
4c40: 29 2c 20 62 6c 6f 62 5f 73 74 72 28 26 72 65 63  ), blob_str(&rec
4c50: 29 29 3b 0a 20 20 20 20 20 20 6e 43 61 72 64 2b  ));.      nCard+
4c60: 2b 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65  +;.      blob_re
4c70: 73 65 74 28 26 72 65 63 29 3b 0a 20 20 20 20 7d  set(&rec);.    }
4c80: 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  .    db_finalize
4c90: 28 26 71 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  (&q);.  }.  if( 
4ca0: 28 67 72 6f 75 70 4d 61 73 6b 20 26 20 43 4f 4e  (groupMask & CON
4cb0: 46 49 47 53 45 54 5f 53 43 52 49 42 45 52 29 21  FIGSET_SCRIBER)!
4cc0: 3d 30 0a 20 20 20 26 26 20 64 62 5f 74 61 62 6c  =0.   && db_tabl
4cd0: 65 5f 65 78 69 73 74 73 28 22 72 65 70 6f 73 69  e_exists("reposi
4ce0: 74 6f 72 79 22 2c 22 73 75 62 73 63 72 69 62 65  tory","subscribe
4cf0: 72 22 29 0a 20 20 29 7b 0a 20 20 20 20 64 62 5f  r").  ){.    db_
4d00: 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c  prepare(&q, "SEL
4d10: 45 43 54 20 6d 74 69 6d 65 2c 20 71 75 6f 74 65  ECT mtime, quote
4d20: 28 73 65 6d 61 69 6c 29 2c 22 0a 20 20 20 20 20  (semail),".     
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4d40: 71 75 6f 74 65 28 73 75 6e 61 6d 65 29 2c 20 71  quote(suname), q
4d50: 75 6f 74 65 28 73 64 69 67 65 73 74 29 2c 22 0a  uote(sdigest),".
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 22 20 71 75 6f 74 65 28 73 64 6f 6e 6f     " quote(sdono
4d80: 74 63 61 6c 6c 29 2c 20 71 75 6f 74 65 28 73 73  tcall), quote(ss
4d90: 75 62 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20  ub),".          
4da0: 20 20 20 20 20 20 20 20 20 22 20 71 75 6f 74 65           " quote
4db0: 28 73 63 74 69 6d 65 29 2c 20 71 75 6f 74 65 28  (sctime), quote(
4dc0: 73 6d 69 70 29 22 0a 20 20 20 20 20 20 20 20 20  smip)".         
4dd0: 20 20 20 20 20 20 20 20 20 20 22 20 46 52 4f 4d            " FROM
4de0: 20 73 75 62 73 63 72 69 62 65 72 20 57 48 45 52   subscriber WHER
4df0: 45 20 73 76 65 72 69 66 69 65 64 22 0a 20 20 20  E sverified".   
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 22 20 41 4e 44 20 6d 74 69 6d 65 3e 3d 25 6c 6c  " AND mtime>=%ll
4e20: 64 22 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  d", iStart);.   
4e30: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
4e40: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
4e50: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
4e60: 70 65 6e 64 66 28 26 72 65 63 2c 0a 20 20 20 20  pendf(&rec,.    
4e70: 20 20 20 20 22 25 6c 6c 64 20 25 73 20 73 75 6e      "%lld %s sun
4e80: 61 6d 65 20 25 73 20 73 64 69 67 65 73 74 20 25  ame %s sdigest %
4e90: 73 20 73 64 6f 6e 6f 74 63 61 6c 6c 20 25 73 20  s sdonotcall %s 
4ea0: 73 73 75 62 20 25 73 22 0a 20 20 20 20 20 20 20  ssub %s".       
4eb0: 20 22 20 73 63 74 69 6d 65 20 25 73 20 73 6d 69   " sctime %s smi
4ec0: 70 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 64  p %s",.        d
4ed0: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 26  b_column_int64(&
4ee0: 71 2c 20 30 29 2c 20 2f 2a 20 6d 74 69 6d 65 20  q, 0), /* mtime 
4ef0: 2a 2f 0a 20 20 20 20 20 20 20 20 64 62 5f 63 6f  */.        db_co
4f00: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29  lumn_text(&q, 1)
4f10: 2c 20 20 2f 2a 20 73 65 6d 61 69 6c 20 28 50 4b  ,  /* semail (PK
4f20: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 62 5f  ) */.        db_
4f30: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4f40: 32 29 2c 20 20 2f 2a 20 73 75 6e 61 6d 65 20 2a  2),  /* suname *
4f50: 2f 0a 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c  /.        db_col
4f60: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 2c  umn_text(&q, 3),
4f70: 20 20 2f 2a 20 73 64 69 67 65 73 74 20 2a 2f 0a    /* sdigest */.
4f80: 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d          db_colum
4f90: 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 2c 20 20  n_text(&q, 4),  
4fa0: 2f 2a 20 73 64 6f 6e 6f 74 63 61 6c 6c 20 2a 2f  /* sdonotcall */
4fb0: 0a 20 20 20 20 20 20 20 20 64 62 5f 63 6f 6c 75  .        db_colu
4fc0: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 35 29 2c 20  mn_text(&q, 5), 
4fd0: 20 2f 2a 20 73 73 75 62 20 2a 2f 0a 20 20 20 20   /* ssub */.    
4fe0: 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65      db_column_te
4ff0: 78 74 28 26 71 2c 20 36 29 2c 20 20 2f 2a 20 73  xt(&q, 6),  /* s
5000: 63 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20  ctime */.       
5010: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
5020: 26 71 2c 20 37 29 20 20 20 2f 2a 20 73 6d 69 70  &q, 7)   /* smip
5030: 20 2a 2f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   */.      );.   
5040: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
5050: 70 4f 75 74 2c 20 22 63 6f 6e 66 69 67 20 2f 73  pOut, "config /s
5060: 75 62 73 63 72 69 62 65 72 20 25 64 5c 6e 25 73  ubscriber %d\n%s
5070: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
5080: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a          blob_siz
5090: 65 28 26 72 65 63 29 2c 20 62 6c 6f 62 5f 73 74  e(&rec), blob_st
50a0: 72 28 26 72 65 63 29 29 3b 0a 20 20 20 20 20 20  r(&rec));.      
50b0: 6e 43 61 72 64 2b 2b 3b 0a 20 20 20 20 20 20 62  nCard++;.      b
50c0: 6c 6f 62 5f 72 65 73 65 74 28 26 72 65 63 29 3b  lob_reset(&rec);
50d0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69  .    }.    db_fi
50e0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d 0a  nalize(&q);.  }.
50f0: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
5100: 20 22 53 45 4c 45 43 54 20 6d 74 69 6d 65 2c 20   "SELECT mtime, 
5110: 71 75 6f 74 65 28 6e 61 6d 65 29 2c 20 71 75 6f  quote(name), quo
5120: 74 65 28 76 61 6c 75 65 29 20 46 52 4f 4d 20 63  te(value) FROM c
5130: 6f 6e 66 69 67 22 0a 20 20 20 20 20 20 20 20 20  onfig".         
5140: 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
5150: 6e 61 6d 65 3d 3a 6e 61 6d 65 20 41 4e 44 20 6d  name=:name AND m
5160: 74 69 6d 65 3e 3d 25 6c 6c 64 22 2c 20 69 53 74  time>=%lld", iSt
5170: 61 72 74 29 3b 0a 20 20 66 6f 72 28 69 69 3d 30  art);.  for(ii=0
5180: 3b 20 69 69 3c 63 6f 75 6e 74 28 61 43 6f 6e 66  ; ii<count(aConf
5190: 69 67 29 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  ig); ii++){.    
51a0: 69 66 28 20 28 61 43 6f 6e 66 69 67 5b 69 69 5d  if( (aConfig[ii]
51b0: 2e 67 72 6f 75 70 4d 61 73 6b 20 26 20 67 72 6f  .groupMask & gro
51c0: 75 70 4d 61 73 6b 29 21 3d 30 20 26 26 20 61 43  upMask)!=0 && aC
51d0: 6f 6e 66 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 5b  onfig[ii].zName[
51e0: 30 5d 21 3d 27 40 27 20 29 7b 0a 20 20 20 20 20  0]!='@' ){.     
51f0: 20 64 62 5f 62 69 6e 64 5f 74 65 78 74 28 26 71   db_bind_text(&q
5200: 2c 20 22 3a 6e 61 6d 65 22 2c 20 61 43 6f 6e 66  , ":name", aConf
5210: 69 67 5b 69 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ig[ii].zName);. 
5220: 20 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73       while( db_s
5230: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
5240: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ROW ){.        b
5250: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 72 65 63  lob_appendf(&rec
5260: 2c 22 25 73 20 25 73 20 76 61 6c 75 65 20 25 73  ,"%s %s value %s
5270: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f  ",.          db_
5280: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
5290: 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 64 62  0),.          db
52a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
52b0: 20 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 64   1),.          d
52c0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
52d0: 2c 20 32 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  , 2).        );.
52e0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70          blob_app
52f0: 65 6e 64 66 28 70 4f 75 74 2c 20 22 63 6f 6e 66  endf(pOut, "conf
5300: 69 67 20 2f 63 6f 6e 66 69 67 20 25 64 5c 6e 25  ig /config %d\n%
5310: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
5320: 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f             blob_
5330: 73 69 7a 65 28 26 72 65 63 29 2c 20 62 6c 6f 62  size(&rec), blob
5340: 5f 73 74 72 28 26 72 65 63 29 29 3b 0a 20 20 20  _str(&rec));.   
5350: 20 20 20 20 20 6e 43 61 72 64 2b 2b 3b 0a 20 20       nCard++;.  
5360: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74        blob_reset
5370: 28 26 72 65 63 29 3b 0a 20 20 20 20 20 20 7d 0a  (&rec);.      }.
5380: 20 20 20 20 20 20 64 62 5f 72 65 73 65 74 28 26        db_reset(&
5390: 71 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  q);.    }.  }.  
53a0: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
53b0: 0a 20 20 72 65 74 75 72 6e 20 6e 43 61 72 64 3b  .  return nCard;
53c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 64 65 6e 74 69  .}../*.** Identi
53d0: 66 79 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  fy a configurati
53e0: 6f 6e 20 67 72 6f 75 70 20 62 79 20 6e 61 6d 65  on group by name
53f0: 2e 20 20 52 65 74 75 72 6e 20 69 74 73 20 6d 61  .  Return its ma
5400: 73 6b 2e 0a 2a 2a 20 54 68 72 6f 77 20 61 6e 20  sk..** Throw an 
5410: 65 72 72 6f 72 20 69 66 20 6e 6f 20 6d 61 74 63  error if no matc
5420: 68 2e 0a 2a 2f 0a 69 6e 74 20 63 6f 6e 66 69 67  h..*/.int config
5430: 75 72 65 5f 6e 61 6d 65 5f 74 6f 5f 6d 61 73 6b  ure_name_to_mask
5440: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
5450: 69 6e 74 20 6e 6f 74 46 6f 75 6e 64 49 73 46 61  int notFoundIsFa
5460: 74 61 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  tal){.  int i;. 
5470: 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
5480: 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  z);.  for(i=0; i
5490: 3c 63 6f 75 6e 74 28 61 47 72 6f 75 70 4e 61 6d  <count(aGroupNam
54a0: 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  e); i++){.    if
54b0: 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 26 61 47  ( strncmp(z, &aG
54c0: 72 6f 75 70 4e 61 6d 65 5b 69 5d 2e 7a 4e 61 6d  roupName[i].zNam
54d0: 65 5b 31 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  e[1], n)==0 ){. 
54e0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 47 72 6f       return aGro
54f0: 75 70 4e 61 6d 65 5b 69 5d 2e 67 72 6f 75 70 4d  upName[i].groupM
5500: 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ask;.    }.  }. 
5510: 20 69 66 28 20 6e 6f 74 46 6f 75 6e 64 49 73 46   if( notFoundIsF
5520: 61 74 61 6c 20 29 7b 0a 20 20 20 20 66 6f 73 73  atal ){.    foss
5530: 69 6c 5f 70 72 69 6e 74 28 22 41 76 61 69 6c 61  il_print("Availa
5540: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
5550: 6e 20 61 72 65 61 73 3a 5c 6e 22 29 3b 0a 20 20  n areas:\n");.  
5560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f 75    for(i=0; i<cou
5570: 6e 74 28 61 47 72 6f 75 70 4e 61 6d 65 29 3b 20  nt(aGroupName); 
5580: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 73 73  i++){.      foss
5590: 69 6c 5f 70 72 69 6e 74 28 22 20 20 25 2d 31 33  il_print("  %-13
55a0: 73 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %s\n",.       
55b0: 20 20 20 20 20 26 61 47 72 6f 75 70 4e 61 6d 65       &aGroupName
55c0: 5b 69 5d 2e 7a 4e 61 6d 65 5b 31 5d 2c 20 61 47  [i].zName[1], aG
55d0: 72 6f 75 70 4e 61 6d 65 5b 69 5d 2e 7a 48 65 6c  roupName[i].zHel
55e0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  p);.    }.    fo
55f0: 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20 73  ssil_fatal("no s
5600: 75 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  uch configuratio
5610: 6e 20 61 72 65 61 3a 20 5c 22 25 73 5c 22 22 2c  n area: \"%s\"",
5620: 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   z);.  }.  retur
5630: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  n 0;.}../*.** Wr
5640: 69 74 65 20 53 51 4c 20 74 65 78 74 20 69 6e 74  ite SQL text int
5650: 6f 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65  o file zFilename
5660: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 74 6f   that will resto
5670: 72 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  re the configura
5680: 74 69 6f 6e 0a 2a 2a 20 61 72 65 61 20 69 64 65  tion.** area ide
5690: 6e 74 69 66 69 65 64 20 62 79 20 6d 61 73 6b 20  ntified by mask 
56a0: 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  to its current s
56b0: 74 61 74 65 20 66 72 6f 6d 20 61 6e 79 20 6f 74  tate from any ot
56c0: 68 65 72 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  her state..*/.st
56d0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6f 72 74  atic void export
56e0: 5f 63 6f 6e 66 69 67 28 0a 20 20 69 6e 74 20 67  _config(.  int g
56f0: 72 6f 75 70 4d 61 73 6b 2c 20 20 20 20 20 20 20  roupMask,       
5700: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 69 6e 64       /* Mask ind
5710: 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 63 6f  icating which co
5720: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 65  nfiguration to e
5730: 78 70 6f 72 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  xport */.  const
5740: 20 63 68 61 72 20 2a 7a 4d 61 73 6b 2c 20 20 20   char *zMask,   
5750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5760: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
5770: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
5780: 6e 74 36 34 20 69 53 74 61 72 74 2c 20 20 20 20  nt64 iStart,    
5790: 20 2f 2a 20 53 74 61 72 74 20 64 61 74 65 20 2a   /* Start date *
57a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
57b0: 7a 46 69 6c 65 6e 61 6d 65 20 20 20 20 20 2f 2a  zFilename     /*
57c0: 20 57 72 69 74 65 20 69 6e 74 6f 20 74 68 69 73   Write into this
57d0: 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 6c   file */.){.  Bl
57e0: 6f 62 20 6f 75 74 3b 0a 20 20 62 6c 6f 62 5f 7a  ob out;.  blob_z
57f0: 65 72 6f 28 26 6f 75 74 29 3b 0a 20 20 62 6c 6f  ero(&out);.  blo
5800: 62 5f 61 70 70 65 6e 64 66 28 26 6f 75 74 2c 0a  b_appendf(&out,.
5810: 20 20 20 20 22 23 20 54 68 65 20 5c 22 25 73 5c      "# The \"%s\
5820: 22 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  " configuration 
5830: 65 78 70 6f 72 74 65 64 20 66 72 6f 6d 5c 6e 22  exported from\n"
5840: 0a 20 20 20 20 22 23 20 72 65 70 6f 73 69 74 6f  .    "# reposito
5850: 72 79 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20  ry \"%s\"\n".   
5860: 20 22 23 20 6f 6e 20 25 73 5c 6e 22 2c 0a 20 20   "# on %s\n",.  
5870: 20 20 7a 4d 61 73 6b 2c 20 67 2e 7a 52 65 70 6f    zMask, g.zRepo
5880: 73 69 74 6f 72 79 4e 61 6d 65 2c 0a 20 20 20 20  sitoryName,.    
5890: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
58a0: 43 54 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77  CT datetime('now
58b0: 27 29 22 29 0a 20 20 29 3b 0a 20 20 63 6f 6e 66  ')").  );.  conf
58c0: 69 67 75 72 65 5f 73 65 6e 64 5f 67 72 6f 75 70  igure_send_group
58d0: 28 26 6f 75 74 2c 20 67 72 6f 75 70 4d 61 73 6b  (&out, groupMask
58e0: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 62 6c 6f  , iStart);.  blo
58f0: 62 5f 77 72 69 74 65 5f 74 6f 5f 66 69 6c 65 28  b_write_to_file(
5900: 26 6f 75 74 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  &out, zFilename)
5910: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
5920: 6f 75 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  out);.}.../*.** 
5930: 43 4f 4d 4d 41 4e 44 3a 20 63 6f 6e 66 69 67 75  COMMAND: configu
5940: 72 61 74 69 6f 6e 2a 0a 2a 2a 0a 2a 2a 20 55 73  ration*.**.** Us
5950: 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 63 6f 6e  age: %fossil con
5960: 66 69 67 75 72 61 74 69 6f 6e 20 4d 45 54 48 4f  figuration METHO
5970: 44 20 2e 2e 2e 20 3f 4f 50 54 49 4f 4e 53 3f 0a  D ... ?OPTIONS?.
5980: 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 4d 45 54 48  **.** Where METH
5990: 4f 44 20 69 73 20 6f 6e 65 20 6f 66 3a 20 65 78  OD is one of: ex
59a0: 70 6f 72 74 20 69 6d 70 6f 72 74 20 6d 65 72 67  port import merg
59b0: 65 20 70 75 6c 6c 20 70 75 73 68 20 72 65 73 65  e pull push rese
59c0: 74 2e 20 20 41 6c 6c 20 6d 65 74 68 6f 64 73 0a  t.  All methods.
59d0: 2a 2a 20 61 63 63 65 70 74 20 74 68 65 20 2d 52  ** accept the -R
59e0: 20 6f 72 20 2d 2d 72 65 70 6f 73 69 74 6f 72 79   or --repository
59f0: 20 6f 70 74 69 6f 6e 20 74 6f 20 73 70 65 63 69   option to speci
5a00: 66 79 20 61 20 72 65 70 6f 73 69 74 6f 72 79 2e  fy a repository.
5a10: 0a 2a 2a 0a 2a 2a 20 20 20 20 25 66 6f 73 73 69  .**.**    %fossi
5a20: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
5a30: 65 78 70 6f 72 74 20 41 52 45 41 20 46 49 4c 45  export AREA FILE
5a40: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  NAME.**.**      
5a50: 20 20 20 57 72 69 74 65 20 74 6f 20 46 49 4c 45     Write to FILE
5a60: 4e 41 4d 45 20 65 78 70 6f 72 74 65 64 20 63 6f  NAME exported co
5a70: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 66 6f  nfiguration info
5a80: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 41 52 45 41  rmation for AREA
5a90: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 52 45  ..**         ARE
5aa0: 41 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 66 3a  A can be one of:
5ab0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
5ac0: 20 20 20 61 6c 6c 20 65 6d 61 69 6c 20 70 72 6f     all email pro
5ad0: 6a 65 63 74 20 73 68 75 6e 20 73 6b 69 6e 20 74  ject shun skin t
5ae0: 69 63 6b 65 74 20 75 73 65 72 20 61 6c 69 61 73  icket user alias
5af0: 20 73 75 62 73 63 72 69 62 65 72 0a 2a 2a 0a 2a   subscriber.**.*
5b00: 2a 20 20 20 20 25 66 6f 73 73 69 6c 20 63 6f 6e  *    %fossil con
5b10: 66 69 67 75 72 61 74 69 6f 6e 20 69 6d 70 6f 72  figuration impor
5b20: 74 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a  t FILENAME.**.**
5b30: 20 20 20 20 20 20 20 20 20 52 65 61 64 20 61 20           Read a 
5b40: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 72  configuration fr
5b50: 6f 6d 20 46 49 4c 45 4e 41 4d 45 2c 20 6f 76 65  om FILENAME, ove
5b60: 72 77 72 69 74 69 6e 67 20 74 68 65 20 63 75 72  rwriting the cur
5b70: 72 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  rent.**         
5b80: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
5b90: 2a 0a 2a 2a 20 20 20 20 25 66 6f 73 73 69 6c 20  *.**    %fossil 
5ba0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6d 65  configuration me
5bb0: 72 67 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a  rge FILENAME.**.
5bc0: 2a 2a 20 20 20 20 20 20 20 20 20 52 65 61 64 20  **         Read 
5bd0: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
5be0: 66 72 6f 6d 20 46 49 4c 45 4e 41 4d 45 20 61 6e  from FILENAME an
5bf0: 64 20 6d 65 72 67 65 20 69 74 73 20 76 61 6c 75  d merge its valu
5c00: 65 73 20 69 6e 74 6f 0a 2a 2a 20 20 20 20 20 20  es into.**      
5c10: 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63     the current c
5c20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 45  onfiguration.  E
5c30: 78 69 73 74 69 6e 67 20 76 61 6c 75 65 73 20 74  xisting values t
5c40: 61 6b 65 20 70 72 69 6f 72 69 74 79 20 6f 76 65  ake priority ove
5c50: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 6c  r.**         val
5c60: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 46 49  ues read from FI
5c70: 4c 45 4e 41 4d 45 2e 0a 2a 2a 0a 2a 2a 20 20 20  LENAME..**.**   
5c80: 20 25 66 6f 73 73 69 6c 20 63 6f 6e 66 69 67 75   %fossil configu
5c90: 72 61 74 69 6f 6e 20 70 75 6c 6c 20 41 52 45 41  ration pull AREA
5ca0: 20 3f 55 52 4c 3f 0a 2a 2a 0a 2a 2a 20 20 20 20   ?URL?.**.**    
5cb0: 20 20 20 20 20 50 75 6c 6c 20 61 6e 64 20 69 6e       Pull and in
5cc0: 73 74 61 6c 6c 20 74 68 65 20 63 6f 6e 66 69 67  stall the config
5cd0: 75 72 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 64  uration from a d
5ce0: 69 66 66 65 72 65 6e 74 20 73 65 72 76 65 72 0a  ifferent server.
5cf0: 2a 2a 20 20 20 20 20 20 20 20 20 69 64 65 6e 74  **         ident
5d00: 69 66 69 65 64 20 62 79 20 55 52 4c 2e 20 20 49  ified by URL.  I
5d10: 66 20 6e 6f 20 55 52 4c 20 69 73 20 73 70 65 63  f no URL is spec
5d20: 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ified, then the 
5d30: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
5d40: 20 20 20 73 65 72 76 65 72 20 69 73 20 75 73 65     server is use
5d50: 64 2e 20 20 55 73 65 20 74 68 65 20 2d 2d 6f 76  d.  Use the --ov
5d60: 65 72 77 72 69 74 65 20 66 6c 61 67 20 74 6f 20  erwrite flag to 
5d70: 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 20 20  completely.**   
5d80: 20 20 20 20 20 20 72 65 70 6c 61 63 65 20 6c 6f        replace lo
5d90: 63 61 6c 20 73 65 74 74 69 6e 67 73 20 77 69 74  cal settings wit
5da0: 68 20 63 6f 6e 74 65 6e 74 20 72 65 63 65 69 76  h content receiv
5db0: 65 64 20 66 72 6f 6d 20 55 52 4c 2e 0a 2a 2a 0a  ed from URL..**.
5dc0: 2a 2a 20 20 20 20 25 66 6f 73 73 69 6c 20 63 6f  **    %fossil co
5dd0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 75 73 68  nfiguration push
5de0: 20 41 52 45 41 20 3f 55 52 4c 3f 0a 2a 2a 0a 2a   AREA ?URL?.**.*
5df0: 2a 20 20 20 20 20 20 20 20 20 50 75 73 68 20 74  *         Push t
5e00: 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 66 69 67 75  he local configu
5e10: 72 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  ration into the 
5e20: 72 65 6d 6f 74 65 20 73 65 72 76 65 72 20 69 64  remote server id
5e30: 65 6e 74 69 66 69 65 64 0a 2a 2a 20 20 20 20 20  entified.**     
5e40: 20 20 20 20 62 79 20 55 52 4c 2e 20 20 41 64 6d      by URL.  Adm
5e50: 69 6e 20 70 72 69 76 69 6c 65 67 65 20 69 73 20  in privilege is 
5e60: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
5e70: 72 65 6d 6f 74 65 20 73 65 72 76 65 72 20 66 6f  remote server fo
5e80: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 69  r.**         thi
5e90: 73 20 74 6f 20 77 6f 72 6b 2e 20 20 57 68 65 6e  s to work.  When
5ea0: 20 74 68 65 20 73 61 6d 65 20 72 65 63 6f 72 64   the same record
5eb0: 20 65 78 69 73 74 73 20 62 6f 74 68 20 6c 6f 63   exists both loc
5ec0: 61 6c 6c 79 20 61 6e 64 20 6f 6e 0a 2a 2a 20 20  ally and on.**  
5ed0: 20 20 20 20 20 20 20 74 68 65 20 72 65 6d 6f 74         the remot
5ee0: 65 20 65 6e 64 2c 20 74 68 65 20 6f 6e 65 20 74  e end, the one t
5ef0: 68 61 74 20 77 61 73 20 6d 6f 73 74 20 72 65 63  hat was most rec
5f00: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 20 77 69  ently changed wi
5f10: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 25 66 6f  ns..**.**    %fo
5f20: 73 73 69 6c 20 63 6f 6e 66 69 67 75 72 61 74 69  ssil configurati
5f30: 6f 6e 20 72 65 73 65 74 20 41 52 45 41 0a 2a 2a  on reset AREA.**
5f40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 73 74  .**         Rest
5f50: 6f 72 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ore the configur
5f60: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 65 66  ation to the def
5f70: 61 75 6c 74 2e 20 20 41 52 45 41 20 61 73 20 61  ault.  AREA as a
5f80: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 25  bove..**.**    %
5f90: 66 6f 73 73 69 6c 20 63 6f 6e 66 69 67 75 72 61  fossil configura
5fa0: 74 69 6f 6e 20 73 79 6e 63 20 41 52 45 41 20 3f  tion sync AREA ?
5fb0: 55 52 4c 3f 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  URL?.**.**      
5fc0: 20 20 20 53 79 6e 63 68 72 6f 6e 69 7a 65 20 63     Synchronize c
5fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 68 61  onfiguration cha
5fe0: 6e 67 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 61  nges in the loca
5ff0: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 77 69 74  l repository wit
6000: 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  h.**         the
6010: 20 72 65 6d 6f 74 65 20 72 65 70 6f 73 69 74 6f   remote reposito
6020: 72 79 20 61 74 20 55 52 4c 2e 0a 2a 2a 0a 2a 2a  ry at URL..**.**
6030: 20 4f 70 74 69 6f 6e 73 3a 0a 2a 2a 20 20 20 20   Options:.**    
6040: 2d 52 7c 2d 2d 72 65 70 6f 73 69 74 6f 72 79 20  -R|--repository 
6050: 46 49 4c 45 20 20 20 20 20 20 20 45 78 74 72 61  FILE       Extra
6060: 63 74 20 69 6e 66 6f 20 66 72 6f 6d 20 72 65 70  ct info from rep
6070: 6f 73 69 74 6f 72 79 20 46 49 4c 45 0a 2a 2a 0a  ository FILE.**.
6080: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 65 74  ** See also: set
6090: 74 69 6e 67 73 2c 20 75 6e 73 65 74 0a 2a 2f 0a  tings, unset.*/.
60a0: 76 6f 69 64 20 63 6f 6e 66 69 67 75 72 61 74 69  void configurati
60b0: 6f 6e 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20  on_cmd(void){.  
60c0: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
60d0: 68 61 72 20 2a 7a 4d 65 74 68 6f 64 3b 0a 20 20  har *zMethod;.  
60e0: 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e  db_find_and_open
60f0: 5f 72 65 70 6f 73 69 74 6f 72 79 28 30 2c 20 30  _repository(0, 0
6100: 29 3b 0a 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e  );.  db_open_con
6110: 66 69 67 28 30 2c 20 30 29 3b 0a 20 20 69 66 28  fig(0, 0);.  if(
6120: 20 67 2e 61 72 67 63 3c 33 20 29 7b 0a 20 20 20   g.argc<3 ){.   
6130: 20 75 73 61 67 65 28 22 53 55 42 43 4f 4d 4d 41   usage("SUBCOMMA
6140: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 7d 0a 20 20  ND ...");.  }.  
6150: 7a 4d 65 74 68 6f 64 20 3d 20 67 2e 61 72 67 76  zMethod = g.argv
6160: 5b 32 5d 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65  [2];.  n = strle
6170: 6e 28 7a 4d 65 74 68 6f 64 29 3b 0a 20 20 69 66  n(zMethod);.  if
6180: 28 20 73 74 72 6e 63 6d 70 28 7a 4d 65 74 68 6f  ( strncmp(zMetho
6190: 64 2c 20 22 65 78 70 6f 72 74 22 2c 20 6e 29 3d  d, "export", n)=
61a0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61  =0 ){.    int ma
61b0: 73 6b 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  sk;.    const ch
61c0: 61 72 20 2a 7a 53 69 6e 63 65 20 3d 20 66 69 6e  ar *zSince = fin
61d0: 64 5f 6f 70 74 69 6f 6e 28 22 73 69 6e 63 65 22  d_option("since"
61e0: 2c 30 2c 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ,0,1);.    sqlit
61f0: 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 3b  e3_int64 iStart;
6200: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 21  .    if( g.argc!
6210: 3d 35 20 29 7b 0a 20 20 20 20 20 20 75 73 61 67  =5 ){.      usag
6220: 65 28 22 65 78 70 6f 72 74 20 41 52 45 41 20 46  e("export AREA F
6230: 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 7d  ILENAME");.    }
6240: 0a 20 20 20 20 6d 61 73 6b 20 3d 20 63 6f 6e 66  .    mask = conf
6250: 69 67 75 72 65 5f 6e 61 6d 65 5f 74 6f 5f 6d 61  igure_name_to_ma
6260: 73 6b 28 67 2e 61 72 67 76 5b 33 5d 2c 20 31 29  sk(g.argv[3], 1)
6270: 3b 0a 20 20 20 20 69 66 28 20 7a 53 69 6e 63 65  ;.    if( zSince
6280: 20 29 7b 0a 20 20 20 20 20 20 69 53 74 61 72 74   ){.      iStart
6290: 20 3d 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63   = db_multi_exec
62a0: 28 0a 20 20 20 20 20 20 20 20 20 22 53 45 4c 45  (.         "SELE
62b0: 43 54 20 63 6f 61 6c 65 73 63 65 28 73 74 72 66  CT coalesce(strf
62c0: 74 69 6d 65 28 27 25 25 73 27 2c 25 51 29 2c 73  time('%%s',%Q),s
62d0: 74 72 66 74 69 6d 65 28 27 25 25 73 27 2c 27 6e  trftime('%%s','n
62e0: 6f 77 27 2c 25 51 29 29 2b 30 22 2c 0a 20 20 20  ow',%Q))+0",.   
62f0: 20 20 20 20 20 20 7a 53 69 6e 63 65 2c 20 7a 53        zSince, zS
6300: 69 6e 63 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  ince.      );.  
6310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
6320: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Start = 0;.    }
6330: 0a 20 20 20 20 65 78 70 6f 72 74 5f 63 6f 6e 66  .    export_conf
6340: 69 67 28 6d 61 73 6b 2c 20 67 2e 61 72 67 76 5b  ig(mask, g.argv[
6350: 33 5d 2c 20 69 53 74 61 72 74 2c 20 67 2e 61 72  3], iStart, g.ar
6360: 67 76 5b 34 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  gv[4]);.  }else.
6370: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4d    if( strncmp(zM
6380: 65 74 68 6f 64 2c 20 22 69 6d 70 6f 72 74 22 2c  ethod, "import",
6390: 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c   n)==0.       ||
63a0: 20 73 74 72 6e 63 6d 70 28 7a 4d 65 74 68 6f 64   strncmp(zMethod
63b0: 2c 20 22 6d 65 72 67 65 22 2c 20 6e 29 3d 3d 30  , "merge", n)==0
63c0: 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 69 6e 3b   ){.    Blob in;
63d0: 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 4d 61  .    int groupMa
63e0: 73 6b 3b 0a 20 20 20 20 69 66 28 20 67 2e 61 72  sk;.    if( g.ar
63f0: 67 63 21 3d 34 20 29 20 75 73 61 67 65 28 6d 70  gc!=4 ) usage(mp
6400: 72 69 6e 74 66 28 22 25 73 20 46 49 4c 45 4e 41  rintf("%s FILENA
6410: 4d 45 22 2c 7a 4d 65 74 68 6f 64 29 29 3b 0a 20  ME",zMethod));. 
6420: 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f     blob_read_fro
6430: 6d 5f 66 69 6c 65 28 26 69 6e 2c 20 67 2e 61 72  m_file(&in, g.ar
6440: 67 76 5b 33 5d 2c 20 45 78 74 46 49 4c 45 29 3b  gv[3], ExtFILE);
6450: 0a 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74 72  .    db_begin_tr
6460: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
6470: 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d   if( zMethod[0]=
6480: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 67 72  ='i' ){.      gr
6490: 6f 75 70 4d 61 73 6b 20 3d 20 43 4f 4e 46 49 47  oupMask = CONFIG
64a0: 53 45 54 5f 41 4c 4c 20 7c 20 43 4f 4e 46 49 47  SET_ALL | CONFIG
64b0: 53 45 54 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20  SET_OVERWRITE;. 
64c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
64d0: 67 72 6f 75 70 4d 61 73 6b 20 3d 20 43 4f 4e 46  groupMask = CONF
64e0: 49 47 53 45 54 5f 41 4c 4c 3b 0a 20 20 20 20 7d  IGSET_ALL;.    }
64f0: 0a 20 20 20 20 63 6f 6e 66 69 67 75 72 65 5f 72  .    configure_r
6500: 65 63 65 69 76 65 5f 61 6c 6c 28 26 69 6e 2c 20  eceive_all(&in, 
6510: 67 72 6f 75 70 4d 61 73 6b 29 3b 0a 20 20 20 20  groupMask);.    
6520: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  db_end_transacti
6530: 6f 6e 28 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  on(0);.  }else. 
6540: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4d 65   if( strncmp(zMe
6550: 74 68 6f 64 2c 20 22 70 75 6c 6c 22 2c 20 6e 29  thod, "pull", n)
6560: 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 6e 63 6d  ==0.   || strncm
6570: 70 28 7a 4d 65 74 68 6f 64 2c 20 22 70 75 73 68  p(zMethod, "push
6580: 22 2c 20 6e 29 3d 3d 30 0a 20 20 20 7c 7c 20 73  ", n)==0.   || s
6590: 74 72 6e 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 20  trncmp(zMethod, 
65a0: 22 73 79 6e 63 22 2c 20 6e 29 3d 3d 30 0a 20 20  "sync", n)==0.  
65b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b  ){.    int mask;
65c0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
65d0: 2a 7a 53 65 72 76 65 72 20 3d 20 30 3b 0a 20 20  *zServer = 0;.  
65e0: 20 20 69 6e 74 20 6f 76 65 72 77 72 69 74 65 46    int overwriteF
65f0: 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  lag = 0;..    if
6600: 28 20 73 74 72 6e 63 6d 70 28 7a 4d 65 74 68 6f  ( strncmp(zMetho
6610: 64 2c 22 70 75 6c 6c 22 2c 6e 29 3d 3d 30 20 29  d,"pull",n)==0 )
6620: 7b 0a 20 20 20 20 20 20 6f 76 65 72 77 72 69 74  {.      overwrit
6630: 65 46 6c 61 67 20 3d 20 66 69 6e 64 5f 6f 70 74  eFlag = find_opt
6640: 69 6f 6e 28 22 6f 76 65 72 77 72 69 74 65 22 2c  ion("overwrite",
6650: 30 2c 30 29 21 3d 30 3b 0a 20 20 20 20 7d 0a 20  0,0)!=0;.    }. 
6660: 20 20 20 75 72 6c 5f 70 72 6f 78 79 5f 6f 70 74     url_proxy_opt
6670: 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20  ions();.    if( 
6680: 67 2e 61 72 67 63 21 3d 34 20 26 26 20 67 2e 61  g.argc!=4 && g.a
6690: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 20 20  rgc!=5 ){.      
66a0: 75 73 61 67 65 28 6d 70 72 69 6e 74 66 28 22 25  usage(mprintf("%
66b0: 73 20 41 52 45 41 20 3f 55 52 4c 3f 22 2c 20 7a  s AREA ?URL?", z
66c0: 4d 65 74 68 6f 64 29 29 3b 0a 20 20 20 20 7d 0a  Method));.    }.
66d0: 20 20 20 20 6d 61 73 6b 20 3d 20 63 6f 6e 66 69      mask = confi
66e0: 67 75 72 65 5f 6e 61 6d 65 5f 74 6f 5f 6d 61 73  gure_name_to_mas
66f0: 6b 28 67 2e 61 72 67 76 5b 33 5d 2c 20 31 29 3b  k(g.argv[3], 1);
6700: 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63 3d  .    if( g.argc=
6710: 3d 35 20 29 7b 0a 20 20 20 20 20 20 7a 53 65 72  =5 ){.      zSer
6720: 76 65 72 20 3d 20 67 2e 61 72 67 76 5b 34 5d 3b  ver = g.argv[4];
6730: 0a 20 20 20 20 7d 0a 20 20 20 20 75 72 6c 5f 70  .    }.    url_p
6740: 61 72 73 65 28 7a 53 65 72 76 65 72 2c 20 55 52  arse(zServer, UR
6750: 4c 5f 50 52 4f 4d 50 54 5f 50 57 29 3b 0a 20 20  L_PROMPT_PW);.  
6760: 20 20 69 66 28 20 67 2e 75 72 6c 2e 70 72 6f 74    if( g.url.prot
6770: 6f 63 6f 6c 3d 3d 30 20 29 20 66 6f 73 73 69 6c  ocol==0 ) fossil
6780: 5f 66 61 74 61 6c 28 22 6e 6f 20 73 65 72 76 65  _fatal("no serve
6790: 72 20 55 52 4c 20 73 70 65 63 69 66 69 65 64 22  r URL specified"
67a0: 29 3b 0a 20 20 20 20 75 73 65 72 5f 73 65 6c 65  );.    user_sele
67b0: 63 74 28 29 3b 0a 20 20 20 20 75 72 6c 5f 65 6e  ct();.    url_en
67c0: 61 62 6c 65 5f 70 72 6f 78 79 28 22 76 69 61 20  able_proxy("via 
67d0: 70 72 6f 78 79 3a 20 22 29 3b 0a 20 20 20 20 69  proxy: ");.    i
67e0: 66 28 20 6f 76 65 72 77 72 69 74 65 46 6c 61 67  f( overwriteFlag
67f0: 20 29 20 6d 61 73 6b 20 7c 3d 20 43 4f 4e 46 49   ) mask |= CONFI
6800: 47 53 45 54 5f 4f 56 45 52 57 52 49 54 45 3b 0a  GSET_OVERWRITE;.
6810: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
6820: 7a 4d 65 74 68 6f 64 2c 20 22 70 75 73 68 22 2c  zMethod, "push",
6830: 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
6840: 63 6c 69 65 6e 74 5f 73 79 6e 63 28 30 2c 30 2c  client_sync(0,0,
6850: 28 75 6e 73 69 67 6e 65 64 29 6d 61 73 6b 29 3b  (unsigned)mask);
6860: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
6870: 74 72 6e 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 20  trncmp(zMethod, 
6880: 22 70 75 6c 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b  "pull", n)==0 ){
6890: 0a 20 20 20 20 20 20 63 6c 69 65 6e 74 5f 73 79  .      client_sy
68a0: 6e 63 28 30 2c 28 75 6e 73 69 67 6e 65 64 29 6d  nc(0,(unsigned)m
68b0: 61 73 6b 2c 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ask,0);.    }els
68c0: 65 7b 0a 20 20 20 20 20 20 63 6c 69 65 6e 74 5f  e{.      client_
68d0: 73 79 6e 63 28 30 2c 28 75 6e 73 69 67 6e 65 64  sync(0,(unsigned
68e0: 29 6d 61 73 6b 2c 28 75 6e 73 69 67 6e 65 64 29  )mask,(unsigned)
68f0: 6d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  mask);.    }.  }
6900: 65 6c 73 65 0a 20 20 69 66 28 20 73 74 72 6e 63  else.  if( strnc
6910: 6d 70 28 7a 4d 65 74 68 6f 64 2c 20 22 72 65 73  mp(zMethod, "res
6920: 65 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  et", n)==0 ){.  
6930: 20 20 69 6e 74 20 6d 61 73 6b 2c 20 69 3b 0a 20    int mask, i;. 
6940: 20 20 20 63 68 61 72 20 2a 7a 42 61 63 6b 75 70     char *zBackup
6950: 3b 0a 20 20 20 20 69 66 28 20 67 2e 61 72 67 63  ;.    if( g.argc
6960: 21 3d 34 20 29 20 75 73 61 67 65 28 22 72 65 73  !=4 ) usage("res
6970: 65 74 20 41 52 45 41 22 29 3b 0a 20 20 20 20 6d  et AREA");.    m
6980: 61 73 6b 20 3d 20 63 6f 6e 66 69 67 75 72 65 5f  ask = configure_
6990: 6e 61 6d 65 5f 74 6f 5f 6d 61 73 6b 28 67 2e 61  name_to_mask(g.a
69a0: 72 67 76 5b 33 5d 2c 20 31 29 3b 0a 20 20 20 20  rgv[3], 1);.    
69b0: 7a 42 61 63 6b 75 70 20 3d 20 64 62 5f 74 65 78  zBackup = db_tex
69c0: 74 28 30 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  t(0,.       "SEL
69d0: 45 43 54 20 73 74 72 66 74 69 6d 65 28 27 63 6f  ECT strftime('co
69e0: 6e 66 69 67 2d 62 61 63 6b 75 70 2d 25 25 59 25  nfig-backup-%%Y%
69f0: 25 6d 25 25 64 25 25 48 25 25 4d 25 25 66 27 2c  %m%%d%%H%%M%%f',
6a00: 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20 64 62  'now')");.    db
6a10: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
6a20: 6f 6e 28 29 3b 0a 20 20 20 20 65 78 70 6f 72 74  on();.    export
6a30: 5f 63 6f 6e 66 69 67 28 6d 61 73 6b 2c 20 67 2e  _config(mask, g.
6a40: 61 72 67 76 5b 33 5d 2c 20 30 2c 20 7a 42 61 63  argv[3], 0, zBac
6a50: 6b 75 70 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  kup);.    for(i=
6a60: 30 3b 20 69 3c 63 6f 75 6e 74 28 61 43 6f 6e 66  0; i<count(aConf
6a70: 69 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ig); i++){.     
6a80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6a90: 6d 65 20 3d 20 61 43 6f 6e 66 69 67 5b 69 5d 2e  me = aConfig[i].
6aa0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
6ab0: 20 28 61 43 6f 6e 66 69 67 5b 69 5d 2e 67 72 6f   (aConfig[i].gro
6ac0: 75 70 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  upMask & mask)==
6ad0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6ae0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d      if( zName[0]
6af0: 21 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20  !='@' ){.       
6b00: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
6b10: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 66  DELETE FROM conf
6b20: 69 67 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ig WHERE name=%Q
6b30: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
6b40: 20 7d 65 6c 73 65 20 69 66 28 20 66 6f 73 73 69   }else if( fossi
6b50: 6c 5f 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 22  l_strcmp(zName,"
6b60: 40 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  @user")==0 ){.  
6b70: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
6b80: 78 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d  xec("DELETE FROM
6b90: 20 75 73 65 72 22 29 3b 0a 20 20 20 20 20 20 20   user");.       
6ba0: 20 64 62 5f 63 72 65 61 74 65 5f 64 65 66 61 75   db_create_defau
6bb0: 6c 74 5f 75 73 65 72 73 28 30 2c 20 30 29 3b 0a  lt_users(0, 0);.
6bc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6bd0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4e  fossil_strcmp(zN
6be0: 61 6d 65 2c 22 40 63 6f 6e 63 65 61 6c 65 64 22  ame,"@concealed"
6bf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6c00: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44  db_multi_exec("D
6c10: 45 4c 45 54 45 20 46 52 4f 4d 20 63 6f 6e 63 65  ELETE FROM conce
6c20: 61 6c 65 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  aled");.      }e
6c30: 6c 73 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73  lse if( fossil_s
6c40: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 22 40 73 68  trcmp(zName,"@sh
6c50: 75 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  un")==0 ){.     
6c60: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
6c70: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 68  ("DELETE FROM sh
6c80: 75 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  un");.      }els
6c90: 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72  e if( fossil_str
6ca0: 63 6d 70 28 7a 4e 61 6d 65 2c 22 40 73 75 62 73  cmp(zName,"@subs
6cb0: 63 72 69 62 65 72 22 29 3d 3d 30 20 29 7b 0a 20  criber")==0 ){. 
6cc0: 20 20 20 20 20 20 20 69 66 28 20 64 62 5f 74 61         if( db_ta
6cd0: 62 6c 65 5f 65 78 69 73 74 73 28 22 72 65 70 6f  ble_exists("repo
6ce0: 73 69 74 6f 72 79 22 2c 22 73 75 62 73 63 72 69  sitory","subscri
6cf0: 62 65 72 22 29 20 29 7b 0a 20 20 20 20 20 20 20  ber") ){.       
6d00: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
6d10: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 75  ("DELETE FROM su
6d20: 62 73 63 72 69 62 65 72 22 29 3b 0a 20 20 20 20  bscriber");.    
6d30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6d40: 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72  e if( fossil_str
6d50: 63 6d 70 28 7a 4e 61 6d 65 2c 22 40 66 6f 72 75  cmp(zName,"@foru
6d60: 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  m")==0 ){.      
6d70: 20 20 69 66 28 20 64 62 5f 74 61 62 6c 65 5f 65    if( db_table_e
6d80: 78 69 73 74 73 28 22 72 65 70 6f 73 69 74 6f 72  xists("repositor
6d90: 79 22 2c 22 66 6f 72 75 6d 70 6f 73 74 22 29 20  y","forumpost") 
6da0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 5f  ){.          db_
6db0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45  multi_exec("DELE
6dc0: 54 45 20 46 52 4f 4d 20 66 6f 72 75 6d 70 6f 73  TE FROM forumpos
6dd0: 74 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  t");.          d
6de0: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45  b_multi_exec("DE
6df0: 4c 45 54 45 20 46 52 4f 4d 20 66 6f 72 75 6d 74  LETE FROM forumt
6e00: 68 72 65 61 64 22 29 3b 0a 20 20 20 20 20 20 20  hread");.       
6e10: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
6e20: 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70  f( fossil_strcmp
6e30: 28 7a 4e 61 6d 65 2c 22 40 72 65 70 6f 72 74 66  (zName,"@reportf
6e40: 6d 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mt")==0 ){.     
6e50: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
6e60: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 65  ("DELETE FROM re
6e70: 70 6f 72 74 66 6d 74 22 29 3b 0a 20 20 20 20 20  portfmt");.     
6e80: 20 20 20 61 73 73 65 72 74 28 20 73 74 72 63 68     assert( strch
6e90: 72 28 7a 52 65 70 6f 73 69 74 6f 72 79 53 63 68  r(zRepositorySch
6ea0: 65 6d 61 44 65 66 61 75 6c 74 52 65 70 6f 72 74  emaDefaultReport
6eb0: 73 2c 27 25 27 29 3d 3d 30 20 29 3b 0a 20 20 20  s,'%')==0 );.   
6ec0: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78       db_multi_ex
6ed0: 65 63 28 7a 52 65 70 6f 73 69 74 6f 72 79 53 63  ec(zRepositorySc
6ee0: 68 65 6d 61 44 65 66 61 75 6c 74 52 65 70 6f 72  hemaDefaultRepor
6ef0: 74 73 20 2f 2a 77 6f 72 6b 73 2d 6c 69 6b 65 3a  ts /*works-like:
6f00: 22 22 2a 2f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ""*/);.      }. 
6f10: 20 20 20 7d 0a 20 20 20 20 64 62 5f 65 6e 64 5f     }.    db_end_
6f20: 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a  transaction(0);.
6f30: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
6f40: 28 22 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ("Configuration 
6f50: 72 65 73 65 74 20 74 6f 20 66 61 63 74 6f 72 79  reset to factory
6f60: 20 64 65 66 61 75 6c 74 73 2e 5c 6e 22 29 3b 0a   defaults.\n");.
6f70: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
6f80: 28 22 54 6f 20 72 65 63 6f 76 65 72 2c 20 75 73  ("To recover, us
6f90: 65 3a 20 20 25 73 20 25 73 20 69 6d 70 6f 72 74  e:  %s %s import
6fa0: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
6fb0: 20 20 20 20 67 2e 61 72 67 76 5b 30 5d 2c 20 67      g.argv[0], g
6fc0: 2e 61 72 67 76 5b 31 5d 2c 20 7a 42 61 63 6b 75  .argv[1], zBacku
6fd0: 70 29 3b 0a 20 20 20 20 72 65 62 75 69 6c 64 4d  p);.    rebuildM
6fe0: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ask |= mask;.  }
6ff0: 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 66 6f 73  else.  {.    fos
7000: 73 69 6c 5f 66 61 74 61 6c 28 22 4d 45 54 48 4f  sil_fatal("METHO
7010: 44 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  D should be one 
7020: 6f 66 3a 22 0a 20 20 20 20 20 20 20 20 20 20 20  of:".           
7030: 20 20 20 20 20 20 22 20 65 78 70 6f 72 74 20 69        " export i
7040: 6d 70 6f 72 74 20 6d 65 72 67 65 20 70 75 6c 6c  mport merge pull
7050: 20 70 75 73 68 20 72 65 73 65 74 22 29 3b 0a 20   push reset");. 
7060: 20 7d 0a 20 20 63 6f 6e 66 69 67 75 72 65 5f 72   }.  configure_r
7070: 65 62 75 69 6c 64 28 29 3b 0a 7d 0a 0a 0a 2f 2a  ebuild();.}.../*
7080: 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65 73  .** COMMAND: tes
7090: 74 2d 76 61 72 2d 6c 69 73 74 0a 2a 2a 0a 2a 2a  t-var-list.**.**
70a0: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
70b0: 74 65 73 74 2d 76 61 72 2d 6c 69 73 74 20 3f 50  test-var-list ?P
70c0: 41 54 54 45 52 4e 3f 20 3f 2d 2d 75 6e 73 65 74  ATTERN? ?--unset
70d0: 3f 20 3f 2d 2d 6d 74 69 6d 65 3f 0a 2a 2a 0a 2a  ? ?--mtime?.**.*
70e0: 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6e 74 65  * Show the conte
70f0: 6e 74 20 6f 66 20 74 68 65 20 43 4f 4e 46 49 47  nt of the CONFIG
7100: 20 74 61 62 6c 65 20 69 6e 20 61 20 72 65 70 6f   table in a repo
7110: 73 69 74 6f 72 79 2e 20 20 49 66 20 50 41 54 54  sitory.  If PATT
7120: 45 52 4e 20 69 73 0a 2a 2a 20 73 70 65 63 69 66  ERN is.** specif
7130: 69 65 64 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 73  ied, then only s
7140: 68 6f 77 20 74 68 65 20 65 6e 74 72 69 65 73 20  how the entries 
7150: 74 68 61 74 20 6d 61 74 63 68 20 74 68 61 74 20  that match that 
7160: 67 6c 6f 62 20 70 61 74 74 65 72 6e 2e 0a 2a 2a  glob pattern..**
7170: 20 4c 61 73 74 20 6d 6f 64 69 66 69 63 61 74 69   Last modificati
7180: 6f 6e 20 74 69 6d 65 20 69 73 20 73 68 6f 77 6e  on time is shown
7190: 20 69 66 20 74 68 65 20 2d 2d 6d 74 69 6d 65 20   if the --mtime 
71a0: 6f 70 74 69 6f 6e 20 69 73 20 70 72 65 73 65 6e  option is presen
71b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
71c0: 2d 2d 75 6e 73 65 74 20 6f 70 74 69 6f 6e 20 69  --unset option i
71d0: 73 20 69 6e 63 6c 75 64 65 64 2c 20 74 68 65 6e  s included, then
71e0: 20 65 6e 74 72 69 65 73 20 61 72 65 20 64 65 6c   entries are del
71f0: 65 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  eted rather than
7200: 0a 2a 2a 20 62 65 69 6e 67 20 64 69 73 70 6c 61  .** being displa
7210: 79 65 64 2e 20 20 57 41 52 4e 49 4e 47 21 20 54  yed.  WARNING! T
7220: 68 69 73 20 63 61 6e 6e 6f 74 20 62 65 20 75 6e  his cannot be un
7230: 64 6f 6e 65 2e 20 20 42 65 20 73 75 72 65 20 79  done.  Be sure y
7240: 6f 75 20 6b 6e 6f 77 20 77 68 61 74 0a 2a 2a 20  ou know what.** 
7250: 79 6f 75 20 61 72 65 20 64 6f 69 6e 67 21 20 20  you are doing!  
7260: 54 68 65 20 2d 2d 75 6e 73 65 74 20 6f 70 74 69  The --unset opti
7270: 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  on only works if
7280: 20 74 68 65 72 65 20 69 73 20 61 20 50 41 54 54   there is a PATT
7290: 45 52 4e 2e 0a 2a 2a 20 50 72 6f 62 61 62 6c 79  ERN..** Probably
72a0: 20 79 6f 75 20 73 68 6f 75 6c 64 20 72 75 6e 20   you should run 
72b0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6f 6e 63 65  the command once
72c0: 20 77 69 74 68 6f 75 74 20 2d 2d 75 6e 73 65 74   without --unset
72d0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a   to make sure.**
72e0: 20 79 6f 75 20 6b 6e 6f 77 20 65 78 61 63 74 6c   you know exactl
72f0: 79 20 77 68 61 74 20 69 73 20 62 65 69 6e 67 20  y what is being 
7300: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  deleted..**.** I
7310: 66 20 6e 6f 74 20 69 6e 20 61 6e 20 6f 70 65 6e  f not in an open
7320: 20 63 68 65 63 6b 2d 6f 75 74 2c 20 75 73 65 20   check-out, use 
7330: 74 68 65 20 2d 52 20 52 45 50 4f 20 6f 70 74 69  the -R REPO opti
7340: 6f 6e 20 74 6f 20 73 70 65 63 69 66 79 20 61 0a  on to specify a.
7350: 2a 2a 20 61 20 72 65 70 6f 73 69 74 6f 72 79 2e  ** a repository.
7360: 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f 76 61  .*/.void test_va
7370: 72 5f 6c 69 73 74 5f 63 6d 64 28 76 6f 69 64 29  r_list_cmd(void)
7380: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e  {.  Stmt q;.  in
7390: 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20  t i, j;.  const 
73a0: 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 20 3d  char *zPattern =
73b0: 20 30 3b 0a 20 20 69 6e 74 20 64 6f 55 6e 73 65   0;.  int doUnse
73c0: 74 3b 0a 20 20 69 6e 74 20 73 68 6f 77 4d 74 69  t;.  int showMti
73d0: 6d 65 3b 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 0a  me;.  Blob sql;.
73e0: 20 20 42 6c 6f 62 20 61 6e 73 3b 0a 20 20 75 6e    Blob ans;.  un
73f0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 54 72 61  signed char zTra
7400: 6e 73 5b 31 30 30 30 5d 3b 0a 0a 20 20 64 6f 55  ns[1000];..  doU
7410: 6e 73 65 74 20 3d 20 66 69 6e 64 5f 6f 70 74 69  nset = find_opti
7420: 6f 6e 28 22 75 6e 73 65 74 22 2c 30 2c 30 29 21  on("unset",0,0)!
7430: 3d 30 3b 0a 20 20 73 68 6f 77 4d 74 69 6d 65 20  =0;.  showMtime 
7440: 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 6d  = find_option("m
7450: 74 69 6d 65 22 2c 30 2c 30 29 21 3d 30 3b 0a 20  time",0,0)!=0;. 
7460: 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65   db_find_and_ope
7470: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 4f 50 45  n_repository(OPE
7480: 4e 5f 41 4e 59 5f 53 43 48 45 4d 41 2c 20 30 29  N_ANY_SCHEMA, 0)
7490: 3b 0a 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f  ;.  verify_all_o
74a0: 70 74 69 6f 6e 73 28 29 3b 0a 20 20 69 66 28 20  ptions();.  if( 
74b0: 67 2e 61 72 67 63 3e 3d 33 20 29 7b 0a 20 20 20  g.argc>=3 ){.   
74c0: 20 7a 50 61 74 74 65 72 6e 20 3d 20 67 2e 61 72   zPattern = g.ar
74d0: 67 76 5b 32 5d 3b 0a 20 20 7d 0a 20 20 62 6c 6f  gv[2];.  }.  blo
74e0: 62 5f 69 6e 69 74 28 26 73 71 6c 2c 30 2c 30 29  b_init(&sql,0,0)
74f0: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66  ;.  blob_appendf
7500: 28 26 73 71 6c 2c 20 22 53 45 4c 45 43 54 20 6e  (&sql, "SELECT n
7510: 61 6d 65 2c 20 76 61 6c 75 65 2c 20 64 61 74 65  ame, value, date
7520: 74 69 6d 65 28 6d 74 69 6d 65 2c 27 75 6e 69 78  time(mtime,'unix
7530: 65 70 6f 63 68 27 29 22 0a 20 20 20 20 20 20 20  epoch')".       
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
7550: 46 52 4f 4d 20 63 6f 6e 66 69 67 22 29 3b 0a 20  FROM config");. 
7560: 20 69 66 28 20 7a 50 61 74 74 65 72 6e 20 29 7b   if( zPattern ){
7570: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
7580: 66 28 26 73 71 6c 2c 20 22 20 57 48 45 52 45 20  f(&sql, " WHERE 
7590: 6e 61 6d 65 20 47 4c 4f 42 20 25 51 22 2c 20 7a  name GLOB %Q", z
75a0: 50 61 74 74 65 72 6e 29 3b 0a 20 20 7d 0a 20 20  Pattern);.  }.  
75b0: 69 66 28 20 73 68 6f 77 4d 74 69 6d 65 20 29 7b  if( showMtime ){
75c0: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
75d0: 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45 52 20  f(&sql, " ORDER 
75e0: 42 59 20 6d 74 69 6d 65 2c 20 6e 61 6d 65 22 29  BY mtime, name")
75f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
7600: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c  lob_appendf(&sql
7610: 2c 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d  , " ORDER BY nam
7620: 65 22 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72  e");.  }.  db_pr
7630: 65 70 61 72 65 28 26 71 2c 20 22 25 73 22 2c 20  epare(&q, "%s", 
7640: 62 6c 6f 62 5f 73 74 72 28 26 73 71 6c 29 2f 2a  blob_str(&sql)/*
7650: 73 61 66 65 2d 66 6f 72 2d 25 73 2a 2f 29 3b 0a  safe-for-%s*/);.
7660: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 71    blob_reset(&sq
7670: 6c 29 3b 0a 23 64 65 66 69 6e 65 20 4d 58 5f 56  l);.#define MX_V
7680: 41 4c 20 34 30 0a 23 64 65 66 69 6e 65 20 4d 58  AL 40.#define MX
7690: 5f 4e 4d 20 20 32 38 0a 23 64 65 66 69 6e 65 20  _NM  28.#define 
76a0: 4d 58 5f 4c 4f 4e 47 4e 4d 20 36 30 0a 20 20 77  MX_LONGNM 60.  w
76b0: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
76c0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
76d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
76e0: 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  *zName = db_colu
76f0: 6d 6e 5f 74 65 78 74 28 26 71 2c 30 29 3b 0a 20  mn_text(&q,0);. 
7700: 20 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 64     int nName = d
7710: 62 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 26  b_column_bytes(&
7720: 71 2c 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  q,0);.    const 
7730: 63 68 61 72 20 2a 7a 56 61 6c 75 65 20 3d 20 64  char *zValue = d
7740: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
7750: 2c 31 29 3b 0a 20 20 20 20 69 6e 74 20 73 7a 56  ,1);.    int szV
7760: 61 6c 75 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  alue = db_column
7770: 5f 62 79 74 65 73 28 26 71 2c 31 29 3b 0a 20 20  _bytes(&q,1);.  
7780: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
7790: 54 69 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Time = db_column
77a0: 5f 74 65 78 74 28 26 71 2c 32 29 3b 0a 20 20 20  _text(&q,2);.   
77b0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 6a 3c 4d 58   for(i=j=0; j<MX
77c0: 5f 56 41 4c 20 26 26 20 7a 56 61 6c 75 65 5b 69  _VAL && zValue[i
77d0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  ]; i++){.      u
77e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d  nsigned char c =
77f0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
7800: 7a 56 61 6c 75 65 5b 69 5d 3b 0a 20 20 20 20 20  zValue[i];.     
7810: 20 69 66 28 20 63 3e 3d 27 20 27 20 26 26 20 63   if( c>=' ' && c
7820: 3c 3d 27 7e 27 20 29 7b 0a 20 20 20 20 20 20 20  <='~' ){.       
7830: 20 7a 54 72 61 6e 73 5b 6a 2b 2b 5d 20 3d 20 63   zTrans[j++] = c
7840: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7850: 20 20 20 20 20 20 20 7a 54 72 61 6e 73 5b 6a 2b         zTrans[j+
7860: 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +] = '\\';.     
7870: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
7880: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 72 61  {.          zTra
7890: 6e 73 5b 6a 2b 2b 5d 20 3d 20 27 6e 27 3b 0a 20  ns[j++] = 'n';. 
78a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
78b0: 20 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20   c=='\r' ){.    
78c0: 20 20 20 20 20 20 7a 54 72 61 6e 73 5b 6a 2b 2b        zTrans[j++
78d0: 5d 20 3d 20 27 72 27 3b 0a 20 20 20 20 20 20 20  ] = 'r';.       
78e0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
78f0: 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t' ){.          
7900: 7a 54 72 61 6e 73 5b 6a 2b 2b 5d 20 3d 20 27 74  zTrans[j++] = 't
7910: 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
7920: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 72 61  {.          zTra
7930: 6e 73 5b 6a 2b 2b 5d 20 3d 20 27 30 27 20 2b 20  ns[j++] = '0' + 
7940: 28 28 63 3e 3e 36 29 26 37 29 3b 0a 20 20 20 20  ((c>>6)&7);.    
7950: 20 20 20 20 20 20 7a 54 72 61 6e 73 5b 6a 2b 2b        zTrans[j++
7960: 5d 20 3d 20 27 30 27 20 2b 20 28 28 63 3e 3e 33  ] = '0' + ((c>>3
7970: 29 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )&7);.          
7980: 7a 54 72 61 6e 73 5b 6a 2b 2b 5d 20 3d 20 27 30  zTrans[j++] = '0
7990: 27 20 2b 20 28 63 26 37 29 3b 0a 20 20 20 20 20  ' + (c&7);.     
79a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
79b0: 20 7d 0a 20 20 20 20 7a 54 72 61 6e 73 5b 6a 5d   }.    zTrans[j]
79c0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 3c   = 0;.    if( i<
79d0: 73 7a 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  szValue ){.     
79e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
79f0: 66 28 73 69 7a 65 6f 66 28 7a 54 72 61 6e 73 29  f(sizeof(zTrans)
7a00: 2d 6a 2c 20 28 63 68 61 72 2a 29 7a 54 72 61 6e  -j, (char*)zTran
7a10: 73 2b 6a 2c 20 22 2e 2e 2e 2b 25 64 22 2c 20 73  s+j, "...+%d", s
7a20: 7a 56 61 6c 75 65 2d 69 29 3b 0a 20 20 20 20 20  zValue-i);.     
7a30: 20 6a 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65   j += (int)strle
7a40: 6e 28 28 63 68 61 72 2a 29 7a 54 72 61 6e 73 2b  n((char*)zTrans+
7a50: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
7a60: 28 20 73 68 6f 77 4d 74 69 6d 65 20 29 7b 0a 20  ( showMtime ){. 
7a70: 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e       fossil_prin
7a80: 74 28 22 25 73 3a 25 2a 73 25 73 5c 6e 22 2c 20  t("%s:%*s%s\n", 
7a90: 7a 4e 61 6d 65 2c 20 35 38 2d 6e 4e 61 6d 65 2c  zName, 58-nName,
7aa0: 20 22 22 2c 20 7a 4d 54 69 6d 65 29 3b 0a 20 20   "", zMTime);.  
7ab0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4e 61 6d    }else if( nNam
7ac0: 65 3c 4d 58 5f 4e 4d 2d 32 20 29 7b 0a 20 20 20  e<MX_NM-2 ){.   
7ad0: 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28     fossil_print(
7ae0: 22 25 73 3a 25 2a 73 25 73 5c 6e 22 2c 20 7a 4e  "%s:%*s%s\n", zN
7af0: 61 6d 65 2c 20 4d 58 5f 4e 4d 2d 31 2d 6e 4e 61  ame, MX_NM-1-nNa
7b00: 6d 65 2c 20 22 22 2c 20 7a 54 72 61 6e 73 29 3b  me, "", zTrans);
7b10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
7b20: 4e 61 6d 65 3c 4d 58 5f 4c 4f 4e 47 4e 4d 2d 32  Name<MX_LONGNM-2
7b30: 20 26 26 20 6a 3c 31 30 20 29 7b 0a 20 20 20 20   && j<10 ){.    
7b40: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
7b50: 25 73 3a 25 2a 73 25 73 5c 6e 22 2c 20 7a 4e 61  %s:%*s%s\n", zNa
7b60: 6d 65 2c 20 4d 58 5f 4c 4f 4e 47 4e 4d 2d 31 2d  me, MX_LONGNM-1-
7b70: 6e 4e 61 6d 65 2c 20 22 22 2c 20 7a 54 72 61 6e  nName, "", zTran
7b80: 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
7b90: 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e       fossil_prin
7ba0: 74 28 22 25 73 3a 5c 6e 25 2a 73 25 73 5c 6e 22  t("%s:\n%*s%s\n"
7bb0: 2c 20 7a 4e 61 6d 65 2c 20 4d 58 5f 4e 4d 2c 20  , zName, MX_NM, 
7bc0: 22 22 2c 20 7a 54 72 61 6e 73 29 3b 0a 20 20 20  "", zTrans);.   
7bd0: 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61   }.  }.  db_fina
7be0: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20  lize(&q);.  if( 
7bf0: 7a 50 61 74 74 65 72 6e 20 26 26 20 64 6f 55 6e  zPattern && doUn
7c00: 73 65 74 20 29 7b 0a 20 20 20 20 70 72 6f 6d 70  set ){.    promp
7c10: 74 5f 75 73 65 72 28 22 44 65 6c 65 74 65 20 61  t_user("Delete a
7c20: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 3f  ll of the above?
7c30: 20 28 79 2f 4e 29 3f 20 22 2c 20 26 61 6e 73 29   (y/N)? ", &ans)
7c40: 3b 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 73  ;.    if( blob_s
7c50: 74 72 28 26 61 6e 73 29 5b 30 5d 3d 3d 27 79 27  tr(&ans)[0]=='y'
7c60: 20 7c 7c 20 62 6c 6f 62 5f 73 74 72 28 26 61 6e   || blob_str(&an
7c70: 73 29 5b 30 5d 3d 3d 27 59 27 20 29 7b 0a 20 20  s)[0]=='Y' ){.  
7c80: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
7c90: 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  c("DELETE FROM c
7ca0: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
7cb0: 20 47 4c 4f 42 20 25 51 22 2c 20 7a 50 61 74 74   GLOB %Q", zPatt
7cc0: 65 72 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ern);.    }.    
7cd0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 61 6e 73 29  blob_reset(&ans)
7ce0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
7cf0: 4f 4d 4d 41 4e 44 3a 20 74 65 73 74 2d 76 61 72  OMMAND: test-var
7d00: 2d 67 65 74 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  -get.**.** Usage
7d10: 3a 20 25 66 6f 73 73 69 6c 20 74 65 73 74 2d 76  : %fossil test-v
7d20: 61 72 2d 67 65 74 20 56 41 52 20 3f 46 49 4c 45  ar-get VAR ?FILE
7d30: 3f 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ?.**.** Write th
7d40: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 56 41  e text of the VA
7d50: 52 20 76 61 72 69 61 62 6c 65 20 69 6e 74 6f 20  R variable into 
7d60: 46 49 4c 45 2e 20 20 49 66 20 46 49 4c 45 20 69  FILE.  If FILE i
7d70: 73 20 22 2d 22 0a 2a 2a 20 6f 72 20 69 73 20 6f  s "-".** or is o
7d80: 6d 69 74 74 65 64 20 74 68 65 6e 20 6f 75 74 70  mitted then outp
7d90: 75 74 20 67 6f 65 73 20 74 6f 20 73 74 61 6e 64  ut goes to stand
7da0: 61 72 64 20 6f 75 74 70 75 74 2e 20 20 56 41 52  ard output.  VAR
7db0: 20 63 61 6e 20 62 65 20 61 0a 2a 2a 20 47 4c 4f   can be a.** GLO
7dc0: 42 20 70 61 74 74 65 72 6e 2e 0a 2a 2a 0a 2a 2a  B pattern..**.**
7dd0: 20 49 66 20 6e 6f 74 20 69 6e 20 61 6e 20 6f 70   If not in an op
7de0: 65 6e 20 63 68 65 63 6b 2d 6f 75 74 2c 20 75 73  en check-out, us
7df0: 65 20 74 68 65 20 2d 52 20 52 45 50 4f 20 6f 70  e the -R REPO op
7e00: 74 69 6f 6e 20 74 6f 20 73 70 65 63 69 66 79 20  tion to specify 
7e10: 61 0a 2a 2a 20 61 20 72 65 70 6f 73 69 74 6f 72  a.** a repositor
7e20: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 5f  y..*/.void test_
7e30: 76 61 72 5f 67 65 74 5f 63 6d 64 28 76 6f 69 64  var_get_cmd(void
7e40: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7e50: 2a 7a 56 61 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *zVar;.  const c
7e60: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 6e  har *zFile;.  in
7e70: 74 20 6e 3b 0a 20 20 42 6c 6f 62 20 78 3b 0a 20  t n;.  Blob x;. 
7e80: 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65   db_find_and_ope
7e90: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 4f 50 45  n_repository(OPE
7ea0: 4e 5f 41 4e 59 5f 53 43 48 45 4d 41 2c 20 30 29  N_ANY_SCHEMA, 0)
7eb0: 3b 0a 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f 6f  ;.  verify_all_o
7ec0: 70 74 69 6f 6e 73 28 29 3b 0a 20 20 69 66 28 20  ptions();.  if( 
7ed0: 67 2e 61 72 67 63 3c 33 20 29 7b 0a 20 20 20 20  g.argc<3 ){.    
7ee0: 75 73 61 67 65 28 22 56 41 52 20 3f 46 49 4c 45  usage("VAR ?FILE
7ef0: 3f 22 29 3b 0a 20 20 7d 0a 20 20 7a 56 61 72 20  ?");.  }.  zVar 
7f00: 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20 20 7a  = g.argv[2];.  z
7f10: 46 69 6c 65 20 3d 20 67 2e 61 72 67 63 3e 3d 34  File = g.argc>=4
7f20: 20 3f 20 67 2e 61 72 67 76 5b 33 5d 20 3a 20 22   ? g.argv[3] : "
7f30: 2d 22 3b 0a 20 20 6e 20 3d 20 64 62 5f 69 6e 74  -";.  n = db_int
7f40: 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  (0, "SELECT coun
7f50: 74 28 2a 29 20 46 52 4f 4d 20 63 6f 6e 66 69 67  t(*) FROM config
7f60: 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42   WHERE name GLOB
7f70: 20 25 51 22 2c 20 7a 56 61 72 29 3b 0a 20 20 69   %Q", zVar);.  i
7f80: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( n==0 ){.    f
7f90: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6e 6f 20  ossil_fatal("no 
7fa0: 6d 61 74 63 68 20 66 6f 72 20 25 51 22 2c 20 7a  match for %Q", z
7fb0: 56 61 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Var);.  }.  if( 
7fc0: 6e 3e 31 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  n>1 ){.    fossi
7fd0: 6c 5f 66 61 74 61 6c 28 22 6d 75 6c 74 69 70 6c  l_fatal("multipl
7fe0: 65 20 6d 61 74 63 68 65 73 3a 20 25 73 22 2c 0a  e matches: %s",.
7ff0: 20 20 20 20 20 20 64 62 5f 74 65 78 74 28 30 2c        db_text(0,
8000: 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63   "SELECT group_c
8010: 6f 6e 63 61 74 28 71 75 6f 74 65 28 6e 61 6d 65  oncat(quote(name
8020: 29 2c 27 2c 20 27 29 20 46 52 4f 4d 20 28 22 0a  ),', ') FROM (".
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 22 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46   " SELECT name F
8050: 52 4f 4d 20 63 6f 6e 66 69 67 20 57 48 45 52 45  ROM config WHERE
8060: 20 6e 61 6d 65 20 47 4c 4f 42 20 25 51 20 4f 52   name GLOB %Q OR
8070: 44 45 52 20 42 59 20 31 29 22 2c 0a 20 20 20 20  DER BY 1)",.    
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 56 61               zVa
8090: 72 29 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f  r));.  }.  blob_
80a0: 69 6e 69 74 28 26 78 2c 30 2c 30 29 3b 0a 20 20  init(&x,0,0);.  
80b0: 64 62 5f 62 6c 6f 62 28 26 78 2c 20 22 53 45 4c  db_blob(&x, "SEL
80c0: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 63  ECT value FROM c
80d0: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
80e0: 20 47 4c 4f 42 20 25 51 22 2c 20 7a 56 61 72 29   GLOB %Q", zVar)
80f0: 3b 0a 20 20 62 6c 6f 62 5f 77 72 69 74 65 5f 74  ;.  blob_write_t
8100: 6f 5f 66 69 6c 65 28 26 78 2c 20 7a 46 69 6c 65  o_file(&x, zFile
8110: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d  );.}../*.** COMM
8120: 41 4e 44 3a 20 74 65 73 74 2d 76 61 72 2d 73 65  AND: test-var-se
8130: 74 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 25  t.**.** Usage: %
8140: 66 6f 73 73 69 6c 20 74 65 73 74 2d 76 61 72 2d  fossil test-var-
8150: 73 65 74 20 56 41 52 20 3f 56 41 4c 55 45 3f 20  set VAR ?VALUE? 
8160: 3f 2d 2d 66 69 6c 65 20 46 49 4c 45 3f 0a 2a 2a  ?--file FILE?.**
8170: 0a 2a 2a 20 53 74 6f 72 65 20 56 41 4c 55 45 20  .** Store VALUE 
8180: 6f 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  or the content o
8190: 66 20 46 49 4c 45 20 28 65 78 61 63 74 6c 79 20  f FILE (exactly 
81a0: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 6d 75 73  one of which mus
81b0: 74 20 62 65 0a 2a 2a 20 73 75 70 70 6c 69 65 64  t be.** supplied
81c0: 29 20 69 6e 74 6f 20 76 61 72 69 61 62 6c 65 20  ) into variable 
81d0: 56 41 52 2e 20 20 55 73 65 20 61 20 46 49 4c 45  VAR.  Use a FILE
81e0: 20 6f 66 20 22 2d 22 20 74 6f 20 72 65 61 64 20   of "-" to read 
81f0: 66 72 6f 6d 0a 2a 2a 20 73 74 61 6e 64 61 72 64  from.** standard
8200: 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 57 41   input..**.** WA
8210: 52 4e 49 4e 47 3a 20 63 68 61 6e 67 69 6e 67 20  RNING: changing 
8220: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 76  the value of a v
8230: 61 72 69 61 62 6c 65 20 63 61 6e 20 69 6e 74 65  ariable can inte
8240: 72 66 65 72 65 20 77 69 74 68 20 74 68 65 0a 2a  rfere with the.*
8250: 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 46  * operation of F
8260: 6f 73 73 69 6c 2e 20 20 42 65 20 73 75 72 65 20  ossil.  Be sure 
8270: 79 6f 75 20 6b 6e 6f 77 20 77 68 61 74 20 79 6f  you know what yo
8280: 75 20 61 72 65 20 64 6f 69 6e 67 2e 0a 2a 2a 0a  u are doing..**.
8290: 2a 2a 20 55 73 65 20 22 2d 2d 62 6c 6f 62 20 46  ** Use "--blob F
82a0: 49 4c 45 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ILE" instead of 
82b0: 22 2d 2d 66 69 6c 65 20 46 49 4c 45 22 20 74 6f  "--file FILE" to
82c0: 20 6c 6f 61 64 20 61 20 62 69 6e 61 72 79 20 62   load a binary b
82d0: 6c 6f 62 0a 2a 2a 20 73 75 63 68 20 61 73 20 61  lob.** such as a
82e0: 20 47 49 46 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65   GIF..*/.void te
82f0: 73 74 5f 76 61 72 5f 73 65 74 5f 63 6d 64 28 76  st_var_set_cmd(v
8300: 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  oid){.  const ch
8310: 61 72 20 2a 7a 56 61 72 3b 0a 20 20 63 6f 6e 73  ar *zVar;.  cons
8320: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
8330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 6c   const char *zBl
8340: 6f 62 3b 0a 20 20 42 6c 6f 62 20 78 3b 0a 20 20  ob;.  Blob x;.  
8350: 53 74 6d 74 20 69 6e 73 3b 0a 20 20 7a 46 69 6c  Stmt ins;.  zFil
8360: 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  e = find_option(
8370: 22 66 69 6c 65 22 2c 30 2c 31 29 3b 0a 20 20 7a  "file",0,1);.  z
8380: 42 6c 6f 62 20 3d 20 66 69 6e 64 5f 6f 70 74 69  Blob = find_opti
8390: 6f 6e 28 22 62 6c 6f 62 22 2c 30 2c 31 29 3b 0a  on("blob",0,1);.
83a0: 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70    db_find_and_op
83b0: 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 4f 50  en_repository(OP
83c0: 45 4e 5f 41 4e 59 5f 53 43 48 45 4d 41 2c 20 30  EN_ANY_SCHEMA, 0
83d0: 29 3b 0a 20 20 76 65 72 69 66 79 5f 61 6c 6c 5f  );.  verify_all_
83e0: 6f 70 74 69 6f 6e 73 28 29 3b 0a 20 20 69 66 28  options();.  if(
83f0: 20 67 2e 61 72 67 63 3c 33 20 7c 7c 20 28 7a 46   g.argc<3 || (zF
8400: 69 6c 65 3d 3d 30 20 26 26 20 7a 42 6c 6f 62 3d  ile==0 && zBlob=
8410: 3d 30 20 26 26 20 67 2e 61 72 67 63 3c 34 29 20  =0 && g.argc<4) 
8420: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 56 41  ){.    usage("VA
8430: 52 20 3f 56 41 4c 55 45 3f 20 3f 2d 2d 66 69 6c  R ?VALUE? ?--fil
8440: 65 20 46 49 4c 45 3f 22 29 3b 0a 20 20 7d 0a 20  e FILE?");.  }. 
8450: 20 7a 56 61 72 20 3d 20 67 2e 61 72 67 76 5b 32   zVar = g.argv[2
8460: 5d 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 20 29  ];.  if( zFile )
8470: 7b 0a 20 20 20 20 69 66 28 20 7a 42 6c 6f 62 20  {.    if( zBlob 
8480: 29 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22  ) fossil_fatal("
8490: 63 61 6e 6e 6f 74 20 64 6f 20 62 6f 74 68 20 2d  cannot do both -
84a0: 2d 66 69 6c 65 20 6f 72 20 2d 2d 62 6c 6f 62 22  -file or --blob"
84b0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 61 64  );.    blob_read
84c0: 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 78 2c 20 7a  _from_file(&x, z
84d0: 46 69 6c 65 2c 20 45 78 74 46 49 4c 45 29 3b 0a  File, ExtFILE);.
84e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 42 6c 6f    }else if( zBlo
84f0: 62 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 72 65  b ){.    blob_re
8500: 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 26 78 2c  ad_from_file(&x,
8510: 20 7a 42 6c 6f 62 2c 20 45 78 74 46 49 4c 45 29   zBlob, ExtFILE)
8520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
8530: 6c 6f 62 5f 69 6e 69 74 28 26 78 2c 67 2e 61 72  lob_init(&x,g.ar
8540: 67 76 5b 33 5d 2c 2d 31 29 3b 0a 20 20 7d 0a 20  gv[3],-1);.  }. 
8550: 20 64 62 5f 70 72 65 70 61 72 65 28 26 69 6e 73   db_prepare(&ins
8560: 2c 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20  ,.     "REPLACE 
8570: 49 4e 54 4f 20 63 6f 6e 66 69 67 28 6e 61 6d 65  INTO config(name
8580: 2c 76 61 6c 75 65 2c 6d 74 69 6d 65 29 22 0a 20  ,value,mtime)". 
8590: 20 20 20 20 22 56 41 4c 55 45 53 28 25 51 2c 3a      "VALUES(%Q,:
85a0: 76 61 6c 2c 6e 6f 77 28 29 29 22 2c 20 7a 56 61  val,now())", zVa
85b0: 72 29 3b 0a 20 20 69 66 28 20 7a 42 6c 6f 62 20  r);.  if( zBlob 
85c0: 29 7b 0a 20 20 20 20 64 62 5f 62 69 6e 64 5f 62  ){.    db_bind_b
85d0: 6c 6f 62 28 26 69 6e 73 2c 20 22 3a 76 61 6c 22  lob(&ins, ":val"
85e0: 2c 20 26 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , &x);.  }else{.
85f0: 20 20 20 20 64 62 5f 62 69 6e 64 5f 74 65 78 74      db_bind_text
8600: 28 26 69 6e 73 2c 20 22 3a 76 61 6c 22 2c 20 62  (&ins, ":val", b
8610: 6c 6f 62 5f 73 74 72 28 26 78 29 29 3b 0a 20 20  lob_str(&x));.  
8620: 7d 0a 20 20 64 62 5f 73 74 65 70 28 26 69 6e 73  }.  db_step(&ins
8630: 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65  );.  db_finalize
8640: 28 26 69 6e 73 29 3b 0a 20 20 62 6c 6f 62 5f 72  (&ins);.  blob_r
8650: 65 73 65 74 28 26 78 29 3b 0a 7d 0a              eset(&x);.}.