#!/usr/bin/env ruby
######################################################
# Programme écrit par David DELAVENNAT en sept 2014 
#    <David.Delavennat@polytechnique.edu>
#
# Nécessite ruby (version > 1.9)
#
# Si nécessaire lancer auparavant la commande :
# $ gem install sequel sqlite3
#
# Pour changer le répertoire analysé, 
# il faut modifier la dernière ligne.
# Par défaut il s'agit de /usr .
#
######################################################
require 'pp'
require 'sequel'

######################################################
#
# Create a memory database
#
######################################################
DB = Sequel.sqlite

######################################################
#
# Create a stat table
#
######################################################
DB.create_table :stat do
 Integer :id
 Integer :size
 String  :path
end

######################################################
#
# trap the exceptions to not stop the recursion
#
######################################################
def file_stat(entry)
  stat = File.lstat(entry)
  case stat.ftype
  when 'file'
    DB[:stat].insert(size:stat.size, path:entry)\
    unless stat.size == 0
  when 'directory'
    recurse(entry)
  end
rescue Errno::ENOENT => e
  puts "#{e}"
rescue Errno::EACCES => e
  puts "#{e}"
end

######################################################
#
# recurse the filesystem
#
######################################################
def recurse(dir)
  Dir.foreach(dir) do |entry|
    file_stat(File.expand_path(entry, dir)) \
    unless (entry == '.' or entry == '..')
  end
end

######################################################
#
# get file size stats
#
######################################################
def get_stats(dir)
  recurse(File.expand_path(dir))

  puts DB[:stat].count

  ####################################################
  #
  # The stat Query itself!!!
  #
  ####################################################
  (1..9).each do |digit|
    query = DB[:stat].where(Sequel.like(:size, "#{digit}%"))
    pp query
    #
    # uncomment to list the files
    #
    # pp query.all
    pp query.count
  end
end

get_stats('/usr')

__END__ 
