func (acmd *AdminCommand) parseUsers(receiveSize int) (int, []*UserRoles, error) { acmd.dataOffset = 0 list := make([]*UserRoles, 0, 100) for acmd.dataOffset < receiveSize { resultCode := int(acmd.dataBuffer[acmd.dataOffset+1]) if resultCode != 0 { if resultCode == _QUERY_END { return -1, nil, nil } return resultCode, nil, nil } userRoles := &UserRoles{} fieldCount := int(acmd.dataBuffer[acmd.dataOffset+3]) acmd.dataOffset += _HEADER_REMAINING for i := 0; i < fieldCount; i++ { len := int(Buffer.BytesToInt32(acmd.dataBuffer, acmd.dataOffset)) acmd.dataOffset += 4 id := acmd.dataBuffer[acmd.dataOffset] acmd.dataOffset++ len-- if id == _USER { userRoles.User = string(acmd.dataBuffer[acmd.dataOffset : acmd.dataOffset+len]) acmd.dataOffset += len } else if id == _ROLES { acmd.parseRoles(userRoles) } else { acmd.dataOffset += len } } if userRoles.User == "" && userRoles.Roles == nil { continue } if userRoles.Roles == nil { userRoles.Roles = make([]string, 0) } list = append(list, userRoles) } return 0, list, nil }
func (upckr *unpacker) unpackObject(isMapKey bool) (interface{}, error) { theType := upckr.buffer[upckr.offset] & 0xff upckr.offset++ switch theType { case 0xc0: return nil, nil case 0xc3: return true, nil case 0xc2: return false, nil case 0xca: val := Buffer.BytesToFloat32(upckr.buffer, upckr.offset) upckr.offset += 4 return val, nil case 0xcb: val := Buffer.BytesToFloat64(upckr.buffer, upckr.offset) upckr.offset += 8 return val, nil case 0xcc: r := upckr.buffer[upckr.offset] & 0xff upckr.offset++ return int(r), nil case 0xcd: val := uint16(Buffer.BytesToInt16(upckr.buffer, upckr.offset)) upckr.offset += 2 return int(val), nil case 0xce: val := uint32(Buffer.BytesToInt32(upckr.buffer, upckr.offset)) upckr.offset += 4 if Buffer.Arch64Bits { return int(val), nil } return int64(val), nil case 0xcf: val := Buffer.BytesToInt64(upckr.buffer, upckr.offset) upckr.offset += 8 return uint64(val), nil case 0xd0: r := int8(upckr.buffer[upckr.offset]) upckr.offset++ return int(r), nil case 0xd1: val := Buffer.BytesToInt16(upckr.buffer, upckr.offset) upckr.offset += 2 return int(val), nil case 0xd2: val := Buffer.BytesToInt32(upckr.buffer, upckr.offset) upckr.offset += 4 return int(val), nil case 0xd3: val := Buffer.BytesToInt64(upckr.buffer, upckr.offset) upckr.offset += 8 if Buffer.Arch64Bits { return int(val), nil } return int64(val), nil case 0xc4, 0xd9: count := int(upckr.offset & 0xff) upckr.offset++ return upckr.unpackBlob(count, isMapKey) case 0xc5, 0xda: count := int(Buffer.BytesToUint16(upckr.buffer, upckr.offset)) upckr.offset += 2 return upckr.unpackBlob(count, isMapKey) case 0xc6, 0xdb: count := int(Buffer.BytesToUint32(upckr.buffer, upckr.offset)) upckr.offset += 4 return upckr.unpackBlob(count, isMapKey) case 0xdc: count := int(Buffer.BytesToUint16(upckr.buffer, upckr.offset)) upckr.offset += 2 return upckr.unpackList(count) case 0xdd: count := int(Buffer.BytesToUint32(upckr.buffer, upckr.offset)) upckr.offset += 4 return upckr.unpackList(count) case 0xde: count := int(Buffer.BytesToUint16(upckr.buffer, upckr.offset)) upckr.offset += 2 return upckr.unpackMap(count) case 0xdf: count := int(Buffer.BytesToUint32(upckr.buffer, upckr.offset)) upckr.offset += 4 return upckr.unpackMap(count) case 0xd4: // Skip over type extension with 1 byte upckr.offset += 1 + 1 return nil, skipHeaderErr case 0xd5: // Skip over type extension with 2 bytes upckr.offset += 1 + 2 return nil, skipHeaderErr case 0xd6: // Skip over type extension with 4 bytes upckr.offset += 1 + 4 return nil, skipHeaderErr case 0xd7: // Skip over type extension with 8 bytes upckr.offset += 1 + 8 return nil, skipHeaderErr case 0xd8: // Skip over type extension with 16 bytes upckr.offset += 1 + 16 return nil, skipHeaderErr case 0xc7: // Skip over type extension with 8 bit header and bytes count := int(upckr.buffer[upckr.offset] & 0xff) upckr.offset += count + 1 + 1 return nil, skipHeaderErr case 0xc8: // Skip over type extension with 16 bit header and bytes count := int(Buffer.BytesToInt16(upckr.buffer, upckr.offset)) upckr.offset += count + 1 + 2 return nil, skipHeaderErr case 0xc9: // Skip over type extension with 32 bit header and bytes count := int(Buffer.BytesToInt32(upckr.buffer, upckr.offset)) upckr.offset += count + 1 + 4 return nil, skipHeaderErr default: if (theType & 0xe0) == 0xa0 { return upckr.unpackBlob(int(theType&0x1f), isMapKey) } if (theType & 0xf0) == 0x80 { return upckr.unpackMap(int(theType & 0x0f)) } if (theType & 0xf0) == 0x90 { count := int(theType & 0x0f) return upckr.unpackList(count) } if theType < 0x80 { return int(theType), nil } if theType >= 0xe0 { return int(int(theType) - 0xe0 - 32), nil } } return nil, NewAerospikeError(SERIALIZE_ERROR) }