Changeset: b9313a963e29 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b9313a963e29
Modified Files:
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/utils/properties.c
        tools/merovingian/utils/properties.h
        tools/merovingian/utils/utils.c
        tools/merovingian/utils/utils.h
Branch: Oct2014
Log Message:

Dimitar's patch for merovingian


Unterschiede (gekürzt von 316 auf 300 Zeilen):

diff --git a/tools/merovingian/daemon/forkmserver.c 
b/tools/merovingian/daemon/forkmserver.c
--- a/tools/merovingian/daemon/forkmserver.c
+++ b/tools/merovingian/daemon/forkmserver.c
@@ -63,7 +63,7 @@ forkMserver(char *database, sabdb** stat
        char upmin[8];
        char upavg[8];
        char upmax[8];
-       confkeyval *ckv, *kv;
+       confkeyval *ckv, *kv, *list;
        SABdbState state;
 
        er = msab_getStatus(stats, database);
@@ -113,7 +113,7 @@ forkMserver(char *database, sabdb** stat
        }
 
        ckv = getDefaultProps();
-       readProps(ckv, (*stats)->path);
+       readAllProps(ckv, (*stats)->path);
        kv = findConfKey(ckv, "type");
        if (kv->val == NULL)
                kv = findConfKey(_mero_db_props, "type");
@@ -280,7 +280,8 @@ forkMserver(char *database, sabdb** stat
                char nclients[24];
                char pipeline[512];
                char *readonly = NULL;
-               char *argv[24]; /* for the exec arguments */
+               char *argv[512];        /* for the exec arguments */
+               char property_other[1024];
                int c = 0;
                unsigned int mport;
 
@@ -323,9 +324,6 @@ forkMserver(char *database, sabdb** stat
                if (kv->val != NULL && strcmp(kv->val, "no") != 0)
                        readonly = "--readonly";
 
-               freeConfFile(ckv);
-               free(ckv); /* can make ckv static and reuse it all the time */
-
                /* redirect stdout and stderr to a new pair of fds for
                 * logging help */
                close(pfdo[0]);
@@ -390,10 +388,25 @@ forkMserver(char *database, sabdb** stat
                if (readonly != NULL) {
                        argv[c++] = readonly;
                }
+               /* get the rest (non-default) mserver props set in the conf 
file */
+               list = ckv;
+               while (list->key != NULL) {
+                       if (list->val != NULL && !defaultProperty(list->key)) {
+                               argv[c++] = "--set";
+                               snprintf(property_other, 
sizeof(property_other), "%s=%s", list->key, list->val);
+                               argv[c++] = property_other;
+                       }
+                       list++;
+               }
+
                /* keep this one last for easy copy/paste with gdb */
                argv[c++] = "--set"; argv[c++] = "monet_daemon=yes";
+
                argv[c++] = NULL;
 
+               freeConfFile(ckv);
+               free(ckv); /* can make ckv static and reuse it all the time */
+
                fprintf(stdout, "arguments:");
                for (c = 0; argv[c] != NULL; c++) {
                        /* very stupid heuristic to make copy/paste easier from
diff --git a/tools/merovingian/utils/properties.c 
b/tools/merovingian/utils/properties.c
--- a/tools/merovingian/utils/properties.c
+++ b/tools/merovingian/utils/properties.c
@@ -34,7 +34,7 @@
        "# This file is used by monetdbd\n\n"
 
 /* these are the properties used for starting an mserver */
-static confkeyval _internal_prop_keys[] = {
+static confkeyval _internal_prop_keys[50] = {
        {"type",     NULL, 0, STR},
        {"shared",   NULL, 0, STR},
        {"nthreads", NULL, 0, INT},
@@ -62,7 +62,7 @@ getDefaultProps(void)
 
 /**
  * Writes the given key-value list to MEROPROPFILE in the given path.
- * Returns 0 when the properties could be written to the file.
+ * Returns 0 when the properties could be successfully written to the file.
  */
 inline int
 writeProps(confkeyval *ckv, const char *path)
@@ -88,6 +88,30 @@ writeProps(confkeyval *ckv, const char *
 }
 
 /**
+ * Appends additional (non-default) property MEROPROPFILE in the given path.
+ * Returns 0 when the property could be successfully appended to the file.
+ */
+static inline int
+appendProp(confkeyval *ckv, const char *path)
+{
+       char file[1024];
+       FILE *cnf;
+
+       snprintf(file, 1024, "%s/" MEROPROPFILE, path);
+       if ((cnf = fopen(file, "a")) == NULL)
+               return(1);
+
+       if (ckv->key != NULL && ckv->val != NULL) {
+               fprintf(cnf, "%s=%s\n", ckv->key, ckv->val);
+       }
+
+       fflush(cnf);
+       fclose(cnf);
+
+       return(0);
+}
+
+/**
  * Writes the given key-value list to a buffer and sets its pointer to
  * buf.  This function deals with the allocation of the buffer, hence
  * the caller should free it.
@@ -137,6 +161,25 @@ readProps(confkeyval *ckv, const char *p
 }
 
 /**
+ * Read all properties from a  property file.
+ * Returns 0 when reading the property file succeeded.
+ */
+inline int
+readAllProps(confkeyval *ckv, const char *path)
+{
+       char file[1024];
+       FILE *cnf;
+
+       snprintf(file, 1024, "%s/" MEROPROPFILE, path);
+       if ((cnf = fopen(file, "r")) != NULL) {
+               readConfFileFull(ckv, cnf);
+               fclose(cnf);
+               return(0);
+       }
+       return(1);
+}
+
+/**
  * Read properties from buf, filling in the requested key-values.
  */
 inline void
@@ -174,15 +217,8 @@ setProp(char *path, char *key, char *val
 
        readProps(props, path);
        kv = findConfKey(props, key);
-       if (kv == NULL) {
-               snprintf(buf, sizeof(buf), "no such property: %s", key);
-               freeConfFile(props);
-               free(props);
-               return(strdup(buf));
-       }
-
-       /* first just attempt to set the value (type-check) in memory */
-       if ((err = setConfVal(kv, val)) != NULL) {
+       if (kv != NULL && (err = setConfVal(kv, val)) != NULL) {
+               /* first just attempt to set the value (type-check) in memory */
                freeConfFile(props);
                free(props);
                return(err);
@@ -225,10 +261,24 @@ setProp(char *path, char *key, char *val
                                value++;
                        }
                }
+
+               /* ok, if we've reached this point we can write this stuff out! 
*/
+               /* Let's check if this was a default property of an additional 
one.
+                * Non-default properties will have a NULL kv */
+               if (kv == NULL) {
+                       confkeyval *addProperty = (struct _confkeyval *) 
malloc(sizeof(struct _confkeyval));
+                       addProperty->key = strdup(key);
+                       addProperty->val = strdup(val);
+                       addProperty->ival = 0;
+                       addProperty->type = STR;
+
+                       appendProp(addProperty, path);
+                       free(addProperty);
+               } else {
+                       writeProps(props, path);
+               }
        }
 
-       /* ok, if we've reached this point we can write this stuff out! */
-       writeProps(props, path);
        freeConfFile(props);
        free(props);
 
diff --git a/tools/merovingian/utils/properties.h 
b/tools/merovingian/utils/properties.h
--- a/tools/merovingian/utils/properties.h
+++ b/tools/merovingian/utils/properties.h
@@ -28,6 +28,7 @@ confkeyval *getDefaultProps(void);
 int writeProps(confkeyval *ckv, const char *path);
 void writePropsBuf(confkeyval *ckv, char **buf);
 int readProps(confkeyval *ckv, const char *path);
+int readAllProps(confkeyval *ckv, const char *path);
 void readPropsBuf(confkeyval *ckv, char *buf);
 char *setProp(char *path, char *key, char *val);
 
diff --git a/tools/merovingian/utils/utils.c b/tools/merovingian/utils/utils.c
--- a/tools/merovingian/utils/utils.c
+++ b/tools/merovingian/utils/utils.c
@@ -72,6 +72,45 @@ readConfFile(confkeyval *list, FILE *cnf
 }
 
 /**
+ * Parses the given file stream matching the and writes all values to the list.
+ */
+void
+readConfFileFull(confkeyval *list, FILE *cnf) {
+       char buf[1024];
+       char *key, *val;
+       char *separator = "=";
+       char *err;
+       confkeyval *t = list;
+
+       /* iterate until the end of the array */
+       while (list->key != NULL) {
+               list++;
+       }
+       /* read the file a line at a time */
+       while (fgets(buf, sizeof(buf), cnf) != NULL) {
+               if (strlen(buf) > 1 && buf[0] != '#') {
+                       /* tokenize */
+                       key = strtok(buf, separator);
+                       val = strtok(NULL, separator);
+                       /* strip trailing newline */
+                       val = strtok(val, "\n");
+                       /* check if it is default property or not. those are 
set in a special way */
+                       if (defaultProperty(key)) {
+                               if ((err = setConfValForKey(t, key, val)) != 
NULL) {
+                                       free(err); /* ignore, just fall back to 
default */
+                               }
+                       } else {
+                               list->key = strdup(key);
+                               list->val = strdup(val);
+                               list->ival = 0;
+                               list->type = STR;
+                               list++;
+                       }
+               }
+       }
+}
+
+/**
  * Frees the values allocated by readConfFile().
  */
 inline void
@@ -86,6 +125,27 @@ freeConfFile(confkeyval *list) {
 }
 
 /**
+ * True if the key is not a default property.
+ */
+inline int
+defaultProperty(char *property) {
+       if (property != NULL && strcmp(property, "type") == 0) {
+               return 1;
+       } else if (property != NULL && strcmp(property, "shared") == 0) {
+               return 1;
+       } else if (property != NULL && strcmp(property, "nthreads") == 0) {
+               return 1;
+       } else if (property != NULL && strcmp(property, "readonly") == 0) {
+               return 1;
+       } else if (property != NULL && strcmp(property, "nclients") == 0) {
+               return 1;
+       } else if (property != NULL && strcmp(property, "mfunnel") == 0) {
+               return 1;
+       }
+       return 0;
+}
+
+/**
  * Returns a pointer to the key-value that has a matching key with the
  * given key, or NULL if no key was found.
  */
@@ -218,6 +278,19 @@ setConfVal(confkeyval *ckv, char *val) {
        return(NULL);
 }
 
+char *
+setConfValForKey(confkeyval *list, char *key, char *val) {
+       while (list->key != NULL) {
+               if (strcmp(list->key, key) == 0) {
+                       return setConfVal(list, val);
+               }
+               list++;
+       }
+       char buf[256];
+       snprintf(buf, sizeof(buf), "key '%s' is not recognized, internal 
error", key);
+       return(strdup(buf));
+}
+
 /**
  * Fills the array pointed to by buf with a human representation of t.
  * The argument longness represents the number of units to print
diff --git a/tools/merovingian/utils/utils.h b/tools/merovingian/utils/utils.h
--- a/tools/merovingian/utils/utils.h
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to