hungrynoodle 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +11 -0
- data/hungrynoodle.rb +111 -0
- metadata +99 -0
data/README.rdoc
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
This class provides a simple mechanism to find and cache a list
|
|
2
|
+
of files on your system (much like slocate). It expects only 3 parameters:
|
|
3
|
+
* db_name - The name of the sqlite database to create/use
|
|
4
|
+
* logfile - The name of the logfile to use
|
|
5
|
+
* dir - The directory to be searched/cached
|
|
6
|
+
* regex - The regular expression detailing the files to be cached
|
|
7
|
+
The class uses sqlite3 by default for storage of its information and logs
|
|
8
|
+
debug information to hungrynoodle.txt
|
|
9
|
+
Author:: Philip Mcmahon (mailto:philip@packetnode.com)
|
|
10
|
+
Copyright:: Copyright (c) 2011 Packetnode, LLC
|
|
11
|
+
License:: Distributes under the same terms as Ruby
|
data/hungrynoodle.rb
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'find'
|
|
3
|
+
require 'sqlite3'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require 'logger'
|
|
6
|
+
|
|
7
|
+
# This class provides a simple mechanism to find and cache a list
|
|
8
|
+
# of files on your system (much like slocate). It expects only 3 parameters:
|
|
9
|
+
# * db_name - The name of the sqlite database to create/use
|
|
10
|
+
# * logfile - The name of the logfile to use
|
|
11
|
+
# * dir - The directory to be searched/cached
|
|
12
|
+
# * regex - The regular expression detailing the files to be cached
|
|
13
|
+
# The class uses sqlite3 by default for storage of its information and logs
|
|
14
|
+
# debug information to hungrynoodle.txt
|
|
15
|
+
# Author:: Philip Mcmahon (mailto:philip@packetnode.com)
|
|
16
|
+
# Copyright:: Copyright (c) 2011 Packetnode, LLC
|
|
17
|
+
# License:: Distributes under the same terms as Ruby
|
|
18
|
+
|
|
19
|
+
class HungryNoodle
|
|
20
|
+
include ObjectSpace
|
|
21
|
+
|
|
22
|
+
# Initialize.
|
|
23
|
+
# * db_name - The name of the sqlite database to create/use
|
|
24
|
+
# * logfile - The name of the logfile to use
|
|
25
|
+
# * dir - The directory to be searched/cached
|
|
26
|
+
# * regex - The regular expression detailing the files to be cached
|
|
27
|
+
def initialize(dir = ".",
|
|
28
|
+
regex = "\.*$",
|
|
29
|
+
db_name = "/tmp/hungrynoodle.db",
|
|
30
|
+
logfile = "/tmp/hungrynoodle.txt"
|
|
31
|
+
)
|
|
32
|
+
@dirs = []
|
|
33
|
+
@log = Logger.new(logfile)
|
|
34
|
+
@db = SQLite3::Database.open(db_name)
|
|
35
|
+
@db.execute("create table if not exists files(
|
|
36
|
+
id integer primary key autoincrement,
|
|
37
|
+
basename varchar,
|
|
38
|
+
atime datetime,
|
|
39
|
+
expand_path varchar,
|
|
40
|
+
ctime datetime,
|
|
41
|
+
dirname varchar,
|
|
42
|
+
extname varchar,
|
|
43
|
+
mtime datetime,
|
|
44
|
+
size integer)")
|
|
45
|
+
@dirs << dir
|
|
46
|
+
@regex = Regexp.compile(regex)
|
|
47
|
+
define_finalizer(self, proc { @db.close; @log.close })
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Insert a file into the sqlite cache. Files are tested for their
|
|
51
|
+
# existence in the cache first via the exists? method
|
|
52
|
+
def insert(file)
|
|
53
|
+
if exists?(file)
|
|
54
|
+
@log.debug "#{file} already exists in cache"
|
|
55
|
+
else
|
|
56
|
+
@log.debug "Inserting #{file} into cache"
|
|
57
|
+
@db.execute("insert into files (basename,
|
|
58
|
+
atime,
|
|
59
|
+
expand_path,
|
|
60
|
+
ctime,
|
|
61
|
+
dirname,
|
|
62
|
+
extname,
|
|
63
|
+
mtime,
|
|
64
|
+
size) values
|
|
65
|
+
('#{File.basename(file).sub("'", "''")}',
|
|
66
|
+
'#{File.atime(file)}',
|
|
67
|
+
'#{File.expand_path(file).sub("'", "''")}',
|
|
68
|
+
'#{File.ctime(file)}',
|
|
69
|
+
'#{File.dirname(file).sub("'", "''")}',
|
|
70
|
+
'#{File.extname(file)}',
|
|
71
|
+
'#{File.mtime(file)}',
|
|
72
|
+
'#{File.size(file)}')")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Does this file exists in the cache ? This method performs a lookup
|
|
77
|
+
# based on filename and size. If a matching file is found, the contents
|
|
78
|
+
# are compared to check if the files are identical.
|
|
79
|
+
def exists?(file)
|
|
80
|
+
@log.debug("Processing file: #{file}")
|
|
81
|
+
@records = @db.execute("select * from files where basename =
|
|
82
|
+
'#{File.basename(file).sub("'", "''")}' and size = '#{File.size(file)}'")
|
|
83
|
+
@records.each do |record|
|
|
84
|
+
return true if FileUtils.compare_file(file, record[3])
|
|
85
|
+
end
|
|
86
|
+
false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Find all files in the configured (see hungrynoodle.xml) directory
|
|
90
|
+
# and regex. All matching files are inserted into the cache unless
|
|
91
|
+
# they already exist.
|
|
92
|
+
def find_and_insert
|
|
93
|
+
excludes = []
|
|
94
|
+
for dir in @dirs
|
|
95
|
+
Find.find(dir) do |path|
|
|
96
|
+
if FileTest.directory?(path)
|
|
97
|
+
if excludes.include?(File.basename(path))
|
|
98
|
+
Find.prune
|
|
99
|
+
else
|
|
100
|
+
next
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
if path =~ @regex
|
|
104
|
+
insert(path)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
metadata
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: hungrynoodle
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 29
|
|
5
|
+
prerelease: false
|
|
6
|
+
segments:
|
|
7
|
+
- 0
|
|
8
|
+
- 0
|
|
9
|
+
- 1
|
|
10
|
+
version: 0.0.1
|
|
11
|
+
platform: ruby
|
|
12
|
+
authors:
|
|
13
|
+
- Philip Mcmahon
|
|
14
|
+
autorequire:
|
|
15
|
+
bindir: bin
|
|
16
|
+
cert_chain: []
|
|
17
|
+
|
|
18
|
+
date: 2011-01-21 00:00:00 -07:00
|
|
19
|
+
default_executable:
|
|
20
|
+
dependencies:
|
|
21
|
+
- !ruby/object:Gem::Dependency
|
|
22
|
+
name: sqlite3
|
|
23
|
+
prerelease: false
|
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
hash: 29
|
|
30
|
+
segments:
|
|
31
|
+
- 1
|
|
32
|
+
- 3
|
|
33
|
+
- 3
|
|
34
|
+
version: 1.3.3
|
|
35
|
+
type: :runtime
|
|
36
|
+
version_requirements: *id001
|
|
37
|
+
- !ruby/object:Gem::Dependency
|
|
38
|
+
name: sqlite3-ruby
|
|
39
|
+
prerelease: false
|
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ">="
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
hash: 29
|
|
46
|
+
segments:
|
|
47
|
+
- 1
|
|
48
|
+
- 3
|
|
49
|
+
- 3
|
|
50
|
+
version: 1.3.3
|
|
51
|
+
type: :runtime
|
|
52
|
+
version_requirements: *id002
|
|
53
|
+
description:
|
|
54
|
+
email: philip@packetnode.com
|
|
55
|
+
executables: []
|
|
56
|
+
|
|
57
|
+
extensions: []
|
|
58
|
+
|
|
59
|
+
extra_rdoc_files: []
|
|
60
|
+
|
|
61
|
+
files:
|
|
62
|
+
- hungrynoodle.rb
|
|
63
|
+
- README.rdoc
|
|
64
|
+
has_rdoc: true
|
|
65
|
+
homepage: http://github.com/snaggled/hungrynoodle
|
|
66
|
+
licenses: []
|
|
67
|
+
|
|
68
|
+
post_install_message:
|
|
69
|
+
rdoc_options: []
|
|
70
|
+
|
|
71
|
+
require_paths:
|
|
72
|
+
- .
|
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
74
|
+
none: false
|
|
75
|
+
requirements:
|
|
76
|
+
- - ">="
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
hash: 3
|
|
79
|
+
segments:
|
|
80
|
+
- 0
|
|
81
|
+
version: "0"
|
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
|
+
none: false
|
|
84
|
+
requirements:
|
|
85
|
+
- - ">="
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
hash: 3
|
|
88
|
+
segments:
|
|
89
|
+
- 0
|
|
90
|
+
version: "0"
|
|
91
|
+
requirements: []
|
|
92
|
+
|
|
93
|
+
rubyforge_project:
|
|
94
|
+
rubygems_version: 1.3.7
|
|
95
|
+
signing_key:
|
|
96
|
+
specification_version: 3
|
|
97
|
+
summary: Library that provides a simple mechanism to find and cache a list of files on your system (much like slocate).
|
|
98
|
+
test_files: []
|
|
99
|
+
|