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