rendered paste bodyfrom 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