Re[4]: SQLite C++ wrapper (альтернативы)
От: Pavel Mosunov Россия  
Дата: 23.06.05 12:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, PM, Вы писали:


PM>>Думаю, я буду необъективен

PM>>Просто разные подходы, вот примерный код для сравнения:
А>Да, спасибо за наглядный сравнительный пример .
А>Пожалуй, сабжевый враппер стОит потестировать по-конкретнее (чем и займемся )

Смотрю тоже на этот врапер, хочу спросить как успехи в тестировании, и работает ли еще автор над врапером?
Re[5]: SQLite C++ wrapper (альтернативы)
От: Mamut Швеция http://dmitriid.com
Дата: 24.06.05 13:29
Оценка:
PM>Смотрю тоже на этот врапер, хочу спросить как успехи в тестировании, и работает ли еще автор над врапером?

Я переписывался с автором пару месяцев тому назад. Он собирался модифицироват враппер, выкинуть оттуда буст и внести еще кой-какие изменения. К сожалению, ему пришлось уйти в оффлайн на неопределенное время С тех пор — ни слуху ни духу.

А враппер в ом виде, что есть я даже использую в одной программе. Нареканий не возникало.


dmitriid.comGitHubLinkedIn
Re: SQLite C++ wrapper
От: newb  
Дата: 14.07.05 03:38
Оценка:
Вводная часть:
sqlite только начинаю изучать,
Boost'a у меня нет(скачать тоже нет возможности) + нужна поддержка уникода.

В меру своих сил я изменил код сабжа, но вот такие примеры не работают.
Просьба прогнать их на оригинальном враппере (а то не пойму толи я где-то накосячил, толи лыжи не едут)
пример 1:
int _tmain(int argc, _TCHAR* argv[])
{
  session db;
try
{
  db.open(L"d:\\test.db");
    
  statement st(db);
  int id;
  double salary;
  CString name;

  st << L"create table some_table(id integer, name varcharn(100) not null, salary real(8))";
  st.exec();
  st << L"insert into some_table(id, name, salary) values(1, 'anna', 345.2)";
  st.exec();

  //st << L"select id, name, salary from some_table where id > " << 0, into(id), into(name), into(salary);
  //st.exec();

  //std::wcout << id << L' ' << (LPCTSTR)name << L' ' << salary << std::endl;

  // в этом примере таблица не дропиться, если предыдущие три строки раскомментарины - причем никаких исключений не возникает
    // если они закомментарины (как сейчас), то все работает как-надо
  st << L"drop table some_table"; 
  st.exec();
}
catch (exception r)
{ std::wcout << L"Error: " << r.code << std::endl;
}
  db.close();
    return 0;
}


пример 2:
int _tmain(int argc, _TCHAR* argv[])
{
  session db;
try
{
  db.open(L"test.db");
    
  statement st(db);
  int id;
  double salary;
  CString name;
    
  st << L"create table some_table(id integer, name varcharn(100) not null, salary real(8))";
  st.exec();
  st << L"insert into some_table(id, name, salary) values(1, 'anna', 345.2)";
  st.exec();
  st << L"insert into some_table(id, name, salary) values(2, 'peter', 999.2)";
  st.exec();
    
  st << L"select id, name, salary from some_table where id > " << 0, into(id), into(name), into(salary);
  st.exec();
  std::wcout << id << L' ' << (LPCTSTR)name << L' ' << salary << std::endl;

  // исключений в примере никаких нет, но второй select выдает все по нулям, таблица не дропиться
  st << L"select id, name, salary from some_table where id > " << 1, into(id), into(name), into(salary);
  st.exec();

  std::wcout << id << L' ' << (LPCTSTR)name << L' ' << salary << std::endl;

  st << L"drop table some_table";
  st.exec();
}
catch (exception r)
{ std::wcout << L"Error: " << r.code << std::endl;
}
  db.close();
    return 0;
}
... << RSDN@Home 1.1.3 stable >>
Re: SQLite C++ wrapper
От: PM  
Дата: 05.10.05 13:01
Оценка: 81 (6)
Здравствуйте, PM, Вы писали:

Наконец-то выложил поправленную версию. Есть небольшая несовместимость в интерфейсах с предыдущей, до документации и build-скриптов руки пока не дошли Поставляется с исходниками SQLite 3.2.7 (последняя версия). Собиралось Visual C++ 7.1 (более старые версии не поддерживаются). Когда-то давно собирал g++ 3.2.3, но makefile не осталось.

Если кому-то будет интересно, буду продолжать развитие по мере сил и свободного времени. У меня сейчас нет проектов с использованием SQLite, так что любые отзывы приветсвуются

Брать здесь

Changes

