from django.db import models from cursesite.wow.database.models import * from struct import unpack import os import time class DBCParser: def __init__(self, filename, output=True, debug=False): self.filename = filename self.debug = debug self.output = output def process(self): try: start = time.time() fp = open(self.filename, "rb") self.fetch_header(fp) self.model_name = os.path.basename(self.filename)[:-4] self.model = eval(self.model_name) #we have our header, now we begin reading rows rows = [] n = 1 row = self.fetch_row(fp) while n < self.records: n += 1 rows.append(row) row = self.fetch_row(fp) if self.output: print "Type: %s\nTotal Rows: %d\nTime Elapsed: %f" % (self.model, self.records, ((time.time()-start)/1000)) return rows 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 toread = toread[4:] elif field_type == "FloatField": row[field_name] = unpack("f", toread[0:4])[0] toread = toread[4:] elif field_type == "SmallIntegerField": row[field_name] = unpack("H", toread[0:2])[0] toread = toread[2:] elif field_type == "PositiveSmallIntegerField": row[field_name] = unpack("h", toread[0:2])[0] toread = toread[2:] elif field_type == "PositiveIntegerField": row[field_name] = unpack("i", 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 id except: raise