Помощь в разработке (псевдо) ORM. За вознаграждение

Модератор: Модераторы

Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение LeonidDV » 25.12.2014 14:38:21

Хотел бы попросить помощи в разработке псевдо-ORM на платной основе
немного в коде
предположим есть класс TDataStore
имеющий следующую структуру
Код: Выделить всё
TDataStore= class
private
Data:string;
public
constructor Create;
destructor Destroy;
SQL: string;
DataSet:TsdfDataset;
procedure FillDataset;
Action: integer; //enum of Select,Insert,Update,Delete
end;

Далее есть класс например TPeople наследник TDataStore
Код: Выделить всё
TDataStore= class
private
DataForDataSet:string;
public
constructor Create(class_description:string); override;
destructor Destroy;
SQL: string;
DataSet:TsdfDataset;
procedure FillDataset;
Action: integer; //enum of ormSelect,ormInsert,ormUpdate,ormDelete
//////// от TPeople
id: integer;
name:string;
bdate:datetime;
price:float;
end;

А теперь суть вопроса. Так как я не в зуб ногой в lazRTTI (да и в делфовом не очень) то что хотелось бы увидеть.
Есть некоторый структурированный текстовый файл в котором содержатся поля и их значения а также данные для датасета (DataSet) в DataForDataSet.
Создать из этого файла класс с необходимыми полями, и с случае если есть данные для датасета заполнить его. И наоборот из имеющегося класса создать текстовый файл из которого его можно было бы воссоздать исходный класс. Сами данные передаются по сети (транспорт есть)

как бы хотелось это видеть
Код: Выделить всё
...
TPeople = class(TDataStore)
end;
....
procedure Button1Click(Sender:TObject);
var People:TPeople;
People2:TPeople;
DataClassAsText:string;
begin
//это у работа с insert update delete
DataClassAsText:='какой-то текст'
People := TPeople.Create(DataClassAsText);
People.name := EditName.text; // вот пока не обматерили замечу что сам знаю что не так все просто, но можно же придумать схему через функцию
People.bdate:=EditBdate.text;
People.price:=SpinEditPrice.text;
People.Action:=ormInsert;
// тут будет Select
DataClassAsText:='какой-то текст содержащий правила для создания полей(какие они заранее известно)';
People := TPeople.Create(DataClassAsText);
EditName.text:=People.name;
EditBdate.text:=People.bdate;
Peopleю.SQL := 'select * from lalalal'; // а поля пойдут как Where cause
///или датасет
People.FillDataset;
DS.DataSet := People.DataSet;
People.DataSet.Active:=True;
end;

Надеюсь описал более менее понятно.
Если кто готов взяться за написание подобной вещи, то пишите в ЛС сколько по времени и стоимости. Лимит бюджета обсуждаем так что все зависит от ВАС
Надеюсь на сотрудничество

PS примеры писал на ходу из головы, поэтому прошу не судить строго если найдете мелкие синтаксические ошибки
LeonidDV
незнакомец
 
Сообщения: 7
Зарегистрирован: 31.10.2014 10:49:07

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение stanilar » 25.12.2014 23:13:43

LeonidDV

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

Почему бы Вам не взять дельфевый аналог датасета для файлов csv? В дельфи это распространненный компонент, думаю для него есть аналог в лазаре, или порт.

Добавлено спустя 16 минут 4 секунды:
Ну и если работать под виндой, то есть стандартный Microsoft Jet Driver, позволяющий подключаться к файлам как к таблице в БД.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение LeonidDV » 26.12.2014 10:58:00

В lazarus есть отлично работающий csv dataset (он и описан SDF dataset) и тут проблем нет.
Весь вопрос реализации заключается в том как создать классу новое свойство (property) в рантайме с определенным типом,
а потом обращаться к нему для чтения и записи, ну и соответственно перебор по циклу всех членов.
В delphi есть примеры и документация, и там удалось решить вопрос, но в лазаре это не работает и документация мягко скажем.... эм... так и не победил.
Остальное в принципе не так сложно
LeonidDV
незнакомец
 
Сообщения: 7
Зарегистрирован: 31.10.2014 10:49:07

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение pupsik » 26.12.2014 11:44:17

В lazarus есть отлично работающий csv dataset (он и описан SDF dataset) и тут проблем нет.
:mrgreen:

У Вас особо изощренная форма поиска проблем... CSV - уже первый этап...
п.с.
Для лазаря я знаю есть 3 реализации ORM (гугл в помощь). Но они "основаны" на zeos или жарптичке или sqlite. Но вот на текстовых файлах... Я такого не встречал.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение LeonidDV » 26.12.2014 12:09:48

У Вас особо изощренная форма поиска проблем... CSV - уже первый этап...

RESTful - вам знакомо такое понятие?
Как поймете механизм работы Вам станет понятно что зачем и как я хочу сделать.
А пока прошу не флудить.
LeonidDV
незнакомец
 
Сообщения: 7
Зарегистрирован: 31.10.2014 10:49:07

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение pupsik » 26.12.2014 12:30:32

CSV - а вы понимаете что это такое?
для маленьких объемов - чепуха. Будет работать,а вот для более 10 метров- лажа..

Флудить... Хм. Если у вас небольшие объемы то возмите за основу Greyhound и добавьте ZMSQL и получите то что хотите. Только объемы данных не большие...

А вот использовать датасет который при поверхностном просмотре красавец, а начинаеш работать с ним концов не найти - бред.

