コード例 #1
0
void wxFileConfig::Init()
{
  m_pCurrentGroup =
  m_pRootGroup    = new ConfigGroup(NULL, "", this);

  m_linesHead =
  m_linesTail = NULL;

  // it's not an error if (one of the) file(s) doesn't exist

  // parse the global file
  if ( !m_strGlobalFile.IsEmpty() && wxFile::Exists(m_strGlobalFile) ) {
    wxTextFile fileGlobal(m_strGlobalFile);

    if ( fileGlobal.Open() ) {
      Parse(fileGlobal, FALSE /* global */);
      SetRootPath();
    }
    else
      wxLogWarning(_("can't open global configuration file '%s'."),
                   m_strGlobalFile.c_str());
  }

  // parse the local file
  if ( !m_strLocalFile.IsEmpty() && wxFile::Exists(m_strLocalFile) ) {
    wxTextFile fileLocal(m_strLocalFile);
    if ( fileLocal.Open() ) {
      Parse(fileLocal, TRUE /* local */);
      SetRootPath();
    }
    else
      wxLogWarning(_("can't open user configuration file '%s'."),
                   m_strLocalFile.c_str());
  }
}
コード例 #2
0
ファイル: GrmlRenderer.cpp プロジェクト: rogerclark/grumble
	bool Renderer::LoadXmlFile(const String& filename)
	{
		m_rootelem.reset();

		TiXmlDocument doc;

		URI uri = URI::Parse(filename);
		if (uri.scheme == URI::SchemeFile)
		{
			if (!TiXmlDocumentLoadFileW(doc, filename.c_str(), TIXML_ENCODING_UTF8))
				return false;
		}
		else if (uri.scheme == URI::SchemeRes)
		{
			LibCC::Blob<BYTE> blob;
			if (!LoadResourceData(_Module.GetResourceInstance(), uri.path.c_str(), L"FILE", blob, true))
				return false;

			doc.Parse(reinterpret_cast<const char*>(blob.GetBuffer()), 0, TIXML_ENCODING_UTF8);
		}

		TiXmlElement* root = doc.FirstChildElement();
		if (root != NULL)
		{
			if (ElementPtr ptr = Element::FromXmlNode(this, root))
			{
				m_rootelem = ptr;
				SetRootPath(LibCC::PathRemoveFilename(filename));

				return true;
			}
		}

		return false;
	}
コード例 #3
0
ファイル: internal.c プロジェクト: hoangduit/reactos
/*
 * CD / CHDIR
 *
 */
