2 from datetime
import datetime
5 from couchdbkit
import Database
6 from django
.core
.management
.base
import BaseCommand
7 from django
.conf
import settings
9 from mygpo
.decorators
import repeat_on_conflict
10 from mygpo
.core
.models
import SanitizingRule
11 from mygpo
.utils
import progress
15 class Command(BaseCommand
):
17 Compacts the database and all views, and measures the required time
21 def get_design_docs(db
):
23 prefix_len
= len(prefix
)
25 for ddoc
in db
.view('_all_docs', startkey
='_design/', endkey
='_design0'):
26 yield ddoc
['key'][prefix_len
:]
29 def handle(self
, *args
, **options
):
31 db_url
= settings
.COUCHDB_DATABASES
[0][1]
34 print 'Compacting Database ... ',
36 compact_db
= lambda: db
.compact()
37 db_is_compacting
= lambda: db
.info()['compact_running']
38 duration
= self
.compact_wait(compact_db
, db_is_compacting
)
41 # Only compact once if multiple views share one index file
43 for ddoc
in self
.get_design_docs(db
):
44 sig
= db
.res
.get('/_design/%s/_info' % ddoc
).json_body
['view_index']['signature']
47 for design_doc
in ddocs
.values():
48 print 'Compacting %s ...' % design_doc
,
50 compact_view
= lambda: db
.compact('%s' % design_doc
)
51 view_is_compacting
= lambda: db
.res
.get('/_design/%s/_info' % design_doc
).json_body
['view_index']['compact_running']
52 duration
= self
.compact_wait(compact_view
, view_is_compacting
)
57 def compact_wait(compact
, is_compacting
, sleep_time
=1, inc_factor
= 2):
59 start
= datetime
.utcnow()
67 print >> sys
.stderr
, e
71 is_comp
= is_compacting()
74 sleep_time
*= inc_factor
80 print >> sys
.stderr
, e
82 end
= datetime
.utcnow()