Move to own sql abstraction on top of jmoiron/sqlx

This commit is contained in:
2022-12-07 22:11:44 +01:00
parent d27e3d9a91
commit 8db0fa37db
34 changed files with 584 additions and 265 deletions

View File

@@ -1,8 +1,7 @@
package models
import (
"database/sql"
"github.com/blockloop/scan"
"github.com/jmoiron/sqlx"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"time"
)
@@ -38,7 +37,7 @@ type ChannelJSON struct {
SubscribeKey *string `json:"subscribe_key"` // can be nil, depending on endpoint
SendKey *string `json:"send_key"` // can be nil, depending on endpoint
TimestampCreated string `json:"timestamp_created"`
TimestampLastSent *string `json:"timestamp_last_sent"`
TimestampLastSent *string `json:"timestamp_lastsent"`
MessagesSent int `json:"messages_sent"`
}
@@ -49,8 +48,8 @@ type ChannelDB struct {
SubscribeKey string `db:"subscribe_key"`
SendKey string `db:"send_key"`
TimestampCreated int64 `db:"timestamp_created"`
TimestampLastRead *int64 `db:"timestamp_last_read"`
TimestampLastSent *int64 `db:"timestamp_last_sent"`
TimestampLastRead *int64 `db:"timestamp_lastread"`
TimestampLastSent *int64 `db:"timestamp_lastsent"`
MessagesSent int `db:"messages_sent"`
}
@@ -67,18 +66,16 @@ func (c ChannelDB) Model() Channel {
}
}
func DecodeChannel(r *sql.Rows) (Channel, error) {
var data ChannelDB
err := scan.RowStrict(&data, r)
func DecodeChannel(r *sqlx.Rows) (Channel, error) {
data, err := scanSingle[ChannelDB](r)
if err != nil {
return Channel{}, err
}
return data.Model(), nil
}
func DecodeChannels(r *sql.Rows) ([]Channel, error) {
var data []ChannelDB
err := scan.RowsStrict(&data, r)
func DecodeChannels(r *sqlx.Rows) ([]Channel, error) {
data, err := scanAll[ChannelDB](r)
if err != nil {
return nil, err
}

View File

@@ -1,8 +1,7 @@
package models
import (
"database/sql"
"github.com/blockloop/scan"
"github.com/jmoiron/sqlx"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"time"
)
@@ -68,18 +67,16 @@ func (c ClientDB) Model() Client {
}
}
func DecodeClient(r *sql.Rows) (Client, error) {
var data ClientDB
err := scan.RowStrict(&data, r)
func DecodeClient(r *sqlx.Rows) (Client, error) {
data, err := scanSingle[ClientDB](r)
if err != nil {
return Client{}, err
}
return data.Model(), nil
}
func DecodeClients(r *sql.Rows) ([]Client, error) {
var data []ClientDB
err := scan.RowsStrict(&data, r)
func DecodeClients(r *sqlx.Rows) ([]Client, error) {
data, err := scanAll[ClientDB](r)
if err != nil {
return nil, err
}

View File

@@ -1,8 +1,7 @@
package models
import (
"database/sql"
"github.com/blockloop/scan"
"github.com/jmoiron/sqlx"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"time"
)
@@ -88,18 +87,16 @@ func (d DeliveryDB) Model() Delivery {
}
}
func DecodeDelivery(r *sql.Rows) (Delivery, error) {
var data DeliveryDB
err := scan.RowStrict(&data, r)
func DecodeDelivery(r *sqlx.Rows) (Delivery, error) {
data, err := scanSingle[DeliveryDB](r)
if err != nil {
return Delivery{}, err
}
return data.Model(), nil
}
func DecodeDeliveries(r *sql.Rows) ([]Delivery, error) {
var data []DeliveryDB
err := scan.RowsStrict(&data, r)
func DecodeDeliveries(r *sqlx.Rows) ([]Delivery, error) {
data, err := scanAll[DeliveryDB](r)
if err != nil {
return nil, err
}

View File

@@ -1,8 +1,7 @@
package models
import (
"database/sql"
"github.com/blockloop/scan"
"github.com/jmoiron/sqlx"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"time"
)
@@ -142,18 +141,16 @@ func (m MessageDB) Model() Message {
}
}
func DecodeMessage(r *sql.Rows) (Message, error) {
var data MessageDB
err := scan.RowStrict(&data, r)
func DecodeMessage(r *sqlx.Rows) (Message, error) {
data, err := scanSingle[MessageDB](r)
if err != nil {
return Message{}, err
}
return data.Model(), nil
}
func DecodeMessages(r *sql.Rows) ([]Message, error) {
var data []MessageDB
err := scan.RowsStrict(&data, r)
func DecodeMessages(r *sqlx.Rows) ([]Message, error) {
data, err := scanAll[MessageDB](r)
if err != nil {
return nil, err
}

View File

@@ -1,8 +1,7 @@
package models
import (
"database/sql"
"github.com/blockloop/scan"
"github.com/jmoiron/sqlx"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"time"
)
@@ -61,18 +60,16 @@ func (s SubscriptionDB) Model() Subscription {
}
}
func DecodeSubscription(r *sql.Rows) (Subscription, error) {
var data SubscriptionDB
err := scan.RowStrict(&data, r)
func DecodeSubscription(r *sqlx.Rows) (Subscription, error) {
data, err := scanSingle[SubscriptionDB](r)
if err != nil {
return Subscription{}, err
}
return data.Model(), nil
}
func DecodeSubscriptions(r *sql.Rows) ([]Subscription, error) {
var data []SubscriptionDB
err := scan.RowsStrict(&data, r)
func DecodeSubscriptions(r *sqlx.Rows) ([]Subscription, error) {
data, err := scanAll[SubscriptionDB](r)
if err != nil {
return nil, err
}

View File

@@ -2,8 +2,7 @@ package models
import (
scn "blackforestbytes.com/simplecloudnotifier"
"database/sql"
"github.com/blockloop/scan"
"github.com/jmoiron/sqlx"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"time"
)
@@ -113,8 +112,8 @@ type UserJSON struct {
SendKey string `json:"send_key"`
AdminKey string `json:"admin_key"`
TimestampCreated string `json:"timestamp_created"`
TimestampLastRead *string `json:"timestamp_last_read"`
TimestampLastSent *string `json:"timestamp_last_sent"`
TimestampLastRead *string `json:"timestamp_lastread"`
TimestampLastSent *string `json:"timestamp_lastsent"`
MessagesSent int `json:"messages_sent"`
QuotaUsed int `json:"quota_used"`
QuotaUsedDay *string `json:"quota_used_day"`
@@ -160,18 +159,16 @@ func (u UserDB) Model() User {
}
}
func DecodeUser(r *sql.Rows) (User, error) {
var data UserDB
err := scan.RowStrict(&data, r)
func DecodeUser(r *sqlx.Rows) (User, error) {
data, err := scanSingle[UserDB](r)
if err != nil {
return User{}, err
}
return data.Model(), nil
}
func DecodeUsers(r *sql.Rows) ([]User, error) {
var data []UserDB
err := scan.RowsStrict(&data, r)
func DecodeUsers(r *sqlx.Rows) ([]User, error) {
data, err := scanAll[UserDB](r)
if err != nil {
return nil, err
}

View File

@@ -1,6 +1,9 @@
package models
import (
"database/sql"
"errors"
"github.com/jmoiron/sqlx"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"time"
)
@@ -19,3 +22,32 @@ func timeOptFromMilli(millis *int64) *time.Time {
}
return langext.Ptr(time.UnixMilli(*millis))
}
func scanSingle[TData any](rows *sqlx.Rows) (TData, error) {
if rows.Next() {
var data TData
err := rows.StructScan(&data)
if err != nil {
return *new(TData), err
}
if rows.Next() {
return *new(TData), errors.New("sql returned more than onw row")
}
return data, nil
} else {
return *new(TData), sql.ErrNoRows
}
}
func scanAll[TData any](rows *sqlx.Rows) ([]TData, error) {
res := make([]TData, 0)
for rows.Next() {
var data TData
err := rows.StructScan(&data)
if err != nil {
return nil, err
}
res = append(res, data)
}
return res, nil
}