From 98dfce2ae587ebd9b2a2064f457af464e19b9ded Mon Sep 17 00:00:00 2001 From: Yosyp Buchma Date: Mon, 18 Sep 2023 17:35:58 +0300 Subject: [PATCH] Concurrent GetTableColumnsMetaData for MySQL --- generator/mysql/query_set.go | 39 ++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/generator/mysql/query_set.go b/generator/mysql/query_set.go index 442b74b..95d6a93 100644 --- a/generator/mysql/query_set.go +++ b/generator/mysql/query_set.go @@ -4,7 +4,9 @@ import ( "context" "database/sql" "fmt" + "runtime" "strings" + "sync" "github.com/go-jet/jet/v2/generator/metadata" "github.com/go-jet/jet/v2/qrm" @@ -27,11 +29,40 @@ ORDER BY table_name; return nil, fmt.Errorf("failed to query %s metadata result: %w", tableType, err) } + tblChan := make(chan int, len(tables)) + errChan := make(chan error, 1) + + wg := sync.WaitGroup{} + for i := 0; i < runtime.NumCPU(); i++ { + wg.Add(1) + go func() { + defer wg.Done() + var err1 error + for tblIdx := range tblChan { + tables[tblIdx].Columns, err1 = m.GetTableColumnsMetaData(db, schemaName, tables[tblIdx].Name) + if err1 != nil { + select { + case errChan <- fmt.Errorf("failed to get '%s' table columns metadata: %w", tables[tblIdx].Name, err1): + return + default: + } + return + } + } + }() + } + for i := range tables { - tables[i].Columns, err = m.GetTableColumnsMetaData(db, schemaName, tables[i].Name) - if err != nil { - return nil, fmt.Errorf("failed to get '%s' table columns metadata: %w", tables[i].Name, err) - } + tblChan <- i + } + + close(tblChan) + wg.Wait() + + select { + case err = <-errChan: + return nil, err + default: } return tables, nil