# LineDB Go Port

Это Go порт библиотеки LineDB - NoSQL базы данных на основе JSONL файлов.

## Особенности

- **JSONL файлы**: Хранение данных в формате JSON Lines
- **Кэширование**: Встроенный кэш с TTL
- **Партиционирование**: Поддержка партиционирования данных
- **Транзакции**: Поддержка транзакций с откатом
- **Шифрование**: Опциональное шифрование данных
- **Индексация**: Поддержка индексированных полей

## Установка

```bash
go get linedb
```

## Быстрый старт

```go
package main

import (
    "log"
    "time"
    "linedb/pkg/linedb"
)

func main() {
    // Создаем опции инициализации
    initOptions := &linedb.LineDbInitOptions{
        CacheSize: 1000,
        CacheTTL:  5 * time.Minute,
        DBFolder:  "./data",
        Collections: []linedb.JSONLFileOptions{
            {
                CollectionName: "users",
                AllocSize:      512,
                IndexedFields:  []string{"id", "email", "name"},
            },
        },
    }

    // Создаем базу данных
    db := linedb.NewLineDb(nil)
    
    // Инициализируем базу данных
    if err := db.Init(false, initOptions); err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Вставляем данные
    user := map[string]any{
        "name":  "John Doe",
        "email": "john@example.com",
        "age":   30,
    }
    
    if err := db.Insert(user, "users", linedb.LineDbAdapterOptions{}); err != nil {
        log.Fatal(err)
    }

    // Читаем данные
    users, err := db.Read("users", linedb.LineDbAdapterOptions{})
    if err != nil {
        log.Fatal(err)
    }
    
    log.Printf("Users: %+v", users)
}
```

## API

### Создание базы данных

```go
db := linedb.NewLineDb(options, adapters...)
```

### Инициализация

```go
err := db.Init(force, initOptions)
```

### CRUD операции

```go
// Вставка
err := db.Insert(data, collectionName, options)

// Чтение
data, err := db.Read(collectionName, options)

// Обновление
updated, err := db.Update(updateData, collectionName, filter, options)

// Удаление
deleted, err := db.Delete(filter, collectionName, options)
```

### Фильтрация

```go
// Фильтр по полям
filter := map[string]any{"name": "John"}
results, err := db.ReadByFilter(filter, collectionName, options)

// Строковый фильтр
results, err := db.ReadByFilter("name===John", collectionName, options)
```

### Партиционирование

```go
initOptions := &linedb.LineDbInitOptions{
    Collections: []linedb.JSONLFileOptions{
        {CollectionName: "orders"},
    },
    Partitions: []linedb.PartitionCollection{
        {
            CollectionName: "orders",
            PartIDFn: func(item any) string {
                if itemMap, ok := item.(map[string]any); ok {
                    return toString(itemMap["userId"])
                }
                return "default"
            },
        },
    },
}
```

## Тестирование

```bash
cd go-port
go test ./tests/...
```

## Примеры

Смотрите папку `examples/` для дополнительных примеров использования.

## Лицензия

MIT

