# Отладка LineDB

Этот документ описывает различные способы отладки проекта LineDB.

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

### 1. Отладка в VS Code

1. Откройте проект в VS Code
2. Нажмите `F5` или выберите "Run and Debug" в боковой панели
3. Выберите одну из конфигураций:
   - **Debug LineDB Simple Test** - отладка простого теста
   - **Debug LineDB Tests** - отладка тестов
   - **Debug LineDB Example** - отладка примера

### 2. Отладка через Makefile

```bash
# Отладка простого теста
make debug-simple

# Отладка тестов
make debug-tests

# Отладка примера
make debug-example

# Запуск без отладки
make run-simple
```

### 3. Отладка через скрипт

```bash
# Отладка простого теста
./debug.sh simple

# Отладка тестов
./debug.sh tests

# Отладка примера
./debug.sh example
```

## Инструменты отладки

### Delve (dlv)

Delve - это отладчик для Go. Устанавливается автоматически при использовании Makefile или скрипта.

**Основные команды Delve:**

```bash
# Установка
go install github.com/go-delve/delve/cmd/dlv@latest

# Отладка программы
dlv debug main.go

# Отладка тестов
dlv test ./tests/... -- -v

# Отладка с аргументами
dlv debug main.go -- --arg1 --arg2
```

**Команды внутри Delve:**

``` text
break main.main          # Установить точку останова в main
break pkg/linedb/line_db.go:30  # Установить точку останова на строке 30
continue                 # Продолжить выполнение
next                     # Следующая строка
step                     # Войти в функцию
print variable           # Вывести значение переменной
vars                     # Показать все переменные
goroutines               # Показать горутины
stack                    # Показать стек вызовов
quit                     # Выйти из отладчика
```

### VS Code

VS Code предоставляет удобный интерфейс для отладки Go приложений.

**Конфигурации отладки:**

- `Debug LineDB Simple Test` - отладка `debug_main.go`
- `Debug LineDB Tests` - отладка тестов
- `Debug LineDB Example` - отладка примера

## Файлы для отладки

### debug_main.go

Содержит подробный тест с отладочной информацией, который проверяет:

- Инициализацию базы данных
- Вставку данных
- Чтение данных
- Фильтрацию
- Обновление данных

### simple.go

Простой тест для быстрой проверки функциональности.

### tests/linedb_test.go

Официальные тесты проекта.

## Переменные окружения

```bash
# Включить отладочный режим
DEBUG=true make run-simple

# Отладка с переменными окружения
./debug.sh env
```

## Точки останова

Рекомендуемые места для установки точек останова:

1. **Инициализация базы данных:**

```go
   // pkg/linedb/line_db.go:61
   func (db *LineDb) Init(force bool, initOptions *LineDbInitOptions) error
   ```

2 **Вставка данных:**

```go
   // pkg/linedb/line_db.go:140
   func (db *LineDb) Insert(data any, collectionName string, options LineDbAdapterOptions) error
   ```

3 **Чтение данных:**

   ```go
   // pkg/linedb/line_db.go:123
   func (db *LineDb) Read(collectionName string, options LineDbAdapterOptions) ([]any, error)
   ```

4 **Фильтрация:**

   ```go
   // pkg/linedb/line_db.go:343
   func (db *LineDb) ReadByFilter(filter any, collectionName string, options LineDbAdapterOptions) ([]any, error)
   ```

## Отладка проблем

### Проблема: Программа зависает

1. Проверьте кэш:

   ```go
   // pkg/linedb/cache.go:cleanupLoop
   func (c *RecordCache) cleanupLoop()
   ```

2. Проверьте транзакции:

   ```go
   // pkg/linedb/transaction.go
   func (t *Transaction) IsActive() bool
   ```

### Проблема: Ошибки при работе с файлами

1. Проверьте права доступа к папке `testdata`
2. Убедитесь, что папка существует
3. Проверьте логи файловых операций

### Проблема: Ошибки кэша

1. Проверьте размер кэша
2. Проверьте TTL кэша
3. Убедитесь, что кэш корректно очищается

## Полезные команды

```bash
# Очистка и пересборка
make clean && make build

# Проверка кода
make lint

# Форматирование кода
make fmt

# Проверка зависимостей
make deps

# Справка
make help
```

## Логирование

Для добавления отладочной информации используйте:

```go
fmt.Printf("DEBUG: %+v\n", variable)
```

Или создайте функцию логирования:

```go
func debugLog(format string, args ...any) {
    if os.Getenv("DEBUG") == "true" {
        fmt.Printf("DEBUG: "+format+"\n", args...)
    }
}
```