version 0.3.2
BLOB support.

version 0.3.1
Minor bug fixes, some interface changes.

version 0.3
Dependences to third-party libraries are removed. Except SQLite of course

version 0.2
Implementation is refactored, dynamic memory allocations are minimized.

version 0.1
This is first release. Basic concepts are implemented.

Re[2]: SQLite C++ wrapper
От: Аноним  
Дата: 06.10.05 08:13
Оценка:
Здравствуйте, PM, Вы писали:

PM>Здравствуйте, PM, Вы писали:


PM>Наконец-то выложил поправленную версию.

Спасибо что поддерживаешь продукт

PM>Если кому-то будет интересно, буду продолжать развитие по мере сил и свободного времени. У меня сейчас нет проектов с использованием SQLite, так что любые отзывы приветсвуются

Интересно, думаю не только мне
Как насчет поддержки уникода?
Re[3]: SQLite C++ wrapper
От: PM  
Дата: 13.10.05 08:09
Оценка:
Здравствуйте, Аноним, Вы писали:

PM>>Если кому-то будет интересно, буду продолжать развитие по мере сил и свободного времени. У меня сейчас нет проектов с использованием SQLite, так что любые отзывы приветсвуются

А>Интересно, думаю не только мне
А>Как насчет поддержки уникода?
В одном из промежуточных вариантов я пытался это сделать, но подход мне не понравился. Сейчас вот думаю как это сделать.


p.s. Я оказался неоригинальным, и название SQLite++ уже используется. Так что, похоже, надо думать о смене названия
Re[2]: SQLite C++ wrapper
От: Didro Россия home~pages
Дата: 17.11.05 19:21
Оценка:
Здравствуйте, PM, Вы писали:

PM>Если кому-то будет интересно, буду продолжать развитие по мере сил и свободного времени. У меня сейчас нет проектов с использованием SQLite, так что любые отзывы приветсвуются


Отзыв.
Потребовалась удобная и не громоздкая СУБД, посоветовали Вашу.
Скачал версию 0.3.2. Компилирую под VisualC++ 7. Возникают ошибки
...\sqlitepp0.3.2\sqlitepp3\test\tut\tut.h(520): error C2065: 'Group' : undeclared identifier
...\sqlitepp0.3.2\sqlitepp3\test\tut\tut.h(520): error C2065: 'Test' : undeclared identifier
в строках кода:

template<class Test,class Group>
  -->struct tests_registerer<Test,Group,0>
  {
    static void reg(Group&){};
  };


т.е. ошибки полностью аналогичные этим http://www.rsdn.ru/Forum/Message.aspx?mid=1061317&amp;pg=1
Автор:
Дата: 09.03.05

Я не очень понимаю смысл этой конструкции(в коде), частичная специализация?
Буду, благодарен за любую помощь.
Спасибо.
Re[3]: SQLite C++ wrapper
От: Рома Мик Россия http://romamik.com
Дата: 17.11.05 19:28
Оценка: +1
Здравствуйте, Didro, Вы писали:

D>Отзыв.

D>Потребовалась удобная и не громоздкая СУБД, посоветовали Вашу.
D>Скачал версию 0.3.2. Компилирую под VisualC++ 7. Возникают ошибки
D>...\sqlitepp0.3.2\sqlitepp3\test\tut\tut.h(520): error C2065: 'Group' : undeclared identifier
D>...\sqlitepp0.3.2\sqlitepp3\test\tut\tut.h(520): error C2065: 'Test' : undeclared identifier
D>в строках кода:
Это тесты, а не сама библиотека, для тестов нужен соотвествующий фреймворк, но тесты никому, кроме разработчика не нужны, разве что в качестве примеров кода использовать.
... << RSDN@Home 1.2.0 alpha rev. 619>>
Re[2]: SQLite C++ wrapper
От: Аноним  
Дата: 30.07.07 02:18
Оценка:
Здравствуйте, PM, Вы писали:

PM>Здравствуйте, PM, Вы писали:


PM>Если кому-то будет интересно, буду продолжать развитие по мере сил и свободного времени. У меня сейчас нет проектов с использованием SQLite, так что любые отзывы приветсвуются

[/q]

А как обновлять записи ? Попробовал в примере (выделенные строки ниже) — какая-то хрень получилась.
Отладчик показывает, что вместо Kat, там МММ.
Чуствую, что что-то не правильно сделал, но что ?


