From 1fbd568dfe33785c803b248ed687de0ba7517c6e Mon Sep 17 00:00:00 2001 From: Athurg Gooth Date: Sun, 8 Oct 2023 18:29:03 +0800 Subject: [PATCH] fix: create resource without some attributes (#2354) --- store/db/mysql/resource.go | 42 ++++++++++++++++++++--------- store/db/sqlite/resource.go | 54 ++++++++++++++++++++----------------- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/store/db/mysql/resource.go b/store/db/mysql/resource.go index 4383360a..501a0f39 100644 --- a/store/db/mysql/resource.go +++ b/store/db/mysql/resource.go @@ -12,18 +12,36 @@ import ( ) func (d *DB) CreateResource(ctx context.Context, create *store.Resource) (*store.Resource, error) { - stmt := "INSERT INTO `resource` (`filename`, `blob`, `external_link`, `type`, `size`, `creator_id`, `internal_path`) VALUES (?, ?, ?, ?, ?, ?, ?)" - result, err := d.db.ExecContext( - ctx, - stmt, - create.Filename, - create.Blob, - create.ExternalLink, - create.Type, - create.Size, - create.CreatorID, - create.InternalPath, - ) + fields := []string{"`filename`", "`blob`", "`external_link`", "`type`", "`size`", "`creator_id`", "`internal_path`"} + placeholder := []string{"?", "?", "?", "?", "?", "?", "?"} + args := []any{create.Filename, create.Blob, create.ExternalLink, create.Type, create.Size, create.CreatorID, create.InternalPath} + + if create.ID != 0 { + fields = append(fields, "`id`") + placeholder = append(placeholder, "?") + args = append(args, create.ID) + } + + if create.CreatedTs != 0 { + fields = append(fields, "`created_ts`") + placeholder = append(placeholder, "FROM_UNIXTIME(?)") + args = append(args, create.CreatedTs) + } + + if create.UpdatedTs != 0 { + fields = append(fields, "`updated_ts`") + placeholder = append(placeholder, "FROM_UNIXTIME(?)") + args = append(args, create.UpdatedTs) + } + + if create.MemoID != nil { + fields = append(fields, "`memo_id`") + placeholder = append(placeholder, "?") + args = append(args, *create.MemoID) + } + + stmt := "INSERT INTO `resource` (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ")" + result, err := d.db.ExecContext(ctx, stmt, args...) if err != nil { return nil, err } diff --git a/store/db/sqlite/resource.go b/store/db/sqlite/resource.go index b922dca8..945de31e 100644 --- a/store/db/sqlite/resource.go +++ b/store/db/sqlite/resource.go @@ -10,30 +10,36 @@ import ( ) func (d *DB) CreateResource(ctx context.Context, create *store.Resource) (*store.Resource, error) { - stmt := ` - INSERT INTO resource ( - filename, - blob, - external_link, - type, - size, - creator_id, - internal_path - ) - VALUES (?, ?, ?, ?, ?, ?, ?) - RETURNING id, created_ts, updated_ts - ` - if err := d.db.QueryRowContext( - ctx, - stmt, - create.Filename, - create.Blob, - create.ExternalLink, - create.Type, - create.Size, - create.CreatorID, - create.InternalPath, - ).Scan(&create.ID, &create.CreatedTs, &create.UpdatedTs); err != nil { + fields := []string{"`filename`", "`blob`", "`external_link`", "`type`", "`size`", "`creator_id`", "`internal_path`"} + placeholder := []string{"?", "?", "?", "?", "?", "?", "?"} + args := []any{create.Filename, create.Blob, create.ExternalLink, create.Type, create.Size, create.CreatorID, create.InternalPath} + + if create.ID != 0 { + fields = append(fields, "`id`") + placeholder = append(placeholder, "?") + args = append(args, create.ID) + } + + if create.CreatedTs != 0 { + fields = append(fields, "`created_ts`") + placeholder = append(placeholder, "?") + args = append(args, create.CreatedTs) + } + + if create.UpdatedTs != 0 { + fields = append(fields, "`updated_ts`") + placeholder = append(placeholder, "?") + args = append(args, create.UpdatedTs) + } + + if create.MemoID != nil { + fields = append(fields, "`memo_id`") + placeholder = append(placeholder, "?") + args = append(args, *create.MemoID) + } + + stmt := "INSERT INTO `resource` (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ") RETURNING `id`, `created_ts`, `updated_ts`" + if err := d.db.QueryRowContext(ctx, stmt, args...).Scan(&create.ID, &create.CreatedTs, &create.UpdatedTs); err != nil { return nil, err }