Skip to main content

SQL to LNH allows to generate LNH structures and functions from SQL queries.

Project description

SQL to LNH

Проект предназначен для конвертацию выражений SQL в выражения языка C++, совместимые с библиотекой LNH L0.

Цели проекта

Основной целью является создание более высокоуровневого инструмент для описания структур LNH и методов их обработки, чем код на C.

Возможности в текущей версии

  • Парсинг SQL выражений CREATE TABLE:
    • Ключ можно задать с использованием ключевых слов PRIMARY KEY при описании столбца или выражения PRIMARY KEY (col1, col2) при описании всей таблицы
    • Поддерживаются поля типов INT{N}, TINYINT, SMALLINT, MEDIUMINT, INT, INTEGER, BIGINTEGER, а также BOOLEAN. Размеры полей возможно задать только в байтах
  • Преобразование выражений CREATE TABLE в шаблонный код на C:
    • Размер поля определяется параметром keyval_size
    • Имеется поддержка расширения структуры путём частичного дублирования ключа, как в btwc-dijkstra-xrt
    • Значения группируются "наивным" алгоритмом: выбираются в порядке их объявления, и если места в группе для значения не хватает, то формируется новая группа, в которую помещается новое значение
  • Задание алгоритмов поиска данных и обхода структур через выражения SELECT
    • Поддерживается поиск только по одной таблице
    • Поддерживаются псевдонимы таблиц и столбцов, LIMIT, ORDER BY, WHERE
    • Поддерживаются поименованные параметры подстановки типа :foo, $bar
    • Поддержка функций агрегации не подтверждена
  • Создание функций вставки из выражений INSERT INTO
    • Необходимо перечислить все столбцы для вставки

Установка

Установить можно с помощью команды:

pip install sql_to_lnh

Использование

CLI

С пакетом предоставляется CLI-утилита для тестирования. Запустите в терминале командой sql_to_lnh. На вход предоставляется выражение SQL, имя объекта, на выходе генерируется необходимый фрагмент C++ кода. Пример:

Введите SQL-выражение
>>> CREATE TABLE users(
>>>  idx     INT4 NOT NULL,
>>>  user    INT4 NOT NULL,
>>>  role    INT4 NOT NULL,
>>>  time    INT4 NOT NULL,
>>>  PRIMARY KEY (idx, user)
>>>  )
>>>
Имя объекта (Enter для имени по-умолчанию):
USERS
Результат трансляции:
struct Users {
  int struct_number;
  constexpr Users(int struct_number) : struct_number(struct_number) {}
  STRUCT(Key0) {
    unsigned int idx: 32;
    unsigned int user: 32;
  };
  STRUCT(Val0) {
    unsigned int role: 32;
    unsigned int time: 32;
  };
  #ifdef __riscv64__
  DEFINE_DEFAULT_KEYVAL(Key0, Val0)
  #endif
};

constexpr Users USERS(1);

Введите SQL-выражение
>>>

cog

С пакетом распространяется утилита для кодогенерации cog. Cog позволяет включать в файлы с исходным кодом комментарии, которые содержат код на python, исполнять код из комментариев и результат работы печатать в исходный файл.

Чтобы создать модуль с объявлениями, который можно использовать в проекте для LNH, создайте файл с комментариями для cog (к примеру, codegen.h). В комментариях cog необходимо:

  1. Инициализировать модуль:
/*[[[cog
from sql_to_lnh.CogPrinter import CogPrinter

codegen = CogPrinter('sql_to_lnh.db')
]]]*/
//[[[end]]]
  1. Вызвать модуль кодогенерации с выражением SQL и именем структуры (опционально):
/*[[[cog
users_SQL = """
CREATE TABLE users(
  idx		    INT4 NOT NULL,
  user       INT4 NOT NULL,
  role       INT4 NOT NULL,
  time    INT4 NOT NULL,
  PRIMARY KEY (idx, user)
  )"""
codegen.translate(users_SQL, 'USERS')
]]]*/
//[[[end]]]
  1. Закрыть модуль кодогенерации:
/*[[[cog
codegen.close()
]]]*/
//[[[end]]]
  1. Вызвать cog командой cog -r [ИМЯ ФАЙЛА]. В результате будет получен файл:
/*[[[cog
from sql_to_lnh.CogPrinter import CogPrinter

codegen = CogPrinter('sql_to_lnh.db')
]]]*/

#ifndef GITERS_H_
#define GITERS_H_


#include <stdlib.h>
#include <stdint.h>
#include <cmath>
#include <cassert>
#ifdef __riscv64__
#include "map.h"
#endif
#include "compose_keys.hxx"

#define DEBUG

#ifdef __riscv64__
template<typename K, typename V>
struct Handle {
        bool ret_val;
        K k{get_result_key<K>()};
        V v{get_result_value<V>()};
        [[gnu::always_inline]] Handle(bool ret_val) : ret_val(ret_val) {
        }

        [[gnu::always_inline]] operator bool() const {
                return ret_val;
        }

        [[gnu::always_inline]] K key() const {
                return k;
        }

        [[gnu::always_inline]] V value() const {
                return v;
        }
};
#endif

//[[[end]]]

/*[[[cog
users_SQL = """
CREATE TABLE users(
  idx		    INT4 NOT NULL,
  user       INT4 NOT NULL,
  role       INT4 NOT NULL,
  time    INT4 NOT NULL,
  PRIMARY KEY (idx, user)
  )"""
codegen.translate(users_SQL, 'USERS')
]]]*/
struct Users {
  int struct_number;
  constexpr Users(int struct_number) : struct_number(struct_number) {}
  STRUCT(Key0) {
    unsigned int idx: 32;
    unsigned int user: 32;
  };
  STRUCT(Val0) {
    unsigned int role: 32;
    unsigned int time: 32;
  };
  #ifdef __riscv64__
  DEFINE_DEFAULT_KEYVAL(Key0, Val0)
  #endif
};

constexpr Users USERS(1);

//[[[end]]]

/*[[[cog
codegen.close()
]]]*/

#endif

//[[[end]]]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sql_to_lnh-1.0.0.tar.gz (105.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sql_to_lnh-1.0.0-py3-none-any.whl (106.7 kB view details)

Uploaded Python 3

File details

Details for the file sql_to_lnh-1.0.0.tar.gz.

File metadata

  • Download URL: sql_to_lnh-1.0.0.tar.gz
  • Upload date:
  • Size: 105.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.10.12

File hashes

Hashes for sql_to_lnh-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ae22fb1a7efab32c224ba21bca4dbd92a15dc37d920f1857a8e60d7461e1d061
MD5 dab54a36b053d1a3cff1fc31ed6c0e4f
BLAKE2b-256 5b06f9a596432fb888744b855a5e5978f07be3f4616dbe953eab482180b39031

See more details on using hashes here.

File details

Details for the file sql_to_lnh-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: sql_to_lnh-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 106.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.10.12

File hashes

Hashes for sql_to_lnh-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a4aa6ea6621c3fa3d9ee3124fb4438e6120d02fed89044096d2c8473bc4e08f0
MD5 ed8075e272c89b4eae9960d9af31ad86
BLAKE2b-256 f4d6a617da27c57737af88cfaf23063c1aa15dd1302fcc6fd1beee5dcf4df9e0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page