Merge branch 'database-connect' into 'master'
Datbase connected to backend, frontend, backend and containers communicating See merge request murphg62/2023-ca400-murphg62-byrnm257!5
This commit is contained in:
commit
1c8556a111
9
src/PanoptesFrontend/Data/Module.cs
Normal file
9
src/PanoptesFrontend/Data/Module.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
public class Module {
|
||||||
|
public String Name {get; set;}
|
||||||
|
public String Container {get; set;}
|
||||||
|
|
||||||
|
public Module(string name, string container){
|
||||||
|
Name = name;
|
||||||
|
Container = container;
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/PanoptesFrontend/Pages/TestCard.razor
Normal file
10
src/PanoptesFrontend/Pages/TestCard.razor
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<p>@Data.Text</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[Parameter]
|
||||||
|
public Component Data { get; set; }
|
||||||
|
}
|
||||||
@ -4,7 +4,7 @@
|
|||||||
@using System.Text.Json;
|
@using System.Text.Json;
|
||||||
@inject IHttpService httpService
|
@inject IHttpService httpService
|
||||||
|
|
||||||
@* @if (data != null)
|
@if (data != null)
|
||||||
{
|
{
|
||||||
@foreach (var component in data) {
|
@foreach (var component in data) {
|
||||||
switch (component.Type) {
|
switch (component.Type) {
|
||||||
@ -27,16 +27,16 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} *@
|
}
|
||||||
|
|
||||||
<pre>@response.Text</pre>
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
private Component response;
|
private Component[] data;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
response = await httpService.GetAsync<Component>("http://localhost:8080/test");
|
var response = await httpService.GetAsync<Schema>("http://localhost:10000/localhost/schema");
|
||||||
|
data = response.components;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,8 @@
|
|||||||
<div class="top-row ps-3 navbar navbar-dark">
|
@using PanoptesFrontend.Data
|
||||||
|
@using System.Text.Json;
|
||||||
|
@inject IHttpService httpService
|
||||||
|
|
||||||
|
<div class="top-row ps-3 navbar navbar-dark">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<a class="navbar-brand" href="">PanoptesFrontend</a>
|
<a class="navbar-brand" href="">PanoptesFrontend</a>
|
||||||
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
|
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
|
||||||
@ -9,27 +13,29 @@
|
|||||||
|
|
||||||
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
|
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
|
||||||
<nav class="flex-column">
|
<nav class="flex-column">
|
||||||
<div class="nav-item px-3">
|
@if (response != null)
|
||||||
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
|
{
|
||||||
<span class="oi oi-home" aria-hidden="true"></span> Home
|
@foreach (var module in response){
|
||||||
</NavLink>
|
<div class="nav-item px-3">
|
||||||
</div>
|
<NavLink class="nav-link" href=@module.Name Match="NavLinkMatch.All">
|
||||||
<div class="nav-item px-3">
|
<span class="oi oi-home" aria-hidden="true"></span> @module.Name
|
||||||
<NavLink class="nav-link" href="counter">
|
</NavLink>
|
||||||
<span class="oi oi-plus" aria-hidden="true"></span> Counter
|
</div>
|
||||||
</NavLink>
|
}
|
||||||
</div>
|
}
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link" href="fetchdata">
|
|
||||||
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
private bool collapseNavMenu = true;
|
|
||||||
|
|
||||||
|
public Module[] response;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
response = await httpService.GetAsync<Module[]>("http://localhost:10000/modules");
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool collapseNavMenu = true;
|
||||||
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
|
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
|
||||||
|
|
||||||
private void ToggleNavMenu()
|
private void ToggleNavMenu()
|
||||||
|
|||||||
@ -1,95 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"io/ioutil"
|
|
||||||
"github.com/gorilla/mux"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Schema struct {
|
|
||||||
Name string `json:"Name"`
|
|
||||||
Type int `json:"Type"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Container struct {
|
|
||||||
Id string `json:"Id`
|
|
||||||
Name string `json:"Name"`
|
|
||||||
port string `json:"Port"`
|
|
||||||
}
|
|
||||||
|
|
||||||
var Containers []Container
|
|
||||||
|
|
||||||
func homePage(w http.ResponseWriter, r *http.Request) {
|
|
||||||
fmt.Fprintf(w, "Welcome to the home page!")
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSchema(w http.ResponseWriter, r *http.Request){
|
|
||||||
vars := mux.Vars(r)
|
|
||||||
key := vars["container"]
|
|
||||||
|
|
||||||
for _, container := range Containers {
|
|
||||||
if container.Id == key {
|
|
||||||
requestURL := fmt.Sprintf("http://%s:%s/schema", container.Name, container.port)
|
|
||||||
resp, err := http.Get(requestURL)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Request to container failed: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Failed to print Body: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(w,string(body))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func getStats(w http.ResponseWriter, r *http.Request){
|
|
||||||
vars := mux.Vars(r)
|
|
||||||
key := vars["container"]
|
|
||||||
|
|
||||||
for _, container := range Containers {
|
|
||||||
if container.Id == key {
|
|
||||||
requestURL := fmt.Sprintf("http://%s:%s/stats", container.Name, container.port)
|
|
||||||
resp, err := http.Get(requestURL)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Request to container failed: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal("Failed to print Body: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprintf(w,string(body))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleRequests() {
|
|
||||||
myRouter := mux.NewRouter().StrictSlash(true)
|
|
||||||
myRouter.HandleFunc("/", homePage)
|
|
||||||
myRouter.HandleFunc("/{container}/schema", getSchema)
|
|
||||||
myRouter.HandleFunc("/{container}/stats", getStats)
|
|
||||||
|
|
||||||
log.Fatal(http.ListenAndServe(":10000", myRouter))
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
|
|
||||||
Containers = []Container{
|
|
||||||
Container{Id: "1", Name: "localhost", port: "3000"},
|
|
||||||
}
|
|
||||||
|
|
||||||
handleRequests()
|
|
||||||
}
|
|
||||||
131
src/backend/cmd/main.go
Normal file
131
src/backend/cmd/main.go
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"gitlab.computing.dcu.ie/murphg62/2023-ca400-murphg62-byrnm257/src/backend/pkg/db"
|
||||||
|
_ "golang.org/x/mod/module"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type Schema struct {
|
||||||
|
Name string `json:"Name"`
|
||||||
|
Type int `json:"Type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Container struct {
|
||||||
|
Id string `json:"Id`
|
||||||
|
Name string `json:"Name"`
|
||||||
|
port string `json:"Port"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Module struct {
|
||||||
|
Name string `json:"Name"`
|
||||||
|
Container string `json:"Container"`
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func homePage(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintf(w, "Welcome to the home page!")
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSchema(w http.ResponseWriter, r *http.Request){
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
key := vars["container"]
|
||||||
|
|
||||||
|
|
||||||
|
requestURL := fmt.Sprintf("http://%s:8080/schema", key)
|
||||||
|
resp, err := http.Get(requestURL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Request to container failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to print Body: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(resp.StatusCode)
|
||||||
|
w.Write(body)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStats(w http.ResponseWriter, r *http.Request){
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
key := vars["container"]
|
||||||
|
|
||||||
|
|
||||||
|
requestURL := fmt.Sprintf("http://%s:8080/stats", key)
|
||||||
|
resp, err := http.Get(requestURL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Request to container failed: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal("Failed to print Body: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(resp.StatusCode)
|
||||||
|
w.Write(body)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func getModules(db *sql.DB) http.HandlerFunc{
|
||||||
|
return func(w http.ResponseWriter, r *http.Request){
|
||||||
|
if r.Method == "GET" {
|
||||||
|
var Modules []Module
|
||||||
|
rows, err := db.Query("Select name, container_name FROM Module")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
for rows.Next() {
|
||||||
|
var module Module
|
||||||
|
if err := rows.Scan(&module.Name, &module.Container); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
Modules = append(Modules, module)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
if err := json.NewEncoder(w).Encode(Modules); err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleRequests(DB *sql.DB) {
|
||||||
|
myRouter := mux.NewRouter().StrictSlash(true)
|
||||||
|
myRouter.HandleFunc("/", homePage)
|
||||||
|
myRouter.HandleFunc("/{container}/schema", getSchema)
|
||||||
|
myRouter.HandleFunc("/{container}/stats", getStats)
|
||||||
|
myRouter.HandleFunc("/modules", getModules(DB))
|
||||||
|
|
||||||
|
log.Fatal(http.ListenAndServe(":10000", myRouter))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
DB := db.ConnectDB()
|
||||||
|
handleRequests(DB)
|
||||||
|
db.CloseDB(DB)
|
||||||
|
}
|
||||||
@ -3,12 +3,7 @@ module gitlab.computing.dcu.ie/murphg62/2023-ca400-murphg62-byrnm257/src/backend
|
|||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/gorilla/mux v1.8.0
|
||||||
github.com/gorilla/mux v1.8.0 // indirect
|
github.com/lib/pq v1.10.8
|
||||||
golang.org/x/net v0.8.0 // indirect
|
golang.org/x/mod v0.8.0
|
||||||
golang.org/x/sys v0.6.0 // indirect
|
|
||||||
golang.org/x/text v0.8.0 // indirect
|
|
||||||
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect
|
|
||||||
google.golang.org/grpc v1.53.0 // indirect
|
|
||||||
google.golang.org/protobuf v1.30.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,35 +1,6 @@
|
|||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
|
||||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
|
||||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||||
golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
|
github.com/lib/pq v1.10.8 h1:3fdt97i/cwSU83+E0hZTC/Xpc9mTZxc6UWSCRcSbxiE=
|
||||||
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
|
github.com/lib/pq v1.10.8/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
|
golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
|
||||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
|
|
||||||
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
|
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
|
|
||||||
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|
||||||
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
|
|
||||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
google.golang.org/genproto v0.0.0-20230109162033-3c3c17ce83e6 h1:uUn6GsgKK2eCI0bWeRMgRCcqDaQXYDuB+5tXA5Xeg/8=
|
|
||||||
google.golang.org/genproto v0.0.0-20230109162033-3c3c17ce83e6/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
|
|
||||||
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA=
|
|
||||||
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
|
|
||||||
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
|
|
||||||
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
|
|
||||||
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
|
|
||||||
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
|
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
|
||||||
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
|
|
||||||
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
|
||||||
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
|
|
||||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
|
||||||
|
|||||||
36
src/backend/pkg/db/db.go
Normal file
36
src/backend/pkg/db/db.go
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package db
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
_ "github.com/lib/pq"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
// placeholder, replace with own
|
||||||
|
const (
|
||||||
|
host = "localhost"
|
||||||
|
port = 5432
|
||||||
|
user = "postgres"
|
||||||
|
password = "Gcvy4266"
|
||||||
|
dbname = "Panoptes"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ConnectDB() *sql.DB {
|
||||||
|
|
||||||
|
psql := fmt.Sprintf("host=%s port=%d user=%s "+ "password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
|
||||||
|
|
||||||
|
db, err := sql.Open("postgres", psql)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
err = db.Ping()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("Successfully connected to db!")
|
||||||
|
return db
|
||||||
|
}
|
||||||
|
|
||||||
|
func CloseDB(db *sql.DB){
|
||||||
|
defer db.Close()
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user