template<>template<>
void object::test<1>()
{
    
    record recs[2] = { record(1, "Наталия", 123.45), record(2, "Анастасия", 678.90) };

    // insert records
    for (size_t i = 0; i < dimof(recs); ++i)
    {
        st << "insert into some_table values( :id, :name, :salary, NULL)",
            use(recs[i].id), use(recs[i].name), use(recs[i].salary);
        ensure("row inserted", !st.exec() );
    }

    // count inserted record
    int count;
    se << "select count(*) from some_table", into(count);
    ensure_equals("row count", count, dimof(recs) ); 

   se << "update some_table set name = :name where id = 1", use("Kat");
   st.exec();

    // check inserted records
    record r;
    st << "select id, name, salary from some_table",
        into(r.id, "id"), into(r.name, "name"), into(r.salary, "salary");
    for (count = 0; st.exec(); ++count)
    {
        ensure_equals(recs[count], r);
    }
    ensure_equals(count, dimof(recs)); 
}
Re[3]: SQLite C++ wrapper
От: PM  
Дата: 06.08.07 07:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А как обновлять записи ? Попробовал в примере (выделенные строки ниже) — какая-то хрень получилась.

А>Отладчик показывает, что вместо Kat, там МММ.
А>Чуствую, что что-то не правильно сделал, но что ?

А>
А>template<>template<>
А>void object::test<1>()
А>{
    
А>    record recs[2] = { record(1, "Наталия", 123.45), record(2, "Анастасия", 678.90) };

А>    // insert records
А>    for (size_t i = 0; i < dimof(recs); ++i)
А>    {
А>        st << "insert into some_table values( :id, :name, :salary, NULL)",
А>            use(recs[i].id), use(recs[i].name), use(recs[i].salary);
А>        ensure("row inserted", !st.exec() );
А>    }

А>    // count inserted record
А>    int count;
А>    se << "select count(*) from some_table", into(count);
А>    ensure_equals("row count", count, dimof(recs) ); 

    // здесь выполняется UPDATE в БД, представленной экземпляром se класса session
А>     se << "update some_table set name = :name where id = 1", use("Kat");

        // а следом за ним выполняется подготовленный statement st 
        // вида "insert into some_table values( :id, :name, :salary, NULL)", use(recs[i].id), use(recs[i].name), use(recs[i].salary);
        // но т.к. из цикла уже вышли, то индекс i указывает на мусор за пределами массива recs
А>      st.exec();

А>    // check inserted records
А>    record r;
А>    st << "select id, name, salary from some_table",
А>        into(r.id, "id"), into(r.name, "name"), into(r.salary, "salary");
А>    for (count = 0; st.exec(); ++count)
А>    {
А>        ensure_equals(recs[count], r);
А>    }
А>    ensure_equals(count, dimof(recs)); 
А>}
А>


Это соображения, почему вместо Kat получается MMM.




Обновлять записи так же, как и добавлять — либо выполнять SQL операторы непосредственно в базе, либо подготовить statement и привязывать к нему данные. Типа такого..

1. Непосредственное выполненение. Используется в основном когда нужно по-быстрому какую-то запись
session se("test.db");
se << "UPDATE some_table SET name = :name WHERE id = :id", use("Kat"), use(1);


2. Выполненение statement'а. Подготавливается SQL запрос, а реальные данные подставляются по мере необходимости:
session se("test.db");
statement st(se);

string name;
int id;
// подготавливаем оператор
st << "UPDATE some_table SET name = :name WHERE id = :id", use(name), use(id);
for (id = 1; id < 100; ++i)
{
    std::cin >> name;
    st.exec(); // здесь выполняется UPDATE
}
Re: SQLite C++ wrapper
От: PM  
Дата: 06.08.07 07:14
Оценка: 21 (2)
Здравствуйте, PM, Вы писали:

PM>Обертка на C++ для sqlite. Создана в духе библиотеки SOCI от Maciej Sobczak.

PM>Интенсивно не тестировалась, наверняка баги присутствуют
PM>Брать здесь

Давненько сюда не писал. Вообще-то иногда обертка даже обновляется. Выложил библиотечку в Subversion на berlios.de
Re: SQLite C++ wrapper
От: Аноним  
Дата: 01.06.09 09:09
Оценка:
Здравствуйте PM, юзаю ваш враппер, а как на счет BLOB?
Re[2]: SQLite C++ wrapper
От: PM  
Дата: 01.06.09 12:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте PM, юзаю ваш враппер, а как на счет BLOB?


Все нормально

В string.hpp есть такое:
struct blob
{
    void const* data;
    size_t size;
};


В statement.hpp есть:
class statement
{
...
     // Column value as BLOB.
    void column_value(int column, blob& value) const;
    // Use BLOB value in query.
    void use_value(int pos, blob const& value);
};


Есть конвертер из std::vector<T> в blob, который можно использовать так:

statement st(db);

std::vector<float> reals(200);
st << "create table test(vals blob)";
st << "insert into test(:vals)", use(reals);
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.