diff options
| author | Martin Pool <mbp@samba.org> | 2002-10-21 11:13:53 +0000 | 
|---|---|---|
| committer | Martin Pool <mbp@samba.org> | 2002-10-21 11:13:53 +0000 | 
| commit | d70d4ef34b21d86ede25f00ed1b9726c9e9444be (patch) | |
| tree | 7c218b09e6499c2a2c93e243e3a821d19f3f1a13 /source3/python/examples | |
| parent | e0d317dd16f130a4290107f9ab1dce20d417d6ad (diff) | |
| download | samba-d70d4ef34b21d86ede25f00ed1b9726c9e9444be.tar.gz samba-d70d4ef34b21d86ede25f00ed1b9726c9e9444be.tar.bz2 samba-d70d4ef34b21d86ede25f00ed1b9726c9e9444be.zip  | |
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 2dc4373727f73a46cd6135413e50917fb7fa538b)
Diffstat (limited to 'source3/python/examples')
| -rw-r--r-- | source3/python/examples/tdbpack/oldtdbutil.py | 144 | 
1 files changed, 144 insertions, 0 deletions
diff --git a/source3/python/examples/tdbpack/oldtdbutil.py b/source3/python/examples/tdbpack/oldtdbutil.py new file mode 100644 index 0000000000..ac435b8bac --- /dev/null +++ b/source3/python/examples/tdbpack/oldtdbutil.py @@ -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)  | 
