Переключение на Главную Страницу Страницы: 1 ... 15 16 [17] 18 19 ... 79 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 464520 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #240 - 10. Июля 2008 :: 17:12
Печать  
А то может быть и забить стандартный QueryInterface сразу в VT, чтобы место под солнцем занять.
Короче, сделать, наконец, нормальные наследники от IUnknown и дело с концом?
И пусть это не COM, и по прежнему CValue и т.п.

Меня, если честно, весь этот rtti в таких объемах прилично напрягает.
Привыкаешь так писать, а для облико морале это не здорово.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #241 - 10. Июля 2008 :: 19:17
Печать  
В-целом то я согласен с тобой.
Есть частности - например, при выгрузке результата запроса количества строк я не знаю.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #242 - 10. Июля 2008 :: 22:16
Печать  
[quote author=orefkov link=1214205575/240#241 date=1215717470]В-целом то я согласен с тобой.
Есть частности - например, при выгрузке результата запроса количества строк я не знаю.[/quote]
Ага, понял. Тогда вот так пока:
[code]
     // источник может передавать 0, если количество не определено
     // приемник может возвращать 0, если ограничений нет
     // если приемник реально не может принять данные, пусть возвращает ошибку
     virtual HRESULT ldrInit(DWORD& nColCount, DWORD& nRowCount) throw() = 0;
[/code]

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

- setColumn упростил в пользу AddColumn - применения colIdx не нашел.

- Вот что хотел спросить у тебя - assignRetValue - тоже не вижу применения.
У меня все приемники - это живые контексты, после выгрузки - это контексты с данными.
Нужен ли будет assignRetValue?

P.S.
Ну, наверняка чего-то будет не хватать, вот жду этого момента. :)
На выгрузке из строки ИТ в вектор пока пожеланий не проявилось.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #243 - 11. Июля 2008 :: 02:59
Печать  
[quote author=kms link=1214205575/240#242 date=1215728213]
Ну, наверняка чего-то будет не хватать, вот жду этого момента. :)
На выгрузке из строки ИТ в вектор пока пожеланий не проявилось.[/quote]
ИМХО нужно переделать выгрузку/загрузку из ИТЗ на этот интерфейс, сразу и проверим его правильность :)
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #244 - 11. Июля 2008 :: 07:32
Печать  
[quote author=artbear link=1214205575/240#243 date=1215745154][quote author=kms link=1214205575/240#242 date=1215728213]
Ну, наверняка чего-то будет не хватать, вот жду этого момента. :)
На выгрузке из строки ИТ в вектор пока пожеланий не проявилось.[/quote]
ИМХО нужно переделать выгрузку/загрузку из ИТЗ на этот интерфейс, сразу и проверим его правильность :)[/quote]
Надеюсь. :)

Надо вот это сделать в полном объеме, http://cvs.alterplast.ru/bugs/show_bug.cgi?id=3979
И интерфейса, видимо, должно быть два: для выгрузки (инициатор источник) и для загрузки (инициатор приемник).
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #245 - 11. Июля 2008 :: 07:44
Печать  
[quote author=kms link=1214205575/240#242 date=1215728213][quote author=orefkov link=1214205575/240#241 date=1215717470]В-целом то я согласен с тобой.
Есть частности - например, при выгрузке результата запроса количества строк я не знаю.[/quote]
Ага, понял. Тогда вот так пока:
[code]
     // источник может передавать 0, если количество не определено
     // приемник может возвращать 0, если ограничений нет
     // если приемник реально не может принять данные, пусть возвращает ошибку
     virtual HRESULT ldrInit(DWORD& nColCount, DWORD& nRowCount) throw() = 0;
[/code]

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

- setColumn упростил в пользу AddColumn - применения colIdx не нашел.

- Вот что хотел спросить у тебя - assignRetValue - тоже не вижу применения.
У меня все приемники - это живые контексты, после выгрузки - это контексты с данными.
Нужен ли будет assignRetValue?

P.S.
Ну, наверняка чего-то будет не хватать, вот жду этого момента. :)
На выгрузке из строки ИТ в вектор пока пожеланий не проявилось.[/quote]

