Index: third_party/gsutil/third_party/boto/bin/dynamodb_dump |
diff --git a/third_party/gsutil/third_party/boto/bin/dynamodb_dump b/third_party/gsutil/third_party/boto/bin/dynamodb_dump |
new file mode 100755 |
index 0000000000000000000000000000000000000000..8b6aada77b81f2c5df0dcc3c005225b3d67c247c |
--- /dev/null |
+++ b/third_party/gsutil/third_party/boto/bin/dynamodb_dump |
@@ -0,0 +1,75 @@ |
+#!/usr/bin/env python |
+ |
+import argparse |
+import errno |
+import os |
+ |
+import boto |
+from boto.compat import json |
+ |
+ |
+DESCRIPTION = """Dump the contents of one or more DynamoDB tables to the local filesystem. |
+ |
+Each table is dumped into two files: |
+ - {table_name}.metadata stores the table's name, schema and provisioned |
+ throughput. |
+ - {table_name}.data stores the table's actual contents. |
+ |
+Both files are created in the current directory. To write them somewhere else, |
+use the --out-dir parameter (the target directory will be created if needed). |
+""" |
+ |
+ |
+def dump_table(table, out_dir): |
+ metadata_file = os.path.join(out_dir, "%s.metadata" % table.name) |
+ data_file = os.path.join(out_dir, "%s.data" % table.name) |
+ |
+ with open(metadata_file, "w") as metadata_fd: |
+ json.dump( |
+ { |
+ "name": table.name, |
+ "schema": table.schema.dict, |
+ "read_units": table.read_units, |
+ "write_units": table.write_units, |
+ }, |
+ metadata_fd |
+ ) |
+ |
+ with open(data_file, "w") as data_fd: |
+ for item in table.scan(): |
+ # JSON can't serialize sets -- convert those to lists. |
+ data = {} |
+ for k, v in item.iteritems(): |
+ if isinstance(v, (set, frozenset)): |
+ data[k] = list(v) |
+ else: |
+ data[k] = v |
+ |
+ data_fd.write(json.dumps(data)) |
+ data_fd.write("\n") |
+ |
+ |
+def dynamodb_dump(tables, out_dir): |
+ try: |
+ os.makedirs(out_dir) |
+ except OSError as e: |
+ # We don't care if the dir already exists. |
+ if e.errno != errno.EEXIST: |
+ raise |
+ |
+ conn = boto.connect_dynamodb() |
+ for t in tables: |
+ dump_table(conn.get_table(t), out_dir) |
+ |
+ |
+if __name__ == "__main__": |
+ parser = argparse.ArgumentParser( |
+ prog="dynamodb_dump", |
+ description=DESCRIPTION |
+ ) |
+ parser.add_argument("--out-dir", default=".") |
+ parser.add_argument("tables", metavar="TABLES", nargs="+") |
+ |
+ namespace = parser.parse_args() |
+ |
+ dynamodb_dump(namespace.tables, namespace.out_dir) |