Здравствуйте, PM, Вы писали:
PM>Обертка на C++ для sqlite. Создана в духе библиотеки SOCI от Maciej Sobczak.
Судя по примеру очень круто. Особенно впечатлила возможность вот таких запросов:
statement s(db);
// fetch records from some_table
s << "select id, name, salary from some_table", into(id, "id"),
into(name, "name"), into(salary, "salary");
count = 0;
while ( s.exec() )
{
//...
}
Только не могу понять как это работает. Где и как вы разбираете конструкции into и use?
Здравствуйте, MarW, Вы писали:
PM>>Обертка на C++ для sqlite. Создана в духе библиотеки SOCI от Maciej Sobczak. MW>Судя по примеру очень круто. Особенно впечатлила возможность вот таких запросов:
MW>
MW> statement s(db);
MW> // fetch records from some_table
MW> s << "select id, name, salary from some_table", into(id, "id"),
MW> into(name, "name"), into(salary, "salary");
MW> count = 0;
MW> while ( s.exec() )
MW> {
MW> //...
MW> }
MW>
MW>Только не могу понять как это работает. Где и как вы разбираете конструкции into и use?
statement::operator << возвращает временный объект типа prepare_info. В prepare_info имеется парочка operator , (into_holder_ptr) и operator , (into_holder_ptr), которые добавлют создаваемые функциями into и use объекты into_holder_base и use_holder_base во внутренние списки statement.
Так как временный объект, созданный statement::operator << живет лишь до конца выражения, то в его деструкторе можно делать обработку данных. Реально происходит только сохранение запроса (statement::set_query()), а привязка into- и uses-ссылок происходит при первом вызове statement::exec
Если у SQL оператора есть результат (у select, например), то производится обновление into-ссылок.
Примерно так и работает. Запутанно как-то объяснил Поставте точки останова на statement::prepare и statement::exec и попробуйте погонять тесты под отладчиком.
Здравствуйте, PM, Вы писали:
PM>Обертка на C++ для sqlite. Создана в духе библиотеки SOCI от Maciej Sobczak. PM>Брать здесь PM>Интенсивно не тестировалась, наверняка баги присутствуют
Угу, присутсвуют. А именно: если вот конструктор session(std::string const& file_name) вызвать с плохим именем базы, то кинется исключение и деструктор не будет вызван. А следовательно и не будет вызвана функция sqlite3_close, а это надо делать, даже если sqlite3_open вернула ошибку.
Здравствуйте, Рома Мик, Вы писали:
> PM>Интенсивно не тестировалась, наверняка баги присутствуют > Угу, присутсвуют. А именно: если вот конструктор session(std::string > const& file_name) вызвать с плохим именем базы, то кинется исключение и > деструктор не будет вызван. А следовательно и не будет вызвана функция > sqlite3_close, а это надо делать, даже если sqlite3_open вернула ошибку.
Хм. Достаточно странное поведение со стороны SQLite
К сожалению, до понедельника наврядли удастся поэкспериментировать
(выходные уже запланированы ) так что пока сказать ничего определенного
не смогу. В любом случае спасибо за информацию, приму к сведению.
Здравствуйте, PM, Вы писали:
PM>Хм. Достаточно странное поведение со стороны SQLite
Я так понял, что это сделано, чтобы errcode и errmsg работали. В любом случае это четко написано в документации.
Здравствуйте, PM, Вы писали:
PM>Обертка на C++ для sqlite. Создана в духе библиотеки SOCI от Maciej Sobczak. PM>Интенсивно не тестировалась, наверняка баги присутствуют PM>Брать здесь
Произошли небольшие изменения: классы теперь лежат в пространстве имен sqlitepp, избавился от лишних выделений динамической памяти и boost::shared_ptr, соответственно. Исправлен баг, замеченный Миклашевским Романом.
Здравствуйте, Mamut, Вы писали:
> PM>Новая версия лежит там же <http://gzip.rsdn.ru/File/7790/sqlitepp.zip>. > Какие условия использования? Public Domain, GPL, LGPL, CPL или > что-нибудь еще?
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Здравствуйте, PM, Вы писали:
PM>Обертка на C++ для sqlite. Создана в духе библиотеки SOCI от Maciej Sobczak. PM>Интенсивно не тестировалась, наверняка баги присутствуют PM>Брать здесь
Еще могу заметить, что sqlite3_errmsg возвращает куда более информативный текст, чем тот, что отдает еxception. В идеале неплохо бы помнить и то и другое, а еще и и запрос, который вызвал ошибку, т.к. иначе возможности отладки не очень хорошие.
Здравствуйте, Рома Мик, Вы писали:
> Еще могу заметить, что sqlite3_errmsg возвращает куда более > информативный текст, чем тот, что отдает еxception. В идеале неплохо бы > помнить и то и другое, а еще и и запрос, который вызвал ошибку, т.к. > иначе возможности отладки не очень хорошие.
Да это так, вообще обработка ошибко пока недостаточно продумана
--
foobar2000 v0.8.3: 03. Prodigy — Voodoo People [Exclusive Edition:
Everybody In The Place/Selected Mixes] (пауза)
Здравствуйте, PM, Вы писали:
PM>Здравствуйте, Рома Мик, Вы писали:
>> Еще могу заметить, что sqlite3_errmsg возвращает куда более >> информативный текст, чем тот, что отдает еxception. В идеале неплохо бы >> помнить и то и другое, а еще и и запрос, который вызвал ошибку, т.к. >> иначе возможности отладки не очень хорошие. PM>Да это так, вообще обработка ошибко пока недостаточно продумана
Я просто добавил в session функцию, возвращающую результат sqlite3_errmsg,
да определил пару доп. членов в exception для хранения ошибки/запроса.
Ну, и конструктор(ы) там чуток изменил для их инициализации, и ф-цию what()...
Дальнейшее совсем просто, благо throw там не так много...
PS: PM, очень правильная получилась библиотека, спасибо!!
Здравствуйте, Ant K, Вы писали: > PM>Да это так, вообще обработка ошибко пока недостаточно продумана > > Я просто добавил в session функцию, возвращающую результат sqlite3_errmsg, > да определил пару доп. членов в exception для хранения ошибки/запроса. > Ну, и конструктор(ы) там чуток изменил для их инициализации, и ф-цию > what()... > Дальнейшее совсем просто, благо throw там не так много...
Отлично, я давно собирался этл сделать Может быть стоит выложить сюда diffы исправлений? > PS: PM, очень правильная получилась библиотека, спасибо!!
Пожалуйста, только помните, что тестировалась она очень мало
--
foobar2000 v0.8.3: 10. Paul Oakenfold — Motion (feat. Grant Lee Phil.. [Bunkka]
Здравствуйте, PM, Вы писали:
PM>Отлично, я давно собирался этл сделать Может быть стоит выложить сюда diffы исправлений?
Запросто. Сегодня-завтра выложу...
Здравствуйте, PM, Вы писали:
PM>Отлично, я давно собирался этл сделать Может быть стоит выложить сюда diffы исправлений? diffы здесь PM>Пожалуйста, только помните, что тестировалась она очень мало
Да, нашлась ошибочка в transaction::exec_sql (см.).
Re: SQLite C++ wrapper (альтернативы)
От:
Аноним
Дата:
09.03.05 09:11
Оценка:
Кто нибудь сравнивал враппер сабжевый с CppSQLite — C++ Wrapper for SQLite? Интересуют преимущества и недостатки одного перед другим.
И сразу другой вопрос: сабж нормально компилируется в VS2003, но при сборке в VS2002 на фрагменте кода из файла tut.h
error C2065: 'Test' : undeclared identifier
error C2065: 'Group' : undeclared identifier
error C2687: cannot define a nested UDT of a template class out of line
Здравствуйте, <Аноним>, Вы писали:
А>Кто нибудь сравнивал враппер сабжевый с CppSQLite — C++ Wrapper for SQLite? Интересуют преимущества и недостатки одного перед другим.
Недостатки того класса: слишком тонкий враппер, надо самому вызывать finalize, геморно получать результаты и т.д.
Недостотаки этого класса: мало оттестирован, довольно сложный для неподготовленного взгляда код.
А>И сразу другой вопрос: сабж нормально компилируется в VS2003, но при сборке в VS2002
Ну там компилятор еще почти что шестерошный, так что вряд ли можно что-то сделать, все же до настоящего C++ он не дотягивает.
Здравствуйте, аноним, Вы писали:
> Кто нибудь сравнивал враппер сабжевый с CppSQLite — C++ Wrapper for > SQLite <http://codeproject.com/database/CppSQLite.asp>? Интересуют > преимущества и недостатки одного перед другим.
Думаю, я буду необъективен
Просто разные подходы, вот примерный код для сравнения:
CppSQLite
// open database
CppSQLiteDB db;
db.open("test.db");
// create and fill table
db.execDML("create table emp(no integer primary key, name char(20))");
for (int i = 0; i < 5; i++)
{
char buf[128];
sprintf(buf, "insert into emp(name) values('Empname%06d');", i+1);
db.execDML(buf);
}
// fetch data
CppSQLiteQuery q = db.execQuery("select * from emp");
for ( ; !q.eof(); q.nextRow() )
{
cout << q.fieldValue(0) << "|" << q.fieldValue(1) << "|" << endl;
}
SQLite++
// open database
session se("test.db");
// create and fill table
se << "create table emp(no integer primary key, name char(20))";
for (int i = 0; i < 5; i++)
{
se << "insert into emp(name) values('" << "Empname" << i+1 << "')";
}
// fetch data
statement st(se);
int no;
string name;
st << "select * from emp", into(no), into(name);
while ( st )
{
cout << no << "|" << name;
}
> И сразу другой вопрос: сабж нормально компилируется в VS2003, но при > сборке в VS2002 на фрагменте кода из файла tut.h
[ошибка поскипана] > Кто может помочь разобраться и пофиксить?
TUT использует шаблонные техники с которыми VS2002 категорически не дружит.
Выход — не компилировать тестовый проект или сменить компилятор
Я собирал SQLite++ только с gcc 3.2.3 и VS2003, так что более древними компиляторами (типа Visual C++ 6 или gcc 2.x.x)
может и не скомпилироваться.
--
foobar2000 v0.8.3: 07. Jerry Beeks — Flash $ [Nightmares on Wax DJ-KICKS:]
Re[3]: SQLite C++ wrapper (альтернативы)
От:
Аноним
Дата:
09.03.05 14:32
Оценка:
Здравствуйте, PM, Вы писали:
PM>Думаю, я буду необъективен PM>Просто разные подходы, вот примерный код для сравнения:
Да, спасибо за наглядный сравнительный пример .
Пожалуй, сабжевый враппер стОит потестировать по-конкретнее (чем и займемся )