int CSqldalImpl::Reopen(const char* p_pkszNewMode )
{
	if ( ! p_pkszNewMode || 0 == p_pkszNewMode[0] ) return false ; // do not reopen, keep current

	if ( strModeToInt(p_pkszNewMode) == m_mode && m_pDBConn ) return true ; // not changed, keep current
	LOG("Try reopen:[%s]",p_pkszNewMode );	// log only when mode changes
	if ( ! Close() )
	{
		return false ;
	}
	return Open(m_pDbFile,p_pkszNewMode);
}
int CSqldalImpl::Reopen(const char* p_pkszNewMode )
{
	LOG("Try reopen:[%s]",p_pkszNewMode );
	if ( ! p_pkszNewMode || 0 == p_pkszNewMode[0] ) return false ;

	if ( strModeToInt(p_pkszNewMode) == m_mode && m_pDBConn ) return true ;
	if ( ! Close() )
	{
		return false ;
	}
	return Open(m_pDbFile,p_pkszNewMode);
}
int CSqldalImpl::Open( const char* p_pDbFile, const char* p_pkszMode )
{
	int srv, mode ;
	// pre
	if ( ! p_pDbFile || *p_pDbFile==0 )
	{
		FERR("NULL file name");
		Close();
		return false ;
	}
	if ( ! p_pkszMode || *p_pkszMode==0 )
	{
		FERR("NULL opening mode");
		Close();
		return false ;
	}

	mode = strModeToInt(p_pkszMode);
	if ( m_pDBConn && mode == m_mode ) return true ;

	m_mode = mode ;
	memmove( m_pDbFile, p_pDbFile, strlen(p_pDbFile) );
	srv = sqlite3_enable_shared_cache( false );
	if (srv != SQLITE_OK)
	{
		WARN("FAIL:sqlite3_enable_shared_cache:[%d]:[%s]",  sqlite3_errcode(m_pDBConn), sqlite3_errmsg(m_pDBConn) );
	}
	srv = sqlite3_open_v2 ( m_pDbFile, &m_pDBConn, m_mode, NULL );
	if (srv != SQLITE_OK)
	{
		ERR("sqlite3_open:[%d]:[%s]", sqlite3_errcode(m_pDBConn), sqlite3_errmsg(m_pDBConn) );
		Close();
		return false ;
	}
	LOG("[%s] Openned in [%s] mode", m_pDbFile, p_pkszMode );
	return true ;
}