[SourcePawn] Урок 13 - Работа с базами данных (MySQL, SQLite)

Dragokas

Добрая душа
Сообщения
229
Реакции
213
А какая из локальных БД быстрее для не-поточных операций - MySQL или SQLite ?
(для простейшей операции - SELECT)

Может, есть какие-то подводные камни в плане стабильности?
 

ykpon

Владыка
Сообщения
675
Реакции
399
А какая из локальных БД быстрее для не-поточных операций - MySQL или SQLite ?
(для простейшей операции - SELECT)

Может, есть какие-то подводные камни в плане стабильности?
Быстрее будет sqlite, если ssd. Это файловая БД и производительность зависит от IO. MySQL может быть быстрее если закешировать все данные в памяти.
 

Dragokas

Добрая душа
Сообщения
229
Реакции
213
А как начать работу с локальной MySQL БД, которая якобы идёт в комплекте с SourceMod?
Судя по докам:

C-подобный:
Database g_hDB;

public void OnConfigsExecuted()
{
    char error[256];
    g_hDB = SQL_DefConnect(error, sizeof(error), true);
    if( g_hDB == null || error[0] )
    {
        SetFailState("%s", error);
    }
}
Но мне выдаёт ошибку авторизации:
[1045]: Access denied for user 'root'@'localhost' (using password: NO)
databases.cfg у меня дефолтовый:
C-подобный:
"Databases"
{
    "driver_default"        "mysql"
    
    // When specifying "host", you may use an IP address, a hostname, or a socket file path
    
    "default"
    {
        "driver"            "default"
        "host"                "localhost"
        "database"            "sourcemod"
        "user"                "root"
        "pass"                ""
        //"timeout"            "0"
        //"port"            "0"
    }
    
    "storage-local"
    {
        "driver"            "sqlite"
        "database"            "sourcemod-local"
    }

    "clientprefs"
    {
        "driver"            "sqlite"
        "host"                "localhost"
        "database"            "clientprefs-sqlite"
        "user"                "root"
        "pass"                ""
        //"timeout"            "0"
        //"port"            "0"
    }
}

Вообще, задача автоматически (плагином) создать локальную базу или подключиться к готовой (без ручных телодвижений с файлом databases.cfg).
С SQLite всё работает норм через:
C-подобный:
g_hLcDB = SQLite_UseDatabase("sourcemod-local", error, sizeof(error));
а с MySQL как?
Сообщения автоматически склеены:

Правильно ли я понимаю, это нужно вручную подключаться к установленной MySQL, создавать юзера, базу, и вносить эти настройки в "default" секцию, иначе это работать не будет?
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #84
@Dragokas, верно понимаете. У см нет никакой локальной MySQL базы. Предполагается, что Вы сами создадите и заполните конфиг.
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
А если необходимо создать более 1 таблицы ?

C++:
public void ConnectCallBack(Database hDatabase, const char[] sError, any data) // Пришел результат соеденения
{
    if (hDatabase == null)    // Соединение  не удачное
    {
        SetFailState("Database failure: %s", sError); // Отключаем плагин
        return;
    }

    g_hDatabase = hDatabase; // Присваиваем глобальной переменной соеденения значение текущего соеденения
    
    
    SQL_LockDatabase(g_hDatabase); // Блокируем базу для других запросов

    g_hDatabase.Query(SQL_Callback_CheckError,    "CREATE TABLE IF NOT EXISTS `table_stats` (\
                                                            `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\
                                                            `auth` VARCHAR(32) NOT NULL,\
                                                            `name` VARCHAR(32) NOT NULL default 'unknown',\
                                                            `last_connect` INTEGER UNSIGNED NOT NULL,\
                                                            `hits` INTEGER NOT NULL default '0',\
                                                            `hits_hs` INTEGER NOT NULL default '0',\
                                                            `kills` INTEGER NOT NULL default '0',\
                                                            `kills_hs` INTEGER NOT NULL default '0',\
                                                            `deaths` INTEGER NOT NULL default '0');");
    SQL_UnlockDatabase(g_hDatabase); // Разблокируем базу
    
    g_hDatabase.SetCharset("utf8"); // Устанавливаем кодировку
}
 

Young <

Now, finally free
Сообщения
1,263
Реакции
505
А если необходимо создать более 1 таблицы ?

