예제 #1
0
 def backup(self, db, path):
     
     backup_path = join(path, '_backup', datetime.today().strftime('%Y-%m-%d_%H-%M-%S'))
     
     os.makedirs(backup_path)
     
     for item in django_couch.design_docs(db):
         # document subname
         name = os.path.basename(item.id)
         extension = self.extensions[item.doc.get('language', 'javascript')]
         
         if 'views' in item.doc:
             for view_name in item.doc['views']:
                 dirname = join(backup_path, '%s.%s' % (name, extension), 'views', view_name)
                 os.makedirs(dirname)
                 for view_type in item.doc['views'][view_name]:
                     filename = join(dirname, '%s.%s' % (view_type, extension))
                     print "  Storing %s %s" % (view_type, filename)
                     f = file(filename, 'w')
                     f.write(item.doc['views'][view_name][view_type])
                     f.close()
                     
         if 'filters' in item.doc:
             dirname = join(backup_path, '%s.%s' % (name, extension), 'filters')
             os.makedirs(dirname)
             for filter_name in item.doc['filters']:
                 filename = join(dirname, '%s.%s' % (filter_name, extension))
                 print "  Storing filter %s" % (filename)
                 f = file(filename, 'w')
                 f.write(item.doc['filters'][filter_name])
                 f.close()
예제 #2
0
    def execute(self, *args, **options):
        
        verbosity = int(options.get('verbosity'))
        
        workers = []

        if not len(args):
            print "No database to ping"
            sys.exit(1)
            
        for db_key in args:
            if verbosity >= 2:
                print "Using database", db_key
                print "Settings data:", settings.COUCHDB[db_key]

            db = django_couch.db(db_key)

            for row in django_couch.design_docs(db):
                nop, view = row.id.split('/', 1)

                d = db[row.id]

                for function in d.get('views', []):
                    worker = Pinger(verbosity, db_key, view, function)
                    workers.append(worker)
                    worker.start()

        for worker in workers:
            if verbosity > 1:
                print "Waiting for worker %s (%s/%s @ %s)..." % (worker, worker.view_name, worker.func_name, worker.db_key)
            worker.join()
            if verbosity > 1:
                print '  done'
예제 #3
0
    def restore(self, db, path, options):
        
        real_run = options.get('real_run')
        verbose = int(options.get('verbosity')) > 1
        
        def macros_load(path):
            macros = {}
            if os.path.exists(join(path, '_macros')):
                for f in os.listdir(join(path, '_macros')):
                    name, ext = os.path.splitext(f)
                    if ext in ['.js', '.py']:
                        if not ext in macros:
                            macros[ext] = {}
                        macros[ext][name] = file(join(path, '_macros', f), 'r').read()

            return macros
        
        macros = macros_load(path)
        
        
        if options['delete']:
            print "Checking for exceed views/filters/shows in design documents"
            delete_docs = []
            for row in django_couch.design_docs(db):
                doc_changed = False
                doc_deleted = False
                
                doc = db[row.id]
                print os.path.basename(doc.id)
                extension = self.extensions[doc.get('language', 'javascript')]
                doc_name = '%s.%s' % (os.path.basename(doc.id), extension)
                
                if os.path.exists(join(path, doc_name)):
                    if 'views' in doc:
                        view_path = join(path, doc_name, 'views')
                        if verbose:
                            print '  checking path', view_path
                        
                        if os.path.exists(view_path):
                            for fun_name in doc['views'].keys(): # copy keys for processing, allow to delete them from loop
                                if verbose:
                                    print '    checking function', fun_name
                        
                                if not os.path.exists(join(view_path, fun_name)):
                                    del(doc['views'][fun_name])
                                    if verbose:
                                        print '      function does not exists. Deleting'
                                    doc_changed = True
                                    
                            pass
                        else:
                            changed = True
                            del(doc['views'])
                            if verbose:
                                print "  Deleting unexistent views entry"
                    for key in ['filters', 'shows']:
                        if key in doc:
                            key_path = join(path, doc_name, key)
                            if verbose:
                                print '  checking path', key_path

                            if os.path.exists(key_path):
                                for fun_name in doc[key].keys():
                                    if verbose:
                                        print '    checking function', fun_name
                                    if not os.path.exists(join(key_path, '%s.%s' % (fun_name, extension))):
                                        del(doc[key][fun_name])
                                        if verbose:
                                            print '    function does not exists. Deleting'
                                        doc_changed = True
                            else:
                                doc_changed = True
                                del(doc[key])
                                if verbose:
                                    print "  Deleting unexistent %s entry" % key

                else:
                    if verbose:
                        print "  Deleting whole document"
                    doc_deleted = True
                    delete_docs.append(row.id)
                
                if not doc_deleted and doc_changed:
                    if real_run:
                        doc.save()
                    else:
                        if verbose:
                            print "Fake run. Skipping doc save"
                
            for doc_id in delete_docs:
                if real_run:
                    doc = db[doc_id]
                    doc.delete()
                else:
                    if verbose:
                        print "Fake run. Skipping doc deleting"

                


        updated = 0
        created = 0
        skipped = 0

        for item in os.listdir(path):
            if not '.' in item:
                if verbose:
                    print "Ignoring", item
                continue
            
            doc_name, extension = item.split('.', 1)
            if extension not in self.extension2lang:
                if verbose:
                    print "Ignoring", item
                continue
            
            print item
            
            language = self.extension2lang[extension]
            
            doc_id = '_design/%s' % doc_name
            changed = False
            
            try:
                doc = db[doc_id]
                creating = False
                if verbose:
                    print "Design-document %s exists" % doc_id
            except ResourceNotFound:
                creating = True
                if verbose:
                    print "Design-document %s not exists. Creating new" % doc_id
                doc = Document({
                    '_id': doc_id,
                    'language': language,
                    }, _db = db)
                
            
            for key in os.listdir(join(path, item)):
                if key == 'views':
                    for view_name in os.listdir(join(path, item, key)):
                        
                        if view_name.startswith('.'):
                            if verbose:
                                print "Skipping hidden file %s" % view_name
                            continue
                        
                        print "  %s (views)" % view_name
                        map_filename = join(path, item, key, view_name, 'map.%s' % extension)
                        reduce_filename = join(path, item, key, view_name, 'reduce.%s' % extension)
                        map_func = None
                        reduce_func = None
                        
                        if os.path.exists(map_filename):
                            map_func = file(map_filename, 'r').read()
                            
                        if os.path.exists(reduce_filename):
                            reduce_func = file(reduce_filename, 'r').read()
                        
                        if map_func:
                            if not 'views' in doc:
                                doc['views'] = {}

                            if not view_name in doc['views']:
                                doc['views'][view_name] = {}
                            
                            if map_func != doc['views'][view_name].get('map'):
                                doc['views'][view_name]['map'] = map_func
                                changed = True
                                if verbose:
                                    print "    map changed. Updating"
                            else:
                                if verbose:
                                    print "    map not changed"
                                    
                            if reduce_func and reduce_func != doc['views'][view_name].get('reduce'):
                                doc['views'][view_name]['reduce'] = reduce_func
                                changed = True
                                if verbose:
                                    print "    reduce changed. Updating"
                            else:
                                if verbose:
                                    print "    reduce not changed"
                    
                if key in ['filters', 'shows']:
                    for func_filename in os.listdir(join(path, item, key)):
                        if func_filename.startswith('.'):
                            if verbose:
                                print "Skipping hidden file %s" % func_filename
                            continue
                        
                        if not func_filename.endswith('.' + extension):
                            continue
                        
                        func_name = os.path.splitext(func_filename)[0]
                        print '  %s (%s)' % (func_name, key)
                        if not key in doc:
                            doc[key] = {}
                            
                        filter_func = file(join(path, item, key, func_filename), 'r').read()

                        if filter_func != doc[key].get(func_name):
                            doc[key][func_name] = filter_func
                            changed = True
                            if verbose:
                                print "      differs. Updating"
                        else:
                            if verbose:
                                print "      same"
                            
                        
            if changed:
                if creating:
                    created += 1
                else:
                    updated += 1
                    
                if real_run:
                    print "Changed. Saving..."
                    doc.save()
                else:
                    print "Fake run. Skipping changes"
            else:
                skipped += 1

        if not real_run:
            print "Fake run done"
        print "%d created, %d updated, %d skipped" % (created, updated, skipped)