O uso do db_queryAndFillArray() em requisições Ajax e RESTFul

Em YeAPF a forma mais simples de responder a uma requisição em que o resultado vem de apenas uma consulta SQL (simples ou combinada) é a seguinte:

function qTeste($a) {
  global $u, $xq_start;
  $useColNames = true;
  $xq_count=999;
  $ret='';

  // publish query variables as local variables
  extract(xq_extractValuesFromQuery());
  $xq_start=isset($xq_start)?intval($xq_start):0;

  switch($a) {
    case "puxarEstruturaDiretoria":
      $ret="select c.id, c.cargo, c.descricao,
                   o.cpf, o.nome
            from cargos c, ocupacao o
            where o.cargo=c.id
            order by cargo, nome";
      break;
      }
  }

  xq_produceReturnLines($ret, $useColNames, $xq_count);
}

Todavia, tem vezes em que precisamos (ou queremos) devolver uma estrutura hierárquica. É o caso quando temos uma tabela diretriz seguida de seus filhos e queremos trazer isso tudo de uma vez.

É obvio que isso não é recomendável para tabelas grandes, mas para pequenas (digamos até 200 registros na tabela filha) pode ser mais simples puxar tudo de uma vez.

É aqui que usar db_queryAndFillArray() pode ser de grande utilidade.

function qTeste($a) {
 global $u, $xq_start;
 $useColNames = true;
 $xq_count=999;
 $ret='';

 // publish query variables as local variables
 extract(xq_extractValuesFromQuery());
 $xq_start=isset($xq_start)?intval($xq_start):0;

 switch($a) {
   case "puxarEstruturaDiretoria":
     $sql="select cargo, descricao, id
           from cargos 
           where nivel<=2
           order by cargo";
     $listaCargos=db_queryAndFillArray($sql, 'cargo', false);
     // agora usamos a tabela de cargos para gerar -manualmente- o retorno 
     $ret=array();
     foreach($listaCargos as $cargo=>$infoC) {
       $idCargo = $infoC['id'];
       $ret[$cargo]=db_queryAndFillArray("select nome, cpf from ocupacao where cargo='$idCargo'", 'cpf');
     }
 
     break;
 }

  xq_produceReturnLines($ret, $useColNames, $xq_count);
}

Nem se fala que a primeira solução é mais simples de expressar e implementar. Também não é mais complicada na hora de receber os dados.

Todavia, em favor da segunda devemos dizer que às vezes o volume de informação que viaja na primeira, é maior que na segunda opção, já que cada linha inclui vários dados repetidos em vários registros que são hierarquicamente do mesmo nível.

Seja lá como for, você pode produzir resultados de forma diferente usando o db_queryAndFillArray()

Ele recebe tres parámetros: o sql, um string com os campos chaves (não do banco mas do vetor de retorno) e a possibilidade ou não de contar os registros que compõem o resultado (especialmente útil em funções de agregação)