Ruby: consulta a BD multithread

Con todo lo aprendido hasta ahora relacionado con ruby y la apertura de socket's y manejo de bases de datos, vamos a unirlo todo en un pequeño programa ejemplo, que ilustrará la simpleza de código ruby.
Partimos de la siguiente tabla de la base de datos.
mysql> show create table users;
+-------+-----------------------------------------------+
| Table | Create Table                                  |
+-------+-----------------------------------------------+
| users | CREATE TABLE `users` (                        |
|       | `id` int(5) unsigned NOT NULL AUTO_INCREMENT, |
|       | `nombre` text NOT NULL,                       |
|       | `login` varchar(15) NOT NULL,                 |
|       | `passwd` varchar(33) NOT NULL,                |
|       | `is_admin` smallint(1) DEFAULT '0',           |
|       | `email` varchar(100) DEFAULT NULL,            |
|       | PRIMARY KEY (`id`) ) ENGINE=InnoDB            |
+-------+-----------------------------------------------+
1 row in set (0.00 sec)

Con el siguiente código nos conectamos a una base de datos y dejamos un servicio multithread a la escucha, que le devuelve a los clientes el resultado de una query. Aunque es sencillo, el código es muy simple y permitiría montar fácilmente un web service multithread rápidamente.
#!/usr/bin/ruby -w

require 'socket'
require 'mysql'

dbh = Mysql.real_connect("localhost", "USER", "PASSWD", "DB")

server = TCPServer.open(4096)
loop {
   Thread.start(server.accept) do |client|
      print(client, ": Conexion inicializada...\n")
      client.puts "Conexion abierta"
      begin
         client.puts "  Server version: " + dbh.get_server_info
         query = dbh.query("SELECT login, email FROM users")
         query.each_hash do |row|
            tmp="\t"+row["login"]+"\t"+row["email"]+"\n"
            client.write(tmp)
         end
         client.puts "  Number of rows returned: #{query.num_rows}"
         rescue Mysql::Error => e
            puts "Error code: #{e.errno}"
            puts "Error message: #{e.error}"
         ensure
      end
      sleep 3
      client.puts "Cerrando conexion"
      print(client, ": Cerrando conexion... ")
      client.close
      print("done!\n")
   end
}
dbh.close if dbh

Y como ejemplo de funcionamiento,
shell> ruby client.rb
Conexion abierta
  Server version: 5.5.13-55-log
     admin     javier@mydomain.com
     javier    jt@mydomain.com
  Number of rows returned: 2
Cerrando conexion


No hay comentarios :

Publicar un comentario

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios