Database management

From ISPWiki
Revision as of 14:33, 30 October 2015 by Ksenya (talk | contribs) (Connecting to the database)
Jump to: navigation, search

Introduction

В состав COREmanager включен набор классов для работы с различными базами данных Group_mgr_db. Эти классы позволяют не только выполнять запросы, но и создавать, а в последствии и изменять, структуру самой базы данных. Следующая статья поможет понять, как всем этим пользоваться.

Connecting to the database

Для начала, чтобы мы сразу смогли проверять то, что мы пишем, давайте подключимся к базе данных. Выбор типа базы данных никак не повляет на описание структуры или работу с ними. В общем, подключение к базе будет выглядеть следующим образом:

#include <mgr/mgrdb_struct.h>
mgr_db::Cache *db_cache;

MODULE_INIT(db, "") {
  mgr_db::ConnectionParams params;
  ...
  db_cache = new mgr_db::Cache(params);
}

Теперь нам осталось заполнить параметры для подключения и создать базу данных.

SqLite

The easiest way is to used the built-in SqLite base. Specify the path to the file where your data will be kept:

  params.type = "sqlite";
  params.db = "etc/mydb.db";

MySQL

There are some differences in the code:

  params.type = "mysql";
  params.db = "my_database";
  params.user = "my_user";
  params.password = "my_password";
  params.client = "my_panel";

Теперь о настройке сервера. Дело в том, что с СУБД типа MySQL, PostgreSQL и т.д. мы работаем через ODBC драйвер. Поэтому, кроме того, что вам надо создать базу данных и пользователя с правами на изменение структуры этой базы, вам необходимо установить и настроить ODBC драйвер.

Например, для Debian, вам необходимо установить пакет: libmyodbc.

После чего необходимо добавить в файл /etc/odbc.ini следующие строки:

[MySQL]
Description = MySQL
Driver = MySQL
Server = localhost
Database =
Port =
Socket = /var/run/mysqld/mysqld.sock
Option =
Stmt =

В файл /etc/odbcinst.ini:

[MySQL]
Description = MySQL ODBC driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
UsageCount = 1
CPTimeout = 0
CPTimeToLive = 0
DisableGetFunctions = 0
DontDLCLose = 1
ExFetchMapping = 1
Threading = 0
FakeUnicode = 0
IconvEncoding =
Trace =
TraceFile =
TraceLibrary =

Пути, которые необходимо указать в параметрах Socket, Driver и Setup, могут отличаться в зависимости от типа используемого дистрибутива.

Creating a table

Следующий небольшой пример демонстрирует создание таблицы "users" с тремя полями: id, name, password:

#include <mgr/mgrdb_struct.h>
extern mgr_db::Cache *db_cache;
...
class Users : public mgr_db::Table {
public:
  mgr_db::StringField Password;
  Users(): mgr_db::Table("users", 32), Password(this, "password", 128) {}
};
...
MODULE_INIT(users, "db") {
  db_cache->Register<Users>();
}

class Users - этот класс описывает структуру будущей таблицы. Поля описываются свойствами класса - объектами наследниками класса Class_mgr_db::Field. Класс обязательно должен иметь без параметров.

Вызов метода Register класса Class_mgr_db::Cache, создает таблицу в БД, или изменяет ее структуру, если она уже создана, но не соответствует описанию.

Внимательный читатель может спросить: почему таблица users будет содержать 3 поля, ведь мы описали только одно? Дело в том, что класс Class_mgr_db::Table - наследник Class_mgr_db::CustomTable уже содержит два поля: первичный ключ - id, и уникальное поле - name. Если эти поля вам не нужны, вы можете унаследоваться от Class_mgr_db::CustomTable или Class_mgr_db::IdTable.

Creating a list

Теперь мы готовы к тому, чтобы начать использование таблицы users в нашей панели.

MODULE_INIT(action_user, "users") {
  new iso_api::TableIdListAction<Users>("user", isp_api::AccessAdmin, *cache);
}

И это все!!! Теперь у нас есть ряд функций реализующих работу с таблицей users:

  • user - выводит список записей
  • user.edit - создание/редактирование записей
  • user.delete - удаление записей

Ключем в данном случае будет выступать id записи. Если вы желаете предоставить клиенту возможность работать с нативными ключами, вы можете переписать этот код следующим образом:

MODULE_INIT(action_user, "users") {
  new iso_api::TableNameListAction<Users>("user", isp_api::AccessAdmin, *cache);
}

В этом случае, ключом будет имя пользователя. Конечно, если вам необходима более сложная логика, чем просто редактирование таблицы, вам придется писать свой класс - наследник например Class_isp_api::TableNameListAction.