Esempio n. 1
0
func mutationUnserialize(reader typedio.Reader) (mut *mutation, err os.Error) {
	mut = &mutation{}

	mut.typ, err = reader.ReadUint16() // type
	if err != nil {
		return mut, err
	}

	switch mut.typ {

	case mut_create_vs:
	case mut_commit_vs:
	case mut_rollback_vs:
		mut.vs, err = reader.ReadUint32() // viewstate
		if err != nil {
			return mut, err
		}

	case mut_obj_op:
		opid, err := reader.ReadUint16() // operation id
		if err != nil {
			return mut, err
		}
		mut.op = id2operation(opid).(mutationOperation)

		var bytes []byte
		var bytecount uint32

		bytecount, err = reader.ReadUint32() // operation size
		if err != nil {
			return mut, err
		}

		bytes = make([]byte, int(bytecount))
		_, err = reader.Read(bytes) // operation
		if err != nil {
			return mut, err
		}

		err = proto.Unmarshal(bytes, mut.op)
		if err != nil {
			return mut, err
		}

		bytes = make([]byte, 1)
		_, err = reader.Read(bytes) // flags
		if err != nil {
			return mut, err
		}
		mut.flags = bytes[0]

		mut.lastPos, err = reader.ReadUint64() // object last position
		if err != nil {
			return mut, err
		}

	default:
		return nil, os.NewError(fmt.Sprintf("Unknown mutation type to unserialize: %d", mut.typ))
	}

	return mut, err
}