Forked from lord-otori/couchbase_export_views.php
Last active
March 21, 2016 13:33
-
-
Save doodyparizada/319b34d0de5a61ac3753 to your computer and use it in GitHub Desktop.
A script to export all views in a Couchbase server to files.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import requests | |
import sys | |
from collections import namedtuple | |
Bucket = namedtuple('Bucket', ('name', 'type', 'ddocs_uri')) | |
View = namedtuple('View', ('name', 'map', 'reduce')) | |
DDoc = namedtuple('DDoc', ('name', 'views')) | |
class Connection(object): | |
def __init__(self, user, password, host): | |
self.user = user | |
self.password = password | |
self.host = host | |
def _req(self, path): | |
return requests.get('http://%s%s' % (self.host, path), | |
auth=(self.user, self.password)).json() | |
def get_buckets(self): | |
res = self._req('/pools/default/buckets') | |
return [Bucket(b['name'], b['bucketType'], b['ddocs']['uri']) for b in res] | |
def get_ddocs(self, bucket): | |
rows = self._req(bucket.ddocs_uri)['rows'] | |
res = [] | |
for row in rows: | |
doc_name = row['doc']['meta']['id'] | |
views = [View(view_name, view.get('map'), view.get('reduce')) | |
for view_name, view | |
in row['doc']['json']['views'].items()] | |
res.append(DDoc(doc_name, views)) | |
return res | |
def mkdir_p(path): | |
import errno | |
import os | |
try: | |
os.makedirs(path) | |
except OSError as exc: # Python >2.5 | |
if exc.errno == errno.EEXIST and os.path.isdir(path): | |
pass | |
else: | |
raise | |
def create_dirs(data): | |
for bucket, ddocs in data.items(): | |
for ddoc in ddocs: | |
dirname = 'buckets/%s/%s' % (bucket.name, ddoc.name.replace('_design/', '')) | |
mkdir_p(dirname) | |
for view in ddoc.views: | |
if view.map: | |
filename = '%s/%s.map.js' % (dirname, view.name) | |
with open(filename, 'w') as f: | |
f.write(view.map) | |
if view.reduce: | |
filename = '%s/%s.reduce.js' % (dirname, view.name) | |
with open(filename, 'w') as f: | |
f.write(view.reduce) | |
if __name__ == '__main__': | |
if len(sys.argv) < 4: | |
print 'usage: %s <user> <pass> <host>' % sys.argv[0] | |
sys.exit(1) | |
user = sys.argv[1] | |
password = sys.argv[2] | |
host = sys.argv[3] # couchbase.example.com:8091 | |
conn = Connection(user, password, host) | |
buckets = conn.get_buckets() | |
res = {} | |
for bucket in buckets: | |
if bucket.type != 'memcached': | |
res[bucket] = conn.get_ddocs(bucket) | |
else: | |
res[bucket] = [] | |
create_dirs(res) | |
from subprocess import call | |
call(['tree']) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment