rendered paste bodyfrom django.db import modelsfrom cursesite.wow.database.models import *import stringfrom struct import unpackWDB_FILES = { "WIDB": "Item", "WMOB": "Creature", "WNPC": "NPC", "WPTX": "PageText", "WGOB": "GameObject", "WQST": "Quest", "WITX": "ItemText",}class WDBParser: def __init__(self, filename, debug=False): self.filename = filename self.debug = debug def process(self): try: fp = open(self.filename, "rb") self.fetch_header(fp) self.model = eval(WDB_FILES[self.signature]) # we have our header, now we begin reading rows rows = () row = self.fetch_row(fp) total_rows = 0 while row: rows.append(row) total_rows += 1 store = self.model() row = self.fetch_row(fp) if self.debug: print "Type: %s\nTotal Rows: %d" % (self.model, total_rows) return rows except IOError: pass def fetch_header(self, fp): try: self.signature = fp.read(4)[::-1] self.version = unpack("i", fp.read(4))[0] self.language = fp.read(4)[::-1] fp.seek(8, 1) except: raise def fetch_row(self, fp): row = {} try: row[id] = unpack("i", fp.read(4))[0] length = unpack("i", fp.read(4))[0] if row[id] == 0: return False print "ID: %d" % row[id] toread = fp.read(length) x = 1 while toread: field_type = self.model._meta.fields[x].__class__.__name__ field_name = self.model._meta.fields[x].name if field_type == "CharField" or field_type == "TextField": str = "" while toread[0] != "\x00": str += toread[0] toread = toread[1:] row[field_name] = str toread = toread[1:] #x += 1 elif field_type == "FloatField": row[field_name] = unpack("f", toread[0:4])[0] toread = toread[4:] else: row[field_name] = unpack("i", toread[0:4])[0] toread = toread[4:] x += 1 if self.debug: print "%s (%s): %s" % (field_name, field_type, row[field_name]) #return "Row %d: %s" % (id, fp.read(length)) return row except: raise