пс
То что вы хотите я понял. но вот звучит оно для меня как полет к луне на велике. Можно... и доберетесь...
Почему использовать CSV, а не что-то более - менее нормальное? Тем более как бы:
Код: Выделить всё
Greyhound is a tiny ORM-ish for [Free Pascal](http://freepascal.org/).

It is fast, clean and simple to use.

``` pascal
program t1;
{$mode objfpc}{$H+}
uses
  SysUtils, ghSQL, ghSQLdbLib;
var
  Co: TghSQLConnector;
begin
  Co := TghSQLConnector.Create(TghSQLite3Lib);
  try
    Co.Database := 'DB.sqlite';
    with Co.Tables['compilers'] do
   begin
      Select('*').Where('lang = :lang');
     Params['lang'].AsString := 'pascal';
     Open;
      Append;
      Columns['name'].AsString := 'FPC';
      Columns['description'].AsString := 'FreePascal Compiler';
      Commit;
   end;
  finally
    Co.Free;
  end;
  writeln('Done.');

end.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение LeonidDV » 26.12.2014 12:48:40

pupsik
Объясните зачем вы выложили этот код? Какое отношение он имеет к вебсервисам?
И еще есть такой вопрос, а причем тут какие-то 10 мегабайт. Что вы с fb будете тянуть 10 метров, что с http://vasya.ru ничего не изменится как были 10 метров так и останутся.
А скорость обработки это вопрос наличия рук... А то что-кто-то за вас решил вопросы пакетной передачи данных и разобрался с догрузкой еще не значит что это дает вам право быть истиной во языцах

Еще раз повторюсь меня не интересует сама база!
Я не могу создать в рантайме наследника класса и присвоить ему нужных мне членов
В шапке в первом сообщении же написано что вопрос в RTTI!!!!!
остальное уже мои проблемы
LeonidDV
незнакомец
 
Сообщения: 7
Зарегистрирован: 31.10.2014 10:49:07

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение pupsik » 26.12.2014 13:24:16

1. Код - это одна из реализаций ORM для лазаря... Кажись вам это надо? Только там нет реализации доступа к CSV. Можно добавить используя ZMSQL...
2. RESTful - относительно касается вопроса ORM....
3. Если вы будете работать с CSV то TsdfDataset вам не подойдет (особенно если использовать sql)...
4. 10 метров - образное. ORM по сути - надстройка. Отсюда следует что она будет медленней работать чем "чистый" доступ. Если использовать CSV да еще и TsdfDataset (да и ZMSQL не сильно оптимизирован) то при больших объемах данных будут лаги...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение stanilar » 26.12.2014 21:32:32

Если Вам нужен орм + вебсервис, то посмотрите mormot. Там уже все есть.

LeonidDV писал(а):как создать классу новое свойство (property) в рантайме с определенным типом


Так понимаю, Вы уже разбирались с вопросом, и кое-что написали. Тем лучше.

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

Код: Выделить всё
  TItemString = class(TCollectionitem)
  end;
 
  TFirstName = class(TItemString)
  end;

  TSecondName = class(TItemString)
  end;

  TPeople = class(TCollection)
 
   // Эти поля будут созданы с помощью RTTI.
    property FirstName  : TFirstName ;
    property SecondName: TSecondName ;
  end;

....
var People : TPeople;

procedure AddField;
var Fld : TItemString ;
begin
  // Это поле будет создано в рантайм.
  Fld := TItemString.Create;
  Fld.FieldName := 'sdfdsfdsfsd';

  People.AddField(Fld);
end;


В качестве небольшого флуда:
LeonidDV писал(а):RESTful

А что Вы вкладываете в это слово?

Добавлено спустя 6 минут 51 секунду:
Кстати, SQLite поддерживает динамическое создание полей на рабочих таблицах.

LeonidDV писал(а):создать в рантайме наследника класса

Такое ощущение, что Вы не очень правильно подбираете слова. В паскале классы создаются на стадии компиляции, и создание наследников класса в рантайм - задача хака высшего пилотажа. В дельфи такая задача решается, но мне сложно представить как она решается в FreePascal, особенно если учесть постоянное развитие компилятора.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение Mirage » 27.12.2014 16:46:48

Не очень все же понятно, что нужно ТС.
TDataStore можно реализовать как ассоциативный массив. Тогда можно будет писать так:
Код: Выделить всё
TPeople = class(TDataStore)
end;
...
People: TPeople;
...
People := TPeople.Create();
People['name'] := EditName.text;
People['bdate'] :=EditBdate.text;
People['price'] :=SpinEditPrice.text;
People.Save(); // А тут INSERT или UPDATE
...
People.Get(id); // А это SELECT

Другое дело, что TPeople тут не особо нужен, можно все то же самое делать сразу в TDataStore, указав таблицу и прочие данные.
В такой реализации даже RTTI не нужен.

Если с настоящими классами и полями, то считывание/запись данных в экземпляры возможно через RTTI, а вот создавать новые классы в рантайме врядли.
В Delphi единственный способ это сделать (хаки не рассматриваем) - написать эти классы, скомпилировать и подключить их через BPL. Но так странный вебсервис получится.:)
В FPC .bpl не поддерживается.

Если нужен синтаксис именно такой:
Код: Выделить всё
People.name := EditName.text;


То тоже можно, через переопределение VarDispProc, с бакендом в виде того же ассоциативного массива в TDataStore.

Не понятно зачем создание новых классов в рантайме? На случай, если кто вдруг новую таблицу в БД добавит? Так все равно же перекомпилировать приложение нужно, хотя бы чтобы бизнес логику добавить для новой таблицы.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Помощь в разработке (псевдо) ORM. За вознаграждение

Сообщение stanilar » 27.12.2014 21:29:27

Mirage писал(а):Не очень все же понятно, что нужно ТС.

Думаю что все, что нужно ТС уже есть в Lazarus, просто он неправильно готовит.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02


Вернуться в Помощь за вознаграждение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru