Re[3]: SQLite++
От: PM  
Дата: 05.09.06 10:04
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Посмотрел. Твоя мощнее.


Спасибо, я думал, наоборот, попроще

N>Вероятно буду твою использовать. Как у тебя с лицензией для комерческих продуктов?


Boost Software License. Можно использовать в коммерческих продуктах без ограничений.

N>И ещё хотелось бы больше примеров кода например для query или transactions.


Можно посмотреть на примеры использования в тестах.

query — просто вспомогательный класс для хранения текста SQL запроса и привязок к переменным. Надобность в непосредственном использовании query у меня пока не возникала, все делал через into и use Но вообще, можно, конечно, и через query:
  statement st(db);

  query q;
  // задаем SQL
  q.sql("select id, name from some_table where id > :id");

  // явно привязываем переменные
  int id = 3;
  string name;

  // создаем привязки к переменным вручную  Ж-[] 
  // кхм. далее могут быть опечатки. писал в форме редактирования сообщения
  q.put(into_binder_ptr(new into_pos_binder<int>(id)));       // к столбцу id
  q.put(into_binder_ptr(new into_pos_binder<string>(name)));  // к солбцу name

  q.put(use_binder_ptr(new use_pos_binder<int>(id)));        // к параметру id

  // задаем query для statement
  // способ немного извращенный. т.к. query - некопируемый класс
  // при этом разрушается query, который был в st.
  swap(st.q(), q);

  while ( st.exec() )
  {
    std::cout << id << ' ' << name << std::endl;
  }


Это просто более многословная запись такого:
  statement st(db);

  int id = 3;
  string name;
  
  st << "select id, name from some_table where id > :id", into(id), into(name), use(id);

  while ( st.exec() )
  {
    std::cout << id << ' ' << name << std::endl;
  }



Транзакции — это объекты, обычно на стеке. Конструктор начинает транзакцию, деструктор делает rollback, если не было явного commit. Вложенные транзакции не поддерживаются, у класса session есть функция active_txn(), которая возвращает указатель на текущую транзакцию (или 0, если используется режим auto commit)
  session db("mega.db");

  // db.active_txn() == 0

  {
     // стартуем транзакцию
     transaction txn(db);
        
     // db.active_txn() == &txn;
        
     db << "insert into blah-blah-blah";

     // txn.commit(); // делаем явный commit

  }  // при разрушении txn произойдет rollback, если не был вызван txn.commit()

  // транзакция завершена
  // db.active_txn() == 0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.