Victo: Realtime AI Native Database
Welcome to Victo project.
Victo is a realtime AI Native Database for effeciently storing and retriving vectors. Victo is a database server leveraging the power of websockets which means to connect to Victo all that we need is a websocket client. Connect seamlessly with application written in any language, unlocking the potential for realtime communication and efficient vector operations.
We hope you enjoy using Victo.
Table of Contents
- Get Started
- Technologies and Concepts
- How it works?
- Authentication
-
DB Operations and Syntax
- Add a database
- List all database instances
- Add User
- Change password for self
- Change password for another User as Admin
- Add a collection
- Delete a collection
- List total number of collections in a database
- List all collections in a database
- Add a vector to a collection
- Retrive a vector from a collection
- Delete a vector in a collection
- List total number of vectors in a collection
- List all vectors in a collection
- Query a vector
- Add a Subscription
- Retrive a subscription from a collection
- Delete a subscription in a collection
- List total number of subscriptions in a collection
- List all subscriptions in a collection
- Logs and Monitoring
- Practical Usecases
- Roadmap
- Version
- License
- Contributing
- Contact
- Acknowledgements
- GCC
- CMake (VERSION 3.27.1)
- Fork the repo
- Clone your forked repo
- CMake is used to manage the build process. In the cloned repo, navigate to the root directory
cd path/to/cloned/repo
Replace "path/to/cloned/repo" with actual path to your cloned repo 4. Build the executable using following commands
cmake -S . -B ./build
make -C ./build/
- Once the step 4 is successful, "victo-exe" would have been created in "path/to/cloned/repo/build" directory
- Navigate to "build" directory and start Victo database using below command
./build/victo-exe -d /preferred/path/for/victo/data/files
It is in this path the actual victo database objects and files are stored in the disk. Other supported flags including -d are:
Flag | Description | Mandatory? | Default Value | Valid values |
---|---|---|---|---|
-d | Preferred path to victo database | Yes | File Path | |
-i | overwrite ip (useful while starting in container) | No | 127.0.0.1 or 0.0.0.0 | IP Address |
127.0.0.1 - localhost | ||||
0.0.0.0 - for routing request outside container | ||||
-p | overwrite port | No | 2018 | Port Number |
-l | Logger Level | No | INFO | DEBUG |
INFO | ||||
WARN | ||||
ERROR | ||||
CRITICAL | ||||
-a | Enable authentication and authorization | No | false | true or false |
-s | Enable subscription | No | true | true or false |
- By default, the db server is started listening on port 2018. We can connect to the victo sb server with any websocket client using the URL as below
ws://<host-ip>:2018/
Alternatively, you can run Victo as a Docker container.
Starting a Victo Server Instance as a Docker container is simple
docker run --name some-name -p <host-port>:8080 -v <host-path>:/app/victodb -d sreehari006/victo:tag
... where "some-name" is the name you want to provide to the container. Inside the container Victo runs on port 8080. is the port on host machine that you want to map to the container port. is the path on host machine where the volume data is stored. "tag" is the version of Victo that you want to run.
The default ENTRPOINT for Victo docker image is
ENTRYPOINT ["/app/exe/victo-exe", "-d", "/app/victodb", "-i", "0.0.0.0", "-p", "8080"]
However, you cna overwrite the ENTRYPOINT based on the details summarized under "Build" section above, point 6.
For more detail, please visit https://hub.docker.com/repository/docker/sreehari006/victo/general
- AI and Vector analysis
- WebSockets and Socket programming
- JSON parser
- Abstract Syntax Tree
- UUID generator
The fundamental components of Victo Database are:
- db: The basic components which holds a list of collections. Victo databse server can have multiple database objects.
- collection: Collection holds a list of vectors
- vector: Vectors are data points or entities which represent vector embeddings.
- queries: Queries are JSON-like string used to interact with database for storing and retriving db objects.
- subscription: Subscription are like queries. It works in a event driven fashion. when there is a new vector added mathcing the criteria of any subscription, the client would be instantly notified.
- User: User is db user. Valid only if authentication control is enabled on server.
The connection request should have a valid "Authorization Bearer Token" included in the Websocket HTTP(s) request header for authentication.
Authorization: Basic <base64-encoded-token>
"base64-encoded-token" here is base64 encoded string of "username:password". Kindly note, colon (:) is the delimiter between username and password.
Sample Header:
GET ws://127.0.0.1:2018/ HTTP/1.1
Host: 127.0.0.1:2018
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Sec-WebSocket-Key: <Sec-WebSocket-Key>
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Authorization: Basic <base64-encoded-token>
When the server is started for the first time, a default "admin" user with a random password would be created. The password for admin user can be found in the logs while server startup. Please change the password immediately for security reasons.
With "admin" account, the additional user accounts can be created using Add User query.
The following list of DB operations can be executed on the server using any websocket client
As mentioned earlier, query is a JSON-like string. Any victo query has 3 basic components
Key | Description | Valid values |
---|---|---|
op | operation on the Database | "add" if the obj is db |
"add", "delete", "list" or "count" if obj is collection | ||
"put", "get", "list", "count", "delete" or "query" if obj is vector | ||
"add", "get", "list", "count" or "delete" if obj is subscription | ||
"add", "ch_pass", "ch_my_pass" if obj is user | ||
obj | Database object on which the operation is executed | "db", "collection", "vector", "subscription" or "user" |
args | arguments |
{
"op":"add",
"obj":"db",
"args": {
"db": <preferred-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"list",
"obj":"db"
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
"db": <list-of-database>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"add",
"obj":"user",
"args": {
"name": <preferred-name>,
"password": <preferred-password>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
name | User Name | Yes | String | Any |
password | Password | Yes | String | Any |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"ch_my_pass",
"obj":"user",
"args": {
"name": <name>,
"password": <password>,
"new_password": <preferred-new-password>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
name | User Name | Yes | String | Any |
password | Password | Yes | String | Any |
new_password | Password | Yes | String | Any |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"ch_pass",
"obj":"user",
"args": {
"name": <name>,
"password": <password>,
"new_password": <preferred-new-password>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
name | User Name | Yes | String | Any |
password | Password | Yes | String | Any |
new_password | Password | Yes | String | Any |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"add",
"obj":"collection",
"args": {
"db": <db-name>,
"collection": <preferred-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"delete",
"obj":"collection",
"args": {
"db": <db-name>,
"collection": <collection-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"count",
"obj":"collection",
"args": {
"db": <db-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"count": <integer>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"list",
"obj":"collection",
"args": {
"db": <db-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"collections: [
"array-of-collections-uuid"
]
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"put",
"obj":"vector",
"args": {
"db": <db-name>,
"collection": <collection-name>,
"ai_model": <ai-model-with-which-vector-embeddings-are-generated>,
"vdim": <vector-dimension">,
"vp": <array-of-vector-datapoints>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
ai_model | AI Model | Yes | String | |
vdim | Vector Dimension | Yes | Integer | |
vp | Vector Points | Yes | Decimal Array |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"hash": <uuid>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"get",
"obj":"vector",
"args": {
"db": <db-name>,
"collection": <collection-name>,
"hash": <vector-id>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
hash | Vector ID | Yes | UUID |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"hash": <uuid>,
"ai_model": <ai-model>,
"dimension": <integer>,
"is_normal": <boolean-true-if-normalized-else-false>,
"vp": <array-of-decimal-datapoints>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"delete",
"obj":"vector",
"args": {
"db": <db-name>,
"collection": <collection-name>,
"hash": <vector-id>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
hash | Vector ID | Yes | UUID |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"count",
"obj":"vector",
"args": {
"db": <db-name>,
"collection": <collection-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"count": <integer>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"list",
"obj":"vector",
"args": {
"db": <db-name>,
"collection": <collection-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"vectors": [
<array-of-vector-uuids>
]
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"query",
"obj":"vector",
"args": {
"db": <db-name>,
"collection": <collection-name>,
"ai_model": <ai-model-with-which-vector-embeddings-are-generated>,
"vdim": <vector-dimension">,
"vp": <array-of-vector-datapoints>
"q_ops": {
"vd_method": <preferred-vector-distance-calculation-method>,
"k_value": <base-value-for-finding-nearest-vectors>,
"logical_op": <logic-operation-in-query-comparison-against-kvalue>,
"limit": <number-of-objects-returned-in-query>,
"order": <order-in-which-query-is-returned>,
"include_fault": <include-fault-nodes>,
"do_normal": <normalize-before-query-comparison>,
"p_value": <applicable-only-for-minskowski-method>
}
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
ai_model | AI Model | Yes | String | |
vdim | Vector Dimension | Yes | Integer | |
vp | Vector Points | Yes | Decimal Array | |
vd_method | Vector Distance Calculation Method | No | String | Default value is EUCLIDEAN_DISTANC |
EUCLIDEAN_DISTANCE | ||||
COSINE_SIMILARITY | ||||
MANHATTAN_DISTANCE | ||||
MINKOWSKI_DISTANCE | ||||
DOT_PRODUCT | ||||
k_value | base value used for query on calculated distance | No | Decimal | Default 0.0 |
logical_op | logical operation against k_value while query | No | String | Default is = |
>= - GREATER_THAN_OR_EQUAL_TO | ||||
> - GREATER_THAN | ||||
= - EQUAL_TO | ||||
< - LESS_THAN | ||||
<= - LESS_THAN_OR_EQUAL_TO | ||||
limit | Number of vector points returned | No | Integer | Positive Integer |
order | Ascending or descending based on k_value | No | Boolean | Default is false |
false - Ascending | ||||
true - Descending | ||||
include_fault | Include fault nodes | No | Boolean | Default is false |
false - do not include fault nodes | ||||
true - include fault nodes | ||||
do_normal | Normalize vector points while query | No | Boolean | Default is false |
false - do not normalize | ||||
true - normalize vector | ||||
p_value | Applicable only for Minskowski Method | Conditional | Decimal |
Fault nodes are something where the query vector and vectors are incompatible. For example, if the query vector dimension is not same as vector data points dimension.
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"vectors": [
{
"code": <interger-result-code>,
"message": <result-message>,
"ai_model": <ai-model>,
"hash": <vector-uuid>,
"is_normal": <Y-if-normalized-else-N>,
"dimension": <integer-vector-dimension>,
"distance": <distance-from-k_value>
}
],
"faults": [
{
"code": <interger-result-code>,
"message": <result-message>,
"ai_model": <ai-model>,
"hash": <vector-uuid>,
"is_normal": <Y-if-normalized-else-N>,
"dimension": <integer-vector-dimension>,
"distance": 0
}
]
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"add",
"obj":"subscription",
"args": {
"db": <db-name>,
"collection": <collection-name>,
"ai_model": <ai-model-with-which-vector-embeddings-are-generated>,
"vdim": <vector-dimension">,
"vp": <array-of-vector-datapoints>,
"is_normal": <normalize-vector-points-before-query>,
"q_ops": {
"vd_method": <preferred-vector-distance-calculation-method>,
"k_value": <base-value-for-finding-nearest-vectors>,
"logical_op": <logic-operation-in-query-comparison-against-kvalue>,
"p_value": <applicable-only-for-minskowski-method>
}
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
ai_model | AI Model | Yes | String | |
vdim | Vector Dimension | Yes | Integer | |
vp | Vector Points | Yes | Decimal Array | |
vd_method | Vector Distance Calculation Method | No | String | Default value is EUCLIDEAN_DISTANCE |
EUCLIDEAN_DISTANCE | ||||
COSINE_SIMILARITY | ||||
MANHATTAN_DISTANCE | ||||
MINKOWSKI_DISTANCE | ||||
DOT_PRODUCT | ||||
is_normal | Normalize vector points before query | No | boolean | true or false. Default: false |
k_value | base value used for query on calculated distance | No | Decimal | Default 0.0 |
logical_op | logical operation against k_value while query | No | String | Default is = |
>= - GREATER_THAN_OR_EQUAL_TO | ||||
> - GREATER_THAN | ||||
= - EQUAL_TO | ||||
< - LESS_THAN | ||||
<= - LESS_THAN_OR_EQUAL_TO | ||||
p_value | Applicable only for Minskowski Method | Conditional | Decimal |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"hash": <subscription-hash>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"get",
"obj":"subscription",
"args": {
"db": <db-name>,
"collection": <collection-name>,
"hash": <subscription-id>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
hash | Subscription ID | Yes | UUID |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"hash": <uuid>,
"client_id": <uuid>,
"ai_model": <ai-model>,
"dimension": <integer>,
"is_normal": <boolean-true-if-normalized-else-false>,
"vp": <array-of-decimal-datapoints>
"q_ops": {
"vd_method": <preferred-vector-distance-calculation-method>,
"k_value": <base-value-for-finding-nearest-vectors>,
"logical_op": <logic-operation-in-query-comparison-against-kvalue>,
"p_value": <applicable-only-for-minskowski-method>
}
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"delete",
"obj":"subscription",
"args": {
"db": <db-name>,
"collection": <collection-name>,
"hash": <subscription-id>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
hash | Subscription ID | Yes | UUID |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"count",
"obj":"subscription",
"args": {
"db": <db-name>,
"collection": <collection-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"count": <integer>
}
],
"error": [
"array-of-error-strings-if-any
]
}
{
"op":"list",
"obj":"subscription",
"args": {
"db": <db-name>,
"collection": <collection-name>
}
}
Key | Description | Is Mandatory? | Data Type | Valid values |
---|---|---|---|---|
db | DB Name | Yes | String | Alphanumeric value with hyphen and underscore |
collection | Collection Name | Yes | String | Alphanumeric value with hyphen and underscore |
{
"metadata": [
{
"response_id": <response-id>,
"response_time": <response-time>,
"unit_of_time": <response-time-metric-measured-in-secs-by-default>
}
],
"result": [
{
"code": <interger-result-code>,
"message": <result-message>,
"subscriptions": [
<array-of-vector-uuids>
]
}
],
"error": [
"array-of-error-strings-if-any
]
}
By default, a log file (log.txt) would be generated under "database-base-path/logs/" location.
The database server can be started with following logger levels using -l flag
- DEBUG: Used for detailed debugging information.
- INFO: Used to provide informational messages.
- WARNING: Used to indicate potential issues or anomalies that are not necessarily errors but might require attention.
- ERROR: Used to indicate errors that caused the server to behave unexpectedly or incorrectly, but that are not fatal.
- CRITICAL: Used to indicate critical errors that require immediate attention and might result in the termination of the server.
- NLP
- Generative AI
- Recommender System
- Viedo Search
- Image Search
- eCommerce
- Machine Learning
- Social Networks
- Enhance logging mechanism and Error Handling
- Enhance DB features
- Users accounts and access control
- Subscribe on collections
- Build scheduler for threads handling db operations
- Enable support for secure websockets (wss)
[01 Mar 2024] - 2.0.1 (Latest stable version) Minor release
- Added support response time in query response
[15 Feb 2024] - 2.0.0 Added support for:
- Authentication
- User accounts and access control
- Subscriptions
[26 Jan 2024] - 1.2.1 Enhanced logging mechanism performance improved
[20 Jan 2024] - 1.2.0 Enhanced logging mechanism and error handling
[12 Jan 2024] - 1.1.0 Added support for Docker and containerization
[6th Jan 2024] - 1.0.0
Distributed under the MIT License. See LICENSE.txt
for more information.
Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
Sree Hari eMail - hari.tinyblitz@gmail.com LinkedIn - [view_my_profile] (https://www.linkedin.com/in/sree-hari-84911b123/)