VictoriaFreSh 2021.7.31 → 2022.1.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a4d0010fe75ced288008ae971b82838a2609ef847ee25c11253869a9ed79f04e
4
- data.tar.gz: 108db43b445c540443113bda9859c9b9a7ff007538e84f401cd954d66ecddf89
3
+ metadata.gz: d6d26d764e0e7243cad77fbf9b9bfa0ab0e3a622dd55df6d606d897cf79cf2ae
4
+ data.tar.gz: 5beff4aba458395347cb1c58ef5af643fc92b9061593571336ee73ad603b328e
5
5
  SHA512:
6
- metadata.gz: 97522a35b8fffa090357609ee1fa03cd482691e740177df23036700c91286578f4eb2dc6ad2b06877ed9ea806a8ca6b7c73b1de5b5f1b042b767f4c9304804eb
7
- data.tar.gz: 70125c3bad87748ef4faf7599cb9946fc4ee741190173064b294218cfe26be5aeb815f7e3e59bb5a277a9bf8e523ac036bf8c94d6eb42b69c57691d9f70cb815
6
+ metadata.gz: 02c1a6374fe1a446bcd471956fd31e96491826a7dbfe24249f8ffd0e5e6d5d07308dc68fa33334752af9b44a517fdba6e98c3ffcf05f8fface38bb14fd505528
7
+ data.tar.gz: 414857f4e1c24ce4a72350769661cdeef8a9f6c67d67e2d9a3c83e71d2b96b415c697ddf36b24b1d2f579ba2b7efe16a1e23a26eff9a489727b3955b8d780b88
data/lib/victoriafresh.rb CHANGED
@@ -4,6 +4,7 @@ require 'pathname'
4
4
  require 'fileutils'
5
5
  require 'cbor'
6
6
  require 'get_process_mem'
7
+ require 'digest'
7
8
 
8
9
  # require File.dirname(__FILE__)+'/VictoriaFreSh/filemessage_pb.rb'
9
10
 
@@ -25,6 +26,21 @@ class VictoriaFresh
25
26
  @currentDiskFlushSuffix=0 #当前的磁盘文件后缀
26
27
  @bufferLength=0 #缓冲区总长度
27
28
  @externalDataFile={} #外部数据文件对象
29
+ @nextFileIdToUse=1 # 下一个要用的文件编号。
30
+ @md5FileIdMap={} # MD5 与文件编号之间的映射
31
+ @fileIdPathMap={} # 文件编号与它的实际路径之间的映射
32
+ end
33
+
34
+ # 计算文件内容的MD5。
35
+ def calculateMd5(currentFileContent)
36
+ Digest::MD5.hexdigest currentFileContent #=> "90015098..."
37
+ end
38
+
39
+ # 下一个可用的文件编号
40
+ def nextFileId
41
+ result=@nextFileIdToUse # 结果
42
+
43
+ @nextFileIdToUse=@nextFileIdToUse+1
28
44
  end
29
45
 
30
46
  def checkMemoryUsage(lineNumber)
@@ -57,15 +73,24 @@ class VictoriaFresh
57
73
  def writeFileExternalDataFile(pathPrefix, packagedFile) #写入文件
58
74
  timeObject=getTimeObject(packagedFile) #构造时间戳对象
59
75
 
60
- @externalDataFile.seek(packagedFile['file_start_index']) #定位到起始位置
61
-
62
- victoriaFreshData=@externalDataFile.read(packagedFile['file_length']) #读取内容
76
+ is_duplicate=packagedFile['is_duplicate'] # 是否是重复文件。
77
+
63
78
 
64
- # victoriaFreshData=contentString[packagedFile.file_start_index, packagedFile.file_length] #获取内容
65
- # victoriaFreshData=contentString[ packagedFile['file_start_index'], packagedFile['file_length'] ] #获取内容
79
+ if is_duplicate # 是重复文件。
80
+ sameFileId=packagedFile['same_file_id'] # 找到相同文件的编号。
81
+
82
+ sameFilePath=@fileIdPathMap[sameFileId] # 获取原始相同文件的路径。
83
+
84
+ victoriaFreshData=File.read(sameFilePath) # 读取原始相同文件的内容。
85
+ else # 不是重复文件。
86
+ @externalDataFile.seek(packagedFile['file_start_index']) #定位到起始位置
87
+
88
+ victoriaFreshData=@externalDataFile.read(packagedFile['file_length']) #读取内容
89
+ end # if is_duplicate # 是重复文件。
66
90
 