Так, по порядку.

Зависимости текущего интерфейса от sqlite нет - параметр объявлен указателем на предварительно продекларированную структуру sqlite3. Как говорится - не нужен, не используй. А мне для будущего развития может пригодится.

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

AddRef/Release тоже ни к чему - мой метод выгрузки нисколько не собирается сохранять ссылки на объект приемник либо удалять его.

Параметры для приемника - ну, тебе не нужны, а мне допустим нужны. Если они есть, то хуже не будет - позволяет реализовывать более гибкие сценарии использования.

Присвоение возвращаемого значения: опять же твой сценарий - это очень частный случай.
Посмотри например у меня IScalarResultLoader.
К тому же какой код проще:
[code]
Приемник = СоздатьПростейшийЗагрузчикВоЧтоТо();
запрос.Выполнить(Приемник);
Результат = Приемник.ПринятыеДанные();
[/code]
или
[code]
Результат = запрос.Выполнить(СоздатьПростейшийЗагрузчикВоЧтоТо());
[/code]?

setColumn vs addColumn
colIdx у меня используется в IVTResultLoader.
Даже если посмотреть общую семантику интерфейса - раз в методе init уже указывается количество колонок, то далее нужен именно set а не add. В первоначальном варианте интерфейса у меня как раз было так - в init количество колонок не указывалось, и был метод addColumn. Однако когда я начал реализовывать загрузчик не в пустую ТЗ, а уже содержашую колонки - вот тут и пришлось изменить интерфейс.

Ограничение количества принимаемых строк - делать в инит имхо неверно - приемник может не знать, сколько строк ему надо выкачать, но должен иметь возможность остановить приемку (например, приемник с какимнить условием типа "Пока общий итог сумм документов меньше 100000").
Я собирался изменить void addValues на BOOL addValues - при возврате FALSE остановить выгрузку.

Вот примерно так.

