from django.db import models from cursesite.wow.database.models import * import string from struct import unpack import os class DBCParser: 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(os.path.basename(self.filename)[:-4]) #we have our header, now we begin reading rows row = self.fetch_row(fp) total_rows = 0 while row: total_rows += 1 row = self.fetch_row(fp) print "Type: %s\nTotal Rows: %d" % (self.model, self.records) except IOError: pass def fetch_header(self, fp): try: self.signature = fp.read(4)[::-1] self.records = unpack("i", fp.read(4))[0] self.fields = unpack("i", fp.read(4))[0] self.recordsize = unpack("i", fp.read(4))[0] self.stringsize = unpack("i", fp.read(4))[0] fp.seek((self.stringsize*-1), 2) self.stringblock = fp.read(self.stringsize) fp.seek(20,0) except: raise def fetch_row(self, fp): row = {} try: toread = fp.read(self.recordsize) x = 0 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": offset = unpack("i", toread[0:4])[0] str = "" newoffset = offset while self.stringblock[newoffset:newoffset+1] != "\x00": str += self.stringblock[newoffset:newoffset+1] newoffset += 1 row[field_name] = str elif field_type == "FloatField": row[field_name] = unpack("f", toread[0:4])[0] 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 id except: raise