@@ -3,15 +3,16 @@ package storage
3
3
import (
4
4
"bytes"
5
5
"context"
6
- "io"
7
-
8
6
"github.com/minio/minio-go/v7"
9
7
"github.com/sio2project/ft-to-s3/v1/db"
10
8
"github.com/sio2project/ft-to-s3/v1/utils"
9
+ "io"
11
10
)
12
11
13
12
func Store (bucketName string , logger * utils.LoggerObject , path string , reader io.Reader , version int64 , size int64 ,
14
13
compressed bool , sha256Digest string , logicalSize int64 ) (int64 , error ) {
14
+ logger .Debug ("storage.Store called on" , bucketName + ":" + path )
15
+
15
16
session := db .GetSession ()
16
17
defer session .Close ()
17
18
fileMutex := db .GetMutex (session , bucketName + ":" + path )
@@ -25,33 +26,37 @@ func Store(bucketName string, logger *utils.LoggerObject, path string, reader io
25
26
if version <= dbModified {
26
27
return dbModified , nil
27
28
}
29
+ logger .Debug ("Version is greater than dbModified" )
28
30
29
31
oldFile , err := db .GetHashForPath (bucketName , path )
30
32
if err != nil {
31
33
return 0 , err
32
34
}
33
35
34
36
options := minio.PutObjectOptions {}
37
+ var data bytes.Buffer
35
38
if sha256Digest == "" || logicalSize == - 1 {
36
- var data []byte
39
+ var tempData []byte
40
+ teeReader := io .TeeReader (reader , & data )
37
41
if compressed {
38
- data , err = utils .ReadGzip (reader )
42
+ tempData , err = utils .ReadGzip (teeReader )
39
43
if err != nil {
40
44
return 0 , err
41
45
}
42
46
} else {
43
- data , err = io .ReadAll (reader )
47
+ tempData , err = io .ReadAll (teeReader )
44
48
if err != nil {
45
49
return 0 , err
46
50
}
47
51
}
48
52
49
- sha256Digest = utils .Sha256Checksum (data )
50
- logicalSize = int64 (len (data ))
51
- reader = bytes .NewReader (data )
53
+ sha256Digest = utils .Sha256Checksum (tempData )
54
+ logicalSize = int64 (len (tempData ))
52
55
}
53
56
if compressed {
57
+ logger .Debug ("Setting ContentEncoding to gzip" )
54
58
options .ContentEncoding = "gzip"
59
+ options .ContentType = "application/gzip"
55
60
}
56
61
57
62
refCount , err := db .GetRefCount (bucketName , sha256Digest )
@@ -60,10 +65,10 @@ func Store(bucketName string, logger *utils.LoggerObject, path string, reader io
60
65
}
61
66
62
67
if refCount == 0 {
63
- logger .Debug ("Storing with options " , options )
68
+ logger .Debug ("Storing with options" , options )
64
69
minioClient := GetClient ()
65
70
66
- _ , err = minioClient .PutObject (context .Background (), bucketName , sha256Digest , reader , size , options )
71
+ _ , err = minioClient .PutObject (context .Background (), bucketName , sha256Digest , & data , size , options )
67
72
if err != nil {
68
73
return 0 , err
69
74
}
@@ -98,3 +103,48 @@ func deleteByHash(bucketName string, logger *utils.LoggerObject, path string, lo
98
103
logger .Debug ("DeleteByHash called on " , path )
99
104
return nil
100
105
}
106
+
107
+ func Get (bucketName string , logger * utils.LoggerObject , path string ) * GetResult {
108
+ logger .Debug ("storage.Get called on" , bucketName + ":" + path )
109
+
110
+ fileHash , err := db .GetHashForPath (bucketName , path )
111
+ if err != nil {
112
+ return & GetResult {Err : err }
113
+ }
114
+ if fileHash == "" {
115
+ return & GetResult {Found : false }
116
+ }
117
+
118
+ lastModified , err := db .GetModified (bucketName , path )
119
+ if err != nil {
120
+ return & GetResult {Err : err }
121
+ }
122
+
123
+ minioClient := GetClient ()
124
+ info , err := minioClient .StatObject (context .Background (), bucketName , fileHash , minio.StatObjectOptions {})
125
+ if err != nil {
126
+ minioErr := minio .ToErrorResponse (err )
127
+ if minioErr .Code == "NoSuchKey" {
128
+ return & GetResult {Found : false }
129
+ }
130
+ return & GetResult {Err : err }
131
+ }
132
+ gziped := info .ContentType == "application/gzip"
133
+
134
+ reader , err := minioClient .GetObject (context .Background (), bucketName , fileHash , minio.GetObjectOptions {})
135
+ if err != nil {
136
+ minioErr := minio .ToErrorResponse (err )
137
+ if minioErr .Code == "NoSuchKey" {
138
+ return & GetResult {Found : false }
139
+ }
140
+ return & GetResult {Err : err }
141
+ }
142
+
143
+ return & GetResult {
144
+ Found : true ,
145
+ File : reader ,
146
+ Gziped : gziped ,
147
+ LastModified : lastModified ,
148
+ LogicalSize : info .Size ,
149
+ }
150
+ }
0 commit comments