# 機能設計書 28-リクエストデータ取得・設定

## 概要

本ドキュメントは、libuv の `uv_req_get_data()` および `uv_req_set_data()` API によるリクエストへのユーザーデータ関連付け機能について、その設計仕様を記述する。

### 本機能の処理概要

本機能は、リクエスト構造体の `data` フィールドを通じて、任意のユーザーデータ（`void*`）をリクエストに関連付ける getter/setter 関数を提供する。

**業務上の目的・背景**：libuv のリクエストにはコールバック関数が設定されるが、コールバック内でアプリケーション固有のコンテキスト情報にアクセスする必要がある。`data` フィールドを介してユーザーポインタを保持することで、非同期操作の完了コールバックからアプリケーションの状態にアクセスできるようになる。`uv_handle_get_data()`/`uv_handle_set_data()`（No.23）のリクエスト版に相当する。

**機能の利用シーン**：非同期操作のコールバック内でアプリケーションコンテキストにアクセスする際、言語バインディングでネイティブオブジェクトとリクエストを対応付ける際に使用される。

**主要な処理内容**：
1. `uv_req_get_data()`: リクエスト構造体の `data` フィールドの値を返却する
2. `uv_req_set_data()`: リクエスト構造体の `data` フィールドに指定された値を設定する

**関連システム・外部連携**：特になし。

**権限による制御**：権限による制御は存在しない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | リクエスト基底 | 主機能 | uv_req_get_data()/uv_req_set_data()によるユーザーデータ関連付けのAPI定義 |

## 機能種別

データ取得・設定（ユーザーデータの読み書き）

## 入力仕様

### 入力パラメータ

#### uv_req_get_data()

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| req | const uv_req_t* | Yes | データを取得するリクエストへのポインタ | NULLでないこと |

#### uv_req_set_data()

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| req | uv_req_t* | Yes | データを設定するリクエストへのポインタ | NULLでないこと |
| data | void* | Yes | リクエストに関連付けるユーザーデータへのポインタ | NULL可 |

### 入力データソース

関数の引数として直接指定される。

## 出力仕様

### 出力データ

#### uv_req_get_data()

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | void* | リクエストに関連付けられたユーザーデータへのポインタ |

#### uv_req_set_data()

| 項目名 | 型 | 説明 |
|--------|-----|------|
| (なし) | void | 戻り値なし |

### 出力先

`uv_req_get_data()` は関数の戻り値として返却。`uv_req_set_data()` はリクエスト構造体の `data` フィールドを直接更新する。

## 処理フロー

### 処理シーケンス

```
uv_req_get_data(req):
1. req->data を返却

uv_req_set_data(req, data):
1. req->data = data を実行
```

### フローチャート

```mermaid
flowchart TD
    A1[uv_req_get_data] --> B1["return req->data"]
    A2[uv_req_set_data] --> B2["req->data = data"]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-28-01 | ユーザー責任の管理 | data ポインタが指すメモリの管理はユーザーの責任である | 常時 |
| BR-28-02 | 公開フィールド | data フィールドは UV_REQ_FIELDS の public セクションに定義されている | 常時 |

### 計算ロジック

フィールドの直接読み書きであり、計算ロジックは存在しない。

## データベース操作仕様

該当なし。

## エラー処理

### エラーケース一覧

明示的なエラー処理は存在しない。

### リトライ仕様

リトライは不要。

## トランザクション仕様

該当なし。

## パフォーマンス要件

O(1)の定数時間で完了する。

## セキュリティ考慮事項

`data` フィールドは void* であり、型安全性は呼び出し元の責任となる。

## 備考

- `data` フィールドは `UV_REQ_FIELDS` マクロの public セクション（`include/uv.h` L434）に定義されている。
- 全てのリクエスト型が `UV_REQ_FIELDS` を含むため、本関数は全リクエスト型に対して使用可能。
- 対応する `uv_handle_get_data()`/`uv_handle_set_data()` がハンドル用に存在する（No.23参照）。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uv.h | `include/uv.h` | **432-439行目**: UV_REQ_FIELDS マクロ。先頭に `void* data;` が定義（L434） |
| 1-2 | uv.h | `include/uv.h` | **441-444行目**: uv_req_s 構造体の定義 |

**読解のコツ**: `data` フィールドは UV_REQ_FIELDS の `/* public */` セクションに定義されており、直接アクセスも可能。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | uv.h | `include/uv.h` | **491行目**: uv_req_get_data() の宣言 |
| 2-2 | uv.h | `include/uv.h` | **492行目**: uv_req_set_data() の宣言 |

#### Step 3: 実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | uv-data-getter-setters.c | `src/uv-data-getter-setters.c` | **69-71行目**: uv_req_get_data() の実装。`return req->data;` |
| 3-2 | uv-data-getter-setters.c | `src/uv-data-getter-setters.c` | **73-75行目**: uv_req_set_data() の実装。`req->data = data;` |

### プログラム呼び出し階層図

```
uv_req_get_data(req)
    └─ return req->data

uv_req_set_data(req, data)
    └─ req->data = data
```

### データフロー図

```
[入力]                [処理]                    [出力]

uv_req_t* ────────▶ req->data 参照 ──────────▶ void* (ユーザーデータ)

uv_req_t* + data ──▶ req->data 設定 ──────────▶ (副作用: フィールド更新)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uv.h | `include/uv.h` | ヘッダ | API宣言、UV_REQ_FIELDS マクロ定義 |
| uv-data-getter-setters.c | `src/uv-data-getter-setters.c` | ソース | uv_req_get_data() / uv_req_set_data() の実装 |
