/internal/database/sqlite3.go

https://github.com/lighttiger2505/sqls · Go · 144 lines · 127 code · 17 blank · 0 comment · 22 complexity · ce3971d14edf038ff262c7d87e3a97d8 MD5 · raw file

  1. package database
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "log"
  7. _ "github.com/mattn/go-sqlite3"
  8. )
  9. func init() {
  10. RegisterOpen("sqlite3", sqlite3Open)
  11. RegisterFactory("sqlite3", NewSQLite3DBRepository)
  12. }
  13. func sqlite3Open(connCfg *DBConfig) (*DBConnection, error) {
  14. conn, err := sql.Open("sqlite3", connCfg.DataSourceName)
  15. if err != nil {
  16. return nil, err
  17. }
  18. conn.SetMaxIdleConns(DefaultMaxIdleConns)
  19. conn.SetMaxOpenConns(DefaultMaxOpenConns)
  20. return &DBConnection{
  21. Conn: conn,
  22. }, nil
  23. }
  24. type SQLite3DBRepository struct {
  25. Conn *sql.DB
  26. }
  27. func NewSQLite3DBRepository(conn *sql.DB) DBRepository {
  28. return &SQLite3DBRepository{Conn: conn}
  29. }
  30. func (db *SQLite3DBRepository) CurrentDatabase(ctx context.Context) (string, error) {
  31. return "", nil
  32. }
  33. func (db *SQLite3DBRepository) Databases(ctx context.Context) ([]string, error) {
  34. return []string{}, nil
  35. }
  36. func (db *SQLite3DBRepository) CurrentSchema(ctx context.Context) (string, error) {
  37. return db.CurrentDatabase(ctx)
  38. }
  39. func (db *SQLite3DBRepository) Schemas(ctx context.Context) ([]string, error) {
  40. return db.Databases(ctx)
  41. }
  42. func (db *SQLite3DBRepository) SchemaTables(ctx context.Context) (map[string][]string, error) {
  43. tables, err := db.Tables(ctx)
  44. if err != nil {
  45. return nil, err
  46. }
  47. return map[string][]string{"": tables}, nil
  48. }
  49. func (db *SQLite3DBRepository) Tables(ctx context.Context) ([]string, error) {
  50. rows, err := db.Conn.QueryContext(ctx, `
  51. SELECT
  52. name
  53. FROM
  54. sqlite_master
  55. WHERE
  56. type = 'table'
  57. ORDER BY
  58. name
  59. `)
  60. if err != nil {
  61. log.Fatal(err)
  62. }
  63. tables := []string{}
  64. for rows.Next() {
  65. var table string
  66. if err := rows.Scan(&table); err != nil {
  67. return nil, err
  68. }
  69. tables = append(tables, table)
  70. }
  71. return tables, nil
  72. }
  73. func (db *SQLite3DBRepository) describeTable(ctx context.Context, tableName string) ([]*ColumnDesc, error) {
  74. rows, err := db.Conn.QueryContext(ctx, fmt.Sprintf("PRAGMA table_info(%s);", tableName))
  75. if err != nil {
  76. log.Fatal(err)
  77. }
  78. tableInfos := []*ColumnDesc{}
  79. for rows.Next() {
  80. var id int
  81. var nonnull int
  82. var tableInfo ColumnDesc
  83. err := rows.Scan(
  84. &id,
  85. &tableInfo.Name,
  86. &tableInfo.Type,
  87. &nonnull,
  88. &tableInfo.Default,
  89. &tableInfo.Key,
  90. )
  91. if err != nil {
  92. return nil, err
  93. }
  94. tableInfo.Table = tableName
  95. if nonnull != 0 {
  96. tableInfo.Null = "NO"
  97. } else {
  98. tableInfo.Null = "YES"
  99. }
  100. tableInfos = append(tableInfos, &tableInfo)
  101. }
  102. return tableInfos, nil
  103. }
  104. func (db *SQLite3DBRepository) DescribeDatabaseTable(ctx context.Context) ([]*ColumnDesc, error) {
  105. tables, err := db.Tables(ctx)
  106. if err != nil {
  107. return nil, err
  108. }
  109. all := []*ColumnDesc{}
  110. for _, table := range tables {
  111. descs, err := db.describeTable(ctx, table)
  112. if err != nil {
  113. return nil, err
  114. }
  115. all = append(all, descs...)
  116. }
  117. return all, nil
  118. }
  119. func (db *SQLite3DBRepository) DescribeDatabaseTableBySchema(ctx context.Context, schemaName string) ([]*ColumnDesc, error) {
  120. return db.DescribeDatabaseTable(ctx)
  121. }
  122. func (db *SQLite3DBRepository) Exec(ctx context.Context, query string) (sql.Result, error) {
  123. return db.Conn.ExecContext(ctx, query)
  124. }
  125. func (db *SQLite3DBRepository) Query(ctx context.Context, query string) (*sql.Rows, error) {
  126. return db.Conn.QueryContext(ctx, query)
  127. }