All pastes #150191 Raw Edit

Stuff

public text v1 · immutable
#150191 ·published 2006-08-26 16:56 UTC
rendered paste body
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