1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

Import old pure Python version of tdbpack/unpack, so that we can do

compatibility testing against the shiny new C version.

This version is slightly modified to not call codepage conversion
routines, and renamed tdbutil->oldtdbutil.
(This used to be commit 2dc4373727)
This commit is contained in:
Martin Pool 2002-10-21 11:13:53 +00:00
parent e0d317dd16
commit d70d4ef34b

View File

@ -0,0 +1,144 @@
#!/usr/bin/python
#############################################################
# tdbutil
#
# Purpose:
# Contains functions that are used to pack and unpack data
# from Samba's tdb databases. Samba sometimes represents complex
# data structures as a single value in a database. These functions
# allow other python scripts to package data types into a single python
# string and unpackage them.
#
#
# XXXXX: This code is no longer used; it's just here for testing
# compatibility with the new (much faster) C implementation.
#
##############################################################
import string
def pack(format,list):
retstring = ''
listind = 0
# Cycle through format entries
for type in format:
# Null Terminated String
if (type == 'f' or type == 'P'):
retstring = retstring + list[listind] + "\000"
# 4 Byte Number
if (type == 'd'):
retstring = retstring + PackNum(list[listind],4)
# 2 Byte Number
if (type == 'w'):
retstring = retstring + PackNum(list[listind],2)
# Pointer Value
if (type == 'p'):
if (list[listind]):
retstring = retstring + PackNum(1,4)
else:
retstring = retstring + PackNum(0,4)
# Buffer and Length
if (type == 'B'):
# length
length = list[listind]
retstring = retstring + PackNum(length,4)
length = int(length)
listind = listind + 1
# buffer
retstring = retstring + list[listind][:length]
listind = listind + 1
return retstring
def unpack(format,buffer):
retlist = []
bufind = 0
lasttype = ""
for type in format:
# Pointer Value
if (type == 'p'):
newvalue = UnpackNum(buffer[bufind:bufind+4])
bufind = bufind + 4
if (newvalue):
newvalue = 1L
else:
newvalue = 0L
retlist.append(newvalue)
# Previous character till end of data
elif (type == '$'):
if (lasttype == 'f'):
while (bufind < len(buffer)):
newstring = ''
while (buffer[bufind] != '\000'):
newstring = newstring + buffer[bufind]
bufind = bufind + 1
bufind = bufind + 1
retlist.append(newstring)
# Null Terminated String
elif (type == 'f' or type == 'P'):
newstring = ''
while (buffer[bufind] != '\000'):
newstring = newstring + buffer[bufind]
bufind = bufind + 1
bufind = bufind + 1
retlist.append(newstring)
# 4 Byte Number
elif (type == 'd'):
newvalue = UnpackNum(buffer[bufind:bufind+4])
bufind = bufind + 4
retlist.append(newvalue)
# 2 Byte Number
elif (type == 'w'):
newvalue = UnpackNum(buffer[bufind:bufind+2])
bufind = bufind + 2
retlist.append(newvalue)
# Length and Buffer
elif (type == 'B'):
# Length
length = UnpackNum(buffer[bufind:bufind+4])
bufind = bufind + 4
retlist.append(length)
length = int(length)
# Buffer
retlist.append(buffer[bufind:bufind+length])
bufind = bufind + length
lasttype = type
return ((retlist,buffer[bufind:]))
def PackNum(myint,size):
retstring = ''
size = size * 2
hint = hex(myint)[2:]
# Check for long notation
if (hint[-1:] == 'L'):
hint = hint[:-1]
addon = size - len(hint)
for i in range(0,addon):
hint = '0' + hint
while (size > 0):
val = string.atoi(hint[size-2:size],16)
retstring = retstring + chr(val)
size = size - 2
return retstring
def UnpackNum(buffer):
size = len(buffer)
mystring = ''
for i in range(size-1,-1,-1):
val = hex(ord(buffer[i]))[2:]
if (len(val) == 1):
val = '0' + val
mystring = mystring + val
if (len(mystring) > 4):
return string.atol(mystring,16)
else:
return string.atoi(mystring,16)