@@ -198,11 +198,52 @@ pub fn delete_by_col_eq(table_id: TableId, col_id: u8, value: &impl Serialize) -
198198 } )
199199}
200200
201- /// A table iterator which yields values of the `TableType` corresponding to the table.
202- type TableTypeTableIter < T > = RawTableIter < TableTypeBufferDeserialize < T > > ;
201+ /*
202+ pub fn delete_pk(table_id: u32, primary_key: &PrimaryKey) -> Result<()> {
203+ with_row_buf(|bytes| {
204+ primary_key.encode(bytes);
205+ sys::delete_pk(table_id, bytes)
206+ })
207+ }
208+
209+ pub fn delete_filter<F: Fn(&ProductValue) -> bool>(table_id: u32, f: F) -> Result<usize> {
210+ with_row_buf(|bytes| {
211+ let mut count = 0;
212+ for tuple_value in pv_table_iter(table_id, None)? {
213+ if f(&tuple_value) {
214+ count += 1;
215+ bytes.clear();
216+ tuple_value.encode(bytes);
217+ sys::delete_value(table_id, bytes)?;
218+ }
219+ }
220+ Ok(count)
221+ })
222+ }
223+
224+ pub fn delete_range(table_id: u32, col_id: u8, range: Range<AlgebraicValue>) -> Result<u32> {
225+ with_row_buf(|bytes| {
226+ range.start.encode(bytes);
227+ let mid = bytes.len();
228+ range.end.encode(bytes);
229+ let (range_start, range_end) = bytes.split_at(mid);
230+ sys::delete_range(table_id, col_id.into(), range_start, range_end)
231+ })
232+ }
233+ */
203234
204- // Get the iterator for this table with an optional filter,
205- fn table_iter < T : TableType > ( table_id : TableId , filter : Option < spacetimedb_lib:: filter:: Expr > ) -> Result < TableIter < T > > {
235+ //
236+ // fn page_table(table_id : u32, pager_token : u32, read_entries : u32) {
237+ //
238+ // }
239+
240+ // Get the buffer iterator for this table,
241+ // with an optional filter,
242+ // and return it and its decoded `ProductType` schema.
243+ fn buffer_table_iter (
244+ table_id : u32 ,
245+ filter : Option < spacetimedb_lib:: filter:: Expr > ,
246+ ) -> Result < ( BufferIter , ProductType ) > {
206247 // Decode the filter, if any.
207248 let filter = filter
208249 . as_ref ( )
@@ -211,8 +252,35 @@ fn table_iter<T: TableType>(table_id: TableId, filter: Option<spacetimedb_lib::f
211252 . expect ( "Couldn't decode the filter query" ) ;
212253
213254 // Create the iterator.
214- let iter = sys:: iter ( table_id, filter. as_deref ( ) ) ?;
255+ let mut iter = sys:: iter ( table_id, filter. as_deref ( ) ) ?;
256+
257+ // First item is an encoded schema.
258+ let schema_raw = iter
259+ . next ( )
260+ . expect ( "Missing schema" )
261+ . expect ( "Failed to get schema" )
262+ . read ( ) ;
263+ let schema = decode_schema ( & mut & schema_raw[ ..] ) . expect ( "Could not decode schema" ) ;
264+
265+ Ok ( ( iter, schema) )
266+ }
267+
268+ /// A table iterator which yields `ProductValue`s.
269+ // type ProductValueTableIter = RawTableIter<ProductValue, ProductValueBufferDeserialize>;
270+
271+ // fn pv_table_iter(table_id: u32, filter: Option<spacetimedb_lib::filter::Expr>) -> Result<ProductValueTableIter> {
272+ // let (iter, schema) = buffer_table_iter(table_id, filter)?;
273+ // let deserializer = ProductValueBufferDeserialize::new(schema);
274+ // Ok(RawTableIter::new(iter, deserializer))
275+ // }
276+
277+ /// A table iterator which yields values of the `TableType` corresponding to the table.
278+ type TableTypeTableIter < T > = RawTableIter < TableTypeBufferDeserialize < T > > ;
215279
280+ fn table_iter < T : TableType > ( table_id : u32 , filter : Option < spacetimedb_lib:: filter:: Expr > ) -> Result < TableIter < T > > {
281+ // The TableType deserializer doesn't need the schema, as we have type-directed
282+ // dispatch to deserialize any given `TableType`.
283+ let ( iter, _schema) = buffer_table_iter ( table_id, filter) ?;
216284 let deserializer = TableTypeBufferDeserialize :: new ( ) ;
217285 Ok ( RawTableIter :: new ( iter, deserializer) . into ( ) )
218286}
0 commit comments