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