Completed
Push — master ( d5cc3f...55b0b1 )
by Roy
01:10
created

pyspider.database.elasticsearch.ProjectDB.update()   A

Complexity

Conditions 2

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 2
dl 0
loc 10
rs 9.4285
1
#!/usr/bin/env python
2
# -*- encoding: utf-8 -*-
3
# vim: set et sw=4 ts=4 sts=4 ff=unix fenc=utf8:
4
# Author: Binux<[email protected]>
5
#         http://binux.me
6
# Created on 2016-01-17 18:32:33
7
8
import time
9
10
import elasticsearch.helpers
11
from elasticsearch import Elasticsearch
12
from pyspider.database.base.projectdb import ProjectDB as BaseProjectDB
13
14
15
class ProjectDB(BaseProjectDB):
16
    __type__ = 'project'
17
18
    def __init__(self, hosts, index='pyspider'):
19
        self.index = index
20
        self.es = Elasticsearch(hosts=hosts)
21
22
        self.es.indices.create(index=self.index, ignore=400)
23
        if not self.es.indices.get_mapping(index=self.index, doc_type=self.__type__):
24
            self.es.indices.put_mapping(index=self.index, doc_type=self.__type__, body={
25
                "_all": {"enabled": False},
26
                "properties": {
27
                    "updatetime": {"type": "double"}
28
                }
29
            })
30
31
    def insert(self, name, obj={}):
32
        obj = dict(obj)
33
        obj['name'] = name
34
        obj['updatetime'] = time.time()
35
36
        obj.setdefault('group', '')
37
        obj.setdefault('status', 'TODO')
38
        obj.setdefault('script', '')
39
        obj.setdefault('comments', '')
40
        obj.setdefault('rate', 0)
41
        obj.setdefault('burst', 0)
42
43
        return self.es.index(index=self.index, doc_type=self.__type__, body=obj, id=name,
44
                             refresh=True)
45
46
    def update(self, name, obj={}, **kwargs):
47
        kwargs.update(obj)
48
        obj = self.get(name)
49
        if obj is None:
50
            return
51
52
        obj.update(kwargs)
53
        obj['updatetime'] = time.time()
54
        return self.es.index(index=self.index, doc_type=self.__type__, body=obj, id=name,
55
                             refresh=True)
56
57
    def get_all(self, fields=None):
58
        for record in elasticsearch.helpers.scan(self.es, index=self.index, doc_type=self.__type__,
59
                                                 query={'query': {"match_all": {}}},
60
                                                 _source_include=fields or []):
61
            yield record['_source']
62
63
    def get(self, name, fields=None):
64
        ret = self.es.get(index=self.index, doc_type=self.__type__, id=name,
65
                          _source_include=fields or [], ignore=404)
66
        return ret.get('_source', None)
67
68
    def check_update(self, timestamp, fields=None):
69
        for record in elasticsearch.helpers.scan(self.es, index=self.index, doc_type=self.__type__,
70
                                                 query={'query': {"range": {
71
                                                     "updatetime": {"gte": timestamp}
72
                                                 }}}, _source_include=fields or []):
73
            yield record['_source']
74
75
    def drop(self, name):
76
        return self.es.delete(index=self.index, doc_type=self.__type__, id=name, refresh=True)
77