C++:
public void ConnectCallBack(Database hDatabase, const char[] sError, any data) // Пришел результат соеденения
{
    if (hDatabase == null)    // Соединение  не удачное
    {
        SetFailState("Database failure: %s", sError); // Отключаем плагин
        return;
    }

    g_hDatabase = hDatabase; // Присваиваем глобальной переменной соеденения значение текущего соеденения
    
    
    SQL_LockDatabase(g_hDatabase); // Блокируем базу для других запросов

    g_hDatabase.Query(SQL_Callback_CheckError,    "CREATE TABLE IF NOT EXISTS `table_stats` (\
                                                            `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\
                                                            `auth` VARCHAR(32) NOT NULL,\
                                                            `name` VARCHAR(32) NOT NULL default 'unknown',\
                                                            `last_connect` INTEGER UNSIGNED NOT NULL,\
                                                            `hits` INTEGER NOT NULL default '0',\
                                                            `hits_hs` INTEGER NOT NULL default '0',\
                                                            `kills` INTEGER NOT NULL default '0',\
                                                            `kills_hs` INTEGER NOT NULL default '0',\
                                                            `deaths` INTEGER NOT NULL default '0');");
    SQL_UnlockDatabase(g_hDatabase); // Разблокируем базу
    
    g_hDatabase.SetCharset("utf8"); // Устанавливаем кодировку
}

В транзакцию.
 

Miroha

Участник
Сообщения
1,124
Реакции
134
Кто знает, как можно ограничить доступ человеку к базе данной если у него допустим есть доступ есть и логин и пароль к базе данной? Как можно ограничить доступ?
 

Larsalex

Сообщения
812
Реакции
404
Кто знает, как можно ограничить доступ человеку к базе данной если у него допустим есть доступ есть и логин и пароль к базе данной? Как можно ограничить доступ?
Кто такой ваш гугол (яндекс(бинг))

1653862756171.png
 

Miroha

Участник
Сообщения
1,124
Реакции
134
Кто такой ваш гугол (яндекс(бинг))

Посмотреть вложение 97051
Что-то похожее нашёл на помощь моего решения, но я в этом даже прочитав не очень разобрался как, просто если буду лазить и не туда нажму боюсь что-то сломаю и всё потом не восстановлю и не пойму.
Похожее на то что мне надо сделать.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #90
@Miroha, когда пользователь в MySQL создаётся, там можно указать конкретные БД, к которым у него должен быть доступ, и права доступа (только чтение/запись/модификация структуры БД/etc).
 

Miroha

Участник
Сообщения
1,124
Реакции
134
@Miroha, когда пользователь в MySQL создаётся, там можно указать конкретные БД, к которым у него должен быть доступ, и права доступа (только чтение/запись/модификация структуры БД/etc).
Слушай кто может помочь? С ограничением базы данных я просто не очень понимаю я просто боюсь испорчу...
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #92
@Miroha, опишите целиком проблему: что дано и как надо сделать.
Перечень возможных прав доступа (чтобы можно было понимать, что можно ограничить, а что нет):
1655413336261.png
 

Miroha

Участник
Сообщения
1,124
Реакции
134
@Miroha, опишите целиком проблему: что дано и как надо сделать.
Перечень возможных прав доступа (чтобы можно было понимать, что можно ограничить, а что нет):
Посмотреть вложение 98105
Надо сделать что бы только я смог входить на баззу данных, а если давал доступ человеку логин базы данной и пароль и он не смог войти - вот что мне надо.
Сообщения автоматически склеены:

@Miroha, опишите целиком проблему: что дано и как надо сделать.
Перечень возможных прав доступа (чтобы можно было понимать, что можно ограничить, а что нет):
Посмотреть вложение 98105
У меня если что вот так.
 

Вложения

  • 1655413563977.png
    1655413563977.png
    8.2 КБ · Просмотры: 12

Miroha

Участник
Сообщения
1,124
Реакции
134
в плане по ip? Просто я в этом новичок... эх если бы ты смог щас по быстрому по демонстрации экрана мне бы показал как что убрать и т.д
Сообщения автоматически склеены:

Мне нужно что бы сайт к которому подключена база данных работал, но что бы к ней не было доступа посторонним людям, такое возможно сделать?
Сообщения автоматически склеены:

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

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #96
Мне нужно что бы сайт к которому подключена база данных работал, но что бы к ней не было доступа посторонним людям, такое возможно сделать?
Если у Вас на веб-хостинге стоит phpMyAdmin, то без шансов: сам PMA все обращения к базе осуществляет из-под IP-адреса 127.0.0.1, поэтому отличать полноценно скрипты от внешних посетителей нельзя.
 

Miroha

Участник
Сообщения
1,124
Реакции
134
Если у Вас на веб-хостинге стоит phpMyAdmin, то без шансов: сам PMA все обращения к базе осуществляет из-под IP-адреса 127.0.0.1, поэтому отличать полноценно скрипты от внешних посетителей нельзя.
Понял, а на какой хост или веб часть мне перейти что бы можно было закрыть доступ?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #98
@Miroha, у Вас сейчас веб-хостинг или вдс?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Miroha, на веб хостингах от хостинга зависит, и то много НО. Тот же Бегет не размещает PMA на всех доменах пользователя, что усложняет (но не делает невозможным) вход в базу. Там у них отдельный домен под каждый выделенный сервер с клиентами.
 
Сверху Снизу