67
- # pathToMake=pathPrefix + '/' + packagedFile.name #构造文件名
68
91
  pathToMake=pathPrefix + '/' + packagedFile['name'] #构造文件名
92
+
93
+ @fileIdPathMap[fileId]=pathToMake # 记录文件编号与路径之间的映射。
69
94
 
70
95
  begin
71
96
  victoriaFreshDataFile=File.new(pathToMake , "wb", packagedFile['permission']) #数据文件。
@@ -80,8 +105,6 @@ class VictoriaFresh
80
105
  elsif #带权限字段
81
106
  File.chmod(permissionNumber, pathToMake) #设置权限
82
107
  end #if (permissionNumber.nil?) #不带权限字段
83
-
84
-
85
108
  rescue Errno::ENOENT # File not exist
86
109
  puts "Rescued by Errno::ENOENT statement. #{pathToMake}" #报告错误
87
110
  rescue Errno::EACCES # File permission error
@@ -320,8 +343,6 @@ class VictoriaFresh
320
343
  @diskWriteFileObject.syswrite(contentToWrite) #写入内容
321
344
 
322
345
  @diskWriteFileObject.close
323
-
324
-
325
346
  else #单个磁盘文件
326
347
  @diskWriteFileObject.syswrite(contentToWrite) #写入内容
327
348
 
@@ -377,19 +398,29 @@ class VictoriaFresh
377
398
 
378
399
  if isFile #是文件,不用再列出其子文件了。
379
400
  packagedFile['file_length']=directoryPathName.size #记录文件的内容长度。
401
+ packagedFile['id']= nextFileId # 设置下一个文件编号
380
402
 
381
403
  #读取文件内容:
382
404
  fileToReadContent=File.new(directoryPath,"rb") #创建文件。
383
405
  currentFileContent=fileToReadContent.read #全部读取
384
- @contentPartArray << currentFileContent
385
- @bufferLength=@bufferLength+ currentFileContent.length #记录缓冲区总长度
386
- # @contentString= @contentString + fileToReadContent.read #全部读取。
406
+
407
+ currentContentMd5=calculateMd5(currentFileContent) # 计算文件内容的MD5。
408
+
409
+ sameFileId=@md5FileIdMap[currentContentMd5] # 尝试寻找对应的相同文件的编号。
410
+
411
+ if sameFileId.nil? # 不存在相同的文件
412
+ @contentPartArray << currentFileContent
413
+ @bufferLength=@bufferLength+ currentFileContent.length #记录缓冲区总长度
414
+ @md5FileIdMap[currentContentMd5]=packagedFile['id'] # 尝试寻找对应的相同文件的编号。
415
+ else # 存在相同的文件
416
+ packagedFile['is_duplicate']=true # 是重复文件。
417
+ packagedFile['same_file_id']=sameFileId # 设置相同文件的编号。
418
+ end # if sameFileId.nil? # 不存在相同的文件
387
419
 
388
420
  assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
389
421
  elsif (isSymLink) #是符号链接
390
422
  linkTarget=directoryPathName.readlink #获取链接目标
391
423
 
392
- # 待续,设置内容长度。符号链接字符串的长度
393
424
  packagedFile['file_length']=linkTarget.to_s.bytesize #记录文件的内容长度。
394
425
 
395
426
  #读取文件内容:
@@ -397,12 +428,9 @@ class VictoriaFresh
397
428
  currentFileContent=StringIO.new(linkTarget.to_s).binmode.read #全部读取。
398
429
  @contentPartArray << currentFileContent #加入数组
399
430
  @bufferLength=@bufferLength + currentFileContent.length #记录缓冲区总长度
400
- # @contentString= @contentString + StringIO.new(linkTarget.to_s).binmode.read #全部读取。
401
431
 
402
432
  assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
403
-
404
433
  else #是目录。
405
- # contentString="" #容纳内容的字符串。
406
434
  subFileStartIndex=startIndex #子文件的起始位置,以此目录的起始位置为基准。
407
435
 
408
436
  packagedFile['file_length']=0 #本目录的内容长度。
@@ -410,20 +438,13 @@ class VictoriaFresh
410
438
  puts "Listing for #{directoryPathName}" # Debug
411
439
 
