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/

Anúncios

Um pensamento sobre “Utilizando SQL no Google Fusion Tables

  1. Pingback: Google Docs – Pivot Table « SQL From Hell.com

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s