/
VirusVK
/
ServerIT
Обзор
Документация
Войти
/
VirusVK
/
ServerIT
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
armdb/src/models/user.c
231 строка
8 KB
VirusVK
upload files
13 дек 2025, 14:28
13 дек 2025, 14:28
a626524
Код
Авторство
О чём код?
#include <stdlib.h> #include <string.h> #include <stdio.h> #include "storage.h" #include "models.h" /* Приватные функции */ static void serialize_user_record(const UserRecord *record, uint8_t *buffer) { size_t offset = 0; // ID memcpy(buffer + offset, &record->id, sizeof(ObjectID)); offset += sizeof(ObjectID); // Поля фиксированной длины memcpy(buffer + offset, record->username, sizeof(record->username)); offset += sizeof(record->username); memcpy(buffer + offset, record->full_name, sizeof(record->full_name)); offset += sizeof(record->full_name); // Подразделение memcpy(buffer + offset, &record->department_id, sizeof(ObjectID)); offset += sizeof(ObjectID); memcpy(buffer + offset, record->phone, sizeof(record->phone)); offset += sizeof(record->phone); // Привязанные АРМ buffer[offset++] = record->assigned_count; for (int i = 0; i < record->assigned_count; i++) { memcpy(buffer + offset, &record->assigned_arms[i], sizeof(ObjectID)); offset += sizeof(ObjectID); } // Остальные поля memcpy(buffer + offset, record->notes, sizeof(record->notes)); offset += sizeof(record->notes); memcpy(buffer + offset, &record->created_at, sizeof(Timestamp)); offset += sizeof(Timestamp); memcpy(buffer + offset, &record->updated_at, sizeof(Timestamp)); offset += sizeof(Timestamp); // Флаги buffer[offset] = record->is_deleted ? 1 : 0; } static void deserialize_user_record(UserRecord *record, const uint8_t *buffer) { size_t offset = 0; // ID memcpy(&record->id, buffer + offset, sizeof(ObjectID)); offset += sizeof(ObjectID); // Поля фиксированной длины memcpy(record->username, buffer + offset, sizeof(record->username)); offset += sizeof(record->username); memcpy(record->full_name, buffer + offset, sizeof(record->full_name)); offset += sizeof(record->full_name); // Подразделение memcpy(&record->department_id, buffer + offset, sizeof(ObjectID)); offset += sizeof(ObjectID); memcpy(record->phone, buffer + offset, sizeof(record->phone)); offset += sizeof(record->phone); // Привязанные АРМ record->assigned_count = buffer[offset++]; for (int i = 0; i < record->assigned_count && i < MAX_ARRAY_SIZE; i++) { memcpy(&record->assigned_arms[i], buffer + offset, sizeof(ObjectID)); offset += sizeof(ObjectID); } // Остальные поля memcpy(record->notes, buffer + offset, sizeof(record->notes)); offset += sizeof(record->notes); memcpy(&record->created_at, buffer + offset, sizeof(Timestamp)); offset += sizeof(Timestamp); memcpy(&record->updated_at, buffer + offset, sizeof(Timestamp)); offset += sizeof(Timestamp); // Флаги record->is_deleted = buffer[offset] ? true : false; } /* Публичные функции */ size_t user_record_size(void) { return sizeof(ObjectID) + // id sizeof(char) * 64 + // username sizeof(char) * 256 + // full_name sizeof(ObjectID) + // department_id sizeof(char) * 32 + // phone 1 + // assigned_count sizeof(ObjectID) * MAX_ARRAY_SIZE + // assigned_arms sizeof(char) * 512 + // notes sizeof(Timestamp) * 2 + // created_at, updated_at 1; // is_deleted } ObjectID create_user_id(uint64_t counter) { ObjectID id = {OBJECT_USER, counter}; return id; } int user_insert(Database *db, const UserRecord *record, ObjectID *current_user_id) { if (!db || !record) return -1; // Проверяем уникальность логина // TODO: реализовать проверку // Создаем новую страницу uint64_t page_num; if (db_alloc_page(db, &page_num) != 0) return -1; // Сериализуем запись Page page; uint8_t buffer[user_record_size()]; serialize_user_record(record, buffer); memcpy(page.data, buffer, sizeof(buffer)); // Записываем страницу if (db_write_page(db, page_num, &page) != 0) { db_free_page(db, page_num); return -1; } // Обновляем индекс // TODO: добавить в B-дерево // Обновляем счетчик ID db->header.last_object_id[1]++; // Журналирование // TODO: journal_log() return 0; } int user_update(Database *db, const ObjectID *id, const UserRecord *record, ObjectID *current_user_id) { if (!db || !id || !record) return -1; // TODO: реализовать обновление return 0; } int user_delete(Database *db, const ObjectID *id, ObjectID *current_user_id) { if (!db || !id) return -1; // TODO: реализовать мягкое удаление return 0; } int user_find_by_id(Database *db, const ObjectID *id, UserRecord *record) { if (!db || !id || !record) return -1; // TODO: поиск через B-дерево return -1; } int user_find_by_username(Database *db, const char *username, UserRecord *record) { if (!db || !username || !record) return -1; // TODO: поиск по логину return -1; } int user_list_all(Database *db, UserRecord **records, int *count) { if (!db || !records || !count) return -1; // TODO: получить все записи *count = 0; *records = NULL; return 0; } int user_assign_arm(Database *db, const ObjectID *user_id, const ObjectID *arm_id, ObjectID *current_user_id) { if (!db || !user_id || !arm_id) return -1; // TODO: добавить АРМ в список привязанных return 0; } int user_unassign_arm(Database *db, const ObjectID *user_id, const ObjectID *arm_id, ObjectID *current_user_id) { if (!db || !user_id || !arm_id) return -1; // TODO: удалить АРМ из списка привязанных return 0; } void user_print(const UserRecord *record) { if (!record) return; printf("=== Пользователь ===\n"); printf("ID: %lu.%lu\n", record->id.type, record->id.counter); printf("Логин: %s\n", record->username); printf("ФИО: %s\n", record->full_name); printf("Подразделение: %lu.%lu\n", record->department_id.type, record->department_id.counter); printf("Телефон: %s\n", record->phone); printf("Привязанные АРМ (%d):\n", record->assigned_count); for (int i = 0; i < record->assigned_count; i++) { printf(" - %lu.%lu\n", record->assigned_arms[i].type, record->assigned_arms[i].counter); } printf("Примечания: %s\n", record->notes); printf("Создан: %lld.%d\n", (long long)record->created_at.seconds, record->created_at.nanoseconds); printf("Обновлен: %lld.%d\n", (long long)record->updated_at.seconds, record->updated_at.nanoseconds); printf("Удален: %s\n", record->is_deleted ? "да" : "нет"); }