Utilizando SQL no Google Fusion Tables

Um dos princípios do caos quando se pensa em trabalhar com banco de dados é a possibilidade de utilizar URL + SQL para retornar resultados (basicamente… SQL Injection). Bem, o Google teve a ousadia ignorar o que diz respeito a este principio, deixando de lado arquiteturas de gente grande, (como o Open Data Protocol) criando a API do Fusion Tables baseada em GET/POST de queries.

Para inicio de conversa, vamos ao método de autenticação, existem três formas de autenticação, sendo a mais simples baseada em POST “email+senha+serviço” resultando em um token (infelizmente não é a mais segura).

Exemplo (método de autenticação com o google em C#):

static string GetToken(string email, string password)
{
  string token;
  //
  var user = HttpUtility.UrlEncode(email);
  var pass = HttpUtility.UrlEncode(password);
  //
  var url = "https://www.google.com/accounts/ClientLogin";
  //
  var reqClient = (HttpWebRequest)WebRequest.Create(url);
  reqClient.Method = "POST";
  reqClient.ContentType = "application/x-www-form-urlencoded";
  //
  var sb = new StringBuilder();
  sb.Append("accountType=GOOGLE");
  sb.Append(string.Format("&Email={0}", user));
  sb.Append(string.Format("&Passwd={0}", pass));
  sb.Append("&service=fusiontables");
  sb.Append("&source=fusiontables.ApiExample");
  sb.Append("&logintoken=");
  sb.Append("&logincaptcha=");
  //
  var data = Encoding.ASCII.GetBytes(sb.ToString());
  reqClient.ContentLength = data.Length;
  //
  using (var post = reqClient.GetRequestStream())
    post.Write(data, 0, data.Length);
  //
  using (var res = (HttpWebResponse)reqClient.GetResponse())
  using (var stIn = new StreamReader(res.GetResponseStream()))
  {
    var s = stIn.ReadToEnd();
    //
    var parts = s.Split('=');
    token = parts[3];
  }
  //
  return token;
}

Para retornar consultas SQL, será necessário utilizar o token da autenticação no cabeçalho de uma chamada web semelhante a:

http://tables.googlelabs.com/api/query?sql=SELECT…

Mas não se preocupe, o SQL Injection que vimos acima é possível realizar em POST.

Exemplo (método para executar SQL no google fusion tables em C#):

static string Execute(string email, string password, string query)
{
  string result;
  //
  var sql = string.Format("sql={0}", HttpUtility.UrlEncode(query));
  //
  var url_fusion_tables = @"http://tables.googlelabs.com/api/query";
  //
  var reqClient = (HttpWebRequest)WebRequest.Create(url_fusion_tables);
  reqClient.Method = "POST";
  reqClient.ContentType = "application/x-www-form-urlencoded";
  //
  var token = string.Format("Authorization: GoogleLogin auth={0}"
  , GetToken(email, password));
  //
  reqClient.Headers.Add(token);
  //
  var data = Encoding.ASCII.GetBytes(sql);
  reqClient.ContentLength = data.Length;
  //
  using (var post = reqClient.GetRequestStream())
    post.Write(data, 0, data.Length);
  //
  using (var res = (HttpWebResponse)reqClient.GetResponse())
  using (var stIn = new StreamReader(res.GetResponseStream()))
    result = stIn.ReadToEnd();
  //
  return result;
}

Métodos criados, vamos à execução.

Exemplo:

static void Main() {
  var email = "mail@@gmail.com";
  var password = "XXX";
  //
  var query = "SELECT ROWID, LastName, FirstName FROM 20108 LIMIT 10";
  //
  Console.Write(Execute(email, password, query));
  Console.ReadKey();
}

E por fim o resultado da query em formato CSV:

clip_image002

O nome da tabela pode ser conseguido a partir da url quando navegamos por uma tabela no Google Fusion Tables, como no exemplo abaixo 20108.

clip_image004

Espero que tenham gostado, mas antes de utilizar o Google Fusion Tables em qualquer projeto não esqueça conhecer um pouco mais sobre suas limitações.

Maiores informações:
http://code.google.com/intl/pt-BR/apis/fusiontables/

Artigo Relacionado:
https://sqlfromhell.wordpress.com/2009/06/14/google-fusion-tables/

Google Fusion Tables?

A novidade da semana é Google Fusion Tables! Legal não tem query e são 250 MB de dados de graça, mas ainda é muito cedo para falar bem dele… Ele é um serviço versão Pré-Alfa, tem a mesma integração de outros serviços como o Google Maps, tem também muitos bugs e funcionalidades ainda parcialmente desenvolvidas ou ainda não implantadas. Na verdade, tirando os problemas que já são esperados de um serviço Pré-Alfa, só eu queria usar SQL ou LINQ para fazer consultas nele…rsss

Para demonstrar os bugs e algumas funcionalidades dele, vou criar uma massa de dados. Acho que 18798 linhas são o suficiente:

2009-06-14_1

A massa de dados no Excel ficou perfeita:

2009-06-14_2

Mas vamos ver como ela fica no GFT, primeiro passo, importando a massa de dados:

2009-06-14_3

Segundo passo, o que o GFT fez com meus dados???

2009-06-14_4

Mais uma chance, agora com um arquivo Excel, parecia que não iria importar nunca…

2009-06-14_5

E os dados ficaram corretos! Agora somente nomear as colunas e prosseguir:

2009-06-14_6

Salvando a tabela e os comentários:

2009-06-14_7

Por fim, tudo ocorreu bem.

2009-06-14_8

Agora vamos às opções, legal não tem count nas agregações… e pelo que ele esta aggregando??? AddressLine1??? Só por que tem número no início é um valor mensurável???rsss

2009-06-14_9

Esta bem, será uma ótima ferramenta, principalmente pelas opções de gráficos e colaboração. Quando lançarem a versão final vou querer “brincar de novo”, mas por enquanto fico com outro Fussion Tables (at: http://www.fusiontables.com/en/index.php/Products/ ) por causa da mesa de snooker em baixo.