diff --git a/aerospike-core/src/commands/buffer.rs b/aerospike-core/src/commands/buffer.rs index 5f99cd6..40d1d2f 100644 --- a/aerospike-core/src/commands/buffer.rs +++ b/aerospike-core/src/commands/buffer.rs @@ -1750,13 +1750,19 @@ impl Buffer { } pub(crate) fn write_geo(&mut self, value: &str) -> usize { + // Bin values require flags+ncells prefix self.write_u8(0); - self.write_u8(0); - self.write_u8(0); + self.write_i16(0); self.write_bytes(value.as_bytes()); 3 + value.len() } + pub(crate) fn write_geo_string(&mut self, value: &str) -> usize { + // Query filters use raw GeoJSON string + self.write_bytes(value.as_bytes()); + value.len() + } + pub(crate) fn write_timeout(&mut self, val: Option) { if let Some(val) = val { let millis: i32 = (val.as_secs() * 1_000) as i32 + val.subsec_millis() as i32; @@ -1767,6 +1773,5 @@ impl Buffer { #[allow(dead_code)] pub(crate) fn dump_buffer(&self) { rhexdump!(&self.data_buffer); - println!(""); } } diff --git a/aerospike-core/src/net/connection.rs b/aerospike-core/src/net/connection.rs index 8810b99..1bbfaf3 100644 --- a/aerospike-core/src/net/connection.rs +++ b/aerospike-core/src/net/connection.rs @@ -141,12 +141,12 @@ impl Connection { } pub async fn flush(&mut self) -> Result<()> { + let send_buf = &self.buffer.data_buffer; match self.conn { - Netsocket::Tcp(ref mut conn) => conn.write_all(&self.buffer.data_buffer).await?, + Netsocket::Tcp(ref mut conn) => conn.write_all(send_buf).await?, #[cfg(feature = "tls")] - Netsocket::Tls(ref mut conn) => conn.write_all(&self.buffer.data_buffer).await?, - }; - + Netsocket::Tls(ref mut conn) => conn.write_all(send_buf).await?, + } self.refresh(); Ok(()) } diff --git a/aerospike-core/src/query/filter.rs b/aerospike-core/src/query/filter.rs index 0a424dc..e7d3177 100644 --- a/aerospike-core/src/query/filter.rs +++ b/aerospike-core/src/query/filter.rs @@ -69,9 +69,15 @@ impl Filter { #[doc(hidden)] pub fn estimate_size(&self) -> usize { - // bin name size(1) + particle type size(1) - // + begin particle size(4) + end particle size(4) = 10 - self.bin_name.len() + self.begin.estimate_size() + self.end.estimate_size() + 10 + let begin_size = match &self.begin { + Value::GeoJSON(ref s) => s.len(), + _ => self.begin.estimate_size(), + }; + let end_size = match &self.end { + Value::GeoJSON(ref s) => s.len(), + _ => self.end.estimate_size(), + }; + self.bin_name.len() + begin_size + end_size + 10 } #[doc(hidden)] @@ -80,11 +86,27 @@ impl Filter { buffer.write_str(&self.bin_name); buffer.write_u8(self.value_particle_type.clone() as u8); - buffer.write_u32(self.begin.estimate_size() as u32); - self.begin.write_to(buffer); + let begin_size = match &self.begin { + Value::GeoJSON(ref s) => s.len(), + _ => self.begin.estimate_size(), + }; + buffer.write_u32(begin_size as u32); + if let Value::GeoJSON(ref geo_str) = &self.begin { + buffer.write_geo_string(geo_str); + } else { + self.begin.write_to(buffer); + } - buffer.write_u32(self.end.estimate_size() as u32); - self.end.write_to(buffer); + let end_size = match &self.end { + Value::GeoJSON(ref s) => s.len(), + _ => self.end.estimate_size(), + }; + buffer.write_u32(end_size as u32); + if let Value::GeoJSON(ref geo_str) = &self.end { + buffer.write_geo_string(geo_str); + } else { + self.end.write_to(buffer); + } } } diff --git a/aerospike-core/src/value.rs b/aerospike-core/src/value.rs index a6cb873..4491ded 100644 --- a/aerospike-core/src/value.rs +++ b/aerospike-core/src/value.rs @@ -292,7 +292,7 @@ impl Value { Value::Bool(_) => 1, Value::List(_) | Value::HashMap(_) => encoder::pack_value(&mut None, self), Value::OrderedMap(_) => panic!("The library never passes ordered maps to the server."), - Value::GeoJSON(ref s) => 1 + 2 + s.len(), // flags + ncells + jsonstr + Value::GeoJSON(ref s) => 1 + 2 + s.len(), // flags + ncells + string Value::HLL(ref h) => h.len(), Value::Infinity => 0, Value::Wildcard => 0,