412
440
  directoryPathName.each_child do |subFile| #一个个文件地处理。
413
- # puts("sub file: #{subFile}, class: #{subFile.class}, symlink: #{subFile.symlink?}, expand_path: #{subFile.expand_path}, file?: #{subFile.file?}") #Debug.
414
- # checkMemoryUsage(221)
441
+ begin
415
442
  realPath=subFile.expand_path #获取绝对路径。
416
443
 
417
444
  packagedSubFile,subFileContent=checkOnce(realPath,subFileStartIndex, layer+1) #打包这个子文件。
418
445
 
419
446
  packagedFile['sub_files'] << packagedSubFile #加入到子文件列表中。
420
447
 
421
- # puts("sub file content: #{subFileContent}, nil?: #{subFileContent.nil?}" ) #Debug
422
-
423
- # puts(" content: #{contentString}, nil?: #{contentString.nil? }") #Debug
424
-
425
- # contentString = contentString + subFileContent #串接文件内容。
426
-
427
448
  assessDiskFlush(layer) #考虑是否要向磁盘先输出内容
428
449
 
429
450
 
@@ -432,6 +453,9 @@ class VictoriaFresh
432
453
  # puts("237, content string length: #{contentString.length}") #Debug
433
454
 
434
455
  packagedFile['file_length']+=packagedSubFile['file_length'] #随着子文件的打包而更新本目录的总长度。
456
+ rescue Errno::EMFILE # File not exist
457
+ puts "Rescued by Errno::EMFILE statement. #{subFile}" #报告错误
458
+ end
435
459
  end #directoryPathName.each_child do |subFile| #一个个文件地处理。
436
460
  end #if (isFile) #是文件,不用再列出其子文件了。
437
461
 
metadata CHANGED
@@ -1,35 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: VictoriaFreSh
3
3
  version: !ruby/object:Gem::Version
4
- version: 2021.7.31
4
+ version: 2022.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hxcan Cai
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-30 00:00:00.000000000 Z
11
+ date: 2022-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: cbor
14
+ name: hx_cbor
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 0.5.9
20
17
  - - ">="
21
18
  - !ruby/object:Gem::Version
22
- version: 0.5.9.6
19
+ version: 2021.8.20
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: 0.5.9
30
24
  - - ">="
31
25
  - !ruby/object:Gem::Version
32
- version: 0.5.9.6
26
+ version: 2021.8.20
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: get_process_mem
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -50,14 +44,13 @@ executables: []
50
44
  extensions: []
51
45
  extra_rdoc_files: []
52
46
  files:
53
- - lib/VictoriaFreSh/filemessage_pb.rb
54
47
  - lib/victoriafresh.rb
55
48
  - victoriafresh.example.rb
56
49
  homepage: http://rubygems.org/gems/VictoriaFreSh
57
50
  licenses:
58
51
  - MIT
59
52
  metadata: {}
60
- post_install_message:
53
+ post_install_message:
61
54
  rdoc_options: []
62
55
  require_paths:
63
56
  - lib
@@ -72,8 +65,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
65
  - !ruby/object:Gem::Version
73
66
  version: '0'
74
67
  requirements: []
75
- rubygems_version: 3.0.3
76
- signing_key:
68
+ rubygems_version: 3.1.6
69
+ signing_key:
77
70
  specification_version: 4
78
71
  summary: VictoriaFreSh
79
72
  test_files: []
@@ -1,24 +0,0 @@
1
- # Generated by the protocol buffer compiler. DO NOT EDIT!
2
- # source: filemessage.proto
3
-
4
- require 'google/protobuf'
5
-
6
- require 'google/protobuf/timestamp_pb'
7
- Google::Protobuf::DescriptorPool.generated_pool.build do
8
- add_message "com.stupidbeauty.victoriafresh.FileMessage" do
9
- optional :name, :string, 1
10
- repeated :sub_files, :message, 2, "com.stupidbeauty.victoriafresh.FileMessage"
11
- optional :is_file, :bool, 3
12
- optional :file_start_index, :int32, 5
13
- optional :file_length, :int32, 6
14
- optional :timestamp, :message, 8, "google.protobuf.Timestamp"
15
- end
16
- end
17
-
18
- module Com
19
- module Stupidbeauty
20
- module Victoriafresh
21
- FileMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("com.stupidbeauty.victoriafresh.FileMessage").msgclass
22
- end
23
- end
24
- end