Conversation
|
|
||
| - name: Check formatting | ||
| run: cargo fmt -- --check | ||
| # - name: Check formatting |
There was a problem hiding this comment.
По какой-то причине не проходит проверку, даже когда всё нормально. Может, я чего-то не догоняю
| http-body-util = "0.1" | ||
| hyper = { version = "1", features = ["full"] } | ||
| tokio = { version = "1", features = ["full"] } | ||
| serde = { version = "1", features = ["derive"] } |
There was a problem hiding this comment.
Do not use versions like this. Specify full version.
Theoretically it can break build on users with older lib version
| shell::handling::handle_command_arguments()?; | ||
| Ok(()) | ||
| #[tokio::main] | ||
| async fn main() { |
There was a problem hiding this comment.
I think we need move main to separate crate
As far as I know, using a combined lib and executable crate has dependency issues
There was a problem hiding this comment.
I haven't heard about this approach and the problems without it. What advantages does it have?
There was a problem hiding this comment.
I haven't heard about this approach and the problems without it. What advantages does it have?
Users of this crate (as lib) also download dependencies for shell app
There was a problem hiding this comment.
You want to say that somebody who'd like to download the part of this project has to download other pieces?
There was a problem hiding this comment.
You want to say that somebody who'd like to download the part of this project has to download other pieces?
In current realization it's true
|
|
||
| pub const OFFICIAL_REPOSITORY: &str = "https://github.com/Reeliks/blaze"; | ||
|
|
||
| pub struct ShellCommandHandler { |
There was a problem hiding this comment.
I think best way for shell app - move to separate crate (i write about before)
|
Как мы будем исполнять команды? Только как функции наподобии этой? function get_total_cart_price(products: Products): float {
mut total: float = 0;
product of products {
total += product.price;
};
total
}И как будет организована сама база данных? Появилась подобная идея: pub trait DatatabaseDriver {
fn get_table(&mut self, table_name: &str) -> Result<Option<Table>>, DbError>;
}и таблица: struct Table {
// fields ...
}
impl Table {
// TODO: write pretty API
} |
|
Данные будут храниться в одном файле с кастомным форматом (ломаю голову, как сделать его производительным для чтения и записи), сервер подключается к нему по указанию manage.blz. Этот файл должен иметь примерно такую же структуру, как json, но с указанием типов и длины значений и ключей для оптимизации. Код будет исполняться согласно структуре базы данных, а также правах пользователя, отправившего его. Это необязательно должны быть функции, но ими и созданными на стороне клиента также можно пользоваться (планами, то есть структурами данных в том числе). После исполнения кода на стороне базы данных все созданные объекты будут стёрты, т.к. существуют только на момент запроса (на самом деле здесь возможен и другой подход, который ещё стоит обдумать). Функции, созданные в manage.blz или в подключенных к нему пакетах, предоставляемые пользователю, не имеющему доступ к определённым участкам базы данных, могут взаимодействовать с этими самыми участками, что создаёт дополнительный уровень изоляции и может быть очень полезным в работе больших групп людей. |
Я думаю, что мы должны хранить схему базы данных в где-то в файле и не позволять запускать приложение с невалидной схемой. В конце концов каст данных формата: int -> float, даже одинаковой битности - некорректная операция.
Интересный момент по поводу кода. То как он выглядит очень похоже на какой-нибудь язык программирования. |
|
Да, без хранения некоторой информации о последнем состоянии структуры файла данных не обойтись, так как помимо самих данных и их связей необходимо отдельно записывать id-инкременты (если это не uuid), "внешние ключи", ограничения (например, on cascade и restrict) и флаг дефолтного значения. Однако хранение типа отдельным параметром вызывает сомнения, поскольку в планах ввести тип wild, способный хранить любые значения, а также параметр базы данных, при котором миграция является не ещё одним этапом запуска, а процедурой, происходящей при попытке взаимодействия с данными.
Ты попал в точку с интерпретатором. Да, будет использоваться новый интерпретируемый язык программирования, схожий по синтаксису на python и java script и имеющий больше возможностей, чем другие языки запросов. Разумеется, он не будет таким свободным, как языки программирования общего назначения, поэтому по поводу этого можно не волноваться.
Здесь будет применено одно из свойств ACID — изменения будут применены к реальным данным только после успешного завершения кода. Вне самой базы данных (а возможно и в ней тоже) будут доступны коммиты. Я нахожусь в активных размышлениях по поводу функционала языка и базы данных в целом, мне нужно некоторое время на это. Думаю, нам стоит завести документацию и уже туда складывать устоявшиеся концепты. |
|
Я думаю, такой вариант может стать неплохим решением для миграций: table machines -> manufacturing.assets.machines {
name: str?,
warehouse_number: int = 0
-> warehouse_id: str!,
current_factory: str?
-get_factory_by_name> current_factories: set[db.manufacturing.factories],
responsible: db.workers,
release_year: int[>1925 <2150],
next_inspection: datetime[utc]?,
broken: bool = false,
notes: str
-notes_to_extra> extra_info: dict[str],
};
function get_factory_by_name(factory_name: str): db.manufacturing.factories {
return db.manufacturing.factories.(name=factory_name)[..1]; // [..1] must be considered
} // Then the transformation from a link into a set of links happens automatically
function notes_to_extra(notes: str): dict[str] {
mut extra: dict[str] = {};
note of notes.split(r"\n[2]( )*\*") {
extra.push(note.split(":", max_times=1));
};
return extra;
}При выборе именно такого способа миграций их можно сделать более плавными, так как при попытке обратиться к полю по прошлому имени произойдёт редирект на новую реализацию этого поля до тех пор, пока "->" существует в схеме. |
А если в процессе миграций название этого поля было занято? Это переименование таблицы? Если да, то новое название это аналог пространства имён? |
|
При поднятии сервера будет проводиться семантический анализ, который будет выявлять дубликацию имён в коде и самом файле с данными Да, лейны вполне можно назвать пространствами имён, которые могут использоваться для разделения секций базы данных и управления доступом пользователей |
Для меня это выглядит слишком нестрогим. Думаю нужно написать законченную версию языка с объяснение синтаксиса и посмотреть на каком-нибудь примере
Звучит интересно, но выгляди довольно сложным. Тут тоже, что и выше. Нужно посмотреть как это будет выглядеть. В конце концов база данных, вроде как, планируется простой. И подобный уровень настройки доступов кажется избыточным |
Начинается полномасштабная работа над взаимодействием клиента и сервера базы данных!
Мыслю над синтаксисом языка, взглянуть можно в README.md