INT cmd_chdir (LPTSTR param)
{
    TCHAR szCurrent[MAX_PATH];
    BOOL bChangeDrive = FALSE;

    /* Filter out special cases first */

    /* Print Help */
    if (!_tcsncmp(param, _T("/?"), 2))
    {
        ConOutResPaging(TRUE,STRING_CD_HELP);
        return 0;
    }

    /* Remove " */
    StripQuotes(param);

    /* Set Error Level to Success */
    nErrorLevel = 0;

    /* Print Current Directory on a disk */
    if (_tcslen(param) == 2 && param[1] == _T(':'))
    {
        if (GetRootPath(param, szCurrent, MAX_PATH))
        {
            error_invalid_drive();
            return 1;
        }
        ConOutPuts(szCurrent);
        return 0;
    }

    /* Get Current Directory */
    GetCurrentDirectory(MAX_PATH, szCurrent);
    if (param[0] == _T('\0'))
    {
        ConOutPuts(szCurrent);
        return 0;
    }

    /* Input String Contains /D Switch */
    if (!_tcsncicmp(param, _T("/D"), 2))
    {
        bChangeDrive = TRUE;
        param += 2;
        while (_istspace(*param))
            param++;
    }

    if (!SetRootPath(bChangeDrive ? NULL : szCurrent, param))
        return 1;

    return 0;
}
コード例 #4
0
wxObjectFolderTree::wxObjectFolderTree(wxWindow* parent, wxWindowID id, const wxPoint& pos,
				  const wxSize& size, long style,
				  const wxValidator& validator,
				  const wxString& name)
		: wxFileTree(parent, id, pos, size, style, validator, name)
{
	wxArrayString extensions;
	extensions.Add("*.ot");
	extensions.Add("*.ocs");
	SetExtensions(extensions);
	SetRootPath("Data\\Editor\\Objects");
	//wxEdit::Instance().GetExplorerToolbar()->RegisterTool("NewFolder", "ResourceMgr", "Data/Editor/Intern/1988.ico", wxObjectFolderTree::OnToolbarEvent);
	wxEdit::Instance().GetExplorerToolbar()->RegisterTool("NewResource", "ResourceMgr", "Data/Editor/Intern/Engine_Icon07.png", wxObjectFolderTree::OnToolbarEvent, "New object resource");
	wxEdit::Instance().GetExplorerToolbar()->SetGroupStatus("ResourceMgr", true);
	//wxEdit::Instance().GetExplorerToolbar()->SetGroupStatus("ResourceMgr", false);
}
コード例 #5
0
void nuiFileTree::Init(const nglPath& rPath, const nglPath& rRootPath, const std::list<nglString>& rFilters, bool showHiddenFiles)
{
  if (SetObjectClass(_T("nuiFileTree")))
    InitAttributes();
  SetObjectName(_T("nuiFileTree"));
  
  mpFileBox = NULL;
  mpTreeView = NULL;
  
  mShowHiddenFiles = showHiddenFiles;
  mFilters = rFilters;
  mpCurrentTree = NULL;
  
  SetRootPath(rRootPath);
  SetPath(rPath);  
}
コード例 #6
0
void nuiFileTree::OnNodeActivated(const nuiEvent& rEvent)
{
  nuiFileSelectorNode* pNode = (nuiFileSelectorNode*)rEvent.mpUser;
  nglPath path(pNode->GetProperty(_T("Path")));
  
  mActivatedPath = path;
  
  // send signal
  bool res = Activated();
  
  if (!res && !path.IsLeaf() && !path.IsBundle())
  {
    SetRootPath(path);
    SetPath(path);    
  }
  
  rEvent.Cancel();
}
コード例 #7
0
void nuiFileTree::OnGotoParentFolder(const nuiEvent& rEvent)
{
  nglPath path = mRootPath;
 
  nglPath parent = mRootPath.GetParent();
  
   // hack to see "/Volumes" as the ROOTPATH_ALLVOLUMES
  if ((mRootPath.GetPathName() == _T("/")) || ((mRootPath.GetPathName().GetLength() > 1) && (mRootPath.GetPathName().Extract(mRootPath.GetPathName().GetLength()-2, 2) == _T(":/"))))
  {
    parent = ROOTPATH_ALLVOLUMES;
    path = nglPath(_T("/"));
  }
  
  SetRootPath(parent);
  
  SetPath(path);
  
  rEvent.Cancel();
}
コード例 #8
0
ファイル: dirstack.c プロジェクト: Fetchered/ReactOS-CMD
/*
 * pushd command
 */
