mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-16 11:23:11 -06:00
SQLite support for mediaapi
This commit is contained in:
parent
2e01c575ce
commit
52b53da4d2
115
mediaapi/storage/sqlite3/media_repository_table.go
Normal file
115
mediaapi/storage/sqlite3/media_repository_table.go
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
// Copyright 2017-2018 New Vector Ltd
|
||||||
|
// Copyright 2019-2020 The Matrix.org Foundation C.I.C.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package sqlite3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/mediaapi/types"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
const mediaSchema = `
|
||||||
|
-- The media_repository table holds metadata for each media file stored and accessible to the local server,
|
||||||
|
-- the actual file is stored separately.
|
||||||
|
CREATE TABLE IF NOT EXISTS mediaapi_media_repository (
|
||||||
|
-- The id used to refer to the media.
|
||||||
|
-- For uploads to this server this is a base64-encoded sha256 hash of the file data
|
||||||
|
-- For media from remote servers, this can be any unique identifier string
|
||||||
|
media_id TEXT NOT NULL,
|
||||||
|
-- The origin of the media as requested by the client. Should be a homeserver domain.
|
||||||
|
media_origin TEXT NOT NULL,
|
||||||
|
-- The MIME-type of the media file as specified when uploading.
|
||||||
|
content_type TEXT NOT NULL,
|
||||||
|
-- Size of the media file in bytes.
|
||||||
|
file_size_bytes INTEGER NOT NULL,
|
||||||
|
-- When the content was uploaded in UNIX epoch ms.
|
||||||
|
creation_ts INTEGER NOT NULL,
|
||||||
|
-- The file name with which the media was uploaded.
|
||||||
|
upload_name TEXT NOT NULL,
|
||||||
|
-- Alternate RFC 4648 unpadded base64 encoding string representation of a SHA-256 hash sum of the file data.
|
||||||
|
base64hash TEXT NOT NULL,
|
||||||
|
-- The user who uploaded the file. Should be a Matrix user ID.
|
||||||
|
user_id TEXT NOT NULL
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS mediaapi_media_repository_index ON mediaapi_media_repository (media_id, media_origin);
|
||||||
|
`
|
||||||
|
|
||||||
|
const insertMediaSQL = `
|
||||||
|
INSERT INTO mediaapi_media_repository (media_id, media_origin, content_type, file_size_bytes, creation_ts, upload_name, base64hash, user_id)
|
||||||
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||||
|
`
|
||||||
|
|
||||||
|
const selectMediaSQL = `
|
||||||
|
SELECT content_type, file_size_bytes, creation_ts, upload_name, base64hash, user_id FROM mediaapi_media_repository WHERE media_id = $1 AND media_origin = $2
|
||||||
|
`
|
||||||
|
|
||||||
|
type mediaStatements struct {
|
||||||
|
insertMediaStmt *sql.Stmt
|
||||||
|
selectMediaStmt *sql.Stmt
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *mediaStatements) prepare(db *sql.DB) (err error) {
|
||||||
|
_, err = db.Exec(mediaSchema)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return statementList{
|
||||||
|
{&s.insertMediaStmt, insertMediaSQL},
|
||||||
|
{&s.selectMediaStmt, selectMediaSQL},
|
||||||
|
}.prepare(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *mediaStatements) insertMedia(
|
||||||
|
ctx context.Context, mediaMetadata *types.MediaMetadata,
|
||||||
|
) error {
|
||||||
|
mediaMetadata.CreationTimestamp = types.UnixMs(time.Now().UnixNano() / 1000000)
|
||||||
|
_, err := s.insertMediaStmt.ExecContext(
|
||||||
|
ctx,
|
||||||
|
mediaMetadata.MediaID,
|
||||||
|
mediaMetadata.Origin,
|
||||||
|
mediaMetadata.ContentType,
|
||||||
|
mediaMetadata.FileSizeBytes,
|
||||||
|
mediaMetadata.CreationTimestamp,
|
||||||
|
mediaMetadata.UploadName,
|
||||||
|
mediaMetadata.Base64Hash,
|
||||||
|
mediaMetadata.UserID,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *mediaStatements) selectMedia(
|
||||||
|
ctx context.Context, mediaID types.MediaID, mediaOrigin gomatrixserverlib.ServerName,
|
||||||
|
) (*types.MediaMetadata, error) {
|
||||||
|
mediaMetadata := types.MediaMetadata{
|
||||||
|
MediaID: mediaID,
|
||||||
|
Origin: mediaOrigin,
|
||||||
|
}
|
||||||
|
err := s.selectMediaStmt.QueryRowContext(
|
||||||
|
ctx, mediaMetadata.MediaID, mediaMetadata.Origin,
|
||||||
|
).Scan(
|
||||||
|
&mediaMetadata.ContentType,
|
||||||
|
&mediaMetadata.FileSizeBytes,
|
||||||
|
&mediaMetadata.CreationTimestamp,
|
||||||
|
&mediaMetadata.UploadName,
|
||||||
|
&mediaMetadata.Base64Hash,
|
||||||
|
&mediaMetadata.UserID,
|
||||||
|
)
|
||||||
|
return &mediaMetadata, err
|
||||||
|
}
|
||||||
38
mediaapi/storage/sqlite3/prepare.go
Normal file
38
mediaapi/storage/sqlite3/prepare.go
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright 2017-2018 New Vector Ltd
|
||||||
|
// Copyright 2019-2020 The Matrix.org Foundation C.I.C.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// FIXME: This should be made common!
|
||||||
|
|
||||||
|
package sqlite3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
)
|
||||||
|
|
||||||
|
// a statementList is a list of SQL statements to prepare and a pointer to where to store the resulting prepared statement.
|
||||||
|
type statementList []struct {
|
||||||
|
statement **sql.Stmt
|
||||||
|
sql string
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepare the SQL for each statement in the list and assign the result to the prepared statement.
|
||||||
|
func (s statementList) prepare(db *sql.DB) (err error) {
|
||||||
|
for _, statement := range s {
|
||||||
|
if *statement.statement, err = db.Prepare(statement.sql); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
36
mediaapi/storage/sqlite3/sql.go
Normal file
36
mediaapi/storage/sqlite3/sql.go
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright 2017-2018 New Vector Ltd
|
||||||
|
// Copyright 2019-2020 The Matrix.org Foundation C.I.C.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package sqlite3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
)
|
||||||
|
|
||||||
|
type statements struct {
|
||||||
|
media mediaStatements
|
||||||
|
thumbnail thumbnailStatements
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *statements) prepare(db *sql.DB) (err error) {
|
||||||
|
if err = s.media.prepare(db); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = s.thumbnail.prepare(db); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
106
mediaapi/storage/sqlite3/storage.go
Normal file
106
mediaapi/storage/sqlite3/storage.go
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
// Copyright 2017-2018 New Vector Ltd
|
||||||
|
// Copyright 2019-2020 The Matrix.org Foundation C.I.C.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package sqlite3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
|
||||||
|
// Import the postgres database driver.
|
||||||
|
"github.com/matrix-org/dendrite/mediaapi/types"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
_ "github.com/mattn/go-sqlite3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Database is used to store metadata about a repository of media files.
|
||||||
|
type Database struct {
|
||||||
|
statements statements
|
||||||
|
db *sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open opens a postgres database.
|
||||||
|
func Open(dataSourceName string) (*Database, error) {
|
||||||
|
var d Database
|
||||||
|
var err error
|
||||||
|
if d.db, err = sql.Open("sqlite3", dataSourceName); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err = d.statements.prepare(d.db); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &d, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// StoreMediaMetadata inserts the metadata about the uploaded media into the database.
|
||||||
|
// Returns an error if the combination of MediaID and Origin are not unique in the table.
|
||||||
|
func (d *Database) StoreMediaMetadata(
|
||||||
|
ctx context.Context, mediaMetadata *types.MediaMetadata,
|
||||||
|
) error {
|
||||||
|
return d.statements.media.insertMedia(ctx, mediaMetadata)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMediaMetadata returns metadata about media stored on this server.
|
||||||
|
// The media could have been uploaded to this server or fetched from another server and cached here.
|
||||||
|
// Returns nil metadata if there is no metadata associated with this media.
|
||||||
|
func (d *Database) GetMediaMetadata(
|
||||||
|
ctx context.Context, mediaID types.MediaID, mediaOrigin gomatrixserverlib.ServerName,
|
||||||
|
) (*types.MediaMetadata, error) {
|
||||||
|
mediaMetadata, err := d.statements.media.selectMedia(ctx, mediaID, mediaOrigin)
|
||||||
|
if err != nil && err == sql.ErrNoRows {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return mediaMetadata, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// StoreThumbnail inserts the metadata about the thumbnail into the database.
|
||||||
|
// Returns an error if the combination of MediaID and Origin are not unique in the table.
|
||||||
|
func (d *Database) StoreThumbnail(
|
||||||
|
ctx context.Context, thumbnailMetadata *types.ThumbnailMetadata,
|
||||||
|
) error {
|
||||||
|
return d.statements.thumbnail.insertThumbnail(ctx, thumbnailMetadata)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetThumbnail returns metadata about a specific thumbnail.
|
||||||
|
// The media could have been uploaded to this server or fetched from another server and cached here.
|
||||||
|
// Returns nil metadata if there is no metadata associated with this thumbnail.
|
||||||
|
func (d *Database) GetThumbnail(
|
||||||
|
ctx context.Context,
|
||||||
|
mediaID types.MediaID,
|
||||||
|
mediaOrigin gomatrixserverlib.ServerName,
|
||||||
|
width, height int,
|
||||||
|
resizeMethod string,
|
||||||
|
) (*types.ThumbnailMetadata, error) {
|
||||||
|
thumbnailMetadata, err := d.statements.thumbnail.selectThumbnail(
|
||||||
|
ctx, mediaID, mediaOrigin, width, height, resizeMethod,
|
||||||
|
)
|
||||||
|
if err != nil && err == sql.ErrNoRows {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return thumbnailMetadata, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetThumbnails returns metadata about all thumbnails for a specific media stored on this server.
|
||||||
|
// The media could have been uploaded to this server or fetched from another server and cached here.
|
||||||
|
// Returns nil metadata if there are no thumbnails associated with this media.
|
||||||
|
func (d *Database) GetThumbnails(
|
||||||
|
ctx context.Context, mediaID types.MediaID, mediaOrigin gomatrixserverlib.ServerName,
|
||||||
|
) ([]*types.ThumbnailMetadata, error) {
|
||||||
|
thumbnails, err := d.statements.thumbnail.selectThumbnails(ctx, mediaID, mediaOrigin)
|
||||||
|
if err != nil && err == sql.ErrNoRows {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return thumbnails, err
|
||||||
|
}
|
||||||
162
mediaapi/storage/sqlite3/thumbnail_table.go
Normal file
162
mediaapi/storage/sqlite3/thumbnail_table.go
Normal file
|
|
@ -0,0 +1,162 @@
|
||||||
|
// Copyright 2017-2018 New Vector Ltd
|
||||||
|
// Copyright 2019-2020 The Matrix.org Foundation C.I.C.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package sqlite3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/matrix-org/dendrite/mediaapi/types"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
const thumbnailSchema = `
|
||||||
|
-- The mediaapi_thumbnail table holds metadata for each thumbnail file stored and accessible to the local server,
|
||||||
|
-- the actual file is stored separately.
|
||||||
|
CREATE TABLE IF NOT EXISTS mediaapi_thumbnail (
|
||||||
|
media_id TEXT NOT NULL,
|
||||||
|
media_origin TEXT NOT NULL,
|
||||||
|
content_type TEXT NOT NULL,
|
||||||
|
file_size_bytes INTEGER NOT NULL,
|
||||||
|
creation_ts INTEGER NOT NULL,
|
||||||
|
width INTEGER NOT NULL,
|
||||||
|
height INTEGER NOT NULL,
|
||||||
|
resize_method TEXT NOT NULL
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS mediaapi_thumbnail_index ON mediaapi_thumbnail (media_id, media_origin, width, height, resize_method);
|
||||||
|
`
|
||||||
|
|
||||||
|
const insertThumbnailSQL = `
|
||||||
|
INSERT INTO mediaapi_thumbnail (media_id, media_origin, content_type, file_size_bytes, creation_ts, width, height, resize_method)
|
||||||
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
||||||
|
`
|
||||||
|
|
||||||
|
// Note: this selects one specific thumbnail
|
||||||
|
const selectThumbnailSQL = `
|
||||||
|
SELECT content_type, file_size_bytes, creation_ts FROM mediaapi_thumbnail WHERE media_id = $1 AND media_origin = $2 AND width = $3 AND height = $4 AND resize_method = $5
|
||||||
|
`
|
||||||
|
|
||||||
|
// Note: this selects all thumbnails for a media_origin and media_id
|
||||||
|
const selectThumbnailsSQL = `
|
||||||
|
SELECT content_type, file_size_bytes, creation_ts, width, height, resize_method FROM mediaapi_thumbnail WHERE media_id = $1 AND media_origin = $2
|
||||||
|
`
|
||||||
|
|
||||||
|
type thumbnailStatements struct {
|
||||||
|
insertThumbnailStmt *sql.Stmt
|
||||||
|
selectThumbnailStmt *sql.Stmt
|
||||||
|
selectThumbnailsStmt *sql.Stmt
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *thumbnailStatements) prepare(db *sql.DB) (err error) {
|
||||||
|
_, err = db.Exec(thumbnailSchema)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return statementList{
|
||||||
|
{&s.insertThumbnailStmt, insertThumbnailSQL},
|
||||||
|
{&s.selectThumbnailStmt, selectThumbnailSQL},
|
||||||
|
{&s.selectThumbnailsStmt, selectThumbnailsSQL},
|
||||||
|
}.prepare(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *thumbnailStatements) insertThumbnail(
|
||||||
|
ctx context.Context, thumbnailMetadata *types.ThumbnailMetadata,
|
||||||
|
) error {
|
||||||
|
thumbnailMetadata.MediaMetadata.CreationTimestamp = types.UnixMs(time.Now().UnixNano() / 1000000)
|
||||||
|
_, err := s.insertThumbnailStmt.ExecContext(
|
||||||
|
ctx,
|
||||||
|
thumbnailMetadata.MediaMetadata.MediaID,
|
||||||
|
thumbnailMetadata.MediaMetadata.Origin,
|
||||||
|
thumbnailMetadata.MediaMetadata.ContentType,
|
||||||
|
thumbnailMetadata.MediaMetadata.FileSizeBytes,
|
||||||
|
thumbnailMetadata.MediaMetadata.CreationTimestamp,
|
||||||
|
thumbnailMetadata.ThumbnailSize.Width,
|
||||||
|
thumbnailMetadata.ThumbnailSize.Height,
|
||||||
|
thumbnailMetadata.ThumbnailSize.ResizeMethod,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *thumbnailStatements) selectThumbnail(
|
||||||
|
ctx context.Context,
|
||||||
|
mediaID types.MediaID,
|
||||||
|
mediaOrigin gomatrixserverlib.ServerName,
|
||||||
|
width, height int,
|
||||||
|
resizeMethod string,
|
||||||
|
) (*types.ThumbnailMetadata, error) {
|
||||||
|
thumbnailMetadata := types.ThumbnailMetadata{
|
||||||
|
MediaMetadata: &types.MediaMetadata{
|
||||||
|
MediaID: mediaID,
|
||||||
|
Origin: mediaOrigin,
|
||||||
|
},
|
||||||
|
ThumbnailSize: types.ThumbnailSize{
|
||||||
|
Width: width,
|
||||||
|
Height: height,
|
||||||
|
ResizeMethod: resizeMethod,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
err := s.selectThumbnailStmt.QueryRowContext(
|
||||||
|
ctx,
|
||||||
|
thumbnailMetadata.MediaMetadata.MediaID,
|
||||||
|
thumbnailMetadata.MediaMetadata.Origin,
|
||||||
|
thumbnailMetadata.ThumbnailSize.Width,
|
||||||
|
thumbnailMetadata.ThumbnailSize.Height,
|
||||||
|
thumbnailMetadata.ThumbnailSize.ResizeMethod,
|
||||||
|
).Scan(
|
||||||
|
&thumbnailMetadata.MediaMetadata.ContentType,
|
||||||
|
&thumbnailMetadata.MediaMetadata.FileSizeBytes,
|
||||||
|
&thumbnailMetadata.MediaMetadata.CreationTimestamp,
|
||||||
|
)
|
||||||
|
return &thumbnailMetadata, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *thumbnailStatements) selectThumbnails(
|
||||||
|
ctx context.Context, mediaID types.MediaID, mediaOrigin gomatrixserverlib.ServerName,
|
||||||
|
) ([]*types.ThumbnailMetadata, error) {
|
||||||
|
rows, err := s.selectThumbnailsStmt.QueryContext(
|
||||||
|
ctx, mediaID, mediaOrigin,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close() // nolint: errcheck
|
||||||
|
|
||||||
|
var thumbnails []*types.ThumbnailMetadata
|
||||||
|
for rows.Next() {
|
||||||
|
thumbnailMetadata := types.ThumbnailMetadata{
|
||||||
|
MediaMetadata: &types.MediaMetadata{
|
||||||
|
MediaID: mediaID,
|
||||||
|
Origin: mediaOrigin,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
err = rows.Scan(
|
||||||
|
&thumbnailMetadata.MediaMetadata.ContentType,
|
||||||
|
&thumbnailMetadata.MediaMetadata.FileSizeBytes,
|
||||||
|
&thumbnailMetadata.MediaMetadata.CreationTimestamp,
|
||||||
|
&thumbnailMetadata.ThumbnailSize.Width,
|
||||||
|
&thumbnailMetadata.ThumbnailSize.Height,
|
||||||
|
&thumbnailMetadata.ThumbnailSize.ResizeMethod,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
thumbnails = append(thumbnails, &thumbnailMetadata)
|
||||||
|
}
|
||||||
|
|
||||||
|
return thumbnails, rows.Err()
|
||||||
|
}
|
||||||
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/matrix-org/dendrite/mediaapi/storage/postgres"
|
"github.com/matrix-org/dendrite/mediaapi/storage/postgres"
|
||||||
|
"github.com/matrix-org/dendrite/mediaapi/storage/sqlite3"
|
||||||
"github.com/matrix-org/dendrite/mediaapi/types"
|
"github.com/matrix-org/dendrite/mediaapi/types"
|
||||||
"github.com/matrix-org/gomatrixserverlib"
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
)
|
)
|
||||||
|
|
@ -40,6 +41,8 @@ func Open(dataSourceName string) (Database, error) {
|
||||||
switch uri.Scheme {
|
switch uri.Scheme {
|
||||||
case "postgres":
|
case "postgres":
|
||||||
return postgres.Open(dataSourceName)
|
return postgres.Open(dataSourceName)
|
||||||
|
case "file":
|
||||||
|
return sqlite3.Open(dataSourceName)
|
||||||
default:
|
default:
|
||||||
return postgres.Open(dataSourceName)
|
return postgres.Open(dataSourceName)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue