forked from fl00r/go-tarantool-1.6
-
Notifications
You must be signed in to change notification settings - Fork 59
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added logic for working with Tarantool schema via Box
- Implemented the `box.Schema()` method that returns a `Schema` object for schema-related operations
- Loading branch information
maksim.konovalov
committed
Dec 27, 2024
1 parent
7eae014
commit 070c6ca
Showing
6 changed files
with
243 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package box | ||
|
||
import "github.com/tarantool/go-tarantool/v2" | ||
|
||
// Schema represents the schema-related operations in Tarantool. | ||
// It holds a connection to interact with the Tarantool instance. | ||
type Schema struct { | ||
conn tarantool.Doer // Connection interface for interacting with Tarantool. | ||
} | ||
|
||
// Schema returns a new Schema instance, providing access to schema-related operations. | ||
// It uses the connection from the Box instance to communicate with Tarantool. | ||
func (b *Box) Schema() *Schema { | ||
return &Schema{ | ||
conn: b.conn, // Pass the Box connection to the Schema. | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
package box | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
|
||
"github.com/tarantool/go-tarantool/v2" | ||
"github.com/vmihailenco/msgpack/v5" | ||
) | ||
|
||
// SchemaUser provides methods to interact with schema-related user operations in Tarantool. | ||
type SchemaUser struct { | ||
conn tarantool.Doer // Connection interface for interacting with Tarantool. | ||
} | ||
|
||
// User returns a new SchemaUser instance, allowing schema-related user operations. | ||
func (s *Schema) User() *SchemaUser { | ||
return &SchemaUser{conn: s.conn} | ||
} | ||
|
||
// UserExistsRequest represents a request to check if a user exists in Tarantool. | ||
type UserExistsRequest struct { | ||
*tarantool.CallRequest // Underlying Tarantool call request. | ||
} | ||
|
||
// UserExistsResponse represents the response to a user existence check. | ||
type UserExistsResponse struct { | ||
Exists bool // True if the user exists, false otherwise. | ||
} | ||
|
||
// DecodeMsgpack decodes the response from a Msgpack-encoded byte slice. | ||
func (uer *UserExistsResponse) DecodeMsgpack(d *msgpack.Decoder) error { | ||
arrayLen, err := d.DecodeArrayLen() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
// Ensure that the response array contains exactly 1 element (the "Exists" field). | ||
if arrayLen != 1 { | ||
return fmt.Errorf("protocol violation; expected 1 array entry, got %d", arrayLen) | ||
} | ||
|
||
// Decode the boolean value indicating whether the user exists. | ||
uer.Exists, err = d.DecodeBool() | ||
|
||
return err | ||
} | ||
|
||
// NewUserExistsRequest creates a new request to check if a user exists. | ||
func NewUserExistsRequest(username string) UserExistsRequest { | ||
callReq := tarantool.NewCallRequest("box.schema.user.exists").Args([]interface{}{username}) | ||
|
||
return UserExistsRequest{ | ||
callReq, | ||
} | ||
} | ||
|
||
// Exists checks if the specified user exists in Tarantool. | ||
func (u *SchemaUser) Exists(ctx context.Context, username string) (bool, error) { | ||
// Create a request and send it to Tarantool. | ||
req := NewUserExistsRequest(username).Context(ctx) | ||
resp := &UserExistsResponse{} | ||
|
||
// Execute the request and parse the response. | ||
err := u.conn.Do(req).GetTyped(resp) | ||
|
||
return resp.Exists, err | ||
} | ||
|
||
// UserCreateOptions represents options for creating a user in Tarantool. | ||
type UserCreateOptions struct { | ||
IfNotExists bool `msgpack:"if_not_exists"` // If true, prevents an error if the user already exists. | ||
Password string `msgpack:"password"` // The password for the new user. | ||
} | ||
|
||
// UserCreateRequest represents a request to create a new user in Tarantool. | ||
type UserCreateRequest struct { | ||
*tarantool.CallRequest // Underlying Tarantool call request. | ||
} | ||
|
||
// NewUserCreateRequest creates a new request to create a user with specified options. | ||
func NewUserCreateRequest(username string, options UserCreateOptions) UserCreateRequest { | ||
callReq := tarantool.NewCallRequest("box.schema.user.create").Args([]interface{}{username, options}) | ||
|
||
return UserCreateRequest{ | ||
callReq, | ||
} | ||
} | ||
|
||
// UserCreateResponse represents the response to a user creation request. | ||
type UserCreateResponse struct { | ||
} | ||
|
||
// DecodeMsgpack decodes the response for a user creation request. | ||
// In this case, the response does not contain any data. | ||
func (uer *UserCreateResponse) DecodeMsgpack(_ *msgpack.Decoder) error { | ||
return nil | ||
} | ||
|
||
// Create creates a new user in Tarantool with the given username and options. | ||
func (u *SchemaUser) Create(ctx context.Context, username string, options UserCreateOptions) error { | ||
// Create a request and send it to Tarantool. | ||
req := NewUserCreateRequest(username, options).Context(ctx) | ||
resp := &UserCreateResponse{} | ||
|
||
// Execute the request and handle the response. | ||
fut := u.conn.Do(req) | ||
|
||
err := fut.GetTyped(resp) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} | ||
|
||
// UserDropOptions represents options for dropping a user in Tarantool. | ||
type UserDropOptions struct { | ||
IfExists bool `msgpack:"if_exists"` // If true, prevents an error if the user does not exist. | ||
} | ||
|
||
// UserDropRequest represents a request to drop a user from Tarantool. | ||
type UserDropRequest struct { | ||
*tarantool.CallRequest // Underlying Tarantool call request. | ||
} | ||
|
||
// NewUserDropRequest creates a new request to drop a user with specified options. | ||
func NewUserDropRequest(username string, options UserDropOptions) UserDropRequest { | ||
callReq := tarantool.NewCallRequest("box.schema.user.drop").Args([]interface{}{username, options}) | ||
|
||
return UserDropRequest{ | ||
callReq, | ||
} | ||
} | ||
|
||
// UserDropResponse represents the response to a user drop request. | ||
type UserDropResponse struct { | ||
} | ||
|
||
// Drop drops the specified user from Tarantool, with optional conditions. | ||
func (u *SchemaUser) Drop(ctx context.Context, username string, options UserDropOptions) error { | ||
// Create a request and send it to Tarantool. | ||
req := NewUserDropRequest(username, options).Context(ctx) | ||
resp := &UserCreateResponse{} | ||
|
||
// Execute the request and handle the response. | ||
fut := u.conn.Do(req) | ||
|
||
err := fut.GetTyped(resp) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters