2026-03-07 19:27:44 +08:00
|
|
|
package stardb
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-20 13:36:59 +08:00
|
|
|
internalconv "b612.me/stardb/internal/convert"
|
|
|
|
|
"database/sql"
|
2026-03-07 19:27:44 +08:00
|
|
|
)
|
|
|
|
|
|
2026-03-20 13:36:59 +08:00
|
|
|
func (r *StarResult) getColumnValue(name string) (interface{}, error) {
|
|
|
|
|
if r == nil || r.columnIndex == nil {
|
|
|
|
|
return nil, wrapColumnNotFound(name)
|
|
|
|
|
}
|
2026-03-07 19:27:44 +08:00
|
|
|
index, ok := r.columnIndex[name]
|
|
|
|
|
if !ok {
|
2026-03-20 13:36:59 +08:00
|
|
|
return nil, wrapColumnNotFound(name)
|
|
|
|
|
}
|
|
|
|
|
return r.Result()[index], nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetString returns column value as string with error
|
|
|
|
|
func (r *StarResult) GetString(name string) (string, error) {
|
|
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return "", err
|
2026-03-07 19:27:44 +08:00
|
|
|
}
|
2026-03-20 13:36:59 +08:00
|
|
|
return ConvertToStringSafe(val)
|
2026-03-07 19:27:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetInt64 returns column value as int64 with error
|
|
|
|
|
func (r *StarResult) GetInt64(name string) (int64, error) {
|
2026-03-20 13:36:59 +08:00
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
2026-03-07 19:27:44 +08:00
|
|
|
}
|
2026-03-20 13:36:59 +08:00
|
|
|
return ConvertToInt64Safe(val)
|
2026-03-07 19:27:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetFloat64 returns column value as float64 with error
|
|
|
|
|
func (r *StarResult) GetFloat64(name string) (float64, error) {
|
2026-03-20 13:36:59 +08:00
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
return internalconv.ToFloat64Safe(val)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetNullString returns a nullable string value.
|
|
|
|
|
func (r *StarResult) GetNullString(name string) (sql.NullString, error) {
|
|
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullString{}, err
|
|
|
|
|
}
|
|
|
|
|
if val == nil {
|
|
|
|
|
return sql.NullString{}, nil
|
|
|
|
|
}
|
|
|
|
|
str, err := ConvertToStringSafe(val)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullString{}, err
|
|
|
|
|
}
|
|
|
|
|
return sql.NullString{String: str, Valid: true}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetNullInt64 returns a nullable int64 value.
|
|
|
|
|
func (r *StarResult) GetNullInt64(name string) (sql.NullInt64, error) {
|
|
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullInt64{}, err
|
|
|
|
|
}
|
|
|
|
|
if val == nil {
|
|
|
|
|
return sql.NullInt64{}, nil
|
|
|
|
|
}
|
|
|
|
|
i, err := ConvertToInt64Safe(val)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullInt64{}, err
|
|
|
|
|
}
|
|
|
|
|
return sql.NullInt64{Int64: i, Valid: true}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetNullFloat64 returns a nullable float64 value.
|
|
|
|
|
func (r *StarResult) GetNullFloat64(name string) (sql.NullFloat64, error) {
|
|
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullFloat64{}, err
|
|
|
|
|
}
|
|
|
|
|
if val == nil {
|
|
|
|
|
return sql.NullFloat64{}, nil
|
|
|
|
|
}
|
|
|
|
|
f, err := internalconv.ToFloat64Safe(val)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullFloat64{}, err
|
|
|
|
|
}
|
|
|
|
|
return sql.NullFloat64{Float64: f, Valid: true}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetNullBool returns a nullable bool value.
|
|
|
|
|
func (r *StarResult) GetNullBool(name string) (sql.NullBool, error) {
|
|
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullBool{}, err
|
|
|
|
|
}
|
|
|
|
|
if val == nil {
|
|
|
|
|
return sql.NullBool{}, nil
|
|
|
|
|
}
|
|
|
|
|
b, err := internalconv.ToBoolSafe(val)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullBool{}, err
|
|
|
|
|
}
|
|
|
|
|
return sql.NullBool{Bool: b, Valid: true}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetNullTime returns a nullable time value.
|
|
|
|
|
func (r *StarResult) GetNullTime(name string) (sql.NullTime, error) {
|
|
|
|
|
val, err := r.getColumnValue(name)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullTime{}, err
|
|
|
|
|
}
|
|
|
|
|
if val == nil {
|
|
|
|
|
return sql.NullTime{}, nil
|
|
|
|
|
}
|
|
|
|
|
t, err := internalconv.ToTimeSafe(val)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return sql.NullTime{}, err
|
2026-03-07 19:27:44 +08:00
|
|
|
}
|
2026-03-20 13:36:59 +08:00
|
|
|
return sql.NullTime{Time: t, Valid: true}, nil
|
2026-03-07 19:27:44 +08:00
|
|
|
}
|