diff options
| author | RogueAI42 <[email protected]> | 2017-06-13 20:06:38 +1000 |
|---|---|---|
| committer | RogueAI42 <[email protected]> | 2017-06-13 20:06:38 +1000 |
| commit | 2acfa34596061a9236bb6a9df1e3f3a0c01d6ff0 (patch) | |
| tree | 72954044f3dde5f9a17d12f99cd57a819f1b0f58 /ShiftOS_TheReturn/Lib/whichdb.py | |
| parent | a2db5d39096cbf4d32412ad40168769ca63d9493 (diff) | |
| download | shiftos_thereturn-2acfa34596061a9236bb6a9df1e3f3a0c01d6ff0.tar.gz shiftos_thereturn-2acfa34596061a9236bb6a9df1e3f3a0c01d6ff0.tar.bz2 shiftos_thereturn-2acfa34596061a9236bb6a9df1e3f3a0c01d6ff0.zip | |
Python API
It uses a meta-language and a CSharpCodeProvider on startup. I will
release a tutorial on the forums soon showing how to use it.
This commit also adds an extremely basic loading screen which shows
while Desktop is getting everything ready. Which can take a while
if you have any Python mods. Thanks, IronPython.
Diffstat (limited to 'ShiftOS_TheReturn/Lib/whichdb.py')
| -rw-r--r-- | ShiftOS_TheReturn/Lib/whichdb.py | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/ShiftOS_TheReturn/Lib/whichdb.py b/ShiftOS_TheReturn/Lib/whichdb.py new file mode 100644 index 0000000..9071430 --- /dev/null +++ b/ShiftOS_TheReturn/Lib/whichdb.py @@ -0,0 +1,117 @@ +# !/usr/bin/env python +"""Guess which db package to use to open a db file.""" + +import os +import struct +import sys + +try: + import dbm + _dbmerror = dbm.error +except ImportError: + dbm = None + # just some sort of valid exception which might be raised in the + # dbm test + _dbmerror = IOError + +def whichdb(filename): + """Guess which db package to use to open a db file. + + Return values: + + - None if the database file can't be read; + - empty string if the file can be read but can't be recognized + - the module name (e.g. "dbm" or "gdbm") if recognized. + + Importing the given module may still fail, and opening the + database using that module may still fail. + """ + + # Check for dbm first -- this has a .pag and a .dir file + try: + f = open(filename + os.extsep + "pag", "rb") + f.close() + # dbm linked with gdbm on OS/2 doesn't have .dir file + if not (dbm.library == "GNU gdbm" and sys.platform == "os2emx"): + f = open(filename + os.extsep + "dir", "rb") + f.close() + return "dbm" + except IOError: + # some dbm emulations based on Berkeley DB generate a .db file + # some do not, but they should be caught by the dbhash checks + try: + f = open(filename + os.extsep + "db", "rb") + f.close() + # guarantee we can actually open the file using dbm + # kind of overkill, but since we are dealing with emulations + # it seems like a prudent step + if dbm is not None: + d = dbm.open(filename) + d.close() + return "dbm" + except (IOError, _dbmerror): + pass + + # Check for dumbdbm next -- this has a .dir and a .dat file + try: + # First check for presence of files + os.stat(filename + os.extsep + "dat") + size = os.stat(filename + os.extsep + "dir").st_size + # dumbdbm files with no keys are empty + if size == 0: + return "dumbdbm" + f = open(filename + os.extsep + "dir", "rb") + try: + if f.read(1) in ("'", '"'): + return "dumbdbm" + finally: + f.close() + except (OSError, IOError): + pass + + # See if the file exists, return None if not + try: + f = open(filename, "rb") + except IOError: + return None + + # Read the start of the file -- the magic number + s16 = f.read(16) + f.close() + s = s16[0:4] + + # Return "" if not at least 4 bytes + if len(s) != 4: + return "" + + # Convert to 4-byte int in native byte order -- return "" if impossible + try: + (magic,) = struct.unpack("=l", s) + except struct.error: + return "" + + # Check for GNU dbm + if magic in (0x13579ace, 0x13579acd, 0x13579acf): + return "gdbm" + + # Check for old Berkeley db hash file format v2 + if magic in (0x00061561, 0x61150600): + return "bsddb185" + + # Later versions of Berkeley db hash file have a 12-byte pad in + # front of the file type + try: + (magic,) = struct.unpack("=l", s16[-4:]) + except struct.error: + return "" + + # Check for BSD hash + if magic in (0x00061561, 0x61150600): + return "dbhash" + + # Unknown + return "" + +if __name__ == "__main__": + for filename in sys.argv[1:]: + print whichdb(filename) or "UNKNOWN", filename |
