|
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
|
|
|
|