INT CommandPushd (LPTSTR rest)
{
	TCHAR curPath[MAX_PATH];

	if (!_tcsncmp (rest, _T("/?"), 2))
	{
		ConOutResPuts(STRING_DIRSTACK_HELP1);
		return 0;
	}

	GetCurrentDirectory (MAX_PATH, curPath);

	if (rest[0] != _T('\0'))
	{
		if (!SetRootPath(NULL, rest))
			return 1;
	}

	return PushDirectory(curPath);
}
コード例 #9
0
ファイル: AtlBase.cpp プロジェクト: viticm/pap2
STDMETHODIMP CAtlBase::Init3DEngineManager(BSTR strStartUpPath, LONG ihWnd)
{
//	TCHAR dllpath[MAX_PATH];
//	//StrCpyN(dllpath, TEXT("KG3DEngineSD.dll"), MAX_PATH);
//	sprintf(g_szStartUpDirectory, BSTR_TO_STRING(strStartUpPath));
//	sprintf(dllpath, BSTR_TO_STRING(strStartUpPath));
//	strcat(dllpath, "/3DProxy/");
//	g_SetRootPath(dllpath);
//#ifdef _DEBUG
//	strcat(dllpath, "KG3DEngineS.dll");
//#else
//	strcat(dllpath, "KG3DEngineS.dll");
//#endif

	SetRootPath(STRING_TO_BSTR(g_szDefWorkDirectory));

	//MessageBox(NULL, "pre load kg3dEngine.dll", "info", 0);

#ifdef _DEBUG
	g_EngineDll = LoadLibrary("KG3DEngineD.dll");
#else
	g_EngineDll = LoadLibrary("KG3DEngine.dll");
#endif

	if (!g_EngineDll)
		MessageBox(NULL, "加载KG3DEngine失败", "失败", 0);
	
	typedef HRESULT (*pfnGet3DEngineInterface)(void**);
	pfnGet3DEngineInterface Get3DEngineInterface = (pfnGet3DEngineInterface)GetProcAddress(g_EngineDll, "Get3DEngineInterface");

	Get3DEngineInterface((void**)&g_pEngineManager);

	//MessageBox(NULL, "pre g_pEngineManager->Init", "info", 0);
	g_pEngineManager->Init(0, KG3DENG_DESIGN, (HWND)ihWnd, (HWND)ihWnd);
	g_pEngineManager->SetAutoReloadTexture(TRUE);
	BOOL* pbEnable = NULL;
	g_pEngineManager->GetEnableAddEntity(&pbEnable);
	*pbEnable = FALSE;

	return S_OK;
}
コード例 #10
0
ファイル: dbconf.cpp プロジェクト: mtangoo/wxDatabase
void wxDatabaseConfig::SetPath(const wxString& strPath) 
{ 
	if (strPath.empty() || strPath.IsSameAs(wxCONFIG_PATH_SEPARATOR)) 
	{ 
		SetRootPath(m_entry); 
		return; 
	} 

	dbentries entries;
	wxString path = strPath;

	// let's be optimistic, most calls should be to existing paths!
	if (!FindEntries(path, entries))
	{
		if (path[0] != wxCONFIG_PATH_SEPARATOR)
		{
			path = m_entry.path + wxCONFIG_PATH_SEPARATOR + path; 
		}
		wxArrayString paths(wxSplit(path, wxCONFIG_PATH_SEPARATOR)); 
		path.Empty();
		for (size_t n = 0; n < paths.Count(); n++) 
		{
			if (paths[n].IsSameAs(wxEmptyString)) continue;
			path += wxCONFIG_PATH_SEPARATOR+paths[n];
			if (!FindEntries(path, entries))
			{ 
				if (!AddEntry(m_entry, paths[n])) return;
				if (!FindEntries(path, entries)) return;
			}
			m_entry = entries[0];
			entries.clear();
		} 
	}
	else
	{
		m_entry = entries[0];
	}
} 
コード例 #11
0
ファイル: dbconf.cpp プロジェクト: mtangoo/wxDatabase
bool wxDatabaseConfig::FindEntries(const wxString& nameORpath, dbentries& entries)
{
	if (nameORpath.empty()) return false;
	wxString path = nameORpath;
	if (path[0] != wxCONFIG_PATH_SEPARATOR)
	{
		path = m_entry.path + wxCONFIG_PATH_SEPARATOR + path; 
	}
	if (path.Contains("..") || path.Contains("."))
	{
		wxArrayString in(wxSplit(path, wxCONFIG_PATH_SEPARATOR)); 
		wxArrayString out;
		size_t count = in.GetCount();
		for (size_t n = 0; n < count; n++)
		{
			wxString name = in[n];
			if (name.IsSameAs(wxEmptyString)) continue;
			if (name == ".") continue;
			if (name == ".." && !out.empty())
			{
				out.pop_back();
				continue;
			}
			out.Add(name);
		}
		path = wxCONFIG_PATH_SEPARATOR+wxJoin(out, wxCONFIG_PATH_SEPARATOR);
	}
	if (path.IsSameAs(wxCONFIG_PATH_SEPARATOR))
	{
		dbentry root;
		SetRootPath(root);
		entries.push_back(root);
	}
	m_pStatementSqlFindEntries->SetParamString(1, path);
	m_self->ExecuteStatement(m_pStatementSqlFindEntries, &entries);
	return (entries.size() > 0);
}
コード例 #12
0
void wxFileConfig::SetPath(const wxString& strPath)
{
  wxArrayString aParts;

  if ( strPath.IsEmpty() ) {
    SetRootPath();
    return;
  }

  if ( strPath[0] == wxCONFIG_PATH_SEPARATOR ) {
    // absolute path
    wxSplitPath(aParts, strPath);
  }
  else {
    // relative path, combine with current one
    wxString strFullPath = m_strPath;
    strFullPath << wxCONFIG_PATH_SEPARATOR << strPath;
    wxSplitPath(aParts, strFullPath);
  }

  // change current group
  size_t n;
  m_pCurrentGroup = m_pRootGroup;
  for ( n = 0; n < aParts.Count(); n++ ) {
    ConfigGroup *pNextGroup = m_pCurrentGroup->FindSubgroup(aParts[n]);
    if ( pNextGroup == NULL )
      pNextGroup = m_pCurrentGroup->AddSubgroup(aParts[n]);
    m_pCurrentGroup = pNextGroup;
  }

  // recombine path parts in one variable
  m_strPath.Empty();
  for ( n = 0; n < aParts.Count(); n++ ) {
    m_strPath << wxCONFIG_PATH_SEPARATOR << aParts[n];
  }
}
コード例 #13
0
ファイル: Report.cpp プロジェクト: KageKirin/hkxcmd
static bool ExecuteCmd(hkxcmdLine &cmdLine)
{
	string outpath;
	int argc = cmdLine.argc;
	char **argv = cmdLine.argv;
	hkSerializeUtil::SaveOptionBits flags = (hkSerializeUtil::SaveOptionBits)(hkSerializeUtil::SAVE_TEXT_FORMAT|hkSerializeUtil::SAVE_TEXT_NUMBERS);

	list<hkxcmd *> plugins;

#pragma region Handle Input Args
	for (int i = 0; i < argc; i++)
	{
		char *arg = argv[i];
		if (arg == NULL)
			continue;
		if (arg[0] == '-' || arg[0] == '/')
		{

			switch (tolower(arg[1]))
			{
			case 'd':
				{
					const char *param = arg+2;
					if (*param == ':' || *param=='=') ++param;
					argv[i] = NULL;
					if ( param[0] == 0 && ( i+1<argc && ( argv[i+1][0] != '-' || argv[i+1][0] != '/' ) ) ) {
						param = argv[++i];
						argv[i] = NULL;
					}
					if ( param[0] == 0 )
					{
						Log::SetLogLevel(LOG_DEBUG);
						break;
					}
					else
					{
						Log::SetLogLevel((LogLevel)StringToEnum(param, LogFlags, LOG_INFO));
					}
				} break;

			case 'o':
				{
					const char *param = arg+2;
					if (*param == ':' || *param=='=') ++param;
					argv[i] = NULL;
					if ( param[0] == 0 && ( i+1<argc && ( argv[i+1][0] != '-' || argv[i+1][0] != '/' ) ) ) {
						param = argv[++i];
						argv[i] = NULL;
					}
					if ( param[0] == 0 )
						break;
					if (outpath.empty())
					{
						outpath = param;
					}
					else
					{
						Log::Error("Output file already specified as '%s'", outpath.c_str());
					}
				} break;

			default:
				Log::Error("Unknown argument specified '%s'", arg);
				break;
			}
		}
		else if (outpath.empty())
		{
			outpath = arg;
		}
	}
#pragma endregion
   if (outpath.empty()){
      HelpString(hkxcmd::htLong);
      return false;
   }
   hkMallocAllocator baseMalloc;
   // Need to have memory allocated for the solver. Allocate 1mb for it.
   hkMemoryRouter* memoryRouter = hkMemoryInitUtil::initDefault( &baseMalloc, hkMemorySystem::FrameInfo(1024 * 1024) );
   hkBaseSystem::init( memoryRouter, errorReport );

   // Normally all the patches would be added to the global singleton but
   // for this example we'll use a private manager to keep the scope small
   // and not leave useless patches in the global registry
   {
      hkVersionPatchManager patchManager;
      {
         extern void HK_CALL CustomRegisterPatches(hkVersionPatchManager& patchManager);
         CustomRegisterPatches(patchManager);
      }
      hkDefaultClassNameRegistry &dynamicRegistry = hkDefaultClassNameRegistry::getInstance();
      {
         extern void HK_CALL CustomRegisterDefaultClasses();
         extern void HK_CALL ValidateClassSignatures();
         CustomRegisterDefaultClasses();
         ValidateClassSignatures();
      } 

      SetRootPath(outpath.c_str());
      DumpClassesAll();
   }

   hkBaseSystem::quit();
	hkMemoryInitUtil::quit();


	return true;
}
コード例 #14
0
void JBoundsEditor::Refresh()
{
    JString path = m_RootPath;
    m_RootPath = "";
    SetRootPath( path.c_str() );
}
コード例 #15
0
void JBoundsEditor::Init()
{
    SetRootPath( m_RootPath.c_str() );
}
コード例 #16
0
ファイル: dbconf.cpp プロジェクト: mtangoo/wxDatabase
bool wxDatabaseConfig::DeleteAll() 
{ 
	this->ExecuteStatement(m_pStatementSqlDropAll);
	SetRootPath(m_entry);
	return true; 
} 
コード例 #17
0
ファイル: dbconf.cpp プロジェクト: mtangoo/wxDatabase
bool wxDatabaseConfig::LoadStream(wxInputStream& inStream, wxString* err) 
{ 
	SetRootPath(m_entry);

	if (m_viewName.IsEmpty())
	{
		m_viewName = m_self->GetAppName();
		if (m_viewName.IsEmpty())
		{
			m_viewName = viewname_default;
		}
	}
	m_viewName.Replace(wxCONFIG_PATH_SEPARATOR, wxEmptyString);

	if (!inStream.CanRead())
	{
		if (err) err->Append("can't read"); 
		return false;
	}

	wxFileConfig config(inStream);

	/*
		SQLite doesn't support stored procedures nor recursion.
		The best compromise between all the flavours of databases is to store the group paths as a closure set
		and to access the groups and entries via a view with triggers instead of accessing the underlying tables directly.

		table "tablename_entry" contains the rows for both group names and entry name/values
		table "tablename_path"  contains a closure set for the group paths

		view  "viewname" (and its associated triggers) provide the interface used by this code
	*/

	wxString sqlCreateTablePath;
	wxString sqlCreateTableEntry;
	wxString sqlCreateViewPath;

	wxString sqlCreateTriggerInsteadOfInsertViewPath;
	wxString sqlCreateTriggerInsteadOfUpdateViewPath;
	wxString sqlCreateTriggerInsteadOfDeleteViewPath;

	wxString sqlAddEntry;
	wxString sqlDelEntry;
	wxString sqlEditEntry;
	wxString sqlFindEntries;

	wxString sqlDropAll;

	// should work on all DBs?
	sqlCreateTablePath << 
		"IF NOT EXISTS (SELECT * FROM sys.views WHERE name = '" << viewname <<"') "
		"AND NOT EXISTS (SELECT * FROM sys.objects WHERE type IN ('U') AND name = '" << tablename_path << "') EXECUTE('"
		"CREATE TABLE " << tablename_path <<
		"("
		"pid INT NOT NULL,"
		"id  INT NOT NULL,"
		"PRIMARY KEY (pid, id),"
		"FOREIGN KEY (pid) REFERENCES " << tablename_entry << "(id),"
		"FOREIGN KEY (id)  REFERENCES " << tablename_entry << "(id)"
		")"
		"')"
		;
	sqlCreateTableEntry << 
		"IF NOT EXISTS (SELECT * FROM sys.views WHERE name = '" << viewname <<"') "
		"AND NOT EXISTS (SELECT * FROM sys.objects WHERE type IN ('U') AND name = '" << tablename_entry <<"') EXECUTE('"
		"CREATE TABLE " << tablename_entry <<
		"("
		"id INT IDENTITY PRIMARY KEY,"
		"name VARCHAR(255) NOT NULL,"
		"value VARCHAR(255) NULL"
		")"
		"')"
		;
	sqlAddEntry <<
		"INSERT INTO " << viewname <<" (id, name, value) VALUES (?, ?, ?)"
		;
	sqlDelEntry <<
		"DELETE FROM " << viewname <<" WHERE id = ?"
		;
	sqlEditEntry <<
		"UPDATE " << viewname <<" SET name = ?, value = ? WHERE id = ?"
		;
	sqlFindEntries <<
		"SELECT id, name, value, path, isgroup FROM " << viewname <<" WHERE path LIKE ?"
		;
	sqlDropAll <<
		"DROP VIEW " << viewname <<"\n"
		"DROP TABLE " << tablename_path <<"\n"
		"DROP TABLE " << tablename_entry <<"\n"
		;
	sqlCreateTriggerInsteadOfInsertViewPath <<
		"IF NOT EXISTS (SELECT * FROM sys.triggers WHERE name = '" << triggername_insertviewpath <<"') EXECUTE('\n"
		"CREATE TRIGGER [" << triggername_insertviewpath <<"] ON " << viewname <<" INSTEAD OF INSERT\n"
		"AS\n"
		"BEGIN\n"
		"\tINSERT INTO " << tablename_entry <<" (name, value) SELECT i.name, i.value FROM inserted i\n"
		"\tINSERT INTO " << tablename_path <<" (pid, id)\n"
		"\tSELECT p.pid, (SELECT MAX(id) FROM " << tablename_entry <<")\n"
		"\tFROM\n"
		"\t\t" << tablename_path <<" p\n"
		"\t\tJOIN inserted i ON p.id = i.id -- treat i.id as the pid p\n"
		"\tUNION\n"
		"\tSELECT MAX(id), MAX(id) FROM " << tablename_entry <<"\n"
		//"\tSELECT id, name, value FROM " << tablename_entry <<" WHERE id IN (SELECT MAX(id) FROM " << tablename_entry <<")\n"
		"END\n"
		"')"
		;
	sqlCreateTriggerInsteadOfUpdateViewPath <<
		"IF NOT EXISTS (SELECT * FROM sys.triggers WHERE name = '" << triggername_updateviewpath <<"') EXECUTE('\n"
		"CREATE TRIGGER [" << triggername_updateviewpath <<"] ON " << viewname <<" INSTEAD OF UPDATE\n"
		"AS\n"
		"BEGIN\n"
		"\tUPDATE " << tablename_entry <<" SET\n"
		"\t\t" << tablename_entry <<".name = i.name,\n"
		"\t\t" << tablename_entry <<".value = CASE WHEN " << tablename_entry <<".value IS NULL THEN NULL ELSE i.value END\n"
		"\tFROM\n"
		"\t\tinserted i\n"
		"\tWHERE\n"
		"\t\t" << tablename_entry <<".id = i.id\n"
		//"\tSELECT e.id, e.name, e.value FROM " << tablename_entry <<" e JOIN inserted i ON i.id = e.id\n"
		"END\n"
		"')"
		;
	sqlCreateTriggerInsteadOfDeleteViewPath <<
		"IF NOT EXISTS (SELECT * FROM sys.triggers WHERE name = '" << triggername_deleteviewpath <<"') EXECUTE('\n"
		"CREATE TRIGGER [" << triggername_deleteviewpath <<"] ON " << viewname <<" INSTEAD OF DELETE\n"
		"AS\n"
		"BEGIN\n"
		"\tDELETE p\n"
		"\tFROM\n"
		"\t\t" << tablename_path <<" c\n"
		"\t\tJOIN " << tablename_path <<" p ON p.id = c.id\n"
		"\t\tJOIN deleted d ON c.pid = d.id -- treat d.id as the id\n"
		"\tDELETE e\n"
		"\tFROM\n"
		"\t\t" << tablename_entry <<" e\n"
		"\tWHERE\n"
		"\t\te.id  NOT IN (SELECT id FROM " << tablename_path <<")\n"
		"END\n"
		"')"
		;

	m_pDatabase = wxDatabase::GetDatabase(config, err);
	if (m_pDatabase == NULL)
	{
		if (err) err->Append("cannot establish database connection from"); 
		return false;
	}

	// if necessary add the database library path to the system path
	if (!m_pDatabase->GetLibraryPath().IsEmpty())
	{
		wxString path;
		wxGetEnv("PATH", &path);
#ifdef WIN32
		path.Append(";");
#else
		path.Append(":");
#endif
		path.Append(m_pDatabase->GetLibraryPath());
		wxSetEnv("PATH", path);
	}

	if (false);
#if wxUSE_DATABASE_SQLITE
	else
	if (m_pDatabase->GetTypeName().IsSameAs("SQLITE"))
	{
		sqlCreateViewPath << 
			"IF NOT EXISTS (SELECT * FROM sys.views WHERE name = '" << viewname <<"') EXECUTE('"
			"CREATE VIEW [" << viewname <<"]\n"
			"AS\n"
			"SELECT\n"
			"\te.id,\n"
			"\te.name,\n"
			"\te.value,\n"
			"\tCONVERT(VARCHAR(255), (\n"
			"\t\tSELECT\n"
			"\t\t\t''/''+dbo.GROUP_CONCAT_D(ie.name, ''/'')\n"
			"\t\tFROM\n"
			"\t\t\t" << tablename_path <<" ic\n"
			"\t\t\tJOIN " << tablename_path <<" ip ON ip.id = ic.pid\n"
			"\t\t\tJOIN " << tablename_entry <<" ie ON ie.id = ip.pid\n"
			"\t\tWHERE\n"
			"\t\t\tic.id = ic.pid\n"
			"\t\t\tAND\n"
			"\t\t\tic.id = c.id\n"
			"\t\tGROUP BY\n"
			"\t\t\tic.id\n"
			"\t)) AS [path],\n"
			"\tCASE WHEN e.value IS NULL THEN 1 ELSE 0 END AS [isgroup]\n"
			"FROM\n"
			"\t" << tablename_path <<" c\n"
			"\tJOIN " << tablename_entry <<" e ON e.id = c.id\n"
			"WHERE\n"
			"\tc.id = c.pid\n"
			"')"
			;
	}
#endif
#if wxUSE_DATABASE_POSTGRESQL
	else
	if (m_pDatabase->GetTypeName().IsSameAs("POSTGRESQL"))
	{
	}
#endif
#if wxUSE_DATABASE_MYSQL
	else
	if (m_pDatabase->GetTypeName().IsSameAs("MYSQL"))
	{
	}
#endif
#if wxUSE_DATABASE_ODBC
	else
	if (m_pDatabase->GetTypeName().IsSameAs("ODBC"))
	{
	}
#endif
#if wxUSE_DATABASE_TDS
	else
	if (m_pDatabase->GetTypeName().IsSameAs("TDS"))
	{
		sqlCreateViewPath << 
			"IF NOT EXISTS (SELECT * FROM sys.views WHERE name = '" << viewname <<"') EXECUTE('"
			"CREATE VIEW [" << viewname <<"]\n"
			"AS\n"
			"SELECT\n"
			"\te.id,\n"
			"\te.name,\n"
			"\te.value,\n"
			"\tCONVERT(VARCHAR(255), (\n"
			"\t\tSELECT\n"
			"\t\t\t''/''+e.name AS [text()]\n"
			"\t\tFROM\n"
			"\t\t\t" << tablename_path <<" p\n"
			"\t\t\tJOIN " << tablename_entry <<" e ON e.id = p.pid\n"
			"\t\tWHERE\n"
			"\t\t\tp.id = c.pid\n"
			"\t\tFOR XML PATH('''')\n"
			"\t)) AS [path],\n"
			"\tCASE WHEN e.value IS NULL THEN 1 ELSE 0 END AS [isgroup]\n"
			"FROM\n"
			"\t" << tablename_path <<" c\n"
			"\tJOIN " << tablename_entry <<" e ON e.id = c.id\n"
			"WHERE\n"
			"\tc.id = c.pid\n"
			"')"
			;
	}
#endif

	m_pDatabase->CloseStatement(this->ExecuteStatement(this->PrepareStatement(sqlCreateTableEntry)));
	m_pDatabase->CloseStatement(this->ExecuteStatement(this->PrepareStatement(sqlCreateTablePath)));
	m_pDatabase->CloseStatement(this->ExecuteStatement(this->PrepareStatement(sqlCreateViewPath)));
	m_pDatabase->CloseStatement(this->ExecuteStatement(this->PrepareStatement(sqlCreateTriggerInsteadOfInsertViewPath)));
	m_pDatabase->CloseStatement(this->ExecuteStatement(this->PrepareStatement(sqlCreateTriggerInsteadOfUpdateViewPath)));
	m_pDatabase->CloseStatement(this->ExecuteStatement(this->PrepareStatement(sqlCreateTriggerInsteadOfDeleteViewPath)));

	m_pStatementSqlAddEntry = this->PrepareStatement(sqlAddEntry);
	m_pStatementSqlDelEntry = this->PrepareStatement(sqlDelEntry);
	m_pStatementSqlEditEntry = this->PrepareStatement(sqlEditEntry);
	m_pStatementSqlFindEntries = this->PrepareStatement(sqlFindEntries);

	m_pStatementSqlDropAll = this->PrepareStatement(sqlDropAll);

	return true;
}