diff --git a/bin/templates/pkg/db/crud/crud.go_ b/bin/templates/pkg/db/crud/crud.go_ index 303b13e..1ad41a7 100644 --- a/bin/templates/pkg/db/crud/crud.go_ +++ b/bin/templates/pkg/db/crud/crud.go_ @@ -48,6 +48,9 @@ func (crud Crud_DB) Read_ctx(ctx context.Context, m *lawsuit_status_types.Lawsui tx := db.First(m, id) err = tx.Error + if err != nil { + err = fmt.Errorf("Read() id: %v, error: %v", m.id, err) + } return err } @@ -192,6 +195,9 @@ func (crud Crud_DB) create_update_ctx(ctx context.Context, m *lawsuit_status_typ err = errors.New(TextError) return err } + if err != nil { + err = fmt.Errorf("Create_update() id: %v, error: %v", m.id, err) + } return err } @@ -228,6 +234,9 @@ func (crud Crud_DB) Delete_ctx(ctx context.Context, m *lawsuit_status_types.Laws m.IsDeleted = true err = crud.Save_ctx(ctx, &m2) + if err != nil { + err = fmt.Errorf("Delete() id: %v, error: %v", m.id, err) + } return err } @@ -264,6 +273,9 @@ func (crud Crud_DB) Restore_ctx(ctx context.Context, m *lawsuit_status_types.Law m.IsDeleted = false err = crud.Save_ctx(ctx, &m2) + if err != nil { + err = fmt.Errorf("Restore() id: %v, error: %v", m.id, err) + } return err } @@ -306,6 +318,9 @@ func (crud Crud_DB) Find_ByExtID_ctx(ctx context.Context, m *lawsuit_status_type tx := db.Where("ext_id = ?", m.ExtID).Where("connection_id = ?", m.ConnectionID).First(m) err = tx.Error + if err != nil { + err = fmt.Errorf("Find_ByExtID() id: %v, error: %v", m.id, err) + } return err } diff --git a/examples/rapira/templates_main/pkg/db/crud/crud.go_ b/examples/rapira/templates_main/pkg/db/crud/crud.go_ index 303b13e..546d636 100644 --- a/examples/rapira/templates_main/pkg/db/crud/crud.go_ +++ b/examples/rapira/templates_main/pkg/db/crud/crud.go_ @@ -48,6 +48,9 @@ func (crud Crud_DB) Read_ctx(ctx context.Context, m *lawsuit_status_types.Lawsui tx := db.First(m, id) err = tx.Error + if err != nil { + err = fmt.Errorf("Read() id: %v, error: %v", id, err) + } return err } @@ -192,6 +195,9 @@ func (crud Crud_DB) create_update_ctx(ctx context.Context, m *lawsuit_status_typ err = errors.New(TextError) return err } + if err != nil { + err = fmt.Errorf("Create_Update() id: %v, error: %v", m.id, err) + } return err } @@ -228,6 +234,9 @@ func (crud Crud_DB) Delete_ctx(ctx context.Context, m *lawsuit_status_types.Laws m.IsDeleted = true err = crud.Save_ctx(ctx, &m2) + if err != nil { + err = fmt.Errorf("Delete() id: %v, error: %v", m.id, err) + } return err } @@ -264,6 +273,9 @@ func (crud Crud_DB) Restore_ctx(ctx context.Context, m *lawsuit_status_types.Law m.IsDeleted = false err = crud.Save_ctx(ctx, &m2) + if err != nil { + err = fmt.Errorf("Restore() id: %v, error: %v", m.id, err) + } return err } @@ -306,6 +318,9 @@ func (crud Crud_DB) Find_ByExtID_ctx(ctx context.Context, m *lawsuit_status_type tx := db.Where("ext_id = ?", m.ExtID).Where("connection_id = ?", m.ConnectionID).First(m) err = tx.Error + if err != nil { + err = fmt.Errorf("Find_ByExtID() id: %v, error: %v", m.id, err) + } return err } diff --git a/examples/rapira/templates_main/pkg/network/grpc/constants/constants.go b/examples/rapira/templates_main/pkg/network/grpc/constants/constants.go index 809887d..ce84163 100644 --- a/examples/rapira/templates_main/pkg/network/grpc/constants/constants.go +++ b/examples/rapira/templates_main/pkg/network/grpc/constants/constants.go @@ -1,5 +1,28 @@ package constants -var TIMEOUT_SECONDS = 30 +import "sync" +// timeout_seconds - время ожидания ответа +var timeout_seconds int = 30 + +// TEXT_ERROR_MODEL_VERSION - текст ошибки версии модели const TEXT_ERROR_MODEL_VERSION = "Error: wrong version object model" + +// mutex_TIMEOUT_SECONDS - защита от многопоточности GetTimeoutSeconds() +var mutex_TIMEOUT_SECONDS sync.RWMutex + +// GetTimeoutSeconds - возвращает время ожидания ответа +func GetTimeoutSeconds() int { + mutex_TIMEOUT_SECONDS.RLock() + defer mutex_TIMEOUT_SECONDS.RUnlock() + + return timeout_seconds +} + +// SetTimeoutSeconds - устанавливает время ожидания ответа +func SetTimeoutSeconds(seconds int) { + mutex_TIMEOUT_SECONDS.Lock() + defer mutex_TIMEOUT_SECONDS.Unlock() + + timeout_seconds = seconds +} diff --git a/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client.go_ b/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client.go_ index 4841eca..b3f156a 100644 --- a/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client.go_ +++ b/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client.go_ @@ -2,12 +2,14 @@ package grpc_client import ( "context" + "errors" "github.com/ManyakRus/starter/contextmain" "github.com/ManyakRus/starter/log" "github.com/ManyakRus/starter/port_checker" "github.com/ManyakRus/starter/stopapp" "gitlab.aescorp.ru/dsp_dev/claim/sync_service/api/grpc_proto" "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/constants" + grpc_constants "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/network/grpc/constants" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "os" @@ -31,8 +33,8 @@ var Conn *grpc.ClientConn // Client - подключение к клиенту GRPC var Client grpc_proto.SyncServiceClient -// mutexReconnect - защита от многопоточности Reconnect() -var mutexReconnect = &sync.Mutex{} +// mutex_Connect - защита от многопоточности Reconnect() +var mutex_Connect = &sync.Mutex{} // NeedReconnect - флаг необходимости переподключения var NeedReconnect bool @@ -44,7 +46,7 @@ func Connect() { err = Connect_err() if err != nil { - log.Fatalf("GRPC Connect() error: %v", err) + log.Panicf("GRPC Connect() error: %v", err) } else { addr := Settings.SYNC_SERVICE_HOST + ":" + Settings.SYNC_SERVICE_PORT log.Info("GRPC client connected. Address: ", addr) @@ -56,29 +58,48 @@ func Connect() { func Connect_err() error { var err error + // + mutex_Connect.Lock() + defer mutex_Connect.Unlock() + + // if Settings.SYNC_SERVICE_HOST == "" { - FillSettings() + err = FillSettings() + if err != nil { + return err + } } addr := Settings.SYNC_SERVICE_HOST + ":" + Settings.SYNC_SERVICE_PORT Conn, err = grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return err + } Client = grpc_proto.NewSyncServiceClient(Conn) return err } -func FillSettings() { +func FillSettings() error { + var err error + Settings = SettingsINI{} Settings.SYNC_SERVICE_HOST = os.Getenv("SYNC_SERVICE_HOST") Settings.SYNC_SERVICE_PORT = os.Getenv("SYNC_SERVICE_PORT") if Settings.SYNC_SERVICE_HOST == "" { - log.Panic("Need fill SYNC_SERVICE_HOST ! in OS Environment ") + TextError := "Need fill SYNC_SERVICE_HOST ! in OS Environment " + err = errors.New(TextError) + return err } if Settings.SYNC_SERVICE_PORT == "" { - log.Panic("Need fill SYNC_SERVICE_PORT ! in OS Environment ") + TextError := "Need fill SYNC_SERVICE_PORT ! in OS Environment " + err = errors.New(TextError) + return err } + + return err } // WaitStop - ожидает отмену глобального контекста @@ -99,20 +120,9 @@ func WaitStop() { // Start - необходимые процедуры для запуска сервера GRPC // если контекст хранится в contextmain.GetContext() +// и есть stopapp.GetWaitGroup_Main() +// при ошибке вызывает панику func Start() { - contextmain.GetContext() - ctx := contextmain.Ctx - wg := stopapp.GetWaitGroup_Main() - Start_ctx(ctx, wg) -} - -// Start_ctx - необходимые процедуры для запуска сервера GRPC -// ctx - глобальный контекст приложения -// wg - глобальный WaitGroup приложения -func Start_ctx(ctx *context.Context, wg *sync.WaitGroup) { - contextmain.Ctx = ctx - stopapp.SetWaitGroup_Main(wg) - Connect() stopapp.GetWaitGroup_Main().Add(1) @@ -123,6 +133,28 @@ func Start_ctx(ctx *context.Context, wg *sync.WaitGroup) { } +// Start_ctx - необходимые процедуры для запуска сервера GRPC +// ctx - глобальный контекст приложения +// wg - глобальный WaitGroup приложения +func Start_ctx(ctx *context.Context, wg *sync.WaitGroup) error { + var err error + contextmain.Ctx = ctx + stopapp.SetWaitGroup_Main(wg) + + err = Connect_err() + if err != nil { + return err + } + + stopapp.GetWaitGroup_Main().Add(1) + go WaitStop() + + stopapp.GetWaitGroup_Main().Add(1) + go ping_go() + + return err +} + // CloseConnection - закрывает подключение к GRPC, и пишет лог func CloseConnection() { err := CloseConnection_err() @@ -191,3 +223,15 @@ loop: stopapp.GetWaitGroup_Main().Done() } + +// GetTimeoutSeconds - возвращает время ожидания ответа +func GetTimeoutSeconds() int { + Otvet := grpc_constants.GetTimeoutSeconds() + + return Otvet +} + +// SetTimeoutSeconds - устанавливает время ожидания ответа +func SetTimeoutSeconds(seconds int) { + grpc_constants.SetTimeoutSeconds(seconds) +} diff --git a/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client_table.go_ b/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client_table.go_ index e12a72d..8a041aa 100644 --- a/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client_table.go_ +++ b/examples/rapira/templates_main/pkg/network/grpc/grpc_client/grpc_client_table.go_ @@ -8,6 +8,7 @@ import ( "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/network/grpc/grpc_proto" "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/lawsuit_status_types" "log" + "sync" "time" ) @@ -17,12 +18,18 @@ var VersionModel uint32 // TableName - имя таблицы в БД Postgres const TableName string = "lawsuit_status_types" +// mutex_GetVersionModel - защита от многопоточности GetVersionModel() +var mutex_GetVersionModel = sync.Mutex{} + // объект для CRUD операций через GRPC type Crud_GRPC struct { } // GetVersionModel - возвращает хэш версии структуры модели func (crud Crud_GRPC) GetVersionModel() uint32 { + mutex_GetVersionModel.Lock() + defer mutex_GetVersionModel.Unlock() + if VersionModel == 0 { VersionModel = lawsuit_status_types.LawsuitStatusType{}.GetStructVersion() } @@ -39,14 +46,14 @@ func (crud Crud_GRPC) Read(m *lawsuit_status_types.LawsuitStatusType) error { } // подготовка запроса - var VersionModel = crud.GetVersionModel() + var versionModel = crud.GetVersionModel() Request := &grpc_proto.RequestId{} Request.ID = int64(m.ID) - Request.VersionModel = VersionModel + Request.VersionModel = versionModel ctxMain := context.Background() - ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.TIMEOUT_SECONDS)) + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.GetTimeoutSeconds())) defer ctxCancelFunc() // запрос @@ -90,7 +97,7 @@ func (crud Crud_GRPC) Create(m *lawsuit_status_types.LawsuitStatusType) error { Request.VersionModel = VersionModel ctxMain := context.Background() - ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.TIMEOUT_SECONDS)) + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.GetTimeoutSeconds())) defer ctxCancelFunc() // запрос @@ -134,7 +141,7 @@ func (crud Crud_GRPC) Update(m *lawsuit_status_types.LawsuitStatusType) error { Request.VersionModel = VersionModel ctxMain := context.Background() - ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.TIMEOUT_SECONDS)) + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.GetTimeoutSeconds())) defer ctxCancelFunc() // запрос @@ -178,7 +185,7 @@ func (crud Crud_GRPC) Save(m *lawsuit_status_types.LawsuitStatusType) error { Request.VersionModel = VersionModel ctxMain := context.Background() - ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.TIMEOUT_SECONDS)) + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.GetTimeoutSeconds())) defer ctxCancelFunc() // запрос @@ -218,7 +225,7 @@ func (crud Crud_GRPC) Delete(m *lawsuit_status_types.LawsuitStatusType) error { Request.VersionModel = VersionModel ctxMain := context.Background() - ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.TIMEOUT_SECONDS)) + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.GetTimeoutSeconds())) defer ctxCancelFunc() // запрос @@ -258,7 +265,7 @@ func (crud Crud_GRPC) Restore(m *lawsuit_status_types.LawsuitStatusType) error { Request.VersionModel = VersionModel ctxMain := context.Background() - ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.TIMEOUT_SECONDS)) + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.GetTimeoutSeconds())) defer ctxCancelFunc() // запрос @@ -297,7 +304,7 @@ func (crud Crud_GRPC) Find_ByExtID(m *lawsuit_status_types.LawsuitStatusType) er Request.VersionModel = VersionModel ctxMain := context.Background() - ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.TIMEOUT_SECONDS)) + ctx, ctxCancelFunc := context.WithTimeout(ctxMain, time.Second*time.Duration(constants.GetTimeoutSeconds())) defer ctxCancelFunc() //запрос diff --git a/examples/rapira/templates_main/pkg/network/nrpc/constants/constants.go b/examples/rapira/templates_main/pkg/network/nrpc/constants/constants.go new file mode 100644 index 0000000..ce84163 --- /dev/null +++ b/examples/rapira/templates_main/pkg/network/nrpc/constants/constants.go @@ -0,0 +1,28 @@ +package constants + +import "sync" + +// timeout_seconds - время ожидания ответа +var timeout_seconds int = 30 + +// TEXT_ERROR_MODEL_VERSION - текст ошибки версии модели +const TEXT_ERROR_MODEL_VERSION = "Error: wrong version object model" + +// mutex_TIMEOUT_SECONDS - защита от многопоточности GetTimeoutSeconds() +var mutex_TIMEOUT_SECONDS sync.RWMutex + +// GetTimeoutSeconds - возвращает время ожидания ответа +func GetTimeoutSeconds() int { + mutex_TIMEOUT_SECONDS.RLock() + defer mutex_TIMEOUT_SECONDS.RUnlock() + + return timeout_seconds +} + +// SetTimeoutSeconds - устанавливает время ожидания ответа +func SetTimeoutSeconds(seconds int) { + mutex_TIMEOUT_SECONDS.Lock() + defer mutex_TIMEOUT_SECONDS.Unlock() + + timeout_seconds = seconds +} diff --git a/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client.go_ b/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client.go_ index 9316696..c6b03dd 100644 --- a/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client.go_ +++ b/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client.go_ @@ -1,10 +1,14 @@ //Файл создан автоматически кодогенератором crud_generator //Не изменяйте ничего здесь. +//Файл создан автоматически кодогенератором crud_generator +//Не изменяйте ничего здесь. + package nrpc_client import ( "context" + "errors" "github.com/ManyakRus/starter/contextmain" "github.com/ManyakRus/starter/log" "github.com/ManyakRus/starter/port_checker" @@ -12,6 +16,7 @@ import ( "github.com/nats-io/nats.go" "gitlab.aescorp.ru/dsp_dev/claim/sync_service/api/grpc_proto" "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/db/constants" + nrpc_constants "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/network/nrpc/constants" "sync" "os" @@ -34,8 +39,8 @@ var Conn *nats.Conn // Client - подключение к клиенту NRPC var Client *grpc_proto.Sync_serviceClient -// mutexReconnect - защита от многопоточности Reconnect() -var mutexReconnect = &sync.Mutex{} +// mutex_Connect - защита от многопоточности Reconnect() +var mutex_Connect = &sync.Mutex{} // NeedReconnect - флаг необходимости переподключения var NeedReconnect bool @@ -47,7 +52,7 @@ func Connect() { err = Connect_err() if err != nil { - log.Fatalf("NRPC Connect() error: %v", err) + log.Panicf("NRPC Connect() error: %v", err) } else { NatsURL := "nats://" + Settings.NATS_HOST + ":" + Settings.NATS_PORT log.Info("GRPC client connected. Address: ", NatsURL) @@ -59,17 +64,21 @@ func Connect() { func Connect_err() error { var err error + // + mutex_Connect.Lock() + defer mutex_Connect.Unlock() + if Settings.NATS_HOST == "" { FillSettings() } NatsURL := "nats://" + Settings.NATS_HOST + ":" + Settings.NATS_PORT + // Connect to the NATS server. Conn, err = nats.Connect(NatsURL, nats.Timeout(5*time.Second)) if err != nil { - log.Panic(err) + return err } - // defer Conn.Close() // This is our generated client. Client = grpc_proto.NewSync_serviceClient(Conn) @@ -78,7 +87,9 @@ func Connect_err() error { } // FillSettings - заполняет настройки из переменных окружения -func FillSettings() { +func FillSettings() error { + var err error + Settings = SettingsINI{} Settings.NATS_HOST = os.Getenv("NATS_HOST") Settings.NATS_PORT = os.Getenv("NATS_PORT") @@ -93,12 +104,18 @@ func FillSettings() { } if Settings.NATS_HOST == "" { - log.Panic("Need fill BUS_LOCAL_HOST ! in OS Environment ") + TextError := "Need fill BUS_LOCAL_HOST ! in OS Environment " + err = errors.New(TextError) + return err } if Settings.NATS_PORT == "" { - log.Panic("Need fill BUS_LOCAL_PORT ! in OS Environment ") + TextError := "Need fill BUS_LOCAL_PORT ! in OS Environment " + err = errors.New(TextError) + return err } + + return err } // WaitStop - ожидает отмену глобального контекста @@ -119,20 +136,9 @@ func WaitStop() { // Start - необходимые процедуры для запуска сервера NRPC // если контекст хранится в contextmain.GetContext() +// и есть stopapp.GetWaitGroup_Main() +// при ошибке вызывает панику func Start() { - contextmain.GetContext() - ctx := contextmain.Ctx - wg := stopapp.GetWaitGroup_Main() - Start_ctx(ctx, wg) -} - -// Start_ctx - необходимые процедуры для запуска сервера NRPC -// ctx - глобальный контекст приложения -// wg - глобальный WaitGroup приложения -func Start_ctx(ctx *context.Context, wg *sync.WaitGroup) { - contextmain.Ctx = ctx - stopapp.SetWaitGroup_Main(wg) - Connect() stopapp.GetWaitGroup_Main().Add(1) @@ -143,6 +149,28 @@ func Start_ctx(ctx *context.Context, wg *sync.WaitGroup) { } +// Start_ctx - необходимые процедуры для запуска сервера NRPC +// ctx - глобальный контекст приложения +// wg - глобальный WaitGroup приложения +func Start_ctx(ctx *context.Context, wg *sync.WaitGroup) error { + var err error + contextmain.Ctx = ctx + stopapp.SetWaitGroup_Main(wg) + + err = Connect_err() + if err != nil { + return err + } + + stopapp.GetWaitGroup_Main().Add(1) + go WaitStop() + + stopapp.GetWaitGroup_Main().Add(1) + go ping_go() + + return err +} + // CloseConnection - закрывает подключение к NATS func CloseConnection() { Conn.Close() @@ -203,3 +231,15 @@ loop: stopapp.GetWaitGroup_Main().Done() } + +// GetTimeoutSeconds - возвращает время ожидания ответа +func GetTimeoutSeconds() int { + Otvet := nrpc_constants.GetTimeoutSeconds() + + return Otvet +} + +// SetTimeoutSeconds - устанавливает время ожидания ответа +func SetTimeoutSeconds(seconds int) { + nrpc_constants.SetTimeoutSeconds(seconds) +} diff --git a/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client_table.go_ b/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client_table.go_ index 0ad505d..5f640a6 100644 --- a/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client_table.go_ +++ b/examples/rapira/templates_main/pkg/network/nrpc/nrpc_client/nrpc_client_table.go_ @@ -7,6 +7,7 @@ import ( "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/network/nrpc/grpc_client/constants" "gitlab.aescorp.ru/dsp_dev/claim/sync_service/pkg/object_model/entities/lawsuit_status_types" "log" + "sync" ) // VersionModel - хранит версию структуры модели @@ -19,8 +20,14 @@ const TableName string = "lawsuit_status_types" type Crud_NRPC struct { } +// mutex_GetVersionModel - защита от многопоточности GetVersionModel() +var mutex_GetVersionModel = sync.Mutex{} + // GetVersionModel - возвращает хэш версии структуры модели func (crud Crud_NRPC) GetVersionModel() uint32 { + mutex_GetVersionModel.Lock() + defer mutex_GetVersionModel.Unlock() + if VersionModel == 0 { VersionModel = lawsuit_status_types.LawsuitStatusType{}.GetStructVersion() } @@ -37,11 +44,11 @@ func (crud Crud_NRPC) Read(m *lawsuit_status_types.LawsuitStatusType) error { } // подготовка запроса - var VersionModel = crud.GetVersionModel() + var versionModel = crud.GetVersionModel() Request := &grpc_proto.RequestId{} Request.ID = int64(m.ID) - Request.VersionModel = VersionModel + Request.VersionModel = versionModel // запрос Response, err := nrpc_client.Client.LawsuitStatusType_Read(Request)