Check-in [134e2aeccc]
Not logged in
Overview

SHA1 Hash:134e2aeccc0acc8a4ced04da5403df234ddc1397
Date: 2007-09-28 20:08:32
User: drh
Comment:Combine the "config" and "setting" commands into a single "settings" command.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified ideas.txt from [555b72ded1] to [df889dde5c].

@@ -28,10 +28,19 @@
 
 Other table columns:
    origintime
    lastchange
 
+
+Field Types:
+
+   text                 width height
+   enum                 width valuelist
+   datetime             width
+   cumulative-text      width height
+   set-of-uuid          width
+   set-of-checkin       width
 
 Tables:
 
    tktrid(rid, tkid, mtime);  index(tkid, mtime);
    ticket(tkid, tkuuid, title, com, status, ...);

Modified src/checkin.c from [a88de4d022] to [1fd79ac4b7].

@@ -222,11 +222,11 @@
   blob_set(&text,
     "\n# Enter comments on this commit.  Lines beginning with # are ignored\n"
     "#\n"
   );
   status_report(&text, "# ");
-  zEditor = db_global_get("editor", 0);
+  zEditor = db_get("editor", 0);
   if( zEditor==0 ){
     zEditor = getenv("VISUAL");
   }
   if( zEditor==0 ){
     zEditor = getenv("EDITOR");

Modified src/clearsign.c from [b83f245b62] to [b8ecd2533f].

@@ -34,11 +34,11 @@
 */
 int clearsign(Blob *pIn, Blob *pOut){
   char *zRand;
   char *zIn;
   char *zOut;
-  char *zBase = db_global_get("clear-sign", "gpg --clearsign -o ");
+  char *zBase = db_get("clear-sign", "gpg --clearsign -o ");
   char *zCmd;
   int rc;
   zRand = db_text(0, "SELECT hex(randomblob(10))");
   zOut = mprintf("out-%s", zRand);
   zIn = mprintf("in-%z", zRand);

Modified src/clone.c from [9cbe1bd6df] to [f1103d57a0].

@@ -49,14 +49,14 @@
   db_create_repository(g.argv[3]);
   db_open_repository(g.argv[3]);
   db_begin_transaction();
   db_initial_setup(0, 0);
   user_select();
-  db_set("content-schema", CONTENT_SCHEMA);
-  db_set("aux-schema", AUX_SCHEMA);
+  db_set("content-schema", CONTENT_SCHEMA, 0);
+  db_set("aux-schema", AUX_SCHEMA, 0);
   if( !g.urlIsFile ){
-    db_set("last-sync-url", g.argv[2]);
+    db_set("last-sync-url", g.argv[2], 0);
   }
   db_multi_exec(
     "INSERT INTO config(name,value)"
     " VALUES('server-code', lower(hex(randomblob(20))));"
   );

Modified src/db.c from [c13c02bc16] to [9a4a994425].

@@ -679,28 +679,28 @@
 ** manifest is created.  The makeServerCodes flag determines whether or
 ** not server and project codes are invented for this repository.
 */
 void db_initial_setup (int makeInitialVersion, int makeServerCodes){
   char *zDate;
-  char *zUser;
+  const char *zUser;
   Blob hash;
   Blob manifest;
 
-  db_set("content-schema", CONTENT_SCHEMA);
-  db_set("aux-schema", AUX_SCHEMA);
+  db_set("content-schema", CONTENT_SCHEMA, 0);
+  db_set("aux-schema", AUX_SCHEMA, 0);
   if( makeServerCodes ){
     db_multi_exec(
       "INSERT INTO config(name,value)"
       " VALUES('server-code', lower(hex(randomblob(20))));"
       "INSERT INTO config(name,value)"
       " VALUES('project-code', lower(hex(randomblob(20))));"
     );
   }
-  db_set_int("autosync", 1);
-  db_set_int("safemerge", 0);
-  db_set_int("localauth", 0);
-  zUser = db_global_get("default-user", 0);
+  if( !db_is_global("autosync") ) db_set_int("autosync", 1, 0);
+  if( !db_is_global("safemerge") ) db_set_int("safemerge", 0, 0);
+  if( !db_is_global("localauth") ) db_set_int("localauth", 0, 0);
+  zUser = db_get("default-user", 0);
   if( zUser==0 ){
     zUser = getenv("USER");
   }
   if( zUser==0 ){
     zUser = "root";
@@ -832,30 +832,62 @@
 
 /*
 ** Get and set values from the CONFIG, GLOBAL_CONFIG and VVAR table in the
 ** repository and local databases.
 */
-char *db_get(const char *zName, const char *zDefault){
-  return db_text((char*)zDefault,
-                 "SELECT value FROM config WHERE name=%Q", zName);
-}
-void db_set(const char *zName, const char *zValue){
-  db_multi_exec("REPLACE INTO config(name,value) VALUES(%Q,%Q)", zName, zValue);
+const char *db_get(const char *zName, const char *zDefault){
+  const char *z = 0;
+  if( g.repositoryOpen ){
+    z = db_text(0, "SELECT value FROM config WHERE name=%Q", zName);
+  }
+  if( z==0 ){
+    z = db_text(0, "SELECT value FROM global_config WHERE name=%Q", zName);
+  }
+  if( z==0 ){
+    z = zDefault;
+  }
+  return z;
+}
+void db_set(const char *zName, const char *zValue, int globalFlag){
+  db_begin_transaction();
+  db_multi_exec("REPLACE INTO %sconfig(name,value) VALUES(%Q,%Q)",
+                 globalFlag ? "global_" : "", zName, zValue);
+  if( globalFlag && g.repositoryOpen ){
+    db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
+  }
+  db_end_transaction(0);
+}
+int db_is_global(const char *zName){
+  return db_exists("SELECT 1 FROM global_config WHERE name=%Q", zName);
 }
 int db_get_int(const char *zName, int dflt){
-  return db_int(dflt, "SELECT value FROM config WHERE name=%Q", zName);
-}
-void db_set_int(const char *zName, int value){
-  db_multi_exec("REPLACE INTO config(name,value) VALUES(%Q,%d)", zName, value);
-}
-char *db_global_get(const char *zName, const char *zDefault){
-  return db_text((char*)zDefault,
-                 "SELECT value FROM global_config WHERE name=%Q", zName);
+  int v;
+  int rc;
+  if( g.repositoryOpen ){
+    Stmt q;
+    db_prepare(&q, "SELECT value FROM config WHERE name=%Q", zName);
+    rc = db_step(&q);
+    if( rc==SQLITE_ROW ){
+      v = db_column_int(&q, 0);
+    }
+    db_finalize(&q);
+  }else{
+    rc = SQLITE_DONE;
+  }
+  if( rc==SQLITE_DONE ){
+    v = db_int(dflt, "SELECT value FROM global_config WHERE name=%Q", zName);
+  }
+  return v;
 }
-void db_global_set(const char *zName, const char *zValue){
-  db_multi_exec("REPLACE INTO global_config(name,value)"
-                "VALUES(%Q,%Q)", zName, zValue);
+void db_set_int(const char *zName, int value, int globalFlag){
+  db_begin_transaction();
+  db_multi_exec("REPLACE INTO %sconfig(name,value) VALUES(%Q,%d)",
+                globalFlag ? "global_" : "", zName, value);
+  if( globalFlag && g.repositoryOpen ){
+    db_multi_exec("DELETE FROM config WHERE name=%Q", zName);
+  }
+  db_end_transaction(0);
 }
 char *db_lget(const char *zName, const char *zDefault){
   return db_text((char*)zDefault,
                  "SELECT value FROM vvar WHERE name=%Q", zName);
 }
@@ -904,104 +936,74 @@
     update_cmd();
   }
 }
 
 /*
-** COMMAND: config
-**
-** Usage: %fossil config NAME=VALUE ...
-**
-** List or change the global configuration settings.  With no arguments,
-** all settings are listed.  Arguments of simply NAME cause that setting
-** to be displayed.  Arguments of the form NAME=VALUE change the value of
-** a setting.  Arguments of the form NAME= delete a setting.
-**
-** Recognized settings include:
-**
-**   editor        Text editor command used for check-in comments.
-**
-**   clear-sign    Command used to clear-sign manifests at check-in.
-**                 The default is "gpg --clearsign -o ".
-**
-**   omit-sign     When enabled, fossil will not attempt to sign any
-**                 commit with gpg. All commits will be unsigned.
+** Print the value of a setting named zName
 */
-void cmd_config(void){
-  db_open_config();
-  if( g.argc>2 ){
-    int i;
-    db_begin_transaction();
-    for(i=2; i<g.argc; i++){
-      char *zName, *zValue;
-      int j, removed=0;
+static void print_setting(const char *zName){
+  Stmt q;
+  db_prepare(&q,
+     "SELECT '(local)', value FROM config WHERE name=%Q"
+     " UNION ALL "
+     "SELECT '(global)', value FROM global_config WHERE name=%Q",
+     zName, zName
+  );
+  if( db_step(&q)==SQLITE_ROW ){
+    printf("%-20s %-8s %s\n", zName, db_column_text(&q, 0),
+        db_column_text(&q, 1));
+  }else{
+    printf("%-20s\n", zName);
+  }
+  db_finalize(&q);
+}
+
 
-      zName = mprintf("%s", g.argv[i]);
-      for(j=0; zName[j] && zName[j]!='='; j++){}
-      if( zName[j] ){
-        zName[j] = 0;
-        zValue = &zName[j+1];
-        if( zValue[0] ){
-          db_global_set(zName, zValue);
-        }else{
-          db_multi_exec("DELETE FROM global_config WHERE name=%Q", zName);
-          removed=1;
-        }
-      }
-      zValue = db_global_get(zName, 0);
-      if( zValue ){
-        printf("%s=%s\n", zName, zValue);
-      }else{
-        if( removed==1 ){
-          printf("%s has been removed from configuration\n", zName);
-        }else{
-          printf("%s is undefined\n", zName);
-        }
-      }
-    }
-    db_end_transaction(0);
-  }else{
-    Stmt q;
-    db_prepare(&q, "SELECT name, value FROM global_config ORDER BY name");
-    while( db_step(&q)==SQLITE_ROW ){
-      printf("%s=%s\n", db_column_text(&q, 0), db_column_text(&q, 1));
-    }
-    db_finalize(&q);
-  }
-}
-
 /*
-** COMMAND: setting
-** %fossil setting ?PROPERTY? ?VALUE?
+** COMMAND: settings
+** %fossil setting ?PROPERTY? ?VALUE? ?-global?
 **
 ** With no arguments, list all properties and their values.  With just
 ** a property name, show the value of that property.  With a value
 ** argument, change the property for the current repository.
 **
 **    autosync         If enabled, automatically pull prior to
 **                     commit or update and automatically push
 **                     after commit or tag or branch creation.
 **
+**    clear-sign       Command used to clear-sign manifests at check-in.
+**                     The default is "gpg --clearsign -o ".
+**
+**    editor           Text editor command used for check-in comments.
+**
 **    localauth        If enabled, require that HTTP connections from
 **                     127.0.0.1 be authenticated by password.  If
 **                     false, all HTTP requests from localhost have
 **                     unrestricted access to the repository.
+**
+**    omit-sign        When enabled, fossil will not attempt to sign any
+**                     commit with gpg. All commits will be unsigned.
 **
 **    safemerge        If enabled, when commit will cause a fork, the
 **                     commit will not abort with warning. Also update
 **                     will not be allowed if local changes exist.
 */
 void setting_cmd(void){
   static const char *azName[] = {
     "autosync",
+    "clearsign",
+    "editor",
     "localauth",
+    "omitsig",
     "safemerge",
   };
   int i;
+  int globalFlag = find_option("global","g",0)!=0;
   db_find_and_open_repository();
   if( g.argc==2 ){
     for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
-      printf("%-20s %d\n", azName[i], db_get_int(azName[i], 0));
+      print_setting(azName[i]);
     }
   }else if( g.argc==3 || g.argc==4 ){
     const char *zName = g.argv[2];
     int n = strlen(zName);
     for(i=0; i<sizeof(azName)/sizeof(azName[0]); i++){
@@ -1009,13 +1011,13 @@
     }
     if( i>=sizeof(azName)/sizeof(azName[0]) ){
       fossil_fatal("no such setting: %s", zName);
     }
     if( g.argc==4 ){
-      db_set(azName[i], g.argv[3]);
+      db_set(azName[i], g.argv[3], globalFlag);
     }else{
-      printf("%-20s %d\n", azName[i], db_get_int(azName[i], 0));
+      print_setting(azName[i]);
     }
   }else{
     usage("?PROPERTY? ?VALUE?");
   }
 }

Modified src/diffcmd.c from [e546baef8b] to [4cfcd3d811].

@@ -88,13 +88,13 @@
   db_must_be_within_tree();
 
   if( internalDiff==0 ){
     const char *zExternalCommand;
     if( strcmp(g.argv[1], "diff")==0 ){
-      zExternalCommand = db_global_get("diff-command", 0);
+      zExternalCommand = db_get("diff-command", 0);
     }else{
-      zExternalCommand = db_global_get("gdiff-command", 0);
+      zExternalCommand = db_get("gdiff-command", 0);
     }
     if( zExternalCommand==0 ){
       internalDiff=1;
     }
     blob_zero(&cmd);

Modified src/setup.c from [fcf807f096] to [da3da0885a].

@@ -429,11 +429,11 @@
     zQ = "off";
   }
   if( zQ ){
     int iQ = strcmp(zQ,"on")==0 || atoi(zQ);
     if( iQ!=iVal ){
-      db_set(zVar, iQ ? "1" : "0");
+      db_set(zVar, iQ ? "1" : "0", 0);
       iVal = iQ;
     }
   }
   if( iVal ){
     @ <input type="checkbox" name="%s(zQParm)" checked>%s(zLabel)</input>
@@ -453,11 +453,11 @@
   const char *zDflt     /* Default value if VAR table entry does not exist */
 ){
   const char *zVal = db_get(zVar, zDflt);
   const char *zQ = P(zQParm);
   if( zQ && strcmp(zQ,zVal)!=0 ){
-    db_set(zVar, zQ);
+    db_set(zVar, zQ, 0);
     zVal = zQ;
   }
   @ <input type="text" name="%s(zQParm)" value="%h(zVal)" size="%d(width)">
   @ %s(zLabel)
 }
@@ -474,11 +474,11 @@
   const char *zDflt     /* Default value if VAR table entry does not exist */
 ){
   const char *zVal = db_get(zVar, zDflt);
   const char *zQ = P(zQParm);
   if( zQ && strcmp(zQ,zVal)!=0 ){
-    db_set(zVar, zQ);
+    db_set(zVar, zQ, 0);
     zVal = zQ;
   }
   @ <textarea name="%s(zQParm)" rows="%d(rows)" cols="%d(cols)">%h(zVal)</textarea>
   @ %s(zLabel)
 }

Modified src/style.c from [24a4432c1e] to [7864b9469a].

@@ -145,11 +145,11 @@
 ** WEBPAGE: index
 ** WEBPAGE: home
 ** WEBPAGE: not_found
 */
 void page_index(void){
-  char *zHome = db_get("homepage", 0);
+  char *zHome = (char*)db_get("homepage", 0);
   if( zHome ){
     g.zExtra = zHome;
     g.okRdWiki = 1;
     wiki_page();
   }else{

Modified src/sync.c from [6476b9b83d] to [f3710d7eb5].

@@ -74,11 +74,11 @@
   }
   url_parse(zUrl);
   if( g.urlIsFile ){
     fossil_fatal("network sync only");
   }
-  db_set("last-sync-url", zUrl);
+  db_set("last-sync-url", zUrl, 0);
   user_select();
   if( g.argc==2 ){
     if( g.urlPort!=80 ){
       printf("Server:    http://%s:%d%s\n", g.urlName, g.urlPort, g.urlPath);
     }else{

Modified src/user.c from [0bda709383] to [45a74402e3].

@@ -200,11 +200,11 @@
     if( g.argc==3 ){
       printf("%s\n", g.zLogin);
     }else if( g.localOpen ){
       db_lset("default-user", g.zLogin);
     }else{
-      db_set("default-user", g.zLogin);
+      db_set("default-user", g.zLogin, 0);
     }
   }else if( n>=2 && strncmp(g.argv[2],"list",n)==0 ){
     Stmt q;
     db_prepare(&q, "SELECT login, info FROM user ORDER BY login");
     while( db_step(&q)==SQLITE_ROW ){

Modified src/xfer.c from [70f34cd473] to [6ecd805cfb].

@@ -812,11 +812,11 @@
           fossil_fatal("server loop");
         }
         nMsg++;
         if( zPCode==0 ){
           zPCode = mprintf("%b", &xfer.aToken[2]);
-          db_set("project-code", zPCode);
+          db_set("project-code", zPCode, 0);
         }
         cloneFlag = 0;
         pullFlag = 1;
         blob_appendf(&send, "pull %s %s\n", zSCode, zPCode);
         nMsg++;
@@ -830,11 +830,11 @@
       **
       ** Each cookie received overwrites the prior cookie from the
       ** same server.
       */
       if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){
-        db_set("cookie", blob_str(&xfer.aToken[1]));
+        db_set("cookie", blob_str(&xfer.aToken[1]), 0);
       }else
 
       /*   message MESSAGE
       **
       ** Print a message.  Similar to "error" but does not stop processing