Statistics
| Branch: | Tag: | Revision:

root / commissioning / apps / fscrud_django / pvdata.py @ 9f1a1bd0

History | View | Annotate | Download (2.5 kB)

1
from os.path import expanduser, exists
2
from os import getenv, fsync, unlink
3
from errno import ENOENT
4
from shutil import move
5

    
6
stripchars = '"\' '
7

    
8
_pvpath_default = getenv('PVDATA_PATH')
9
if not _pvpath_default:
10
    _pvpath_default = expanduser('~/.pvdata')
11

    
12
_pvpath = None
13
_pvdict = None
14
_pvdata_counter = 0
15
_pvdirty = 0
16

    
17
def _pvopen(pvpath=_pvpath_default):
18
    global _pvdict
19
    if _pvdict is not None:
20
        return _pvdict
21

    
22
    try:
23
        with open(pvpath) as f:
24
            pvdata = f.read()
25
    except IOError, e:
26
        if e.errno != ENOENT:
27
            m = "Cannot open pvdata file '%s'" % (pvpath,)
28
            raise ValueError(m, e)
29

    
30
        with open(pvpath, "w") as f:
31
            pass
32
        pvdata = ''
33

    
34
    global _pvpath
35
    _pvpath = pvpath
36

    
37
    pvdict = {}
38
    for line in pvdata.splitlines():
39
        key, sep, val = line.partition('=')
40
        if not key or key[0] == '#':
41
            continue
42

    
43
        key = key.strip()
44
        val = val.strip()
45

    
46
        if len(key) > 1 and key[0] == "'" and key[-1] == "'":
47
            key = key[1:-1]
48

    
49
        if len(val) > 1 and val[0] == "'" and val[-1] == "'":
50
            val = val[1:-1]
51

    
52
        pvdict[key] = val
53

    
54
    _pvdict = pvdict
55
    return pvdict
56

    
57

    
58
def pvsave(pvpath=None, force=0):
59

    
60
    if _pvdict is None or not (force or _pvdirty):
61
        return
62

    
63
    if pvpath is None:
64
        pvpath = _pvpath
65

    
66
    pvdata_list = []
67
    append = pvdata_list.append
68

    
69
    for key, val in _pvdict.items():
70
        if not key or '\n' in key or '\n' in val:
71
            continue
72

    
73
        if key[0] == ' ' or key[-1] == ' ':
74
            key = "'%s'" % (key,)
75

    
76
        if val[0] == ' ' or val[-1] == ' ':
77
            val = "'%s'" % (val,)
78

    
79
        append("%s = %s" % (key, val))
80

    
81
    pvdata = '\n'.join(pvdata_list) + '\n'
82

    
83
    global _pvdata_counter
84

    
85
    while 1:
86
        pvpath_old = '%s.old.%d' % (pvpath, _pvdata_counter)
87
        if not exists(pvpath_old):
88
            break
89

    
90
        _pvdata_counter += 1
91
        continue
92

    
93
    move(pvpath, pvpath_old)
94

    
95
    try:
96
        with open(pvpath, "w") as f:
97
            f.write(pvdata)
98
            f.flush()
99
            fsync(f.fileno())
100
    except IOError, e:
101
        m = "Cannot open pvdata file '%s'" % (pvpath,)
102
        raise ValueError(m, e)
103

    
104
    unlink(pvpath_old)
105

    
106

    
107
def getpv(key):
108
    pvdict = _pvopen()
109
    return pvdict[key] if key in pvdict else ''
110

    
111
def setpv(key, val):
112
    pvdict = _pvopen()
113
    global _pvdirty
114
    _pvdirty = 1
115
    pvdict[key] = val
116

    
117
def delpv(key):
118
    pvdict = _pvopen()
119
    del pvdict[key]
120

    
121
def savepv(key, val):
122
    setpv(key, val)
123
    pvsave()
124