All pastes #115308 Raw Edit

Anonymous

public python v1 · immutable
·published 2006-08-04 14:21 UTC
rendered paste body
from 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