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:
parent
e0d317dd16
commit
d70d4ef34b
144
source3/python/examples/tdbpack/oldtdbutil.py
Normal file
144
source3/python/examples/tdbpack/oldtdbutil.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user