Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Taught "fossil settings" how to accept multiple ?VALUES? parameters, storing the result as a JSON-encoded array in the config table. Nothing uses this yet, but the resulting SQL DB manipulation appears to work correctly. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | fossil-spawn |
| Files: | files | file ages | folders |
| SHA3-256: |
ca069402f8fb2d53e6d05bd5066e1d7c |
| User & Date: | wyoung 2021-06-22 02:37:16.858 |
Context
|
2021-06-22
| ||
| 03:45 | Extracted json_serialize_array() function common to both test-json-carray and settings commands, reducing redundant code. check-in: ead1432af9 user: wyoung tags: fossil-spawn | |
| 02:37 | Taught "fossil settings" how to accept multiple ?VALUES? parameters, storing the result as a JSON-encoded array in the config table. Nothing uses this yet, but the resulting SQL DB manipulation appears to work correctly. check-in: ca069402f8 user: wyoung tags: fossil-spawn | |
| 01:38 | Added the carray() virtual table extension from SQLite and added the test-json-carray command to test it. This is needed for the next step on this branch. check-in: 4223fe8cb5 user: wyoung tags: fossil-spawn | |
Changes
Changes to src/db.c.
| ︙ | ︙ | |||
3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 |
zName, zValue);
}
if( globalFlag && g.repositoryOpen ){
db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
}
db_end_transaction(0);
db_protect_pop();
}
void db_unset(const char *zName, int globalFlag){
db_begin_transaction();
db_unprotect(PROTECT_CONFIG);
if( globalFlag ){
db_swap_connections();
db_multi_exec("DELETE FROM global_config WHERE name=%Q", zName);
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 |
zName, zValue);
}
if( globalFlag && g.repositoryOpen ){
db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
}
db_end_transaction(0);
db_protect_pop();
}
void db_set_array(const char *zName, char* azValues[], size_t nValues, int globalFlag){
Stmt q;
db_assert_protection_off_or_not_sensitive(zName);
db_unprotect(PROTECT_CONFIG);
db_begin_transaction();
if( globalFlag ){
db_swap_connections();
sqlite3_carray_init(g.db, 0, 0); /* not registered globally on purpose */
db_prepare(&q, "REPLACE INTO global_config(name,value) VALUES(%Q,"
"(SELECT json_group_array(value) FROM carray(?1)))",
zName);
sqlite3_carray_bind(q.pStmt, 1, azValues, nValues, CARRAY_TEXT, SQLITE_STATIC);
db_exec(&q);
db_swap_connections();
}else{
sqlite3_carray_init(g.db, 0, 0); /* ditto */
db_prepare(&q, "REPLACE INTO config(name,value,mtime) VALUES(%Q,"
"(SELECT json_group_array(value) FROM carray(?1)),now())",
zName);
sqlite3_carray_bind(q.pStmt, 1, azValues, nValues, CARRAY_TEXT, SQLITE_STATIC);
db_exec(&q);
}
if( globalFlag && g.repositoryOpen ){
db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
}
db_end_transaction(0);
db_protect_pop();
}
void db_unset(const char *zName, int globalFlag){
db_begin_transaction();
db_unprotect(PROTECT_CONFIG);
if( globalFlag ){
db_swap_connections();
db_multi_exec("DELETE FROM global_config WHERE name=%Q", zName);
|
| ︙ | ︙ | |||
4383 4384 4385 4386 4387 4388 4389 |
usage("PROPERTY ?-global?");
}
if( g.argc==2 ){
for(i=0; i<nSetting; i++){
print_setting(&aSetting[i]);
}
| | | > | > > > > | 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 |
usage("PROPERTY ?-global?");
}
if( g.argc==2 ){
for(i=0; i<nSetting; i++){
print_setting(&aSetting[i]);
}
}else if( g.argc>=3 ){
const char *zName = g.argv[2];
int n = (int)strlen(zName);
const Setting *pSetting = db_find_setting(zName, !exactFlag);
if( pSetting==0 ){
fossil_fatal("no such setting: %s", zName);
}
if( globalFlag && fossil_strcmp(pSetting->name, "manifest")==0 ){
fossil_fatal("cannot set 'manifest' globally");
}
if( unsetFlag || g.argc>=4 ){
int isManifest = fossil_strcmp(pSetting->name, "manifest")==0;
if( n!=strlen(pSetting[0].name) && pSetting[1].name &&
fossil_strncmp(pSetting[1].name, zName, n)==0 ){
Blob x;
int i;
blob_init(&x,0,0);
for(i=0; pSetting[i].name; i++){
if( fossil_strncmp(pSetting[i].name,zName,n)!=0 ) break;
blob_appendf(&x, " %s", pSetting[i].name);
}
fossil_fatal("ambiguous setting \"%s\" - might be:%s",
zName, blob_str(&x));
}
if( globalFlag && isManifest ){
fossil_fatal("cannot set 'manifest' globally");
}
if( unsetFlag ){
db_unset(pSetting->name, globalFlag);
}else{
db_protect_only(PROTECT_NONE);
if( g.argc==4 ){
db_set(pSetting->name, g.argv[3], globalFlag);
}
else {
db_set_array(pSetting->name, g.argv+3, g.argc-3, globalFlag);
}
db_protect_pop();
}
if( isManifest && g.localOpen ){
manifest_to_disk(db_lget_int("checkout", 0));
}
}else{
while( pSetting->name ){
|
| ︙ | ︙ |