stackoverflow 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/stackoverflow.rb +59 -24
  2. metadata +3 -3
@@ -97,17 +97,17 @@ module StackOverflow
97
97
  sub_sql << "id=#{question_id}"
98
98
  end
99
99
  sql += sub_sql.join(' OR ')
100
- sql += ' ORDER BY score DESC'
100
+ sql += ' ORDER BY score DESC LIMIT 0,25'
101
101
 
102
102
  questions = []
103
103
  db_error_catching do
104
104
  @db.execute(sql) do |row|
105
- questions << { :id => row[0],
106
- :score => row[1],
107
- :body => row[2],
108
- :title => row[3],
109
- :link => '',
110
- :answers => get_answers(row[0]) }
105
+ questions << { 'id' => row[0],
106
+ 'score' => row[1],
107
+ 'body' => row[2],
108
+ 'title' => row[3],
109
+ 'link' => '',
110
+ 'answers' => get_answers(row[0]) }
111
111
  end
112
112
  end
113
113
  questions
@@ -136,9 +136,9 @@ module StackOverflow
136
136
  answers = []
137
137
  db_error_catching do
138
138
  @db.execute(sql) do |row|
139
- answers << { :id => row[0],
140
- :score => row[1],
141
- :body => row[2] }
139
+ answers << { 'id' => row[0],
140
+ 'score' => row[1],
141
+ 'body' => row[2] }
142
142
  end
143
143
  end
144
144
  answers
@@ -178,32 +178,68 @@ module StackOverflow
178
178
  end
179
179
  end
180
180
 
181
+ def can_resume?(remote_db_version)
182
+ can_resume = false
183
+ last_download_db_version_flagpath = File.join(@dir_path, ".last_download_db_version")
184
+ if file_exists?(last_download_db_version_flagpath)
185
+ File.open(last_download_db_version_flagpath, 'r') do |f|
186
+ can_resume = true if remote_db_version == f.read().to_i
187
+ end
188
+ end
189
+ File.open(last_download_db_version_flagpath, 'w+') { |f| f.write(remote_db_version.to_s) }
190
+ can_resume
191
+ end
192
+
181
193
  def update
182
194
  check_local_dir
183
195
  remote_db_version = get_remote_db_version
184
196
  db_version = get_db_version
197
+ can_resume = can_resume?(remote_db_version)
185
198
  if db_version < remote_db_version
186
199
  puts "Database update found!"
187
200
  puts "Updating from version #{db_version} to version #{remote_db_version} (several GB to download - this can take a while)..."
188
- download_all
201
+ download_all(can_resume)
189
202
  set_db_version(remote_db_version)
190
203
  end
191
204
  puts "The database is up to date (version #{get_db_version})."
192
205
  end
193
206
 
194
- def download_all
195
- download_file "stackoverflow_idx.db.gz"
196
- gunzip_file "stackoverflow_idx.db.gz"
197
- download_file "stackoverflow.db.gz"
198
- gunzip_file "stackoverflow.db.gz"
207
+ def wget_available?
208
+ available = false
209
+ ENV['PATH'].split(':').each {|folder| available = true if File.exists?(folder+'/wget')}
210
+ available
211
+ end
212
+
213
+ def download_all(can_resume)
214
+ files_names = ["stackoverflow_idx.db.gz", "stackoverflow.db.gz"]
215
+
216
+ for file_name in files_names
217
+ file_path = File.join(@dir_path, file_name)
218
+ File.delete(file_path) if file_exists?(file_path) and not can_resume
219
+
220
+ puts "Downloading #{file_path}..."
221
+ if wget_available?
222
+ wget file_name
223
+ else
224
+ puts "Warning: 'wget' utility unavailable. Install it to be able to resume failed downloads."
225
+ internal_download file_name
226
+ end
227
+
228
+ puts "Unpacking #{file_path}..."
229
+ gunzip_file file_name
230
+ end
231
+ end
232
+
233
+ def wget(file_name)
234
+ download_url = "http://#{@remote_hostname}" + File.join(@remote_path, file_name)
235
+ `wget -P #{@dir_path} -c #{download_url}`
199
236
  end
200
237
 
201
- def download_file(filename)
202
- puts "Downloading #{filename}..."
238
+ def internal_download(file_name)
203
239
  Net::HTTP.start(@remote_hostname) do |http|
204
- f = open(File.join(@dir_path, filename), "wb")
240
+ f = open(File.join(@dir_path, file_name), "wb")
205
241
  begin
206
- http.request_get(File.join(@remote_path, filename)) do |resp|
242
+ http.request_get(File.join(@remote_path, file_name)) do |resp|
207
243
  resp.read_body do |segment|
208
244
  f.write(segment)
209
245
  end
@@ -214,9 +250,8 @@ module StackOverflow
214
250
  end
215
251
  end
216
252
 
217
- def gunzip_file(filename)
218
- puts "Unpacking #{filename}..."
219
- gz_file_path = File.join(@dir_path, filename)
253
+ def gunzip_file(file_name)
254
+ gz_file_path = File.join(@dir_path, file_name)
220
255
  z = Zlib::Inflate.new(16+Zlib::MAX_WBITS)
221
256
 
222
257
  File.open(gz_file_path) do |f|
@@ -254,7 +289,7 @@ module StackOverflow
254
289
  else
255
290
  score = 0
256
291
  end
257
- t << ["[#{nb}]", "(#{score})", question['title']]
292
+ t << ["[#{nb}]", "(#{score})", question['title'][0..60]]
258
293
  nb += 1
259
294
  end
260
295
  t.style = {:padding_left => 2, :border_x => " ", :border_i => " ", :border_y => " "}
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 3
9
- version: 0.1.3
8
+ - 4
9
+ version: 0.1.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Xavier Antoviaque
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-03-24 00:00:00 -04:00
17
+ date: 2012-03-26 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency