6
6
"io/ioutil"
7
7
8
8
"gopkg.in/src-d/go-mysql-server.v0/sql"
9
+ "gopkg.in/src-d/go-mysql-server.v0/sql/expression"
9
10
10
11
"gopkg.in/src-d/go-git.v4/plumbing"
11
12
"gopkg.in/src-d/go-git.v4/plumbing/object"
@@ -70,7 +71,7 @@ func (r *blobsTable) TransformExpressionsUp(f sql.TransformExprFunc) (sql.Node,
70
71
71
72
func (r blobsTable ) RowIter (ctx * sql.Context ) (sql.RowIter , error ) {
72
73
span , ctx := ctx .Span ("gitbase.BlobsTable" )
73
- iter := new ( blobIter )
74
+ iter := & blobIter { readContent : true }
74
75
75
76
repoIter , err := NewRowRepoIter (ctx , iter )
76
77
if err != nil {
@@ -91,23 +92,26 @@ func (blobsTable) HandledFilters(filters []sql.Expression) []sql.Expression {
91
92
92
93
func (r * blobsTable ) WithProjectAndFilters (
93
94
ctx * sql.Context ,
94
- _ , filters []sql.Expression ,
95
+ columns , filters []sql.Expression ,
95
96
) (sql.RowIter , error ) {
96
97
span , ctx := ctx .Span ("gitbase.BlobsTable" )
97
98
iter , err := rowIterWithSelectors (
98
99
ctx , BlobsSchema , BlobsTableName , filters ,
99
100
[]string {"hash" },
100
101
func (selectors selectors ) (RowRepoIter , error ) {
101
102
if len (selectors ["hash" ]) == 0 {
102
- return new ( blobIter ) , nil
103
+ return & blobIter { readContent : shouldReadContent ( columns )} , nil
103
104
}
104
105
105
106
hashes , err := selectors .textValues ("hash" )
106
107
if err != nil {
107
108
return nil , err
108
109
}
109
110
110
- return & blobsByHashIter {hashes : hashes }, nil
111
+ return & blobsByHashIter {
112
+ hashes : hashes ,
113
+ readContent : shouldReadContent (columns ),
114
+ }, nil
111
115
},
112
116
)
113
117
@@ -120,7 +124,8 @@ func (r *blobsTable) WithProjectAndFilters(
120
124
}
121
125
122
126
type blobIter struct {
123
- iter * object.BlobIter
127
+ iter * object.BlobIter
128
+ readContent bool
124
129
}
125
130
126
131
func (i * blobIter ) NewIterator (repo * Repository ) (RowRepoIter , error ) {
@@ -129,7 +134,7 @@ func (i *blobIter) NewIterator(repo *Repository) (RowRepoIter, error) {
129
134
return nil , err
130
135
}
131
136
132
- return & blobIter {iter : iter }, nil
137
+ return & blobIter {iter : iter , readContent : i . readContent }, nil
133
138
}
134
139
135
140
func (i * blobIter ) Next () (sql.Row , error ) {
@@ -138,7 +143,7 @@ func (i *blobIter) Next() (sql.Row, error) {
138
143
return nil , err
139
144
}
140
145
141
- return blobToRow (o )
146
+ return blobToRow (o , i . readContent )
142
147
}
143
148
144
149
func (i * blobIter ) Close () error {
@@ -150,13 +155,14 @@ func (i *blobIter) Close() error {
150
155
}
151
156
152
157
type blobsByHashIter struct {
153
- repo * Repository
154
- pos int
155
- hashes []string
158
+ repo * Repository
159
+ pos int
160
+ hashes []string
161
+ readContent bool
156
162
}
157
163
158
164
func (i * blobsByHashIter ) NewIterator (repo * Repository ) (RowRepoIter , error ) {
159
- return & blobsByHashIter {repo , 0 , i .hashes }, nil
165
+ return & blobsByHashIter {repo , 0 , i .hashes , i . readContent }, nil
160
166
}
161
167
162
168
func (i * blobsByHashIter ) Next () (sql.Row , error ) {
@@ -176,26 +182,26 @@ func (i *blobsByHashIter) Next() (sql.Row, error) {
176
182
return nil , err
177
183
}
178
184
179
- return blobToRow (blob )
185
+ return blobToRow (blob , i . readContent )
180
186
}
181
187
}
182
188
183
189
func (i * blobsByHashIter ) Close () error {
184
190
return nil
185
191
}
186
192
187
- func blobToRow (c * object.Blob ) (sql.Row , error ) {
193
+ func blobToRow (c * object.Blob , readContent bool ) (sql.Row , error ) {
188
194
var content []byte
189
195
var isAllowed = blobsAllowBinary
190
- if ! isAllowed {
196
+ if ! isAllowed && readContent {
191
197
ok , err := isBinary (c )
192
198
if err != nil {
193
199
return nil , err
194
200
}
195
201
isAllowed = ! ok
196
202
}
197
203
198
- if c .Size <= int64 (blobsMaxSize ) && isAllowed {
204
+ if c .Size <= int64 (blobsMaxSize ) && isAllowed && readContent {
199
205
r , err := c .Reader ()
200
206
if err != nil {
201
207
return nil , err
@@ -248,3 +254,19 @@ func isBinary(blob *object.Blob) (bool, error) {
248
254
}
249
255
}
250
256
}
257
+
258
+ func shouldReadContent (columns []sql.Expression ) bool {
259
+ for _ , e := range columns {
260
+ var found bool
261
+ expression .Inspect (e , func (e sql.Expression ) bool {
262
+ gf , ok := e .(* expression.GetField )
263
+ found = ok && gf .Table () == BlobsTableName && gf .Name () == "content"
264
+ return ! found
265
+ })
266
+
267
+ if found {
268
+ return true
269
+ }
270
+ }
271
+ return false
272
+ }
0 commit comments