Primeiros, a definição: POG: Postgres Oriented Gambis!
Brincadeiras a parte, vamos lá: eu tenho certeza que você já quis colocar uma array no banco
(por exemplo, todos os telefones de uma pessoa) sem ter que criar outra tabela para criar a relação.
Agora que você esta ciente dos riscos, da quantidade de POG [dessa vez programação orientada a gambi mesmo] que você irá fazer, continuaremos.
Adicionar um novo campo com os telefones seria fácil demais:
create table blabla ( id_blabla bigiserial, telefones text[] );
Porém, você só poderia ter os telefones assim:
{
'1234-2222', 123342123, 23212
}
Mas aí surgem necessidades como, separar o DDD, saber se é FAX, se tem ramal, etc…
Então, na mais pura maldade pensei:
“pow, seria muito legal ter um HASH ai nesse campo…”
Como a preguiça também é grande, não quis criar um TYPE do postgres, pois seria dispersão de tempo,
afinal este campo não precisa de search, é so um lugar pra jogar esta informação antes dela ser mais refinada.
Aí pensei, “Hmm, uma array de array resolveria o problema, ‘bora fazê’”:
Deixe assim:
create table blabla ( id_blabla bigiserial, telefones text[][] );
Pronto, agora você pode fazer isto:
{
{tel,'1234-2222'},
{tel,123342123},
{tel,23212}
}
Assim, você salva chave, valor, chave, valor….
Em perl, é bem simples transformar um HASH em Array [tem várias formas também]:
A que eu utilizei foi esta:
# Array de HASH
my $array_de_hash = [{tel => 123, ddd => 11}, ... ];
# array que vc vai colocar enviar ao banco
my @as_array;
foreach my $i (@$array_de_hash ) {
if (ref $i eq 'HASH') {
my @sub_array;
foreach my $k (keys %$i){
push(@sub_array, $k, $i->{$k});
}
push(@as_array, @sub_array);
}else{
push(@as_array, $i);
}
}
$array_de_hash = $database->quote( @as_array );
Este é um exemplo muito básico, e não tem recursividade, mas funciona para casos simples.
Falta o código perl pra montar o $array_de_hash novamente, mas acho que é só você fazer um foreach seguido de %hash = @valores;
{
{matchkey,6868465D6A6E5660,telephone,11111111,extension,"",
other,"",status,000000000000001,ddd,11}
}
Cheers