From 763b8f693363ed611f04b41e202d7e661c9bd48b Mon Sep 17 00:00:00 2001 From: Dmitri Dolguikh Date: Mon, 10 Aug 2026 15:55:24 +0200 Subject: [PATCH] support for GetDomains in sqlite Signed-off-by: Dmitri Dolguikh --- .../network_map_db/pgsql/domain_test.go | 5 --- .../network_map_db/sqlite/account_setting.go | 8 +--- .../internals/network_map_db/sqlite/dns.go | 12 ++---- .../internals/network_map_db/sqlite/domain.go | 24 +++++++++++ .../network_map_db/sqlite/sqlite_store.go | 3 -- .../network_map_db/struct_helpers.go | 40 +++++++++++++++++++ 6 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 management/internals/network_map_db/sqlite/domain.go diff --git a/integration_tests/management/network_map_db/pgsql/domain_test.go b/integration_tests/management/network_map_db/pgsql/domain_test.go index 2e8184abf..8434a76c3 100644 --- a/integration_tests/management/network_map_db/pgsql/domain_test.go +++ b/integration_tests/management/network_map_db/pgsql/domain_test.go @@ -8,15 +8,10 @@ import ( "testing" networkmapdb "github.com/netbirdio/netbird/management/internals/network_map_db" - "github.com/netbirdio/netbird/management/server/types" "github.com/stretchr/testify/assert" ) func TestGetDomains(t *testing.T) { - if engine == string(types.SqliteStoreEngine) { - t.Skip() - } - ctx := context.TODO() execQuery(t, ctx, diff --git a/management/internals/network_map_db/sqlite/account_setting.go b/management/internals/network_map_db/sqlite/account_setting.go index 8653da137..ff645a005 100644 --- a/management/internals/network_map_db/sqlite/account_setting.go +++ b/management/internals/network_map_db/sqlite/account_setting.go @@ -32,14 +32,8 @@ func (sc *SqliteStoreConn) GetAccountSettings(ctx context.Context, accountId str if err != nil { return nmdata.AccountSettingsInfo{}, err } - defer rows.Close() - rows.Next() - a := account{} - err = rows.Scan(networkmapdb.StructFields(&a)...) - if err != nil { - return nmdata.AccountSettingsInfo{}, err - } + a, err := networkmapdb.CollectOneRowForSqlite[account](rows) settingsInfo := nmdata.AccountSettingsInfo{} err = networkmapdb.FromSqlTypesToSharedTypes(reflect.ValueOf(&a), reflect.ValueOf(&settingsInfo)) diff --git a/management/internals/network_map_db/sqlite/dns.go b/management/internals/network_map_db/sqlite/dns.go index 0fc1d6ad2..4dffd9f92 100644 --- a/management/internals/network_map_db/sqlite/dns.go +++ b/management/internals/network_map_db/sqlite/dns.go @@ -22,16 +22,10 @@ func (sc *SqliteStoreConn) GetAppliedZoneCandidates(ctx context.Context, account if err != nil { return nil, err } - defer rows.Close() - zones := make([]networkmapdb.Zone, 0) - for rows.Next() { - z := networkmapdb.Zone{} - err := rows.Scan(networkmapdb.StructFields(&z)...) - if err != nil { - return nil, err - } - zones = append(zones, z) + zones, err := networkmapdb.CollectRowsForSqlite[networkmapdb.Zone](rows) + if err != nil { + return nil, err } return networkmapdb.ZonesToAppliedZoneCandidates(zones) diff --git a/management/internals/network_map_db/sqlite/domain.go b/management/internals/network_map_db/sqlite/domain.go new file mode 100644 index 000000000..241219a4a --- /dev/null +++ b/management/internals/network_map_db/sqlite/domain.go @@ -0,0 +1,24 @@ +package networkmap_sqlite + +import ( + "context" + + networkmapdb "github.com/netbirdio/netbird/management/internals/network_map_db" +) + +const ( + GetDomainsQuery = ` + select domain, target_cluster + from domains + where account_id=$1 and domain<>'' and target_cluster<>'' + ` +) + +func (sc *SqliteStoreConn) GetDomains(ctx context.Context, accountId string) ([]networkmapdb.Domain, error) { + rows, err := sc.Conn.QueryContext(ctx, GetDomainsQuery, accountId) + if err != nil { + return nil, err + } + + return networkmapdb.CollectRowsForSqlite[networkmapdb.Domain](rows) +} diff --git a/management/internals/network_map_db/sqlite/sqlite_store.go b/management/internals/network_map_db/sqlite/sqlite_store.go index 7eaa5af4f..549b3459c 100644 --- a/management/internals/network_map_db/sqlite/sqlite_store.go +++ b/management/internals/network_map_db/sqlite/sqlite_store.go @@ -85,9 +85,6 @@ func (s *SqliteStore) UsingConn() *SqliteStoreConn { func (s *SqliteStoreConn) GetGroups(ctx context.Context, accountId string) ([]nmdata.Group, map[string]map[string]any, error) { return nil, nil, nil } -func (s *SqliteStoreConn) GetDomains(ctx context.Context, accountId string) ([]networkmapdb.Domain, error) { - return nil, nil -} func (s *SqliteStoreConn) GetPeers(ctx context.Context, accountId string) ([]nmdata.Peer, map[string][]*nmdata.Peer, error) { return nil, nil, nil } diff --git a/management/internals/network_map_db/struct_helpers.go b/management/internals/network_map_db/struct_helpers.go index 5f67bc8e3..169b184b5 100644 --- a/management/internals/network_map_db/struct_helpers.go +++ b/management/internals/network_map_db/struct_helpers.go @@ -10,6 +10,8 @@ import ( "github.com/rs/xid" ) +var ErrNoRows = errors.New("no rows in result set") + const ( NMAP_STRUCT_TAG = "nmap" NMAP_SKIP = "skip" @@ -139,3 +141,41 @@ func StructFields(s any) []any { return toret } + +func CollectOneRowForSqlite[T any](rows *sql.Rows) (T, error) { + defer rows.Close() + var r T + + if !rows.Next() { + if err := rows.Err(); err != nil { + return r, err + } + return r, ErrNoRows + } + err := rows.Scan(StructFields(&r)...) + if err != nil { + return r, err + } + + return r, nil +} + +func CollectRowsForSqlite[T any](rows *sql.Rows) ([]T, error) { + defer rows.Close() + toret := make([]T, 0) + + for rows.Next() { + var r T + err := rows.Scan(StructFields(&r)...) + if err != nil { + return nil, err + } + toret = append(toret, r) + } + + if err := rows.Err(); err != nil { + return nil, err + } + + return toret, nil +}