Depois de algumas semanas de férias volto a postar aqui no blog e começarei por um fato que aconteceu justamente nesse período de ausência.
Por volta do dia 15 de agosto aconteceu algo que eu chamei de “A implosão do Alagoas24horas” – um bug previsto meses atrás pelo meu amigo Iran Rodrigues, programador web.
Lembro que chegamos a calcular a semana exata em que o Alagoas24horas entraria em colapso. Acertamos.
No dia 15 as chamadas apareciam na página inicial, no entanto, ao clicá-las os usuários se deparavam com uma mensagem de erro, similar a esta da figura abaixo:

Por que isso aconteceu e como Iran conseguiu prever com tanto tempo de antecedência?
Deixemos que ele mesmo responda:
“Cada registro na tabela das notícias possui um campo numérico que o identifica unicamente, o seu ID, ou código. Cada notícia cadastrada recebe como ID um novo número, um incremento em relação à notícia anterior. Logo, a primeira notícia tem ID 1, a segunda, 2, e assim por diante. Para que a notícia seja recuperada do banco de dados para ser visualizada, é feita uma busca no banco utilizando o ID dessa notícia, que está presente no link que aponta para a mesma, ex.: http://www.noticias.com.br/?noticia=33402.
Nesse exemplo, a notícia a ser buscada é a de ID 33402. O “noticia=33402″ indica que “noticia” pode ser acessada como uma variável, contendo o valor “33402″. O problema é que esse valor, apesar de conter apenas números, não é considerado numérico, e sim como um texto, ou string. Deve ser feita então, a conversão do “33402″ (texto) para o 33402 (número). O VBScript, assim como tantas outras linguagens de programação, possui um “tipo” (na verdade um subtipo) para representar valores inteiros. O “Int” do VBScript tem uma limitação em relação à maioria das outras linguagens: seu tipo Int suporta valores na faixa de -32768 até 32767 (outras linguagens suportam valores entre -2147483648 e 2147483647 para o tipo correspondente). É aqui onde o problema ocorre. Não é possível representar um valor maior que 32767 com o tipo Int do VBScript.
Qualquer tentativa de conversão resultará em erro. Desta forma, o sistema fica limitado a possuir 32767 notícias. A solução para isso é mais simples do que se possa imaginar. Se o tipo Int não comporta inteiros longos, basta usar o um outro tipo para representar números extensos:
Long – Suporta inteiros entre -2147483648 e 2147483647.
Single – Suporta números de ponto flutuante com precisão simples entre -3,402823×10^38 e -1,401298×10^-45 para valores negativos e entre 1,401298×10^-45 e 3,402823×10^38 para valores positivos.
Double – Suporta números de ponto flutuante com precisão dupla entre -1,79769313486232×10^308 e -4,94065645841247×10^-324 para valores negativos e entre 4,94065645841247×10^-324 e 1,79769313486232×10^308 para valores positivos.
Currency – Apropriado para trabalhar com valores monetários. Suporta valores entre -922337203685477,5808 e 922337203685477,5807.
Ou seja, utilizando um outro tipo ao invés do Int, na pior das hipóteses (em caso de se usar o Long) seria possível exibir até dois bilhões, cento e quarenta e sete milhões, quatrocentos e oitenta e três mil, seiscentos e quarenta e sete notícias. Para esse caso, basta trocr a função que converte em Int – cInt() – pela que converte em Long – cLng().”
Ao que parece, os programadores do Alagoas24horas não previram este bug, contudo, foram eficazes em consertá-lo rapidamente, mas não antes de eu dar meu “print screen”.


