Skip to main content

Module array

Module array 

Source
Expand description

Colunas ARRAY do SQL (op_get_slice / op_put_slice / op_slice).

Um ARRAY do Firebird é armazenado como um blob especial: numa linha a coluna chega como um id de 8 bytes (Value::Array), igual a um blob. Para ler ou escrever os elementos é preciso descrever a fatia com a SDL (Slice Description Language) — um pequeno bytecode que diz o tipo do elemento, a relação/campo e os limites de cada dimensão.

§Fluxo

  1. Connection::array_desc consulta RDB$RELATION_FIELDS/RDB$FIELDS/ RDB$FIELD_DIMENSIONS e monta um ArrayDesc (tipo BLR do elemento, tamanho, escala, dimensões).
  2. Connection::read_array envia op_get_slice (id + SDL) e decodifica a resposta op_slice num Vec<Value> (um por elemento, em ordem).
  3. Connection::write_array envia op_put_slice (SDL + dados) e devolve o id do novo array, que então vai como Value::Array num INSERT/UPDATE.

§Codificação na transmissão (wire)

A op_slice traz p_slr_length (tamanho da fatia na representação do cliente = nº de elementos × stride) seguido do comprimento XDR e dos dados. Cada elemento é serializado por xdr_datum: tipos de largura fixa vão como inteiros XDR (4 ou 8 bytes); VARYING vai como comprimento(4 B) + bytes + padding até 4; TEXT como bytes + padding até 4. O nº de elementos é p_slr_length / stride — derivamos o stride do ArrayDesc, pois o comprimento XDR reportado é o tamanho lógico, não a contagem de bytes na rede.

Structs§

ArrayDesc
Descreve uma coluna ARRAY: o tipo do elemento e as dimensões. Obtido por Connection::array_desc; consumido por Connection::read_array / Connection::write_array para montar a SDL.
Dimension
Os limites (inferior, superior) de uma dimensão de array, ambos inclusivos.