sqlite.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: sqlite.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:33:05  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: sqlite.cpp,v 1000.1 2004/06/01 19:33:05 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is sqlite_freememly available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <sqlite/sqlite.hpp>
  41. #include <sqlite/sqlite_exception.hpp>
  42. #include <corelib/ncbifile.hpp>
  43. #include <sqlite.h>
  44. BEGIN_NCBI_SCOPE
  45. CSQLite::CSQLite()
  46.     : m_DB(NULL)
  47.     , m_DeleteFile(false)
  48. {
  49.     Open(":memory:");
  50. }
  51. CSQLite::CSQLite(const string& dbname, bool delete_file)
  52.     : m_DB(NULL)
  53.     , m_DeleteFile(false)
  54. {
  55.     Open(dbname, delete_file);
  56. }
  57. CSQLite::~CSQLite()
  58. {
  59.     Close();
  60. }
  61. void CSQLite::Open(const string& dbname, bool delete_file)
  62. {
  63.     Close();
  64.     char* msg = NULL;
  65.     m_DB = sqlite_open(dbname.c_str(), 0, &msg);
  66.     if ( !m_DB ) {
  67.         string str("error opening database ");
  68.         str += dbname;
  69.         str += ": ";
  70.         str += msg;
  71.         sqlite_freemem(msg);
  72.         NCBI_THROW(CSqliteException, eOpen, str);
  73.     }
  74.     m_Filename = dbname;
  75.     m_DeleteFile = delete_file;
  76.     if (dbname == ":memory:") {
  77.         m_DeleteFile = false;
  78.     }
  79. }
  80. void CSQLite::Close()
  81. {
  82.     if (m_DB) {
  83.         sqlite_close(m_DB);
  84.     }
  85.     m_DB = NULL;
  86.     if (m_DeleteFile) {
  87.         CFile file(m_Filename);
  88.         if ( !file.Remove() ) {
  89.             LOG_POST(Error << "CSQLite::Close(): Cannot delete file "
  90.                      << m_Filename);
  91.         }
  92.         m_DeleteFile = false;
  93.         m_Filename.erase();
  94.     }
  95. }
  96. bool CSQLite::IsValidDB(const string& str)
  97. {
  98.     CFile file(str);
  99.     if ( !file.Exists() ) {
  100.         return false;
  101.     }
  102.     try {
  103.         CRef<CSQLite> sqlite(new CSQLite(str));
  104.         CRef<CSQLiteQuery> q(sqlite->Compile("select * from sqlite_master"));
  105.         int count;
  106.         const char** data;
  107.         const char** cols;
  108.         return q->NextRow(count, data, cols);
  109.     }
  110.     catch (...) {
  111.     }
  112.     return false;
  113. }
  114. struct SNullCallback : public ISQLiteCallback
  115. {
  116.     int Callback(int, char**, char**)
  117.     {
  118.         return 1;
  119.     }
  120. };
  121. static int s_CallbackHandler(void* data,
  122.                              int argc, char** argv, char** cols)
  123. {
  124.     ISQLiteCallback* ptr = static_cast<ISQLiteCallback*>(data);
  125.     if (ptr) {
  126.         return ptr->Callback(argc, argv, cols);
  127.     }
  128.     return 1;
  129. }
  130. void CSQLite::Execute(const string& cmd)
  131. {
  132.     SNullCallback cb;
  133.     Execute(cmd, cb);
  134. }
  135. CSQLiteQuery* CSQLite::Compile(const string& sql) const
  136. {
  137.     //_TRACE("compiling: " << sql);
  138.     sqlite_vm* vm = NULL;
  139.     const char* tail = NULL;
  140.     char* msg = NULL;
  141.     if (SQLITE_OK != sqlite_compile(m_DB, sql.c_str(), &tail, &vm, &msg)) {
  142.         string str("Error: can't compile query: >>");
  143.         str += sql + "<<: ";
  144.         str += msg;
  145.         sqlite_freemem(msg);
  146.         NCBI_THROW(CSqliteException, eExecute, str);
  147.     }
  148.     return new CSQLiteQuery(vm);
  149. }
  150. void CSQLite::Execute(const string& cmd, ISQLiteCallback& cb)
  151. {
  152.     //_TRACE("executing: " << cmd);
  153.     if ( !m_DB ) {
  154.         NCBI_THROW(CSqliteException, eExecute,
  155.                    "Error: database not open");
  156.     }
  157.     char* msg = NULL;
  158.     int rc = sqlite_exec(m_DB, cmd.c_str(), s_CallbackHandler, &cb, &msg);
  159.     if ( rc != SQLITE_OK ) {
  160.         string str("Error executing command >>");
  161.         str += cmd;
  162.         str += "<<: ";
  163.         str += msg;
  164.         sqlite_freemem(msg);
  165.         NCBI_THROW(CSqliteException, eExecute, str);
  166.     }
  167. }
  168. int CSQLite::GetLastRowID(void)
  169. {
  170.     if ( !m_DB ) {
  171.         return -1;
  172.     }
  173.     return sqlite_last_insert_rowid(m_DB);
  174. }
  175. int CSQLite::GetRowsAffected(void)
  176. {
  177.     if ( !m_DB ) {
  178.         return -1;
  179.     }
  180.     return sqlite_changes(m_DB);
  181. }
  182. void CSQLite::StopExecute(void)
  183. {
  184.     if ( !m_DB ) {
  185.         return;
  186.     }
  187.     sqlite_interrupt(m_DB);
  188. }
  189. //////////////////////////////////////////////////////////////
  190. //
  191. // query interface
  192. //
  193. CSQLiteQuery::CSQLiteQuery(sqlite_vm* query)
  194.     : m_Query(query)
  195. {
  196. }
  197. CSQLiteQuery::~CSQLiteQuery()
  198. {
  199.     x_CleanUp();
  200. }
  201. bool CSQLiteQuery::NextRow(int& count,
  202.                            const char**& data,
  203.                            const char**& cols) const
  204. {
  205.     if ( !m_Query ) {
  206.         return false;
  207.     }
  208.     switch (sqlite_step(m_Query, &count, &data, &cols)) {
  209.     case SQLITE_DONE:
  210.         x_CleanUp();
  211.         return false;
  212.     case SQLITE_ROW:
  213.         return true;
  214.     case SQLITE_BUSY:
  215.         return false;
  216.     default:
  217.         x_CleanUp();
  218.         return false;
  219.     }
  220. }
  221. void CSQLiteQuery::x_CleanUp() const
  222. {
  223.     if ( !m_Query ) {
  224.         return;
  225.     }
  226.     char* msg = NULL;
  227.     if (SQLITE_OK != sqlite_finalize(m_Query, &msg) ) {
  228.         LOG_POST(Error << "failed to clean up query: " << msg);
  229.         sqlite_freemem(msg);
  230.     }
  231.     m_Query = NULL;
  232. }
  233. END_NCBI_SCOPE
  234. /*
  235.  * ===========================================================================
  236.  * $Log: sqlite.cpp,v $
  237.  * Revision 1000.1  2004/06/01 19:33:05  gouriano
  238.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  239.  *
  240.  * Revision 1.2  2004/05/17 21:05:24  gorelenk
  241.  * Added include of PCH ncbi_pch.hpp
  242.  *
  243.  * Revision 1.1  2003/09/29 12:24:17  dicuccio
  244.  * Initial revision
  245.  *
  246.  * ===========================================================================
  247.  */