@@ -2,11 +2,11 @@
2 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Copyright (c) 2008 D. Richard Hipp
3 3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
4 4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This program is free software; you can redistribute it and/or
5 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** modify it under the terms of the Simplified BSD License (also
6 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** known as the "2-Clause License" or "FreeBSD License".)
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
8 8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This program is distributed in the hope that it will be useful,
9 9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** but without any warranty; without even the implied warranty of
10 10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** merchantability or fitness for a particular purpose.
11 11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
12 12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Author contact information:
@@ -27,18 +27,21 @@
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if INTERFACE
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Configuration transfers occur in groups. These are the allowed
30 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** groupings:
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define CONFIGSET_SKIN 0x000001 /* WWW interface appearance */
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define CONFIGSET_TKT 0x000002 /* Ticket configuration */
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define CONFIGSET_PROJ 0x000004 /* Project name */
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define CONFIGSET_SHUN 0x000008 /* Shun settings */
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define CONFIGSET_USER 0x000010 /* The USER table */
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define CONFIGSET_ADDR 0x000020 /* The CONCEALED table */
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define CONFIGSET_ALL 0xffffff /* Everything */
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_SKIN 0x000001 /* WWW interface appearance */
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_TKT 0x000002 /* Ticket configuration */
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_PROJ 0x000004 /* Project name */
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_SHUN 0x000008 /* Shun settings */
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_USER 0x000010 /* The USER table */
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_ADDR 0x000020 /* The CONCEALED table */
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_ALL 0x0000ff /* Everything */
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_OVERWRITE 0x100000 /* Causes overwrite instead of merge */
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_OLDFORMAT 0x200000 /* Use the legacy format */
40 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* INTERFACE */
42 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
43 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
44 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Names of the configuration sets
@@ -46,17 +49,17 @@
46 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static struct {
47 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName; /* Name of the configuration set */
48 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int groupMask; /* Mask for that configuration set */
49 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zHelp; /* What it does */
50 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} aGroupName[] = {
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "email", CONFIGSET_ADDR, "Concealed email addresses in tickets" },
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "project", CONFIGSET_PROJ, "Project name and description" },
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "skin", CONFIGSET_SKIN, "Web interface apparance settings" },
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "shun", CONFIGSET_SHUN, "List of shunned artifacts" },
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket", CONFIGSET_TKT, "Ticket setup", },
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "user", CONFIGSET_USER, "Users and privilege settings" },
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "all", CONFIGSET_ALL, "All of the above" },
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/email", CONFIGSET_ADDR, "Concealed email addresses in tickets" },
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/project", CONFIGSET_PROJ, "Project name and description" },
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/skin", CONFIGSET_SKIN, "Web interface apparance settings" },
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/shun", CONFIGSET_SHUN, "List of shunned artifacts" },
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/ticket", CONFIGSET_TKT, "Ticket setup", },
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/user", CONFIGSET_USER, "Users and privilege settings" },
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/all", CONFIGSET_ALL, "All of the above" },
58 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
59 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
60 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
61 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
62 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The following is a list of settings that we are willing to
@@ -106,15 +109,29 @@
106 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *configure_first_name(int iMask){
107 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iConfig = 0;
108 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return configure_next_name(iMask);
109 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
110 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *configure_next_name(int iMask){
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( iConfig<count(aConfig) ){
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aConfig[iConfig].groupMask & iMask ){
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return aConfig[iConfig++].zName;
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iConfig++;
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iMask & CONFIGSET_OLDFORMAT ){
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( iConfig<count(aConfig) ){
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aConfig[iConfig].groupMask & iMask ){
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return aConfig[iConfig++].zName;
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iConfig++;
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iConfig==0 && (iMask & CONFIGSET_ALL)==CONFIGSET_ALL ){
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iConfig = count(aGroupName);
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "/all";
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( iConfig<count(aGroupName)-1 ){
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aGroupName[iConfig].groupMask & iMask ){
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return aGroupName[iConfig++].zName;
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iConfig++;
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
117 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
118 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
119 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -127,12 +144,17 @@
127 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** login credentials and has sufficient capabilities to access the requested
128 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** information.
129 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
130 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int configure_is_exportable(const char *zName){
131 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = strlen(zName);
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n>2 && zName[0]=='\'' && zName[n-1]=='\'' ){
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zName++;
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n -= 2;
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<count(aConfig); i++){
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fossil_strcmp(zName, aConfig[i].zName)==0 ){
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( memcmp(zName, aConfig[i].zName, n)==0 && aConfig[i].zName[n]==0 ){
134 156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int m = aConfig[i].groupMask;
135 157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.okAdmin ){
136 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m &= ~CONFIGSET_USER;
137 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
138 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.okRdAddr ){
@@ -200,38 +222,39 @@
200 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
201 223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
202 224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
203 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Two SQL functions:
204 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** flag_test(int)
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** flag_clear(int)
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** config_is_reset(int)
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** config_reset(int)
207 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The flag_test() function takes the integer valued argument and
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** ANDs it against the static variable "flag_value" below. The
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** function returns TRUE or false depending on the result. The
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** flag_clear() function masks off the bits from "flag_value" that
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The config_is_reset() function takes the integer valued argument and
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ANDs it against the static variable "configHasBeenReset" below. The
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function returns TRUE or FALSE depending on the result depending on
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** whether or not the corresponding configuration table has been reset. The
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** config_reset() function adds the bits to "configHasBeenReset" that
212 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** are given in the argument.
213 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
214 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** These functions are used below in the WHEN clause of a trigger to
215 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** get the trigger to fire exactly once.
216 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int flag_value = 0xffff;
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void flag_test_function(
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int configHasBeenReset = 0;
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void config_is_reset_function(
219 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_context *context,
220 243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int argc,
221 244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **argv
222 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
223 246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int m = sqlite3_value_int(argv[0]);
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_result_int(context, (flag_value&m)!=0 );
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_int(context, (configHasBeenReset&m)!=0 );
225 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void flag_clear_function(
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void config_reset_function(
227 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_context *context,
228 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int argc,
229 252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **argv
230 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
231 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int m = sqlite3_value_int(argv[0]);
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- flag_value &= ~m;
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configHasBeenReset |= m;
233 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
234 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
235 258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
236 259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Create the temporary _xfer_reportfmt and _xfer_user tables that are
237 260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** necessary in order to evalute the SQL text generated by the
@@ -261,12 +284,14 @@
261 284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ ipaddr TEXT, -- IP address for which cookie is valid
262 285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ cexpire DATETIME, -- Time when cookie expires
263 286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ info TEXT, -- contact information
264 287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ photo BLOB -- JPEG image of this user
265 288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ );
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ INSERT INTO _xfer_reportfmt SELECT * FROM reportfmt;
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ INSERT INTO _xfer_user SELECT * FROM user;
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO _xfer_reportfmt
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT rn,owner,title,cols,sqlcode FROM reportfmt;
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO _xfer_user
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT uid,login,pw,cap,cookie,ipaddr,cexpire,info,photo FROM user;
268 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
269 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(zSQL1);
270 295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
271 296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* When the replace flag is set, add triggers that run the first time
272 297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that new data is seen. The triggers run only once and delete all the
@@ -273,33 +298,89 @@
273 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** existing data.
274 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
275 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( replaceFlag ){
276 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const char zSQL2[] =
277 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TRIGGER _xfer_r1 BEFORE INSERT ON _xfer_reportfmt
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ WHEN flag_test(1) BEGIN
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ WHEN NOT config_is_reset(2) BEGIN
279 304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ DELETE FROM _xfer_reportfmt;
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ SELECT flag_clear(1);
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT config_reset(2);
281 306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ END;
282 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TRIGGER _xfer_r2 BEFORE INSERT ON _xfer_user
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ WHEN flag_test(2) BEGIN
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ WHEN NOT config_is_reset(16) BEGIN
284 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ DELETE FROM _xfer_user;
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ SELECT flag_clear(2);
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT config_reset(16);
286 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ END;
287 312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ CREATE TEMP TRIGGER _xfer_r3 BEFORE INSERT ON shun
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ WHEN flag_test(4) BEGIN
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ WHEN NOT config_is_reset(8) BEGIN
289 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ DELETE FROM shun;
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ SELECT flag_clear(4);
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT config_reset(8);
291 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ END;
292 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
;
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_create_function(g.db, "flag_test", 1, SQLITE_UTF8, 0,
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- flag_test_function, 0, 0);
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_create_function(g.db, "flag_clear", 1, SQLITE_UTF8, 0,
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- flag_clear_function, 0, 0);
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- flag_value = 0xffff;
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_create_function(g.db, "config_is_reset", 1, SQLITE_UTF8, 0,
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config_is_reset_function, 0, 0);
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_create_function(g.db, "config_reset", 1, SQLITE_UTF8, 0,
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ config_reset_function, 0, 0);
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configHasBeenReset = 0;
298 323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec(zSQL2);
299 324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
300 325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** After receiving configuration data, call this routine to transfer
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the results into the main database.
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void configure_finalize_receive(void){
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char zSQL[] =
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM user;
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO user SELECT * FROM _xfer_user;
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM reportfmt;
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO reportfmt SELECT * FROM _xfer_reportfmt;
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DROP TABLE _xfer_user;
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DROP TABLE _xfer_reportfmt;
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ;
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(zSQL);
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if z[] is not a "safe" SQL token. A safe token is one of:
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * A string literal
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * A blob literal
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * An integer literal (no floating point)
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * NULL
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int safeSql(const char *z){
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z==0 || z[0]==0 ) return 0;
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (z[0]=='x' || z[0]=='X') && z[1]=='\'' ) z++;
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z[0]=='\'' ){
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; z[i]; i++){
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z[i]=='\'' ){
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z[i]=='\'' ){ continue; }
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return z[i]==0;
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; (c = z[i])!=0; i++){
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fossil_isalnum(c) ) return 0;
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if z[] consists of nothing but digits
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int safeInt(const char *z){
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z==0 || z[0]==0 ) return 0;
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; fossil_isdigit(z[i]); i++){}
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return z[i]==0;
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
301 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
302 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
303 384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Process a single "config" card received from the other side of a
304 385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sync session.
305 386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -344,108 +425,302 @@
344 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** table like _fer_reportfmt or _xfer_user. Such tables must be created
345 426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ahead of time using configure_prepare_to_receive(). Then after multiple
346 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** calls to this routine, configure_finalize_receive() to transfer the
347 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** information received into the true target table.
348 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void configure_receive(const char *zName, Blob *pContent, int mask){
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (configure_is_exportable(zName) & mask)==0 ) return;
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strcmp(zName, "logo-image")==0 ){
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Stmt ins;
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare(&ins,
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "REPLACE INTO config(name, value) VALUES(:name, :value)"
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_bind_text(&ins, ":name", zName);
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_bind_blob(&ins, ":value", pContent);
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_step(&ins);
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_finalize(&ins);
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( zName[0]=='@' ){
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Notice that we are evaluating arbitrary SQL received from the
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** client. But this can only happen if the client has authenticated
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** as an administrator, so presumably we trust the client at this
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** point.
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_multi_exec("%s", blob_str(pContent));
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_multi_exec(
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "REPLACE INTO config(name,value) VALUES(%Q,%Q)",
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zName, blob_str(pContent)
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** After receiving configuration data, call this routine to transfer
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the results into the main database.
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void configure_finalize_receive(void){
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const char zSQL[] =
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ DELETE FROM user;
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ INSERT INTO user SELECT * FROM _xfer_user;
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ DELETE FROM reportfmt;
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ INSERT INTO reportfmt SELECT * FROM _xfer_reportfmt;
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ DROP TABLE _xfer_user;
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ DROP TABLE _xfer_reportfmt;
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ;
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_multi_exec(zSQL);
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void configure_receive(const char *zName, Blob *pContent, int groupMask){
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zName[0]=='/' ){
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The new format */
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *azToken[12];
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken = 0;
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii, jj;
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int thisMask;
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob name, value, sql;
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const struct receiveType {
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName;
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zPrimKey;
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nField;
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *azField[4];
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } aType[] = {
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "/config", "name", 1, { "value", 0, 0, 0 } },
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "@user", "login", 4, { "pw", "cap", "info", "photo" } },
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "@shun", "uuid", 1, { "scom", 0, 0, 0 } },
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "@reportfmt", "title", 3, { "owner", "cols", "sqlcode", 0 } },
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "@concealed", "hash", 1, { "content", 0, 0, 0 } },
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=0; ii<count(aType); ii++){
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(&aType[ii].zName[1],&zName[1])==0 ) break;
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ii>=count(aType) ) return;
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( blob_token(pContent, &name) && blob_sqltoken(pContent, &value) ){
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z = blob_terminate(&name);
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !safeSql(z) ) return;
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nToken>0 ){
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(jj=0; jj<aType[ii].nField; jj++){
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fossil_strcmp(aType[ii].azField[jj], z)==0 ) break;
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( jj>=aType[ii].nField ) continue;
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !safeInt(z) ) return;
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azToken[nToken++] = z;
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azToken[nToken++] = z = blob_terminate(&value);
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !safeSql(z) ) return;
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nToken>=count(azToken) ) break;
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nToken<2 ) return;
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aType[ii].zName[0]=='/' ){
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ thisMask = configure_is_exportable(azToken[1]);
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ thisMask = configure_is_exportable(aType[ii].zName);
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (thisMask & groupMask)==0 ) return;
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&sql);
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( groupMask & CONFIGSET_OVERWRITE ){
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (thisMask & configHasBeenReset)==0 && aType[ii].zName[0]!='/' ){
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("DELETE FROM %s", &aType[ii].zName[1]);
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configHasBeenReset |= thisMask;
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&sql, "REPLACE INTO ", -1);
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&sql, "INSERT OR IGNORE INTO ", -1);
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql, "%s(%s, mtime", &zName[1], aType[ii].zPrimKey);
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(jj=2; jj<nToken; jj+=2){
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql, ",%s", azToken[jj]);
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql,") VALUES(%s,%s", azToken[1], azToken[0]);
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(jj=2; jj<nToken; jj+=2){
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql, ",%s", azToken[jj+1]);
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("%s)", blob_str(&sql));
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db_changes()==0 ){
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&sql);
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql, "UPDATE %s SET mtime=%s", &zName[1], azToken[0]);
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(jj=2; jj<nToken; jj+=2){
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql, ", %s=%s", azToken[jj], azToken[jj+1]);
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql, " WHERE %s=%s AND mtime<%s",
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aType[ii].zPrimKey, azToken[1], azToken[0]);
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("%s", blob_str(&sql));
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&sql);
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Otherwise, the old format */
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (configure_is_exportable(zName) & groupMask)==0 ) return;
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strcmp(zName, "logo-image")==0 ){
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt ins;
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&ins,
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "REPLACE INTO config(name, value, mtime) VALUES(:name, :value, now())"
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_text(&ins, ":name", zName);
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_blob(&ins, ":value", pContent);
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_step(&ins);
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&ins);
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( zName[0]=='@' ){
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Notice that we are evaluating arbitrary SQL received from the
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** client. But this can only happen if the client has authenticated
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as an administrator, so presumably we trust the client at this
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** point.
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("%s", blob_str(pContent));
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "REPLACE INTO config(name,value,mtime) VALUES(%Q,%Q,now())",
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zName, blob_str(pContent)
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Process a file full of "config" cards.
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void configure_receive_all(Blob *pIn, int groupMask){
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob line;
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken;
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int size;
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob aToken[4];
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configHasBeenReset = 0;
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( blob_line(pIn, &line) ){
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_buffer(&line)[0]=='#' ) continue;
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nToken = blob_tokenize(&line, aToken, count(aToken));
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_eq(&aToken[0],"config")
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && nToken==3
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && blob_is_int(&aToken[2], &size)
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName = blob_str(&aToken[1]);
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob content;
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&content);
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_extract(pIn, size, &content);
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.okAdmin = g.okRdAddr = 1;
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configure_receive(zName, &content, groupMask);
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&content);
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_seek(pIn, 1, BLOB_SEEK_CUR);
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Send "config" cards using the new format for all elements of a group
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that have recently changed.
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Output goes into pOut. The groupMask identifies the group(s) to be sent.
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Send only entries whose timestamp is later than or equal to iStart.
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the number of cards sent.
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int configure_send_group(
576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *pOut, /* Write output here */
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int groupMask, /* Mask of groups to be send */
578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iStart /* Only write values changed since this time */
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob rec;
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii;
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nCard = 0;
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&rec);
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( groupMask & CONFIGSET_SHUN ){
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT mtime, quote(uuid), quote(scom) FROM shun"
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE mtime>=%lld", iStart);
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&rec,"%s %s scom %s",
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0),
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 1),
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 2)
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "config /shun %d\n%s\n",
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&rec), blob_str(&rec));
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCard++;
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&rec);
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( groupMask & CONFIGSET_USER ){
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT mtime, quote(login), quote(pw), quote(cap),"
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " quote(info), quote(photo) FROM user"
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE mtime>=%lld", iStart);
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&rec,"%s %s pw %s cap %s info %s photo %s",
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0),
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 1),
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 2),
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 3),
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 4),
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 5)
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "config /user %d\n%s\n",
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&rec), blob_str(&rec));
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCard++;
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&rec);
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( groupMask & CONFIGSET_TKT ){
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT mtime, quote(title), quote(owner), quote(cols),"
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " quote(sqlcode) FROM reportfmt"
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE mtime>=%lld", iStart);
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&rec,"%s %s owner %s cols %s sqlcode %s",
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0),
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 1),
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 2),
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 3),
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 4)
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "config /reportfmt %d\n%s\n",
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&rec), blob_str(&rec));
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCard++;
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&rec);
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( groupMask & CONFIGSET_ADDR ){
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT mtime, quote(hash), quote(content) FROM concealed"
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE mtime>=%lld", iStart);
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&rec,"%s %s content %s",
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0),
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 1),
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 2)
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "config /concealed %d\n%s\n",
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&rec), blob_str(&rec));
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCard++;
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&rec);
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT mtime, quote(name), quote(value) FROM config"
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " WHERE name=:name AND mtime>=%lld", iStart);
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=0; ii<count(aConfig); ii++){
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (aConfig[ii].groupMask & groupMask)!=0 && aConfig[ii].zName[0]!='@' ){
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_bind_text(&q, ":name", aConfig[ii].zName);
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&rec,"%s %s value %s",
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0),
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 1),
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 2)
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "config /config %d\n%s\n",
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&rec), blob_str(&rec));
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCard++;
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&rec);
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_reset(&q);
674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return nCard;
390 678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
391 679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
392 680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
393 681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Identify a configuration group by name. Return its mask.
394 682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Throw an error if no match.
395 683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int find_area(const char *z){
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int configure_name_to_mask(const char *z, int notFoundIsFatal){
397 685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
398 686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n = strlen(z);
399 687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<count(aGroupName); i++){
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncmp(z, aGroupName[i].zName, n)==0 ){
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp(z, &aGroupName[i].zName[1], n)==0 ){
401 689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return aGroupName[i].groupMask;
402 690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
403 691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("Available configuration areas:\n");
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<count(aGroupName); i++){
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf(" %-10s %s\n", aGroupName[i].zName, aGroupName[i].zHelp);
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( notFoundIsFatal ){
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("Available configuration areas:\n");
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<count(aGroupName); i++){
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf(" %-10s %s\n", &aGroupName[i].zName[1], aGroupName[i].zHelp);
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("no such configuration area: \"%s\"", z);
407 698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_fatal("no such configuration area: \"%s\"", z);
409 699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
410 700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
411 701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
412 702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
413 703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Write SQL text into file zFilename that will restore the configuration
414 704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** area identified by mask to its current state from any other state.
415 705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
416 706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void export_config(
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mask, /* Mask indicating which configuration to export */
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int groupMask, /* Mask indicating which configuration to export */
418 708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zMask, /* Name of the configuration */
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iStart, /* Start date */
419 710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFilename /* Write into this file */
420 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
422 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob out;
423 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&out);
424 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&out,
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-- The \"%s\" configuration exported from\n"
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-- repository \"%s\"\n"
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-- on %s\n",
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "# The \"%s\" configuration exported from\n"
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "# repository \"%s\"\n"
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "# on %s\n",
428 718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zMask, g.zRepositoryName,
429 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_text(0, "SELECT datetime('now')")
430 720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<count(aConfig); i++){
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (aConfig[i].groupMask & mask)!=0 ){
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zName = aConfig[i].zName;
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zName[0]!='@' ){
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zValue = db_text(0,
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT quote(value) FROM config WHERE name=%Q", zName);
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zValue ){
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&out,"REPLACE INTO config VALUES(%Q,%s);\n",
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zName, zValue);
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- free(zValue);
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- configure_render_special_name(zName, &out);
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configure_send_group(&out, groupMask, iStart);
447 722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_write_to_file(&out, zFilename);
448 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&out);
449 724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
450 725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
451 726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -475,25 +750,31 @@
475 750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
476 751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** %fossil configuration pull AREA ?URL?
477 752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
478 753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Pull and install the configuration from a different server
479 754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** identified by URL. If no URL is specified, then the default
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** server is used.
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** server is used. Use the --legacy option for the older protocol
756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (when talking to servers compiled prior to 2011-04-27.) Use
757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the --overwrite flag to completely replace local settings with
758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** content received from URL.
481 759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
482 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** %fossil configuration push AREA ?URL?
483 761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
484 762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Push the local configuration into the remote server identified
485 763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by URL. Admin privilege is required on the remote server for
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** this to work.
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this to work. When the same record exists both locally and on
765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the remote end, the one that was most recently changed wins.
766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the --legacy flag when talking to holder servers.
487 767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
488 768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** %fossil configuration reset AREA
489 769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
490 770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Restore the configuration to the default. AREA as above.
491 771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** WARNING: Do not import, merge, or pull configurations from an untrusted
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** source. The inbound configuration is not checked for safety and can
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** introduce security vulnerabilities.
772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** %fossil configuration sync AREA ?URL?
773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Synchronize configuration changes in the local repository with
775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the remote repository at URL.
495 776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
496 777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void configuration_cmd(void){
497 778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n;
498 779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zMethod;
499 780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc<3 ){
@@ -502,36 +783,59 @@
502 783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(0, 0);
503 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zMethod = g.argv[2];
504 785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
n = strlen(zMethod);
505 786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zMethod, "export", n)==0 ){
506 787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mask;
788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSince = find_option("since",0,1);
789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iStart;
507 790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=5 ){
508 791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
usage("export AREA FILENAME");
509 792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mask = find_area(g.argv[3]);
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- export_config(mask, g.argv[3], g.argv[4]);
793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask = configure_name_to_mask(g.argv[3], 1);
794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zSince ){
795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iStart = db_multi_exec(
796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT coalesce(strftime('%%s',%Q),strftime('%%s','now',%Q))+0",
797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSince, zSince
798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iStart = 0;
801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ export_config(mask, g.argv[3], iStart, g.argv[4]);
512 803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
513 804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zMethod, "import", n)==0
514 805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| strncmp(zMethod, "merge", n)==0 ){
515 806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob in;
807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int groupMask;
516 808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=4 ) usage(mprintf("%s FILENAME",zMethod));
517 809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_from_file(&in, g.argv[3]);
518 810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_begin_transaction();
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- configure_prepare_to_receive(zMethod[0]=='i');
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_multi_exec("%s", blob_str(&in));
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- configure_finalize_receive();
811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zMethod[0]=='i' ){
812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ groupMask = CONFIGSET_ALL | CONFIGSET_OVERWRITE;
813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ groupMask = CONFIGSET_ALL;
815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configure_receive_all(&in, groupMask);
522 817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_end_transaction(0);
523 818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncmp(zMethod, "pull", n)==0 || strncmp(zMethod, "push", n)==0 ){
819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp(zMethod, "pull", n)==0
820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || strncmp(zMethod, "push", n)==0
821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || strncmp(zMethod, "sync", n)==0
822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
525 823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mask;
526 824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zServer;
527 825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zPw;
826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int legacyFlag = 0;
827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int overwriteFlag = 0;
828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zMethod[0]!='s' ) legacyFlag = find_option("legacy",0,0)!=0;
829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp(zMethod,"pull",n)==0 ){
830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ overwriteFlag = find_option("overwrite",0,0)!=0;
831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
528 832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
url_proxy_options();
529 833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=4 && g.argc!=5 ){
530 834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
usage("pull AREA ?URL?");
531 835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mask = find_area(g.argv[3]);
836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask = configure_name_to_mask(g.argv[3], 1);
533 837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc==5 ){
534 838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zServer = g.argv[4];
535 839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPw = 0;
536 840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.dontKeepUrl = 1;
537 841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -543,25 +847,29 @@
543 847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
544 848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
url_parse(zServer);
545 849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlPasswd==0 && zPw ) g.urlPasswd = mprintf("%s", zPw);
546 850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
user_select();
547 851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
url_enable_proxy("via proxy: ");
852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( legacyFlag ) mask |= CONFIGSET_OLDFORMAT;
853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( overwriteFlag ) mask |= CONFIGSET_OVERWRITE;
548 854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zMethod, "push", n)==0 ){
549 855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
client_sync(0,0,0,0,0,mask);
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strncmp(zMethod, "pull", n)==0 ){
551 857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
client_sync(0,0,0,0,mask,0);
858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ client_sync(0,0,0,0,mask,mask);
552 860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
553 861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
554 862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zMethod, "reset", n)==0 ){
555 863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mask, i;
556 864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zBackup;
557 865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=4 ) usage("reset AREA");
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mask = find_area(g.argv[3]);
866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask = configure_name_to_mask(g.argv[3], 1);
559 867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBackup = db_text(0,
560 868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT strftime('config-backup-%%Y%%m%%d%%H%%M%%f','now')");
561 869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_begin_transaction();
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- export_config(mask, g.argv[3], zBackup);
870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ export_config(mask, g.argv[3], 0, zBackup);
563 871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<count(aConfig); i++){
564 872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName = aConfig[i].zName;
565 873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (aConfig[i].groupMask & mask)==0 ) continue;
566 874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zName[0]!='@' ){
567 875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
568 876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!