Commit 052bf00d authored by vipwzw's avatar vipwzw Committed by 33cn

fixbug merge iter bug

parent 680eb2a9
...@@ -72,6 +72,10 @@ func (u *js) GetDriverName() string { ...@@ -72,6 +72,10 @@ func (u *js) GetDriverName() string {
return driverName return driverName
} }
func (u *js) ExecutorOrder() int64 {
return drivers.ExecLocalSameTime
}
func (u *js) IsFriend(myexec, writekey []byte, othertx *types.Transaction) bool { func (u *js) IsFriend(myexec, writekey []byte, othertx *types.Transaction) bool {
if othertx == nil { if othertx == nil {
return false return false
......
...@@ -64,7 +64,6 @@ func TestCallcode(t *testing.T) { ...@@ -64,7 +64,6 @@ func TestCallcode(t *testing.T) {
dir, ldb, kvdb := util.CreateTestDB() dir, ldb, kvdb := util.CreateTestDB()
defer util.CloseTestDB(dir, ldb) defer util.CloseTestDB(dir, ldb)
e := initExec(ldb, kvdb, jscode, t) e := initExec(ldb, kvdb, jscode, t)
call, tx := callCodeTx("test", "hello", `{"hello":"world"}`) call, tx := callCodeTx("test", "hello", `{"hello":"world"}`)
receipt, err := e.Exec_Call(call, tx, 0) receipt, err := e.Exec_Call(call, tx, 0)
assert.Nil(t, err) assert.Nil(t, err)
......
...@@ -127,7 +127,7 @@ func (i *mergedIterator) next() bool { ...@@ -127,7 +127,7 @@ func (i *mergedIterator) next() bool {
return false return false
} }
if i.dir == dirSOI { if i.dir == dirSOI {
i.prevKey = key i.prevKey = cloneByte(key)
} }
i.dir = dirForward i.dir = dirForward
return true return true
......
...@@ -118,6 +118,48 @@ func TestMergeIterDup3(t *testing.T) { ...@@ -118,6 +118,48 @@ func TestMergeIterDup3(t *testing.T) {
assert.Equal(t, "db1-key-3", string(list0[2])) assert.Equal(t, "db1-key-3", string(list0[2]))
} }
func TestMergeIter3(t *testing.T) {
db1 := newGoMemDB(t)
db2 := newGoMemDB(t)
db3 := newGoMemDB(t)
db3.Set([]byte("key-1"), []byte("db3-key-1"))
db3.Set([]byte("key-2"), []byte("db3-key-2"))
db3.Set([]byte("key-3"), []byte("db3-key-3"))
//合并以后:
db := NewMergedIteratorDB([]IteratorDB{db1, db2, db3})
it0 := NewListHelper(db)
list0 := it0.List([]byte("key-"), nil, 0, 0)
for k, v := range list0 {
println(k, string(v))
}
assert.Equal(t, 3, len(list0))
assert.Equal(t, "db3-key-3", string(list0[0]))
assert.Equal(t, "db3-key-2", string(list0[1]))
assert.Equal(t, "db3-key-1", string(list0[2]))
}
func TestMergeIter1(t *testing.T) {
db1 := newGoMemDB(t)
db2 := newGoMemDB(t)
db3 := newGoMemDB(t)
db1.Set([]byte("key-1"), []byte("db1-key-1"))
db1.Set([]byte("key-2"), []byte("db1-key-2"))
db1.Set([]byte("key-3"), []byte("db1-key-3"))
//合并以后:
db := NewMergedIteratorDB([]IteratorDB{db1, db2, db3})
it0 := NewListHelper(db)
list0 := it0.List(nil, nil, 100, 0)
for k, v := range list0 {
println(k, string(v))
}
assert.Equal(t, 3, len(list0))
assert.Equal(t, "db1-key-3", string(list0[0]))
assert.Equal(t, "db1-key-2", string(list0[1]))
assert.Equal(t, "db1-key-1", string(list0[2]))
}
func TestMergeIterSearch(t *testing.T) { func TestMergeIterSearch(t *testing.T) {
db1 := newGoMemDB(t) db1 := newGoMemDB(t)
db2 := newGoMemDB(t) db2 := newGoMemDB(t)
......
...@@ -11,6 +11,8 @@ import ( ...@@ -11,6 +11,8 @@ import (
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
_ "github.com/33cn/chain33/system/dapp/coins/types" //load system plugin
) )
// DecodeLog decode log // DecodeLog decode log
......
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
package types package types
import ( import (
"encoding/json"
"testing" "testing"
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
...@@ -54,3 +56,16 @@ func TestDecodeTx(t *testing.T) { ...@@ -54,3 +56,16 @@ func TestDecodeTx(t *testing.T) {
assert.NotNil(t, data) assert.NotNil(t, data)
assert.Nil(t, err) assert.Nil(t, err)
} }
func TestDecodeTx2(t *testing.T) {
bdata, err := common.FromHex("0a05636f696e73121018010a0c108084af5f1a05310a320a3320e8b31b30b9b69483d7f9d3f04c3a22314b67453376617969715a4b6866684d66744e3776743267447639486f4d6b393431")
assert.Nil(t, err)
var r types.Transaction
err = types.Decode(bdata, &r)
assert.Nil(t, err)
data, err := DecodeTx(&r)
assert.Nil(t, err)
jsondata, err := json.Marshal(data)
assert.Nil(t, err)
assert.Equal(t, string(jsondata), `{"execer":"coins","payload":{"transfer":{"cointoken":"","amount":"200000000","note":"1\n2\n3","to":""},"ty":1},"rawPayload":"0x18010a0c108084af5f1a05310a320a33","signature":{"ty":0,"pubkey":"","signature":""},"fee":449000,"feefmt":"0.0045","expire":0,"nonce":5539796760414985017,"from":"1HT7xU2Ngenf7D4yocz2SAcnNLW7rK8d4E","to":"1KgE3vayiqZKhfhMftN7vt2gDv9HoMk941","hash":"0x6f9d543a345f6e17d8c3cc5f846c22570acf3b4b5851f48d0c2be5459d90c410"}`)
}
...@@ -535,15 +535,20 @@ func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v refle ...@@ -535,15 +535,20 @@ func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v refle
out.write("null") out.write("null")
return out.err return out.err
} }
out.write(`"`)
data := v.Interface().([]byte) data := v.Interface().([]byte)
//开启这个选项后,会把utf8的字符串转化成string,而不会弄成hex //开启这个选项后,会把utf8的字符串转化成string,而不会弄成hex
if m.EnableUTF8BytesToString && utf8.Valid(data) { if m.EnableUTF8BytesToString && utf8.Valid(data) {
out.write(string(data)) s := string(data)
b, err := json.Marshal(s)
if err != nil {
return err
}
out.write(string(b))
} else { } else {
out.write(`"`)
out.write(common.ToHex(data)) out.write(common.ToHex(data))
out.write(`"`)
} }
out.write(`"`)
return out.err return out.err
} }
......
...@@ -402,3 +402,24 @@ func TestIterateCallBack_PrefixWithExecAddr(t *testing.T) { ...@@ -402,3 +402,24 @@ func TestIterateCallBack_PrefixWithExecAddr(t *testing.T) {
assert.Equal(t, int64(3), reply.Num) assert.Equal(t, int64(3), reply.Num)
assert.Equal(t, len(key), len(reply.NextKey)) assert.Equal(t, len(key), len(reply.NextKey))
} }
func TestJsonpbUTF8Tx(t *testing.T) {
bdata, err := common.FromHex("0a05636f696e73121018010a0c108084af5f1a05310a320a3320e8b31b30b9b69483d7f9d3f04c3a22314b67453376617969715a4b6866684d66744e3776743267447639486f4d6b393431")
assert.Nil(t, err)
var r Transaction
err = Decode(bdata, &r)
assert.Nil(t, err)
plType := LoadExecutorType("coins")
var pl Message
if plType != nil {
pl, err = plType.DecodePayload(&r)
if err != nil {
pl = nil
}
}
var pljson json.RawMessage
assert.NotNil(t, pl)
pljson, err = PBToJSONUTF8(pl)
assert.Nil(t, err)
assert.Equal(t, string(pljson), `{"transfer":{"cointoken":"","amount":"200000000","note":"1\n2\n3","to":""},"ty":1}`)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment