Changeset: 30978d8c99e2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=30978d8c99e2
Modified Files:
        tools/merovingian/client/monetdb.c
Branch: hot-snapshot
Log Message:

Add `snapshot` subcommand to merovingian client


diffs (121 lines):

diff --git a/tools/merovingian/client/monetdb.c 
b/tools/merovingian/client/monetdb.c
--- a/tools/merovingian/client/monetdb.c
+++ b/tools/merovingian/client/monetdb.c
@@ -169,6 +169,14 @@ command_help(int argc, char *argv[])
        } else if (strcmp(argv[1], "version") == 0) {
                printf("Usage: monetdb version\n");
                printf("  prints the version of this monetdb utility\n");
+       } else if (strcmp(argv[1], "snapshot") == 0) {
+               printf("Usage: monetdb snapshot -f <filename> <database>\n");
+               printf("  Takes a snapshot of database <database> in file 
<filename>.\n");
+               printf("  The snapshot is a tar file that contains a full 
database directory.\n");
+               printf("  If the filename ends in .gz or another supported 
compression\n");
+               printf("  algorithm, the contents of the file are 
compressed.\n");
+               printf("Options:\n");
+               printf("  -f <filename>  File on server to write snapshot 
to.\n");
        } else {
                printf("help: unknown command: %s\n", argv[1]);
        }
@@ -1658,6 +1666,93 @@ command_profilerstop(int argc, char *arg
        simple_command(argc, argv, "profilerstop", "stopped profiler", 1);
 }
 
+static void snapshot_adhoc(sabdb *databases, char *filename) {
+       /* databases is supposed to only hold a single database */
+       assert(databases != NULL);
+       assert(databases->next == NULL);
+
+       char *merocmd = malloc(100 + strlen(filename));
+       sprintf(merocmd, "snapshot adhoc %s", filename);
+
+       simple_argv_cmd("snapshot", databases, merocmd, NULL, "snapshotting 
database");
+
+       free(merocmd);
+}
+
+static void
+command_snapshot(int argc, char *argv[])
+{
+       char *filename = NULL;
+       char *err;
+       if (argc == 1) {
+               /* print help message for this command */
+               command_help(argc + 1, &argv[-1]);
+               exit(1);
+       }
+
+       /* walk through the arguments and hunt for "options" */
+       for (int i = 1; i < argc; i++) {
+               if (strcmp(argv[i], "--") == 0) {
+                       argv[i] = NULL;
+                       break;
+               }
+               if (argv[i][0] == '-') {
+                       if (argv[i][1] == 'f') {
+                               if (argv[i][2] != '\0') {
+                                       filename = &argv[i][2];
+                                       argv[i] = NULL;
+                               } else if (i + 1 < argc && argv[i+1][0] != '-') 
{
+                                       filename = argv[i+1];
+                                       argv[i] = NULL;
+                                       argv[i+1] = NULL;
+                                       i++;
+                               } else {
+                                       fprintf(stderr, "snapshot: -f needs an 
argument\n");
+                               }
+                       } else {
+                               fprintf(stderr, "destroy: unknown option: 
%s\n", argv[i]);
+                               command_help(argc + 1, &argv[-1]);
+                               exit(1);
+                       }
+               }
+       }
+
+       /* Look up the databases to snapshot */
+       sabdb *all = NULL;
+       err = MEROgetStatus(&all, NULL);
+       if (err != NULL) {
+               fprintf(stderr, "snapshot: %s\n", err);
+               free(err);
+               exit(2);
+       }
+       sabdb *databases = globMatchDBS(argc, argv, &all, "snapshot");
+       msab_freeStatus(&all);
+       if (databases == NULL)
+               exit(1);
+
+
+       /* Until we implement a default snapshot location, filename is 
mandatory */
+       if (filename == NULL) {
+               fprintf(stderr, "snapshot: filename is mandatory\n");
+               command_help(argc + 1, &argv[-1]);
+               exit(1);
+       }
+
+       /* Go do the work */
+       if (filename != NULL) {
+               if (databases->next != NULL) {
+                       fprintf(stderr, "snapshot: -f only allows a single 
database\n");
+                       exit(1);
+               }
+               snapshot_adhoc(databases, filename);
+       } else {
+               /* to be implemented: trigger multiple databases to snapshot
+                * to a default location */
+       }
+
+       msab_freeStatus(&databases);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -1856,6 +1951,8 @@ main(int argc, char *argv[])
                command_set(argc - i, &argv[i], INHERIT);
        } else if (strcmp(argv[i], "discover") == 0) {
                command_discover(argc - i, &argv[i]);
+       } else if (strcmp(argv[i], "snapshot") == 0) {
+               command_snapshot(argc - i, &argv[i]);
        } else {
                fprintf(stderr, "monetdb: unknown command: %s\n", argv[i]);
                command_help(0, NULL);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to