#!/usr/bin/ruby -w

#=============================================================
# discos.rb - cliente a la DB discos.db (SQLite3)
# 
#=============================================================
# FJA - neocipres@gmail.com 	Septiembre de 2008 (12/12/10)
#=============================================================

require 'rubygems'
require 'sqlite3'

# BUGS -> warning: global variable `$swig_runtime_data_type_pointer2' not initialized si dejamos -w
$swig_runtime_data_type_pointer2 = nil

$db = '/home/paco/prgdgnu/ruby/discos/discos.db' 

def listar(campo)
 if !campo
	sql = 'SELECT * FROM t1'
 else
  	sql = "SELECT autor,ndisco,tipo,ae,codigo FROM t1 ORDER BY #{campo}"
 end
 db = SQLite3::Database.new($db)
 regs = db.execute(sql)
 db.close()
 return regs
end

def buscar(campo, texto)
 if campo == 'temas'
  	sql =	"SELECT autor,ndisco,tipo,ae,codigo,tca1,tca2,ob FROM t1 where tca1 like '%"+texto+"%' OR tca2 like '%"+texto+"%' ORDER BY autor, ndisco"
 else
  	sql = "SELECT autor,ndisco,tipo,ae,codigo,tca1,tca2,ob FROM t1 where "+campo+" like '%"+texto+"%' ORDER BY autor, ndisco"   
 end
 db = SQLite3::Database.new($db)
 regs = db.execute(sql)
 db.close()
 return regs
end

def contar(campo)
 sql = "SELECT #{campo}, COUNT(*) FROM t1 GROUP BY #{campo}"
 db = SQLite3::Database.new($db)
 regs = db.execute(sql)
 db.close()
 return regs
end

def eliminar(codigo)
 sql = "DELETE FROM t1 WHERE codigo='#{codigo}'"
 db = SQLite3::Database.new($db)
 regs = db.execute(sql)
 db.close()
 return regs
end

def listarc()
 sql = "SELECT codigo, autor, ndisco FROM t1 GROUP BY codigo"
 db = SQLite3::Database.new($db)
 regs = db.execute(sql)
 db.close()
 return regs
end

def listarb(campo,texto)
 if campo == 'temas'
  	sql = "SELECT autor,ndisco,tipo,ae,codigo FROM t1 where tca1 like '%"+texto+"%' OR tca2 like '%"+texto+"%' ORDER BY autor, ndisco"
 else
  	sql = "SELECT autor,ndisco,tipo,ae,codigo FROM t1 where "+campo+" like '%"+texto+"%' ORDER BY autor, ndisco"   
 end
 db = SQLite3::Database.new($db)
 regs = db.execute(sql)
 db.close()
 return regs
end

begin
 opcion, campo, valor = ARGV
 raise if ARGV.size == 0 || opcion == '-h'
 case opcion
	when '-l'
		salida = listar(campo)
		puts "\n\t "
		salida.each { |reg| puts "\t #{reg.join(' ')}" }
		puts "\n\t Registros listados: #{salida.size} \n\n"
	when '-b'
		campo = 'codigo' if !campo
		if valor
			valor = valor.upcase 
		else
			valor = ' '
		end
		salida = buscar(campo, valor) 
 		puts "\n"
		salida.each  { |reg| print "\n\t#{reg.join("\n\t")} ", "\n\t", "-"*79 } 
		puts "\n\t Registros listados: #{salida.size} \n\n"
	when '-c'
		campo = 'autor' if !campo
		salida = contar(campo)
		puts "\n\t "
		salida.each { |reg| puts "\t #{reg.reverse.join("\t")}" }
		puts "\n\t Registros listados: #{salida.size} \n\n"
	when '-d'
		cod = campo.upcase
		salida = buscar('codigo', cod)
		print "\n\t", "="*79
		puts "\n\t#{salida.join("\n\t")} "
		print "\t",  "="*79
		print "\n\n\t", "Desea eliminar el registro? (s/n) "
		tecla = STDIN.gets
		if tecla[0].chr.upcase == 'S'
			salida = eliminar(cod)
			puts "\n\tRegistro borrado \n\n" if salida 
		else
			exit
		end
	when '-lc'
		codigos = []
		salida = listarc()
		salida.each { |reg| codigos << reg[0][2..-1]}
		puts "\n\t "
		salida.each { |reg| puts "\t #{reg.join(' ')}" }
		puts "\n\t Registros listados: #{salida.size} \n"
		puts "\n\t Último valor de código: #{codigos.max} \n\n"
	when '-lb'
		campo = 'codigo' if !campo
		if valor
			valor = valor.upcase 
		else
			valor = ' '
		end
		salida = listarb(campo, valor) 
 		puts "\n"
 		salida.each { |reg| puts "\t #{reg.join(' ')}" }
		puts "\n\t Registros listados: #{salida.size} \n\n"	
	else
		puts "\n\t No es válida la opción \n\n"
 end

rescue
 if ARGV.size == 0 || opcion == '-h'
 	print "\n\t", "="*80
  	print "\n\t Uso: discos <opcion> [campo] [valor]  \n"
	print "\t",  "-"*80, "\n "
	print "\t Campos: autor, ndisco, tipo, gro, ae, codigo, temas, ob \n "
	print "\t",  "-"*80, "\n "
	print "\t Opciones: \n "
	print "\n\t\t -l -> lista todos los registros \n "
	print "\n\t\t -lb campo texto -> lista los registros que coincidan con campo y texto \n "
	print "\n\t\t -lc -> devuelve el último código introducido\n "
	print "\n\t\t -l campo -> lista todos los registros ordenados por campo \n "
	print "\n\t\t -b campo texto -> busca los registros en campo con el texto \n "
	print "\n\t\t -c campo -> contar los registros según el campo \n "
	print "\n\t\t -d codigo -> elimina el registro según código \n "
	print "\t", "="*80, "\n\n"
 else
  print "\n\t Error-> #{$!} \n\n"
 end

rescue SQLite3::SQLException
 print "\n\t Error-> #{$!} \n\n"

end