content_data 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,441 @@
1
+ require 'time'
2
+
3
+ module BBFS
4
+ module ContentData
5
+
6
+ class Content
7
+ attr_reader :checksum, :size, :first_appearance_time
8
+
9
+ def initialize(checksum, size, first_appearance_time, content_serializer = nil)
10
+ if content_serializer != nil
11
+ if (content_serializer.checksum == nil)
12
+ raise ArgumentError.new("checksum have to be defined")
13
+ else
14
+ @checksum = content_serializer.checksum
15
+ end
16
+ if (content_serializer.size == nil)
17
+ raise ArgumentError.new("size have to be defined")
18
+ else
19
+ @size = content_serializer.size
20
+ end
21
+ if (content_serializer.first_appearance_time == nil)
22
+ raise ArgumentError.new("first_appearance_time have to be defined")
23
+ else
24
+ @first_appearance_time = ContentData.parse_time(content_serializer.first_appearance_time)
25
+ end
26
+
27
+ else
28
+ @checksum = checksum
29
+ @size = size
30
+ @first_appearance_time = first_appearance_time
31
+ end
32
+ end
33
+
34
+
35
+
36
+ def to_s
37
+ "%s,%d,%s" % [@checksum, @size, ContentData.format_time(@first_appearance_time)]
38
+ end
39
+
40
+ def ==(other)
41
+ return (self.checksum.eql? other.checksum and
42
+ self.size.eql? other.size and
43
+ self.first_appearance_time.to_i.eql? other.first_appearance_time.to_i)
44
+ end
45
+
46
+ # Support for protocol buffers
47
+ #def serialize
48
+ # serializer = ContentMessage.new
49
+ # serializer.checksum = checksum
50
+ # serializer.size = size
51
+ # serializer.first_appearance_time = ContentData.format_time(first_appearance_time)
52
+ #
53
+ # serializer
54
+ #end
55
+ end
56
+
57
+ class ContentInstance
58
+ attr_reader :checksum, :size, :server_name, :device, :full_path, :modification_time
59
+
60
+ def initialize(checksum, size, server_name, device, full_path, modification_time, content_instance_serializer = nil)
61
+ if content_instance_serializer != nil
62
+ if (content_instance_serializer.checksum == nil)
63
+ raise ArgumentError.new("checksum have to be defined")
64
+ else
65
+ @checksum = content_instance_serializer.checksum
66
+ end
67
+ if (content_instance_serializer.size == nil)
68
+ raise ArgumentError.new("size have to be defined")
69
+ else
70
+ @size = content_instance_serializer.size
71
+ end
72
+ if (content_instance_serializer.modification_time == nil)
73
+ raise ArgumentError.new("modification_time have to be defined")
74
+ else
75
+ @modification_time = ContentData.parse_time(content_instance_serializer.modification_time)
76
+ end
77
+ if (content_instance_serializer.server_name == nil)
78
+ raise ArgumentError.new("server_name have to be defined")
79
+ else
80
+ @server_name = content_instance_serializer.server_name
81
+ end
82
+ if (content_instance_serializer.device == nil)
83
+ raise ArgumentError.new("device have to be defined")
84
+ else
85
+ @device = content_instance_serializer.device
86
+ end
87
+ if (content_instance_serializer.full_path == nil)
88
+ raise ArgumentError.new("full_path have to be defined")
89
+ else
90
+ @full_path = content_instance_serializer.full_path
91
+ end
92
+ else
93
+ @checksum = checksum
94
+ @size = size
95
+ @server_name = server_name
96
+ @device = device
97
+ @full_path = full_path
98
+ @modification_time = modification_time
99
+ end
100
+ end
101
+
102
+ def global_path
103
+ "%s:%s:%s" % [@server_name, @device, @full_path]
104
+ end
105
+
106
+ def to_s
107
+ "%s,%d,%s,%s,%s,%s" % [@checksum, @size, @server_name,
108
+ @device, @full_path, ContentData.format_time(@modification_time)]
109
+ end
110
+
111
+ def ==(other)
112
+ return (self.checksum.eql? other.checksum and
113
+ self.size.eql? other.size and
114
+ self.server_name.eql? other.server_name and
115
+ self.device.eql? other.device and
116
+ self.full_path.eql? other.full_path and
117
+ self.modification_time.to_i.eql? other.modification_time.to_i)
118
+ end
119
+
120
+ # Support for protocol buffers
121
+ # #def serialize
122
+ # serializer = ContentInstanceMessage.new
123
+ # serializer.checksum = checksum
124
+ # serializer.size = size
125
+ # serializer.modification_time = ContentData.format_time(modification_time)
126
+ # serializer.server_name = server_name
127
+ # serializer.device = device.to_s
128
+ # serializer.full_path = full_path
129
+ #
130
+ # serializer
131
+ #end
132
+
133
+ #@checksum
134
+ #@size
135
+ #@server_name
136
+ #@device
137
+ #@full_path
138
+ #@modification_time
139
+ end
140
+
141
+ class ContentData
142
+ attr_reader :contents, :instances
143
+
144
+ # @param content_data_serializer_str [String]
145
+ def initialize(content_data_serializer = nil)
146
+ @contents = Hash.new # key is a checksum , value is a refernce to the Content object
147
+ @instances = Hash.new # key is an instance global path , value is a reference to the ContentInstance object
148
+ if (content_data_serializer != nil)
149
+ content_data_serializer.contents.each do |entry|
150
+ key = entry.key
151
+ value = entry.value
152
+ content_serializer = value.content
153
+ raise ArgumentError.new("content have to be defined") if content_serializer.nil?
154
+ content = Content.new(nil, nil, nil, content_serializer)
155
+ @contents[key] = content
156
+ end
157
+ content_data_serializer.instances.each do |entry|
158
+ key = entry.key
159
+ value = entry.value
160
+ content_instance_serializer = value.instance
161
+ raise ArgumentError.new("instance have to be defined") if content_instance_serializer.nil?
162
+ content_instance = ContentInstance.new(nil, nil, nil, nil, nil, nil, content_instance_serializer)
163
+ @instances[key] = content_instance
164
+ end
165
+ end
166
+ end
167
+
168
+ # Support for protocol buffers
169
+ #def serialize (serializer = nil)
170
+ # serializer = ContentDataMessage.new if (serializer == nil)
171
+ # contents.each do |key, value|
172
+ # hash_value = ContentDataMessage::HashEntry::HashValue.new
173
+ # content_serializer = value.serialize
174
+ # #content_serializer = ContentMessage.new
175
+ # #content_serializer.parse_from_string(content_serializer_str)
176
+ # hash_value.content = content_serializer
177
+ # hash_entry = ContentDataMessage::HashEntry.new
178
+ # hash_entry.key = key
179
+ # hash_entry.value = hash_value
180
+ # serializer.contents << hash_entry
181
+ # end
182
+ # instances.each do |key, value|
183
+ # hash_value = ContentDataMessage::HashEntry::HashValue.new
184
+ # instance_serializer = value.serialize
185
+ # #instance_serializer = ContentInstanceMessage.new
186
+ # #instance_serializer.parse_from_string(instance_serializer_str)
187
+ # hash_value.instance = instance_serializer
188
+ # hash_entry = ContentDataMessage::HashEntry.new
189
+ # hash_entry.key = key
190
+ # hash_entry.value = hash_value
191
+ # serializer.instances << hash_entry
192
+ # end
193
+ # serializer
194
+ #end
195
+
196
+ def add_content(content)
197
+ @contents[content.checksum] = content
198
+ end
199
+
200
+ def add_instance(instance)
201
+ if (not @contents.key?(instance.checksum))
202
+ printf("Warning: Adding instance while it's" +
203
+ " checksum %s does not exists.\n", instance.checksum)
204
+ printf("%s\n", instance.to_s)
205
+ return false
206
+ elsif (@contents[instance.checksum].size != instance.size)
207
+ print("Warning: File size different from content size while same checksum.\n")
208
+ printf("%s\n", instance.to_s)
209
+ return false
210
+ end
211
+
212
+ key = instance.global_path
213
+
214
+ #override file if needed
215
+ @instances[key] = instance
216
+ end
217
+
218
+ def empty?
219
+ @contents.empty?
220
+ end
221
+
222
+ def content_exists(checksum)
223
+ @contents.key? checksum
224
+ end
225
+
226
+ def merge(content_data)
227
+ content_data.contents.values.each { |content|
228
+ add_content(content)
229
+ }
230
+ content_data.instances.values.each { |instance|
231
+ add_instance(instance)
232
+ }
233
+ end
234
+
235
+ def ==(other)
236
+
237
+ #print "size:%s\n" % @contents.size
238
+ #print "other size:%s\n" % other.contents.size
239
+ return false if other == nil
240
+ return false unless @contents.size == other.contents.size
241
+ return false unless @instances.size == other.instances.size
242
+
243
+ @contents.keys.each { |key|
244
+ if (@contents[key] != other.contents[key])
245
+ #print "%s-" % @contents[key].to_s
246
+ #print other.contents[key].to_s
247
+ #puts " compare - false"
248
+ puts @contents[key].first_appearance_time.to_i
249
+ puts other.contents[key].first_appearance_time.to_i
250
+ return false
251
+ end
252
+ }
253
+
254
+ @instances.keys.each { |key|
255
+ if (@instances[key] != other.instances[key])
256
+ #print "%s-" % @instances[key].to_s
257
+ #print other.instances[key].to_s
258
+ #puts " compare - false"
259
+ return false
260
+ end
261
+ }
262
+ #puts "compare - true"
263
+ return true
264
+ end
265
+
266
+ def to_s
267
+ ret = ""
268
+ ret << @contents.length.to_s << "\n"
269
+ @contents.each_value { |content|
270
+ ret << content.to_s << "\n"
271
+ }
272
+ ret << @instances.length.to_s << "\n"
273
+ @instances.each_value { |instance|
274
+ ret << instance.to_s << "\n"
275
+ }
276
+ return ret
277
+ end
278
+
279
+ def to_file(filename)
280
+ File.open(filename, 'w') {|f| f.write(to_s) }
281
+ end
282
+
283
+ def from_file(filename)
284
+ lines = IO.readlines(filename)
285
+ i = 0
286
+ number_of_contents = lines[i].to_i
287
+ i += 1
288
+ number_of_contents.times {
289
+ parameters = lines[i].split(",")
290
+ add_content(Content.new(parameters[0],
291
+ parameters[1].to_i,
292
+ ContentData.parse_time(parameters[2])))
293
+ i += 1
294
+ }
295
+
296
+ number_of_instances = lines[i].to_i
297
+ i += 1
298
+ number_of_instances.times {
299
+ parameters = lines[i].split(",")
300
+ # bugfix: if file name consist a comma then parsing based on comma separating fails
301
+ if (parameters.size > 6)
302
+ (5..parameters.size-2).each do |i|
303
+ parameters[4] = [parameters[4], parameters[i]].join(",")
304
+ end
305
+ (5..parameters.size-2).each do |i|
306
+ parameters.delete_at(5)
307
+ end
308
+ end
309
+
310
+ add_instance(ContentInstance.new(parameters[0],
311
+ parameters[1].to_i,
312
+ parameters[2],
313
+ parameters[3],
314
+ parameters[4],
315
+ ContentData.parse_time(parameters[5])))
316
+ i += 1
317
+ }
318
+ end
319
+
320
+ def self.parse_time(time_str)
321
+ return Nil unless time_str.instance_of?String
322
+ time = Time.strptime( time_str, '%Y/%m/%d %H:%M:%S.%L' )
323
+ # another option to parse a time
324
+ #require 'scanf.rb'
325
+ #time_arr = time_str.scanf("%d/%d/%d %d:%d:%d.%d")
326
+ #time = Time.utc(time_arr[0], time_arr[1],time_arr[2],time_arr[3],time_arr[4],time_arr[5],time_arr[6])
327
+ end
328
+
329
+ def self.format_time(time)
330
+ return Nil unless time.instance_of?Time
331
+ #puts time.class
332
+ str = time.strftime( '%Y/%m/%d %H:%M:%S.%L' )
333
+ #puts str
334
+ return str
335
+ end
336
+
337
+ # merges content data a and content data b to a new content data and returns it.
338
+ def self.merge(a, b)
339
+ return b unless not a.nil?
340
+ return a unless not b.nil?
341
+
342
+ return Nil unless a.instance_of?ContentData
343
+ return Nil unless b.instance_of?ContentData
344
+
345
+ ret = ContentData.new
346
+ ret.merge(a)
347
+ ret.merge(b)
348
+
349
+ return ret
350
+ end
351
+
352
+ # removed content data a from content data b and returns the new content data.
353
+ def self.remove(a, b)
354
+ return Nil unless a.instance_of?ContentData
355
+ return Nil unless b.instance_of?ContentData
356
+
357
+ ret = ContentData.new
358
+
359
+ b.contents.values.each { |content|
360
+ #print "%s - %s\n" % [content.checksum, a.content_exists(content.checksum).to_s]
361
+ ret.add_content(content) unless a.content_exists(content.checksum)
362
+ }
363
+
364
+ #puts "kaka"
365
+
366
+ b.instances.values.each { |instance|
367
+ #print "%s - %s\n" % [instance.checksum, a.content_exists(instance.checksum).to_s]
368
+ ret.add_instance(instance) unless a.content_exists(instance.checksum)
369
+ }
370
+
371
+ #print "kuku %s" % ret.contents.size.to_s
372
+ #print "kuku %s" % ret.instances.size.to_s
373
+ return ret
374
+ end
375
+
376
+ # returns the common content in both a and b
377
+ def self.intersect(a, b)
378
+ b_minus_a = ContentData.remove(a, b)
379
+ return ContentData.remove(b_minus_a, b)
380
+ end
381
+
382
+ # unify time for all entries with same content to minimal time
383
+ def self.unify_time(db)
384
+ mod_db = ContentData.new # resulting ContentData that will consists objects with unified time
385
+ checksum2time = Hash.new # key=checksum value=min_time_for_this_checksum
386
+ checksum2instances = Hash.new # key=checksum value=array_of_instances_with_this_checksum (Will be replaced with ContentData method)
387
+
388
+ # populate tables with given ContentData entries
389
+ db.instances.each_value do |instance|
390
+ checksum = instance.checksum
391
+ time = instance.modification_time
392
+
393
+ unless (checksum2instances.has_key?checksum)
394
+ checksum2instances[checksum] = []
395
+ end
396
+ checksum2instances[checksum] << instance
397
+
398
+ if (not checksum2time.has_key?checksum)
399
+ checksum2time[checksum] = time
400
+ elsif ((checksum2time[checksum] <=> time) > 0)
401
+ checksum2time[checksum] = time
402
+ end
403
+ end
404
+
405
+ # update min time table with time information from contents
406
+ db.contents.each do |checksum, content|
407
+ time = content.first_appearance_time
408
+ if (not checksum2time.has_key?checksum)
409
+ checksum2time[checksum] = time
410
+ elsif ((checksum2time[checksum] <=> time) > 0)
411
+ checksum2time[checksum] = time
412
+ end
413
+ end
414
+
415
+ # add content entries to the output table. in need of case update time field with found min time
416
+ db.contents.each do |checksum, content|
417
+ time = checksum2time[checksum]
418
+ if ((content.first_appearance_time <=> time) == 0)
419
+ mod_db.add_content(content)
420
+ else
421
+ mod_db.add_content(Content.new(checksum, content.size, time))
422
+ end
423
+ end
424
+
425
+ # add instance entries to the output table. in need of case update time field with found min time
426
+ checksum2instances.each do |checksum, instances|
427
+ time = checksum2time[checksum]
428
+ instances.each do |instance|
429
+ if ((instance.modification_time <=> time) == 0)
430
+ mod_db.add_instance(instance)
431
+ else # must be bigger then found min time
432
+ mod_instance = ContentInstance.new(instance.checksum, instance.size, instance.server_name, instance.device, instance.full_path, time)
433
+ mod_db.add_instance(mod_instance)
434
+ end
435
+ end
436
+ end
437
+ mod_db
438
+ end
439
+ end
440
+ end
441
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'content_data/content_data'
2
+
3
+ # Data structure for an abstract layer over files.
4
+ # Each binary sequence is a content, each file is content instance.
5
+ module BBFS
6
+ module ContentData
7
+ VERSION = "0.0.1"
8
+ end
9
+ end
@@ -0,0 +1,146 @@
1
+ require 'time.rb'
2
+ require 'test/unit'
3
+
4
+ require_relative '../../lib/content_data/content_data.rb'
5
+
6
+ module BBFS
7
+ module ContentData
8
+
9
+ class TestContentData < Test::Unit::TestCase
10
+ def test_content
11
+ content_data = ContentData.new
12
+ content_data.add_content(Content.new("D12A1C98A3", 765, ContentData.parse_time("2011/02/01 02:23:59.000")))
13
+ content_data.add_content(Content.new("B12A1C98A3", 123123, ContentData.parse_time("2011/02/01 02:23:59.000")))
14
+ content_data.add_content(Content.new("D1234C98A3", 12444, ContentData.parse_time("2011/02/01 02:23:59.000")))
15
+ content_data.add_content(Content.new("DB12A1C233", 2, ContentData.parse_time("2011/02/01 02:23:59.000")))
16
+ content_data.add_content(Content.new("DB12A4338A", 12412, ContentData.parse_time("2011/02/01 02:23:59.000")))
17
+ content_data.add_content(Content.new("232A1C98A3", 124424, ContentData.parse_time("2011/02/01 02:23:59.000")))
18
+ content_data.add_content(Content.new("AC12A1C983", 1242, ContentData.parse_time("2011/02/01 02:23:59.000")))
19
+ content_data.add_content(Content.new("AAC12A1C983", 1242,ContentData.parse_time("2011/02/01 02:23:59.000")))
20
+
21
+ content_data.add_instance(ContentInstance.new("DB12A1C233", 765, "large_server_1", "dev1",
22
+ "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
23
+ content_data.add_instance(ContentInstance.new("DB12A4338A", 765, "large_server_1", "dev2",
24
+ "/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
25
+ content_data.add_instance(ContentInstance.new("232A1C98A3", 765, "large_server_1", "dev3",
26
+ "/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
27
+ content_data.add_instance(ContentInstance.new("DB12A4338A", 765, "large_server_2", "dev2",
28
+ "/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
29
+ content_data.add_instance(ContentInstance.new("D1234C98A3", 765, "large_server_2", "dev1",
30
+ "/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
31
+ content_data.add_instance(ContentInstance.new("D12A1C98A3", 765, "large_server_2", "dev1",
32
+ "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
33
+ content_data.add_instance(ContentInstance.new("AC12A1C983", 765, "large_server_2", "dev2",
34
+ "/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
35
+ content_data.add_instance(ContentInstance.new("232A1C98A3", 765, "large_server_2", "dev3",
36
+ "/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
37
+ content_data.add_instance(ContentInstance.new("D12A1C98A3", 765, "large_server_2", "dev2",
38
+ "/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
39
+ content_data.add_instance(ContentInstance.new("D1234C98A3", 12412, "large_server_2", "dev1",
40
+ "/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
41
+ content_data.add_instance(ContentInstance.new("DB12A4338A", 12412, "large_server_2", "dev1",
42
+ "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
43
+ content_data.add_instance(ContentInstance.new("AC12A1C983", 12412, "large_server_2", "dev2",
44
+ "/home/kuku/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
45
+ content_data.add_instance(ContentInstance.new("232A1C98A3", 12412, "large_server_2", "dev3",
46
+ "/home/kuku/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
47
+ content_data.add_instance(ContentInstance.new("DB12A4338A", 12412, "large_server_1", "dev2",
48
+ "/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
49
+ content_data.add_instance(ContentInstance.new("D1234C98A3", 12412, "large_server_1", "dev1",
50
+ "/home/kuku/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
51
+
52
+ #print content_data.to_s
53
+
54
+ assert_equal("8\nD12A1C98A3,765,2011/02/01 02:23:59.000\nB12A1C98A3,123123,2011/02/01 02:23:59.000\nD1234C98A3,12444,2011/02/01 02:23:59.000\nDB12A1C233,2,2011/02/01 02:23:59.000\nDB12A4338A,12412,2011/02/01 02:23:59.000\n232A1C98A3,124424,2011/02/01 02:23:59.000\nAC12A1C983,1242,2011/02/01 02:23:59.000\nAAC12A1C983,1242,2011/02/01 02:23:59.000\n3\nDB12A4338A,12412,large_server_2,dev1,/home/kuku/dev/lala/k.txt,2011/02/01 02:23:59.000\nD12A1C98A3,765,large_server_2,dev2,/home/lala/k.txt,2011/02/01 02:23:59.000\nDB12A4338A,12412,large_server_1,dev2,/home/kuku/lala/k.txt,2011/02/01 02:23:59.000\n",
55
+ content_data.to_s)
56
+ content_data.to_file("content_data_test.data")
57
+ new_content_data = ContentData.new()
58
+ new_content_data.from_file("content_data_test.data")
59
+ assert_equal(new_content_data, content_data)
60
+
61
+ content_data2 = ContentData.new
62
+ content_data2.add_content(Content.new("AD12A1C98A3", 765, ContentData.parse_time("2011/02/01 02:23:59.000")))
63
+ content_data2.add_content(Content.new("AB12A1C98A3", 123123, ContentData.parse_time("2011/02/01 02:23:59.000")))
64
+ content_data2.add_content(Content.new("AD1234C98A3", 12444, ContentData.parse_time("2011/02/01 02:23:59.000")))
65
+ content_data2.add_content(Content.new("ADB12A1C233", 2, ContentData.parse_time("2011/02/01 02:23:59.000")))
66
+ content_data2.add_content(Content.new("ADB12A4338A", 12412, ContentData.parse_time("2011/02/01 02:23:59.000")))
67
+ content_data2.add_content(Content.new("A232A1C98A3", 124424, ContentData.parse_time("2011/02/01 02:23:59.000")))
68
+ content_data2.add_content(Content.new("AAC12A1C983", 1242, ContentData.parse_time("2011/02/01 02:23:59.000")))
69
+
70
+ content_data2.add_instance(ContentInstance.new("ADB12A1C233", 765, "large_server_11", "dev1",
71
+ "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
72
+ content_data2.add_instance(ContentInstance.new("ADB12A4338A", 765, "large_server_11", "dev2",
73
+ "/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
74
+ content_data2.add_instance(ContentInstance.new("A232A1C98A3", 765, "large_server_11", "dev3",
75
+ "/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
76
+ content_data2.add_instance(ContentInstance.new("ADB12A4338A", 765, "large_server_12", "dev2",
77
+ "/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
78
+ content_data2.add_instance(ContentInstance.new("AD1234C98A3", 765, "large_server_12", "dev1",
79
+ "/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
80
+ content_data2.add_instance(ContentInstance.new("AD12A1C98A3", 765, "large_server_12", "dev1",
81
+ "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
82
+ content_data2.add_instance(ContentInstance.new("AAC12A1C983", 765, "large_server_12", "dev2",
83
+ "/home/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
84
+ content_data2.add_instance(ContentInstance.new("A232A1C98A3", 765, "large_server_12", "dev3",
85
+ "/home/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
86
+ content_data2.add_instance(ContentInstance.new("AD12A1C98A3", 765, "large_server_12", "dev2",
87
+ "/home/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
88
+ content_data2.add_instance(ContentInstance.new("AD1234C98A3", 12412, "large_server_12", "dev1",
89
+ "/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
90
+ content_data2.add_instance(ContentInstance.new("ADB12A4338A", 12412, "large_server_12", "dev1",
91
+ "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
92
+ content_data2.add_instance(ContentInstance.new("AAC12A1C983", 12412, "large_server_12", "dev2",
93
+ "/home/kuku/kuku/dev/lala/k1.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
94
+ content_data2.add_instance(ContentInstance.new("A232A1C98A3", 12412, "large_server_12", "dev3",
95
+ "/home/kuku/kuku/dev/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
96
+ content_data2.add_instance(ContentInstance.new("ADB12A4338A", 12412, "large_server_11", "dev2",
97
+ "/home/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
98
+ content_data2.add_instance(ContentInstance.new("AD1234C98A3", 12412, "large_server_11", "dev1",
99
+ "/home/kuku/kuku/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000")))
100
+
101
+ old_content_data = ContentData.new
102
+ old_content_data.merge(content_data)
103
+ assert_equal(true, old_content_data == content_data)
104
+ content_data.merge(content_data2)
105
+ content_data.to_file("content_data_test2.data")
106
+ new_content_data2 = ContentData.new()
107
+ new_content_data2.from_file("content_data_test2.data")
108
+ assert_equal(true, new_content_data2 == content_data)
109
+ assert_equal(false, new_content_data2 == old_content_data)
110
+
111
+ cd3 = ContentData.remove(content_data2, content_data)
112
+ assert_equal(false, old_content_data == cd3)
113
+ cd4 = ContentData.remove(cd3, content_data)
114
+ #assert_equal(content_data.to_s, "")
115
+ assert_equal(cd3.to_s, "7\nD12A1C98A3,765,2011/02/01 02:23:59.000\nB12A1C98A3,123123,2011/02/01 02:23:59.000\nD1234C98A3,12444,2011/02/01 02:23:59.000\nDB12A1C233,2,2011/02/01 02:23:59.000\nDB12A4338A,12412,2011/02/01 02:23:59.000\n232A1C98A3,124424,2011/02/01 02:23:59.000\nAC12A1C983,1242,2011/02/01 02:23:59.000\n3\nDB12A4338A,12412,large_server_2,dev1,/home/kuku/dev/lala/k.txt,2011/02/01 02:23:59.000\nD12A1C98A3,765,large_server_2,dev2,/home/lala/k.txt,2011/02/01 02:23:59.000\nDB12A4338A,12412,large_server_1,dev2,/home/kuku/lala/k.txt,2011/02/01 02:23:59.000\n")
116
+ assert_equal(cd4.to_s, "7\nAAC12A1C983,1242,2011/02/01 02:23:59.000\nAD12A1C98A3,765,2011/02/01 02:23:59.000\nAB12A1C98A3,123123,2011/02/01 02:23:59.000\nAD1234C98A3,12444,2011/02/01 02:23:59.000\nADB12A1C233,2,2011/02/01 02:23:59.000\nADB12A4338A,12412,2011/02/01 02:23:59.000\nA232A1C98A3,124424,2011/02/01 02:23:59.000\n3\nADB12A4338A,12412,large_server_12,dev1,/home/kuku/dev/lala/k.txt,2011/02/01 02:23:59.000\nAD12A1C98A3,765,large_server_12,dev2,/home/lala/k.txt,2011/02/01 02:23:59.000\nADB12A4338A,12412,large_server_11,dev2,/home/kuku/lala/k.txt,2011/02/01 02:23:59.000\n")
117
+ cd5 = ContentData.merge(cd3, cd4)
118
+ assert_equal(cd5, content_data)
119
+
120
+ intersect = ContentData.intersect(cd3, cd4)
121
+ assert_equal(intersect, ContentData.new)
122
+ intersect = ContentData.intersect(cd5, cd4)
123
+ assert_equal(cd4, intersect)
124
+
125
+ # Content serialization test
126
+ #content = Content.new("D12A1C98A3", 765, ContentData.parse_time("2011/02/01 02:23:59.000"))
127
+ #content_serializer = content.serialize()
128
+ #content_copy = Content.new(nil, nil, nil, content_serializer)
129
+ #assert_equal(content, content_copy)
130
+
131
+ # ContentInstance serialization test
132
+ #instance = ContentInstance.new("DB12A1C233", 765, "large_server_1", "dev1",
133
+ # "/home/kuku/dev/lala/k.txt", ContentData.parse_time("2011/02/01 02:23:59.000"))
134
+ #instance_serializer = instance.serialize()
135
+ #instance_copy = ContentInstance.new(nil, nil, nil, nil, nil, nil, instance_serializer)
136
+ #assert_equal(instance, instance_copy)
137
+
138
+ # ContentData serialization test
139
+ #content_data_serializer = content_data.serialize
140
+ #content_data_copy = ContentData.new(content_data_serializer)
141
+ #assert_equal(content_data, content_data_copy)
142
+ end
143
+ end
144
+
145
+ end
146
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: content_data
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Gena Petelko, Kolman Vornovitsky
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-08 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: ! 'Data structure for an abstract layer over files. Each binary sequence
15
+ is a content, '
16
+ email: kolmanv@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - lib/content_data.rb
22
+ - lib/content_data/content_data.rb
23
+ - test/content_data/content_data_test.rb
24
+ homepage: http://github.com/kolmanv/bbfs
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.15
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Data structure for an abstract layer over files.
48
+ test_files:
49
+ - test/content_data/content_data_test.rb