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

Snapshot restore, mero client side


diffs (179 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
@@ -178,6 +178,11 @@ command_help(int argc, char *argv[])
                        printf("  
<snapshotdir>/<dbname>_<YYYY><MM><DD>T<HH><MM>UTC.tar.gz.\n");
                        printf("Options:\n");
                        printf("  -t <targetfile>  File on the server to write 
the snapshot to.\n");
+               } else if (argc > 2 && strcmp(argv[2], "restore") == 0) {
+                       printf("Usage: monetdb snapshot restore -s <sourcefile> 
<dbname>\n");
+                       printf("  Restore a database from the given snapshot 
file.\n");
+                       printf("Options:\n");
+                       printf("  -s <sourcefile>  Full path to the snapshot 
file on the server.\n");
                } else {
                        printf("Usage: monetdb <create|list|restore|destroy> 
[arguments]\n");
                        printf("  Manage database snapshots\n");
@@ -1672,13 +1677,13 @@ command_profilerstop(int argc, char *arg
 }
 
 static void
-snapshot_adhoc(sabdb *databases, char *filename) {
+snapshot_create_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);
+       sprintf(merocmd, "snapshot create adhoc %s", filename);
 
        simple_argv_cmd("snapshot", databases, merocmd, NULL, "snapshotting 
database");
 
@@ -1686,8 +1691,38 @@ snapshot_adhoc(sabdb *databases, char *f
 }
 
 static void
-snapshot_automatic(sabdb *databases) {
-       simple_argv_cmd("snapshot", databases, "snapshot automatic", NULL, 
"snapshotting database");
+snapshot_create_automatic(sabdb *databases) {
+       simple_argv_cmd("snapshot", databases, "snapshot create automatic", 
NULL, "snapshotting database");
+}
+
+static void
+snapshot_restore_adhoc(char *sourcefile, char *dbname)
+{
+       char *ret;
+       char *out;
+       char *merocmd = malloc(100 + strlen(sourcefile));
+
+       if (!monetdb_quiet) {
+               printf("Restore '%s' from '%s'... ", dbname, sourcefile);
+               fflush(stdout);
+       }
+
+       sprintf(merocmd, "snapshot restore adhoc %s", sourcefile);
+       ret = control_send(&out, mero_host, mero_port, dbname, merocmd, 0, 
mero_pass);
+       free(merocmd);
+
+       if (ret != NULL) {
+               fprintf(stderr, "snapshot restore: %s", ret);
+               exit(2);
+       }
+       if (strcmp(out, "OK") == 0) {
+               if (!monetdb_quiet) {
+                       printf("done\n");
+               }
+       } else {
+               fprintf(stderr, "snapshot restore: %s\n", out);
+               exit(1);
+       }
 }
 
 static void
@@ -1742,14 +1777,72 @@ command_snapshot_create(int argc, char *
                        fprintf(stderr, "snapshot: -t only allows a single 
database\n");
                        exit(1);
                }
-               snapshot_adhoc(databases, targetfile);
+               snapshot_create_adhoc(databases, targetfile);
        } else {
-               snapshot_automatic(databases);
+               snapshot_create_automatic(databases);
        }
 
        msab_freeStatus(&databases);
 }
 
+
+static void
+command_snapshot_restore(int argc, char *argv[])
+{
+       char *sourcefile = NULL;
+       char *dbname = NULL;
+
+       /* 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] == 's') {
+                               if (argv[i][2] != '\0') {
+                                       sourcefile = &argv[i][2];
+                                       argv[i] = NULL;
+                               } else if (i + 1 < argc && argv[i+1][0] != '-') 
{
+                                       sourcefile = argv[i+1];
+                                       argv[i] = NULL;
+                                       argv[i+1] = NULL;
+                                       i++;
+                               } else {
+                                       fprintf(stderr, "snapshot: -s needs an 
argument\n");
+                               }
+                       } else {
+                               fprintf(stderr, "snapshot restore: unknown 
option: %s\n", argv[i]);
+                               command_help(argc + 2, &argv[-2]);  // ewww
+                               exit(1);
+                       }
+               }
+       }
+
+       /* Find the dbname */
+       for (int i = 1; i < argc; i++) {
+               if (argv[i] == NULL)
+                       continue;
+               if (dbname != NULL) {
+                       fprintf(stderr, "snapshot restore: only a single 
database at a time\n");
+                       return;
+               }
+               dbname = argv[i];
+       }
+
+       if (dbname == NULL) {
+               fprintf(stderr, "snapshot restore: dbname is mandatory\n");
+               return;
+       }
+       if (sourcefile == NULL) {
+               fprintf(stderr, "snapshot restore: sourcefile is mandatory\n");
+               return;
+
+       }
+
+       snapshot_restore_adhoc(sourcefile, dbname);
+}
+
 static void
 command_snapshot(int argc, char *argv[])
 {
@@ -1767,6 +1860,8 @@ command_snapshot(int argc, char *argv[])
        /* pick the right subcommand */
        if (strcmp(argv[1], "create") == 0) {
                command_snapshot_create(argc - 1, &argv[1]);
+       } else if (strcmp(argv[1], "restore") == 0) {
+               command_snapshot_restore(argc - 1, &argv[1]);
        } else {
                /* print help message for this command */
                command_help(argc - 1, &argv[1]);
diff --git a/tools/merovingian/daemon/controlrunner.c 
b/tools/merovingian/daemon/controlrunner.c
--- a/tools/merovingian/daemon/controlrunner.c
+++ b/tools/merovingian/daemon/controlrunner.c
@@ -691,8 +691,8 @@ static void ctl_handle_client(
                                                         origin, q);
                                }
                                msab_freeStatus(&stats);
-                       } else if (strncmp(p, "snapshot adhoc ", 
strlen("snapshot adhoc ")) == 0) {
-                               char *dest = p + strlen("snapshot adhoc ");
+                       } else if (strncmp(p, "snapshot create adhoc ", 
strlen("snapshot create adhoc ")) == 0) {
+                               char *dest = p + strlen("snapshot create adhoc 
");
                                Mfprintf(_mero_ctlout, "Start snapshot of 
database '%s' to file '%s'\n", q, dest);
                                char *e = snapshot_database_to(q, dest);
                                if (e != NULL) {
@@ -707,7 +707,7 @@ static void ctl_handle_client(
                                        Mfprintf(_mero_ctlout, "%s: completed 
snapshot of database '%s' to '%s'\n",
                                                origin, q, dest);
                                }
-                       } else if (strcmp(p, "snapshot automatic") == 0) {
+                       } else if (strcmp(p, "snapshot create automatic") == 0) 
{
                                char *dest = NULL;
                                char *e = snapshot_default_filename(&dest, q);
                                if (e != NULL) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to