I was inserting strings of length 2 which was why it worked for me. 
Yours were larger.  It turns out that you can't cross the end boundary
when using modify.  So if you are inserting a string of length 10, you
can't insert it into a string of length 9.  Also, if you are inserting
it into a string of length 12, you can only insert at 0 or 1!

Using this, I wrote a safe modify function that handles this boundary
case.  Let me know if it works for you:


import Mk4py
import random

s = Mk4py.storage()
v = s.getas("v[b:B]")
p = Mk4py.property("B", "b")
v.append()
#
# view.modify(byteprop, rownum, string, offset, diff)
#  Store (partial) byte property contents. A non-zero value of diff
removes (<0) or inserts (>0) bytes.

def modify(v, property, rownum, string, offset, diff):
    # safe modify
    val = getattr(v[rownum], property.name)
    l = len(val)
    ls = len(string)
    if  l > ls and offset < l-ls:
        return v.modify(property, rownum, string, offset, diff)
        
    while string:
        chunksize = max(l-offset, 1)
        s1, string = string[:chunksize], string[chunksize:]
        v.modify(property, rownum, s1, offset, len(s1))
        offset += chunksize
        
pystring = v[0].b = "test"

for i in range(2000):
   # Create a random range string
   x = random.randrange(10)
   randstring = str(x)*x

   # insert it at a random position in the text
   pos = max(1, random.randrange(len(v[0].b)) - len(randstring) + 2)
   #v.modify(p, 0, randstring, pos, len(randstring))
   modify(v, p, 0, randstring, pos, len(randstring))
   # Keep a matching python string
   pystring = pystring[:pos] + randstring + pystring[pos:]

   if pystring != v[0].b:
       print v[0].b
       print pystring
       print len(randstring)
       raise "ERROR: string mismatch"
_____________________________________________
Metakit mailing list  -  [EMAIL PROTECTED]
http://www.equi4.com/mailman/listinfo/metakit

Reply via email to