summaryrefslogtreecommitdiffstats
path: root/cobbler
diff options
context:
space:
mode:
authorMichael DeHaan <mdehaan@redhat.com>2007-10-17 13:29:00 -0400
committerMichael DeHaan <mdehaan@redhat.com>2007-10-17 13:29:00 -0400
commit940a0bbbe44db52c06514423823f865a6c579e3a (patch)
tree759405a71065b9427e5765f76b9fd310358ae802 /cobbler
parent3e339bdfd00dc822fba3880e28e738d64bcb0fc2 (diff)
downloadthird_party-cobbler-940a0bbbe44db52c06514423823f865a6c579e3a.tar.gz
third_party-cobbler-940a0bbbe44db52c06514423823f865a6c579e3a.tar.xz
third_party-cobbler-940a0bbbe44db52c06514423823f865a6c579e3a.zip
Make experimental shelve module explicitly use gdbm.
Diffstat (limited to 'cobbler')
-rw-r--r--cobbler/modules/serializer_shelve.py41
1 files changed, 23 insertions, 18 deletions
diff --git a/cobbler/modules/serializer_shelve.py b/cobbler/modules/serializer_shelve.py
index e1dd7e4..f7a5c65 100644
--- a/cobbler/modules/serializer_shelve.py
+++ b/cobbler/modules/serializer_shelve.py
@@ -21,17 +21,30 @@ import os
import sys
import glob
import traceback
-
-plib = distutils.sysconfig.get_python_lib()
-mod_path="%s/cobbler" % plib
-sys.path.insert(0, mod_path)
-
-
from rhpl.translate import _, N_, textdomain, utf8
from cexceptions import *
import os
import shelve
+# FIXME: this is only needed for loading other modules, right?
+# plib = distutils.sysconfig.get_python_lib()
+# mod_path="%s/cobbler" % plib
+# sys.path.insert(0, mod_path)
+
+
+import gdbm # FIXME: check if available in EL4?
+
+def open_db(obj):
+ while 1:
+ try:
+ filename = obj.filename() + ".gdbm"
+ internal_db = gdbm.open(filename, 'c', 0644)
+ return shelve.BsdDbShelf(internal_db)
+ except gdbm.error:
+ print "- can't access %s right now, waiting..." % filename
+ time.sleep(1)
+ continue
+
def register():
"""
The mandatory cobbler module registration hook.
@@ -44,10 +57,10 @@ def serialize(obj):
Will create intermediate paths if it can. Returns True on Success,
False on permission errors.
"""
- fd = shelve.open(obj.filename() + ".shelve","c")
# FIXME: this needs to understand deletes
# FIXME: create partial serializer and don't use this
+ fd = open_db(obj)
for entry in obj:
fd[entry.name] = entry.to_datastruct()
@@ -55,14 +68,14 @@ def serialize(obj):
return True
def serialize_item(obj, item):
- fd = shelve.open(obj.filename() + ".shelve","w")
+ fd = open_db(obj)
fd[item.name] = item.to_datastruct()
fd.sync()
return True
# NOTE: not heavily tested
def serialize_delete(obj, item):
- fd = shelve.open(obj.filename() + ".shelve","w")
+ fd = open_db(obj)
if fd.has_key(item.name):
del fd[item.name]
fd.sync()
@@ -75,15 +88,7 @@ def deserialize(obj,topological=False):
files could be read and contained decent YAML. Otherwise returns
False.
"""
- filename = obj.filename() + ".shelve"
- try:
- fd = shelve.open(filename, "r")
- except:
- if not os.path.exists(filename):
- return True
- else:
- traceback.print_exc()
- raise CX(_("Can't access storage file"))
+ fd = open_db(obj)
datastruct = []
for (key,value) in fd.iteritems():