И такой вопрос
Даже перейдя на IUnknown-ые интерфейсы, остается вопрос перехода от CValue/CBLContext к IUnknown, те тот же rtti и dynamic_cast. Так стоит ли овчинка выделки?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #246 - 11. Июля 2008 :: 08:35
Печать  
[quote author=orefkov link=1214205575/240#245 date=1215762279]
Зависимости текущего интерфейса от sqlite нет - параметр объявлен указателем на предварительно продекларированную структуру sqlite3. Как говорится - не нужен, не используй. А мне для будущего развития может пригодится.
[/quote]
Прости мою дотошность, но я как раз хотел бы понять, каким образом.
Может быть, я тоже забыл какие-то данные добавить, которые могут потом понадобиться.
А интерфейс - есть интерфейс, изменить ведь не получится.

[quote]
AddRef/Release тоже ни к чему - мой метод выгрузки нисколько не собирается сохранять ссылки на объект приемник либо удалять его.
[/quote]
Я понимаю. Это общая часть для других интерфейсов.

[quote]
Параметры для приемника - ну, тебе не нужны, а мне допустим нужны. Если они есть, то хуже не будет - позволяет реализовывать более гибкие сценарии использования.
[/quote]
OK.

[quote]
Присвоение возвращаемого значения: опять же твой сценарий - это очень частный случай.
Посмотри например у меня IScalarResultLoader.
[/quote]
Здесь согласен, спасибо.

[quote]
setColumn vs addColumn
colIdx у меня используется в IVTResultLoader.
Даже если посмотреть общую семантику интерфейса - раз в методе init уже указывается количество колонок, то далее нужен именно set а не add. В первоначальном варианте интерфейса у меня как раз было так - в init количество колонок не указывалось, и был метод addColumn. Однако когда я начал реализовывать загрузчик не в пустую ТЗ, а уже содержашую колонки - вот тут и пришлось изменить интерфейс.
[/quote]
Нет, не соглашусь.
Это частная проблема загрузки в ТЗ, а не основа интерфейса.
Ничто не мешает приемнику сделать счетчик колонок на своей стороне.

Add() и без того обязан передать согласованное число колонок, только Add() обязан сделать это по-порядку, а Set() - это интерфейс типа random access.

[quote]
Ограничение количества принимаемых строк - делать в инит имхо неверно - приемник может не знать, сколько строк ему надо выкачать, но должен иметь возможность остановить приемку (например, приемник с какимнить условием типа "Пока общий итог сумм документов меньше 100000").
Я собирался изменить void addValues на BOOL addValues - при возврате FALSE остановить выгрузку.
[/quote]
Не согласен.
Если приемник знает свои возможности, это может помочь источнику оптимизировать собственные механизмы.
Предположим, для выгрузки одной строки не  нужно кешировать данные размером в 10000.
Возможность останова - это хорошо, но недостаточно.

Кроме того, BOOL - не лучший вариант.
Ибо причина останова может быть как критической (переполнение памяти, ошибка в данных), так и рабочей (наелся суммой).
Первая требует исключения - вторая нет.

[quote]
И такой вопрос
Даже перейдя на IUnknown-ые интерфейсы, остается вопрос перехода от CValue/CBLContext к IUnknown, те тот же rtti и dynamic_cast. Так стоит ли овчинка выделки?[/quote]
Да вот не знаю пока.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #247 - 11. Июля 2008 :: 08:44
Печать  
[quote author=kms link=1214205575/240#246 date=1215765340]
[quote]
И такой вопрос
Даже перейдя на IUnknown-ые интерфейсы, остается вопрос перехода от CValue/CBLContext к IUnknown, те тот же rtti и dynamic_cast. Так стоит ли овчинка выделки?[/quote]
Да вот не знаю пока.[/quote]
ИМХО IUnknown пока не нужно, ведь в дальнейшем при необходимости нам никто не мешает нарастить каркас для этого интерфейса, объединив в каком-то промежуточном прокси-объекте интерфейс IUnknown и наши интерфейсы.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #248 - 11. Июля 2008 :: 09:03
Печать  
[quote author=kms link=1214205575/240#246 date=1215765340][quote]
Параметры для приемника - ну, тебе не нужны, а мне допустим нужны. Если они есть, то хуже не будет - позволяет реализовывать более гибкие сценарии использования.
[/quote]
OK.
[/quote]
Только интерфейс перестает быть самодостаточным.

Получив интерфейс некоторого приемника и захотев что-то выгрузить, я не могу быть уверен в результате.
Ибо кроме интерфейса я должен знать и параметры.

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

Ладно, это видимо уже вопрос идеологии.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #249 - 11. Июля 2008 :: 10:26
Печать  
Да, я подумал еще и во многом с тобой согласился.
С addColumn ты прав.
Действительно, в моей реализации IVTResultLoader::setColumn я полагаюсь на последовательный перебор индекса с выгружающей стороны.
Присвоение значения - спецефическая мулька ВыполнитьЗапрос, и может быть реализована совершенно другим интерфесом, равно как и доп.параметры. Да и вообще я в ВыполнитьЗапрос доп параметры уберу.
Кому надо, чтобы ТЗ или СЗ очищались - пусть предварительно пишут - Очистить(), УдалитьСтроки(), УдалитьВсеЗначения().
Ща накидаю свой вариант интерфейса.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #250 - 11. Июля 2008 :: 10:45
Печать  
orefkov писал(а) 11. Июля 2008 :: 10:26:
Да и вообще я в ВыполнитьЗапрос доп параметры уберу.
Кому надо, чтобы ТЗ или СЗ очищались - пусть предварительно пишут - Очистить(), УдалитьСтроки(), УдалитьВсеЗначения().

+1
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #251 - 11. Июля 2008 :: 11:05
Печать  
Вот допустим примерно так:
Код
Выбрать все
class IInterface
{
public:
	virtual void AddRef() = 0;
	virtual void Release() = 0;
	enum errCodes{
		success,
		memError,
		// Другие базовые ошибки
		firstErrForChilds
	};
};

class IErrorDescription : public IInterface
{
public:
	virtual errCodes lastError(CString& errDescr) throw() = 0;
};

class IValuesDataDestination : public IInterface
{
public:
	enum myErrCodes{
		dontWantMoreData = IInterface::firstErrForChilds,
	};
	enum{
		unLimRows = 0,
	};
	virtual errCodes init(DWORD& colCount, DWORD& rowCount) throw() = 0;
	virtual errCodes addColumn(LPCSTR colName, const CType& type) throw() = 0;
	// Нельзя менять ни адреса в массиве указателей, ни сами значения
	virtual errCodes addValues(CValue const* const* ppVals) throw() = 0;
};

class IValuesDataSource : public IInterface
{
public:
	virtual errCodes dataInfo(DWORD& colCount, DWORD& rowCount) throw() = 0;
	virtual errCodes columnInfo(DWORD colIdx, CString& colName, CType& type) throw() = 0;
	virtual errCodes nextValues(CValue const* const* &ppVals) throw() = 0;
};

class ISQLiteParamModificators : public IInterface
{
	virtual errCodes columnModificator(DWORD colIdx, int& mod) throw() = 0;
};
 



Обсуждаем дальше.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #252 - 11. Июля 2008 :: 11:18
Печать  
Тема пересеклась с темой Коллекции в 1С++, поэтому пишу сюда.

kms

Михаил, все-таки мне не нравится твой вариант реализации выгрузки строки ИТЗ в коллекцию Печаль
ИМХО метод интерфейса ldrAddRow / AddValues (CValue** pValues) для оптимизации должен получать уже готовую строку.
А сейчас мы вызываем этот метод столько раз, сколько колонок мы передали.
Каждый раз производится вызов виртуального метода и т.д, мелочь, но неприятно.

Наш интерфейс ИМХО работает с последовательным количеством колонок, они не дробятся, поэтому мы и имеем право выдавать строку целой порцией/массивом, а не поэлементно.

Что скажете?

Саша, я прав насчет целой порции или ты считаешь по другому?

PS я через Н-минут в оффлайн до понедельника уеду, так что продолжайте без меня Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #253 - 11. Июля 2008 :: 11:29
Печать  
Саша, меня интерфейсы почти устраивают.

ОДно но:
Михаил, Саша, а нафига нам коды ошибок вообще?
Я лично нигде, кроме AddValues, не вижу необходимости для них.
Можно ведь вернуть TRUE или FALSE в каждом методе, а для получения точной инфы в случае возврата FALSE можно обратиться к интерфейсу получения данных об ошибке.

Все равно нельзя предугадать заранее все коды ошибок для будущих объектов.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #254 - 11. Июля 2008 :: 15:18
Печать  
[quote author=artbear link=1214205575/240#252 date=1215775112]
ИМХО метод интерфейса ldrAddRow / AddValues (CValue** pValues) для оптимизации должен получать уже готовую строку.
А сейчас мы вызываем этот метод столько раз, сколько колонок мы передали.
Каждый раз производится вызов виртуального метода и т.д, мелочь, но неприятно.
[/quote]
Время - это ресурс. Память - это ресурс.
Допустим, для меня они равнозначны.
Как сделать выбор в пользу одного из них?

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

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

[quote]
Наш интерфейс ИМХО работает с последовательным количеством колонок, они не дробятся, поэтому мы и имеем право выдавать строку целой порцией/массивом, а не поэлементно.
[/quote]
Я тебе больше скажу.
Можно вообще сразу передавать массив N * M - и всего за 1 вызов виртуального метода. ;)
Только мы еще пытаемся решать задачу ограничения набора данных и вменяемой диагностики ошибок.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 15 16 [17] 18 19 ... 79
ОтправитьПечать