/[svn]/linuxsampler/trunk/src/db/InstrumentsDb.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/db/InstrumentsDb.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1782 by iliev, Tue Sep 30 02:16:41 2008 UTC revision 1944 by persson, Tue Jul 14 18:54:08 2009 UTC
# Line 1  Line 1 
1  /***************************************************************************  /***************************************************************************
2   *                                                                         *   *                                                                         *
3   *   Copyright (C) 2007, 2008 Grigor Iliev                                 *   *   Copyright (C) 2007-2009 Grigor Iliev, Benno Senoner                   *
4   *                                                                         *   *                                                                         *
5   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
6   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 27  Line 27 
27  #include <iostream>  #include <iostream>
28  #include <sstream>  #include <sstream>
29  #include <vector>  #include <vector>
30    #include <algorithm>
31  #include <errno.h>  #include <errno.h>
32    #ifndef WIN32
33  #include <fnmatch.h>  #include <fnmatch.h>
34    #else
35    #include <direct.h>
36    #endif
37  #include "../common/Exception.h"  #include "../common/Exception.h"
38    
39  namespace LinuxSampler {  namespace LinuxSampler {
# Line 87  namespace LinuxSampler { Line 91  namespace LinuxSampler {
91    
92      InstrumentsDb::InstrumentsDb() {      InstrumentsDb::InstrumentsDb() {
93          db = NULL;          db = NULL;
         DbInstrumentsMutex = Mutex();  
94          InTransaction = false;          InTransaction = false;
95      }      }
96    
# Line 120  namespace LinuxSampler { Line 123  namespace LinuxSampler {
123      sqlite3* InstrumentsDb::GetDb() {      sqlite3* InstrumentsDb::GetDb() {
124          if ( db != NULL) return db;          if ( db != NULL) return db;
125    
126          if (DbFile.empty()) DbFile = CONFIG_DEFAULT_INSTRUMENTS_DB_LOCATION;          if (DbFile.empty()) {
127                        #ifndef WIN32
128                        DbFile = CONFIG_DEFAULT_INSTRUMENTS_DB_LOCATION;
129                            #else
130                            char *userprofile = getenv("USERPROFILE");
131                            if(userprofile) {
132                                String DbPath = userprofile;
133                                    DbPath += "\\.linuxsampler";
134                                DbFile = DbPath + "\\instruments.db";
135                                    File InstrumentsDbFile(DbFile);
136                                    // if no DB exists create the subdir and then the DB
137                                    if( !InstrumentsDbFile.Exist() ) {
138                                        _mkdir( DbPath.c_str() );
139                                            // formats the DB, which creates a new instruments.db file
140                                            Format();
141                                    }
142                        }
143                            else {
144                                // in case USERPROFILE is not set (which should not occur)
145                                DbFile = "instruments.db";
146                            }
147                            #endif
148                }
149                  #if defined(__APPLE__)  /* 20071224 Toshi Nagata  */                  #if defined(__APPLE__)  /* 20071224 Toshi Nagata  */
150                  if (DbFile.find("~") == 0)                  if (DbFile.find("~") == 0)
151                          DbFile.replace(0, 1, getenv("HOME"));                          DbFile.replace(0, 1, getenv("HOME"));
# Line 131  namespace LinuxSampler { Line 156  namespace LinuxSampler {
156              db = NULL;              db = NULL;
157              throw Exception("Cannot open instruments database: " + DbFile);              throw Exception("Cannot open instruments database: " + DbFile);
158          }          }
159    #ifndef WIN32
160          rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8, NULL, Regexp, NULL, NULL);          rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8, NULL, Regexp, NULL, NULL);
161          if (rc) { throw Exception("Failed to add user function for handling regular expressions."); }          if (rc) { throw Exception("Failed to add user function for handling regular expressions."); }
162    #endif
163    
164          // TODO: remove this in the next version          // TODO: remove this in the next version
165          try {          try {
# Line 1177  namespace LinuxSampler { Line 1204  namespace LinuxSampler {
1204              throw Exception(ss.str());              throw Exception(ss.str());
1205          }          }
1206    
1207            bool unlocked = false;
1208          RIFF::File* riff = NULL;          RIFF::File* riff = NULL;
1209          gig::File* gig = NULL;          gig::File* gig = NULL;
1210          try {          try {
# Line 1197  namespace LinuxSampler { Line 1225  namespace LinuxSampler {
1225                  throw Exception("DB error: " + ToString(sqlite3_errmsg(db)));                  throw Exception("DB error: " + ToString(sqlite3_errmsg(db)));
1226              }              }
1227    
1228              String s = toEscapedFsPath(FilePath);              String s = FilePath;
1229                s = toEscapedFsPath(s);
1230              BindTextParam(pStmt, 2, s);              BindTextParam(pStmt, 2, s);
1231              String ver = "";              String ver = "";
1232              if (gig->pVersion != NULL) ver = ToString(gig->pVersion->major);              if (gig->pVersion != NULL) ver = ToString(gig->pVersion->major);
# Line 1205  namespace LinuxSampler { Line 1234  namespace LinuxSampler {
1234    
1235              if (Index == -1) {              if (Index == -1) {
1236                  int instrIndex = 0;                  int instrIndex = 0;
1237                    // Assume that it's locked and should be unlocked at this point
1238                    // to be able to use the database from another threads
1239                    if (!InTransaction) {
1240                        DbInstrumentsMutex.Unlock();
1241                        unlocked = true;
1242                    } else {
1243                        std::cerr << "Shouldn't be in transaction when adding instruments." << std::endl;
1244                    }
1245    
1246                  if (pProgress != NULL) gig->GetInstrument(0, &(pProgress->GigFileProgress)); // TODO: this workaround should be fixed                  if (pProgress != NULL) gig->GetInstrument(0, &(pProgress->GigFileProgress)); // TODO: this workaround should be fixed
1247                  gig::Instrument* pInstrument = gig->GetFirstInstrument();                  gig::Instrument* pInstrument = gig->GetFirstInstrument();
1248    
1249                    if (!InTransaction) DbInstrumentsMutex.Lock();
1250                  while (pInstrument) {                  while (pInstrument) {
1251                      BindTextParam(pStmt, 7, gig->pInfo->Product);                      BindTextParam(pStmt, 7, gig->pInfo->Product);
1252                      BindTextParam(pStmt, 8, gig->pInfo->Artists);                      BindTextParam(pStmt, 8, gig->pInfo->Artists);
# Line 1234  namespace LinuxSampler { Line 1274  namespace LinuxSampler {
1274          } catch (RIFF::Exception e) {          } catch (RIFF::Exception e) {
1275              if (gig != NULL) delete gig;              if (gig != NULL) delete gig;
1276              if (riff != NULL) delete riff;              if (riff != NULL) delete riff;
1277                if (unlocked) DbInstrumentsMutex.Lock();
1278              std::stringstream ss;              std::stringstream ss;
1279              ss << "Failed to scan `" << FilePath << "`: " << e.Message;              ss << "Failed to scan `" << FilePath << "`: " << e.Message;
1280                            
# Line 1241  namespace LinuxSampler { Line 1282  namespace LinuxSampler {
1282          } catch (Exception e) {          } catch (Exception e) {
1283              if (gig != NULL) delete gig;              if (gig != NULL) delete gig;
1284              if (riff != NULL) delete riff;              if (riff != NULL) delete riff;
1285                if (unlocked) DbInstrumentsMutex.Lock();
1286              throw e;              throw e;
1287          } catch (...) {          } catch (...) {
1288              if (gig != NULL) delete gig;              if (gig != NULL) delete gig;
1289              if (riff != NULL) delete riff;              if (riff != NULL) delete riff;
1290                if (unlocked) DbInstrumentsMutex.Lock();
1291              throw Exception("Failed to scan `" + FilePath + "`");              throw Exception("Failed to scan `" + FilePath + "`");
1292          }          }
1293      }      }
# Line 1643  namespace LinuxSampler { Line 1686  namespace LinuxSampler {
1686          }          }
1687      }      }
1688    
1689    #ifndef WIN32
1690      void InstrumentsDb::Regexp(sqlite3_context* pContext, int argc, sqlite3_value** ppValue) {      void InstrumentsDb::Regexp(sqlite3_context* pContext, int argc, sqlite3_value** ppValue) {
1691          if (argc != 2) return;          if (argc != 2) return;
1692    
# Line 1653  namespace LinuxSampler { Line 1697  namespace LinuxSampler {
1697              sqlite3_result_int(pContext, 1);              sqlite3_result_int(pContext, 1);
1698          }          }
1699      }      }
1700    #endif
1701    
1702      String InstrumentsDb::GetDirectoryPath(String File) {      String InstrumentsDb::GetDirectoryPath(String File) {
1703          if (File.empty()) return String("");          if (File.empty()) return String("");
# Line 1754  namespace LinuxSampler { Line 1799  namespace LinuxSampler {
1799      }      }
1800    
1801      String InstrumentsDb::AppendNode(String DbDir, String Node) {      String InstrumentsDb::AppendNode(String DbDir, String Node) {
1802          if(DbDir.length() == 1 && DbDir.at(0) == '/') return DbDir + Node + "/";          if(DbDir.length() == 1 && DbDir.at(0) == '/') return DbDir + Node;
1803          return DbDir + "/" + Node + "/";            if(DbDir.at(DbDir.length() - 1) == '/') return DbDir + Node;
1804            return DbDir + "/" + Node;
1805      }      }
1806    
1807      String InstrumentsDb::toDbName(String AbstractName) {      String InstrumentsDb::toDbName(String AbstractName) {
# Line 1812  namespace LinuxSampler { Line 1858  namespace LinuxSampler {
1858      }      }
1859            
1860      String InstrumentsDb::toEscapedFsPath(String FsPath) {      String InstrumentsDb::toEscapedFsPath(String FsPath) {
1861    #ifdef WIN32
1862            replace(FsPath.begin(), FsPath.end(), '\\', '/');
1863    #endif
1864          return toEscapedText(FsPath);          return toEscapedText(FsPath);
1865      }      }
1866            
1867      String InstrumentsDb::toNonEscapedFsPath(String FsPath) {      String InstrumentsDb::toNonEscapedFsPath(String FsPath) {
1868          return toNonEscapedText(FsPath);          FsPath = toNonEscapedText(FsPath);
1869    #ifdef WIN32
1870            replace(FsPath.begin(), FsPath.end(), '/', '\\');
1871    #endif
1872            return FsPath;
1873      }      }
1874            
1875      String InstrumentsDb::toAbstractName(String DbName) {      String InstrumentsDb::toAbstractName(String DbName) {

Legend:
Removed from v.1782  
changed lines
  Added in v.1944

  ViewVC Help
Powered by ViewVC