Skip to content

Commit

Permalink
restructure module to be similar to other packages
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Gaetano Padula committed Jan 1, 2024
1 parent d8f2e69 commit 2afd23a
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 35 deletions.
63 changes: 33 additions & 30 deletions cursusdb.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,48 +28,50 @@ import (
"time"
)

type CursusDB struct {
TLS bool
ClusterHost string
ClusterPort uint
Username string
Password string
Text *textproto.Conn
Conn net.Conn
// Client is the CursusDB cluster client structure
type Client struct {
TLS bool // TLS enabled?
ClusterHost string // Cluster host
ClusterPort uint // Cluster port
Username string // Database username
Password string // Database password
Text *textproto.Conn // Writer and reader
Conn net.Conn // Conn
ClusterReadTimeout time.Time // Cluster read timeout
}

// NewClient - Create new client connection to a CursusDB cluster
func (cursusdb *CursusDB) NewClient() error {
if cursusdb.ClusterHost == "" || cursusdb.ClusterPort == 0 {
// Connect - Connect to new setup client to a CursusDB cluster
func (client *Client) Connect() error {
if client.ClusterHost == "" || client.ClusterPort == 0 {
return errors.New("CursusDB cluster host and port required.")
}

if !cursusdb.TLS {
tcpAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", cursusdb.ClusterHost, cursusdb.ClusterPort))
if !client.TLS {
tcpAddr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("%s:%d", client.ClusterHost, client.ClusterPort))
if err != nil {
return err
}

cursusdb.Conn, err = net.DialTCP("tcp", nil, tcpAddr)
client.Conn, err = net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
return err
}

// If nothing from cluster in 5 seconds, report error
err = cursusdb.Conn.SetReadDeadline(time.Now().Add(5 * time.Second))
err = client.Conn.SetReadDeadline(client.ClusterReadTimeout)
if err != nil {
return err
}

cursusdb.Text = textproto.NewConn(cursusdb.Conn)
client.Text = textproto.NewConn(client.Conn)

// Authenticate
err = cursusdb.Text.PrintfLine(fmt.Sprintf("Authentication: %s", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s\\0%s", cursusdb.Username, cursusdb.Password)))))
err = client.Text.PrintfLine(fmt.Sprintf("Authentication: %s", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s\\0%s", client.Username, client.Password)))))
if err != nil {
return err
}

read, err := cursusdb.Text.ReadLine()
read, err := client.Text.ReadLine()
if err != nil {
return err
}
Expand All @@ -82,27 +84,27 @@ func (cursusdb *CursusDB) NewClient() error {

} else {
var err error
config := tls.Config{ServerName: cursusdb.ClusterHost}
config := tls.Config{ServerName: client.ClusterHost}

cursusdb.Conn, err = tls.Dial("tcp", fmt.Sprintf("%s:%d", cursusdb.ClusterHost, cursusdb.ClusterPort), &config)
client.Conn, err = tls.Dial("tcp", fmt.Sprintf("%s:%d", client.ClusterHost, client.ClusterPort), &config)
if err != nil {
return err
}

// If nothing from cluster in 5 seconds, report error
err = cursusdb.Conn.SetReadDeadline(time.Now().Add(5 * time.Second))
err = client.Conn.SetReadDeadline(client.ClusterReadTimeout)
if err != nil {
return err
}

cursusdb.Text = textproto.NewConn(cursusdb.Conn)
client.Text = textproto.NewConn(client.Conn)
// Authenticate
err = cursusdb.Text.PrintfLine(fmt.Sprintf("Authentication: %s", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s\\0%s", cursusdb.Username, cursusdb.Password)))))
err = client.Text.PrintfLine(fmt.Sprintf("Authentication: %s", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s\\0%s", client.Username, client.Password)))))
if err != nil {
return err
}

read, err := cursusdb.Text.ReadLine()
read, err := client.Text.ReadLine()
if err != nil {
return err
}
Expand All @@ -119,22 +121,23 @@ func (cursusdb *CursusDB) NewClient() error {
}

// Close closes CursusDB cluster connection
func (cursusdb *CursusDB) Close() {
cursusdb.Text.Close()
cursusdb.Conn.Close()
func (client *Client) Close() {
client.Text.Close()
client.Conn.Close()
}

func (cursusdb *CursusDB) Query(query string) (string, error) {
// Query sends query to cluster
func (client *Client) Query(query string) (string, error) {
if !strings.HasSuffix(query, ";") {
return "", errors.New("invalid query")
}

_, err := cursusdb.Conn.Write([]byte(fmt.Sprintf("%s\r\n", query)))
_, err := client.Conn.Write([]byte(fmt.Sprintf("%s\r\n", query)))
if err != nil {
return "", err
}

read, err := cursusdb.Text.ReadLine()
read, err := client.Text.ReadLine()
if err != nil {
return "", err
}
Expand Down
11 changes: 6 additions & 5 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,26 @@ import (
)
func main() {
var cursusdb *cursusdbgo.CursusDB
var client *cursusdbgo.Client
cursusdb = &cursusdbgo.CursusDB{
client = &cursusdbgo.Client{
TLS: false,
ClusterHost: "0.0.0.0",
ClusterPort: 7681,
Username: "someuser",
Password: "somepassword",
ClusterReadTimeout: time.Now().Add(time.Second * 10)
}
err := cursusdb.NewClient()
err := client.Connect()
if err != nil {
fmt.Println(err.Error())
return
}
defer cursusdb.Close()
defer client.Close()
res, err := cursusdb.Query(`select * from users;`)
res, err := client.Query(`ping;`)
if err != nil {
fmt.Println(err.Error())
return
Expand Down

0 comments on commit 2afd23a

Please sign in to comment.