A web NO seu banco de dados

A web NO seu banco de dados

(Tradução de The web IN your database

Recentemente, ouvi falar muito sobre o novo serviço do Yahoo, o "Yahoo Pipes". Para aqueles que ainda não viram, ele basicamente permite fazer o mash-up de feeds rss para criar o seu próprio feed personalizado para reuso e exibição. Não é exatamente revolucionário, mas facilita a entrada de um um número de pessoas. Em qualquer caso, noite passada, lendo o log buffer e David Van Couvering, eu li a entrada interessante de Alex Iskold no tópico comparado a idéia do Yahoo Pipes com a idéia de Bancos Relacionais. Uma boa leitura, é claro, mas parece-me que talvez se você quer "a web como um banco de dados" talvez você deva colocar "a web no seu banco de dados". Assumindo que seu banco de dados lhe forneça algum tipo de capacidade de acesso a dados remotos não deve ser difícil; se seu banco de dados permite que você o faça em PHP, é bem "simples".

pagila=# create type blog as (blog text, entry text, pubdate timestamptz, link text);
CREATE TYPE
pagila=# create or replace function getblog(text)
pagila-# returns setof blog
pagila-# language plphp
pagila-# as $$
pagila$# $blog = simplexml_load_file($args[0]);
pagila$#
pagila$# $r[0] = (string)$blog->channel[0]->title;
pagila$#
pagila$# foreach($blog->channel[0]->item as $entry) {
pagila$# $r[1] = (string)$entry->title;
pagila$# $r[2] = (string)$entry->pubDate;
pagila$# $r[3] = str_replace('http://people.planetpostgresql.org/','~',(string)$entry->link);
pagila$# return_next($r);
pagila$# }
pagila$# $$;
CREATE FUNCTION

Sim, esse código faz isso. Agora eu posso passar meu feed favorido e obter um resultset sql padrão.

pagila=# select entry,link from
pagila-# getblog('http://people.planetpostgresql.org/xzilla/index.php?/feeds/rss2.xml');
entry | link
-----------------------------------------------------+-----------------------------------------------------------------------------------------
Web team updates | ~xzilla/index.php?/archives/289-Web-team-updates.html
getting killed by dbx | ~xzilla/index.php?/archives/288-getting-killed-by-dbx.html
killing invincible processes with dbx | ~xzilla/index.php?/archives/287-killing-invincible-processes-with-dbx.html
phpPgAdmin 4.1 Released | ~xzilla/index.php?/archives/286-phpPgAdmin-4.1-Released.html
planetpostgresql blogger feed urls fixed | ~xzilla/index.php?/archives/285-planetpostgresql-blogger-feed-urls-fixed.html
Log Buffer #27, A Carnival of the Vanities for DBAs | ~xzilla/index.php?/archives/284-Log-Buffer-27,-A-Carnival-of-the-Vanities-for-DBAs.html
Go Gators! | ~xzilla/index.php?/archives/283-Go-Gators!.html
2006 Year In Review | ~xzilla/index.php?/archives/282-2006-Year-In-Review.html
sizing up your partitions | ~xzilla/index.php?/archives/281-sizing-up-your-partitions.html
sql servers charindex function in postgresql | ~xzilla/index.php?/archives/279-sql-servers-charindex-function-in-postgresql.html
PostgreSQL full text search testing PART II | ~xzilla/index.php?/archives/280-PostgreSQL-full-text-search-testing-PART-II.html
PostgreSQL full text search testing | ~xzilla/index.php?/archives/278-PostgreSQL-full-text-search-testing.html
PostgreSQL bios page updated | ~xzilla/index.php?/archives/277-PostgreSQL-bios-page-updated.html
PostgreSQL 8.2 RC1 Released, are you testing? | ~xzilla/index.php?/archives/276-PostgreSQL-8.2-RC1-Released,-are-you-testing.html
Why usability matters | ~xzilla/index.php?/archives/275-Why-usability-matters.html
(15 rows)

O melhor de tudo é que eu posso fazer isso transparentemente...

pagila=# create or replace view omniti as
pagila-# select * from getblog('http://www.schlossnagle.org/~george/blog/index.php?/feeds/index.rss2')
pagila-# union select * from getblog('http://feeds.feedburner.com/shiflett')
pagila-# union select * from getblog('http://www.lethargy.org/~jesus/feeds/index.rss2')
pagila-# union select * from getblog('http://netevil.org/feeds/rss.xml')
pagila-# union select * from getblog('http://people.planetpostgresql.org/xzilla/index.php?/feeds/rss2.xml')
pagila-# ;
CREATE VIEW

Nesse ponto, podemos olhar em todos os nossos blogs apenas como qualquer outro tipo de dado em nosso banco de dados, e podemos fazer todos os tipos de coisas (quase) interessantes, como trazer uma lista dos posts recentes

pagila=# select blog, entry, pubdate from omniti where
pagila-# pubdate > date_trunc('month',current_date)
pagila-# order by pubdate desc;
blog | entry | pubdate
-----------------+------------------------------------------------------------+------------------------
Evil, as in Dr. | Jyte.com: digg crossed with social networking | 2007-02-15 17:40:03-05
Evil, as in Dr. | AOL switches on OpenID provider | 2007-02-15 17:29:51-05
Evil, as in Dr. | OpenID (and TypeKey) using native OpenSSL functions in PHP | 2007-02-15 17:23:48-05
zillablog | Web team updates | 2007-02-08 21:18:08-05
Esoteric Curio | Debugging a memory-exhausting mod_perl app | 2007-02-03 21:12:07-05
(5 rows)

ou talvez, plotar a atividade relativa de cada um de nós nos nossos blogs

pagila=# select blog,to_char(date_trunc('month',pubdate),'mon YY'), count(*) from omniti
pagila-# where pubdate > date_trunc('month',current_date) - '2 months'::interval
pagila-# group by blog, date_trunc('month',pubdate)
pagila-# order by date_trunc('month',pubdate) desc,3 desc;
blog | to_char | count
-----------------+---------+-------
Evil, as in Dr. | feb 07 | 3
Esoteric Curio | feb 07 | 1
zillablog | feb 07 | 1
zillablog | jan 07 | 7
Chris Shiflett | jan 07 | 4
Esoteric Curio | jan 07 | 2
Evil, as in Dr. | jan 07 | 2
George's Blog | jan 07 | 1
zillablog | dec 06 | 5
Chris Shiflett | dec 06 | 5
Esoteric Curio | dec 06 | 3
Evil, as in Dr. | dec 06 | 2
(12 rows)

Então, é isso. Essa pode não ser a aplicação mais prática dessa funcionalidade, mas poder pegar qualquer informação na internet e tê-la como um objeto padrão no seu banco de dados com certeza será útil em alguma situação.

# % if c.boo_box: DVD Transformers 2 - A Vingança dos Derrotados- Duplo Transformers Derrotista Transformers Transformers DVD Transformers Armada - Base