@@ -35,10 +35,12 @@
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** groupings:
36 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
37 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define CONFIGSET_SKIN 0x000001 /* WWW interface appearance */
38 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define CONFIGSET_TKT 0x000002 /* Ticket configuration */
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define CONFIGSET_PROJ 0x000004 /* Project name */
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_SHUN 0x000008 /* Shun settings */
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define CONFIGSET_USER 0x000010 /* The USER table */
40 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define CONFIGSET_ALL 0xffffff /* Everything */
42 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
43 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* INTERFACE */
44 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -46,41 +48,51 @@
46 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Names of the configuration sets
47 49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
48 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static struct {
49 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName; /* Name of the configuration set */
50 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int groupMask; /* Mask for that configuration set */
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zHelp; /* What it does */
51 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} aGroupName[] = {
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "skin", CONFIGSET_SKIN },
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket", CONFIGSET_TKT },
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "project", CONFIGSET_PROJ },
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "all", CONFIGSET_ALL },
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "skin", CONFIGSET_SKIN, "Web interface apparance settings" },
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket", CONFIGSET_TKT, "Ticket setup", },
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "project", CONFIGSET_PROJ, "Project name and description" },
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "shun", CONFIGSET_SHUN, "List of shunned artifacts" },
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" },
56 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
57 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
60 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The following is a list of settings that we are willing to
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** transfer.
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** transfer.
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Setting names that begin with an alphabetic characters refer to
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** single entries in the CONFIG table. Setting names that begin with
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "@" are for special processing.
62 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
63 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static struct {
64 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName; /* Name of the configuration parameter */
65 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int groupMask; /* Which config groups is it part of */
66 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} aConfig[] = {
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "css", CONFIGSET_SKIN },
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "header", CONFIGSET_SKIN },
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "footer", CONFIGSET_SKIN },
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "project-name", CONFIGSET_PROJ },
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "project-description", CONFIGSET_PROJ },
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "index-page", CONFIGSET_SKIN },
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "timeline-block-markup", CONFIGSET_SKIN },
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "timeline-max-comment", CONFIGSET_SKIN },
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket-table", CONFIGSET_TKT },
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket-common", CONFIGSET_TKT },
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket-newpage", CONFIGSET_TKT },
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket-viewpage", CONFIGSET_TKT },
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket-editpage", CONFIGSET_TKT },
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket-report-template", CONFIGSET_TKT },
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "ticket-key-template", CONFIGSET_TKT },
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "css", CONFIGSET_SKIN },
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "header", CONFIGSET_SKIN },
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "footer", CONFIGSET_SKIN },
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "project-name", CONFIGSET_PROJ },
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "project-description", CONFIGSET_PROJ },
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "index-page", CONFIGSET_SKIN },
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "timeline-block-markup", CONFIGSET_SKIN },
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "timeline-max-comment", CONFIGSET_SKIN },
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket-table", CONFIGSET_TKT },
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket-common", CONFIGSET_TKT },
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket-newpage", CONFIGSET_TKT },
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket-viewpage", CONFIGSET_TKT },
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket-editpage", CONFIGSET_TKT },
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket-report-template", CONFIGSET_TKT },
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "ticket-key-template", CONFIGSET_TKT },
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "@reportfmt", CONFIGSET_TKT },
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "@user", CONFIGSET_USER },
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "@shun", CONFIGSET_SHUN },
82 94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
83 95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int iConfig = 0;
84 96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
85 97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
86 98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return name of first configuration property matching the given mask.
@@ -99,22 +111,184 @@
99 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
101 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
102 114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
103 115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Return TRUE if a particular configuration parameter zName is
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** safely exportable.
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return the mask for the named configuration parameter if it can be
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** safely exported. Return 0 if the parameter is not safe to export.
106 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
107 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int configure_is_exportable(const char *zName){
108 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
109 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<count(aConfig); i++){
110 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(zName, aConfig[i].zName)==0 ){
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return aConfig[i].groupMask;
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int m = aConfig[i].groupMask;
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !g.okAdmin ){
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ m &= ~CONFIGSET_USER;
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return m;
112 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
115 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zName is one of the special configuration names that refers to an entire
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table rather than a single entry in CONFIG. Special names are "@reportfmt"
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and "@shun" and "@user". This routine writes SQL text into pOut that when
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** evaluated will populate the corresponding table with data.
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void configure_render_special_name(const char *zName, Blob *pOut){
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stmt q;
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strcmp(zName, "@shun")==0 ){
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT uuid FROM shun");
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "INSERT OR IGNORE INTO shun VALUES('%s');\n",
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0)
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strcmp(zName, "@reportfmt")==0 ){
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT title, cols, sqlcode FROM reportfmt");
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "INSERT INTO _xfer_reportfmt(title,cols,sqlcode) "
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " VALUES(%Q,%Q,%Q);\n",
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0),
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 1),
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 2)
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strcmp(zName, "@user")==0 ){
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&q, "SELECT login, cap, info, quote(photo) FROM user");
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( db_step(&q)==SQLITE_ROW ){
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pOut, "INSERT INTO _xfer_user(login,cap,info,photo) "
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " VALUES(%Q,%Q,%Q,%s);\n",
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 0),
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 1),
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 2),
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_column_text(&q, 3)
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_finalize(&q);
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Two SQL functions:
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** flag_test(int)
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** flag_clear(int)
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The flag_test() function takes the integer valued argument and
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ANDs it against the static variable "flag_value" below. The
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function returns TRUE or false depending on the result. The
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** flag_clear() function masks off the bits from "flag_value" that
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are given in the argument.
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** These functions are used below in the WHEN clause of a trigger to
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** get the trigger to fire exactly once.
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int flag_value = 0xffff;
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void flag_test_function(
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_context *context,
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int argc,
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_value **argv
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int m = sqlite3_value_int(argv[0]);
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_int(context, (flag_value&m)!=0 );
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void flag_clear_function(
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_context *context,
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int argc,
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_value **argv
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int m = sqlite3_value_int(argv[0]);
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ flag_value &= ~m;
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Create the temporary _xfer_reportfmt and _xfer_user tables that are
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** necessary in order to evalute the SQL text generated by the
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** configure_render_special_name() routine.
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If replaceFlag is true, then the setup is such that the content in
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the SQL text will completely replace the current repository configuration.
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If replaceFlag is false, then the SQL text will be merged with the
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** existing configuration. When merging, existing values take priority
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** over SQL text values.
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void configure_prepare_to_receive(int replaceFlag){
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char zSQL1[] =
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TEMP TABLE _xfer_reportfmt(
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ rn integer primary key, -- Report number
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ owner text, -- Owner of this report format (not used)
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ title text UNIQUE ON CONFLICT IGNORE, -- Title of this report
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ cols text, -- A color-key specification
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ sqlcode text -- An SQL SELECT statement for this report
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ );
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TEMP TABLE _xfer_user(
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ uid INTEGER PRIMARY KEY, -- User ID
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ login TEXT UNIQUE ON CONFLICT IGNORE, -- login name of the user
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ pw TEXT, -- password
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ cap TEXT, -- Capabilities of this user
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ cookie TEXT, -- WWW login cookie
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ ipaddr TEXT, -- IP address for which cookie is valid
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ cexpire DATETIME, -- Time when cookie expires
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ info TEXT, -- contact information
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ photo BLOB -- JPEG image of this user
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ );
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO _xfer_reportfmt SELECT * FROM reportfmt;
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO _xfer_user SELECT * FROM user;
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ;
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(zSQL1);
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* When the replace flag is set, add triggers that run the first time
245 { 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
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** existing data.
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( replaceFlag ){
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char zSQL2[] =
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TRIGGER _xfer_r1 BEFORE INSERT ON _xfer_reportfmt
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ WHEN flag_test(1) BEGIN
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM _xfer_reportfmt;
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT flag_clear(1);
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ END;
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TRIGGER _xfer_r2 BEFORE INSERT ON _xfer_user
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ WHEN flag_test(2) BEGIN
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM _xfer_user;
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT flag_clear(2);
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ END;
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ CREATE TEMP TRIGGER _xfer_r3 BEFORE INSERT ON shun
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ WHEN flag_test(4) BEGIN
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM shun;
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ SELECT flag_clear(4);
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ END;
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ;
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_create_function(g.db, "flag_test", 1, SQLITE_UTF8, 0,
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ flag_test_function, 0, 0);
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_create_function(g.db, "flag_clear", 1, SQLITE_UTF8, 0,
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ flag_clear_function, 0, 0);
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ flag_value = 0xffff;
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(zSQL2);
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** After receiving configuration data, call this routine to transfer
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the results into the main database.
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void configure_finalize_receive(void){
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char zSQL[] =
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM user;
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO user SELECT * FROM _xfer_user;
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DELETE FROM reportfmt;
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ INSERT INTO reportfmt SELECT * FROM _xfer_reportfmt;
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DROP TABLE _xfer_user;
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ DROP TABLE _xfer_reportfmt;
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ;
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec(zSQL);
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
117 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
118 292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Identify a configuration group by name. Return its mask.
119 293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Throw an error if no match.
120 294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -124,21 +298,64 @@
124 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<count(aGroupName); i++){
125 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(z, aGroupName[i].zName, n)==0 ){
126 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return aGroupName[i].groupMask;
127 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
128 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("Available configuration areas:\n");
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<count(aGroupName); i++){
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf(" %-10s %s\n", aGroupName[i].zName, aGroupName[i].zHelp);
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
129 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("no such configuration area: \"%s\"", z);
130 308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
131 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Write SQL text into file zFilename that will restore the configuration
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** area identified by mask to its current state from any other state.
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void export_config(
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mask, /* Mask indicating which configuration to export */
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zMask, /* Name of the configuration */
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFilename /* Write into this file */
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob out;
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&out);
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&out,
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "-- The \"%s\" configuration exported from\n"
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "-- repository \"%s\"\n"
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "-- on %s\n",
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zMask, g.zRepositoryName,
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_text(0, "SELECT datetime('now')")
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<count(aConfig); i++){
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (aConfig[i].groupMask & mask)!=0 ){
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName = aConfig[i].zName;
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zName[0]!='@' ){
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zValue = db_text(0,
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT value FROM config WHERE name=%Q", zName);
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zValue ){
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&out,"REPLACE INTO config VALUES(%Q,%Q);\n",
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zName, zValue);
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zValue);
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configure_render_special_name(zName, &out);
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(&out, zFilename);
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&out);
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
133 350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
134 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
135 352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: configuration
136 353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
137 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Usage: %fossil configure METHOD ...
138 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Where METHOD is one of: export import pull reset. All methods
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Where METHOD is one of: export import merge pull reset. All methods
140 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** accept the -R or --repository option to specific a repository.
141 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
142 359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** %fossil configuration export AREA FILENAME
143 360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
144 361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Write to FILENAME exported configuraton information for AREA.
@@ -145,104 +362,108 @@
145 362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** AREA can be one of: all ticket skin project
146 363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
147 364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** %fossil configuration import FILENAME
148 365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
149 366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Read a configuration from FILENAME, overwriting the current
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** configuration. Warning: Do not read a configuration from
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** an untrusted source since the configuration is not checked
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for safety and can introduce security threats.
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** configuration.
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** %fossil configuration merge FILENAME
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read a configuration from FILENAME and merge its values into
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the current configuration. Existing values take priority over
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** values read from FILENAME.
153 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** %fossil configuration pull AREA URL
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** %fossil configuration pull AREA ?URL?
155 376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
156 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Pull and install the configuration from a different server
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** identified by URL. AREA is as in "export".
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** identified by URL. If no URL is specified, then the default
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** server is used.
158 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
159 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** %fossil configuration reset AREA
160 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
161 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Restore the configuration to the default. AREA as above.
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WARNING: Do not import, merge, or pull configurations from an untrusted
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** source. The inbound configuration is not checked for safety and can
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** introduce security vulnerabilities.
162 388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
163 389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void configuration_cmd(void){
164 390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n;
165 391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zMethod;
166 392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc<3 ){
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- usage("METHOD ...");
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage("export|import|merge|pull|reset ...");
168 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
169 395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(1);
170 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zMethod = g.argv[2];
171 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
n = strlen(zMethod);
172 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zMethod, "export", n)==0 ){
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
174 399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mask;
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zSep;
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob sql;
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Stmt q;
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob out;
179 400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=5 ){
180 401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
usage("export AREA FILENAME");
181 402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
182 403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mask = find_area(g.argv[3]);
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&sql);
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&out);
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&sql,
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT 'REPLACE INTO config(name,value) VALUES('''"
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " || name || ''',' || quote(value) || ');'"
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- " FROM config WHERE name IN "
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSep = "(";
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<count(aConfig); i++){
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aConfig[i].groupMask & mask ){
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&sql, "%s'%s'", zSep, aConfig[i].zName);
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSep = ",";
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&sql, ") ORDER BY name");
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare(&q, blob_str(&sql));
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&sql);
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&out,
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-- The \"%s\" configuration exported from\n"
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-- repository \"%s\"\n"
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "-- on %s\n",
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.argv[3], g.zRepositoryName,
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_text(0, "SELECT datetime('now')")
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( db_step(&q)==SQLITE_ROW ){
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&out, "%s\n", db_column_text(&q, 0));
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_finalize(&q);
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_write_to_file(&out, g.argv[4]);
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&out);
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ export_config(mask, g.argv[3], g.argv[4]);
213 405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncmp(zMethod, "import", n)==0 ){
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncmp(zMethod, "import", n)==0
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || strncmp(zMethod, "merge", n)==0 ){
215 408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob in;
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.argc!=4 ) usage("import FILENAME");
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc!=4 ) usage(mprintf("%s FILENAME",zMethod));
217 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_from_file(&in, g.argv[3]);
218 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_begin_transaction();
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configure_prepare_to_receive(zMethod[0]=='i');
219 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_multi_exec("%s", blob_str(&in));
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ configure_finalize_receive();
220 415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_end_transaction(0);
221 416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
222 417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zMethod, "pull", n)==0 ){
223 418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mask;
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zServer;
224 420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
url_proxy_options();
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.argc!=5 ) usage("pull AREA URL");
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc!=4 && g.argc!=5 ){
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage("pull AREA ?URL?");
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
226 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mask = find_area(g.argv[3]);
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- url_parse(g.argv[4]);
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc==5 ){
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zServer = g.argv[4];
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zServer = db_get("last-sync-url", 0);
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zServer==0 ){
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("no server specified");
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_parse(zServer);
228 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlIsFile ){
229 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("network sync only");
230 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
231 437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
user_select();
232 438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
client_sync(0,0,0,mask);
233 439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
234 440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zMethod, "reset", n)==0 ){
235 441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int mask, i;
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zBackup;
236 443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.argc!=4 ) usage("reset AREA");
237 444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mask = find_area(g.argv[3]);
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zBackup = db_text(0,
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT strftime('config-backup-%%Y%%m%%d%%H%%M%%f','now')");
238 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_begin_transaction();
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ export_config(mask, g.argv[3], zBackup);
239 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<count(aConfig); i++){
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName = aConfig[i].zName;
240 451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (aConfig[i].groupMask & mask)==0 ) continue;
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_multi_exec("DELETE FROM config WHERE name=%Q", aConfig[i].zName);
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zName[0]!='@' ){
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strcmp(zName,"@user")==0 ){
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("DELETE FROM user");
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_create_default_users();
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strcmp(zName,"@reportfmt")==0 ){
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_multi_exec("DELETE FROM reportfmt");
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
242 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
243 461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_end_transaction(0);
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("Configuration reset to factory defaults.\n");
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("To recover, use: %s %s import %s\n",
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.argv[0], g.argv[1], zBackup);
244 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
245 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_fatal("METHOD should be one of: export import pull reset");
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("METHOD should be one of: export import merge pull reset");
247 468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
248 469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
249 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!