Develop and Download Open Source Software

Browse CVS Repository

Diff of /xoonips/AL/commonal.cc

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

revision 1.119 by tani, Fri Apr 7 08:19:51 2006 UTC revision 1.120 by tani, Tue Apr 11 10:31:27 2006 UTC
# Line 22  Line 22 
22   *   *
23   * $Revision$   * $Revision$
24   * $Log$   * $Log$
25     * Revision 1.120  2006/04/11 10:31:27  tani
26     * merge to main trunk (from REL20060213 to merge_to_20060411)
27     * REL20060213からmerge_to_20060411までのSTABLE_2の差分をCURRENTにマージ.
28     *
29     * Revision 1.118.2.2  2006/02/28 04:49:17  aga4096
30     * ・NIJC code, guestのon/offを書き換えたときに item_status をリセットする.
31     *
32     * Revision 1.118.2.1  2006/02/14 05:13:17  aga4096
33     * ・アイテムが private/index_a と public/index_b に登録された状態で、 private/index_aを削除するとおかしくなるのを修正.
34     *
35   * Revision 1.119  2006/04/07 08:19:51  tani   * Revision 1.119  2006/04/07 08:19:51  tani
36   * doiをDBから取得する時の型指定をBLOBにあわせて修正.   * doiをDBから取得する時の型指定をBLOBにあわせて修正.
37   *   *
# Line 6458  result_t deleteIndexInternal( sessionid_ Line 6468  result_t deleteIndexInternal( sessionid_
6468          for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。          for ( int i = descXIDLen-1; i >= 0; i-- ){ // 逆方向にして、途中で失敗した場合の惨事を防ぐ。descXIDは幅優先探索順に並んでいるので。
6469              string strXID = unsignedIntToString(descXID[i]);              string strXID = unsignedIntToString(descXID[i]);
6470              string linkTable = dbprefix + "_xoonips_index_item_link";              string linkTable = dbprefix + "_xoonips_index_item_link";
6471                string indexTable = dbprefix + "_xoonips_index";
6472                            
6473              // descXID[i] のアイテムの中で、被参照数が1のものを列挙 → 迷子にならないように移動  
6474              // HAVINGを使うべき? "select item_id, count(*) as v1, sum(index_id=$index_id) as v2 from $link_table having v1=1 and v2=1"              // descXID[i]がPrivate以下 && descXID[i]内のアイテムIを参照するPrivateなindexが1個しかない → Iを迷子にならないように親に移動
6475              // しかしsum内に<predicate>を書いてもいいのだろうか? 代わりにnullifとcoalesceならsqliteは通るが・・・              if ( index->getOpenLevel() == index::OL_PRIVATE ){
6476              //  → 互換性の高い方法がよくわからないので、とりあえず自己joinにする。                  string sql( "SELECT t1.index_item_link_id, t1.item_id, count(*) "
6477              string sql( "SELECT t1.index_item_link_id "                      " FROM " + linkTable + " AS t1 "
6478                  " FROM " + linkTable + " AS t1 "                      " LEFT JOIN " + linkTable + " AS t2 ON t1.item_id = t2.item_id "
6479                  " LEFT JOIN " + linkTable + " AS t2 ON t1.item_id = t2.item_id and t2.index_id <> t1.index_id "                      " LEFT JOIN " + indexTable + " AS tx2 on t2.index_id = tx2.index_id "
6480                  " WHERE t1.index_id=" + strXID + " and t2.item_id is NULL" );                      " WHERE t1.index_id=" + strXID +
6481              if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){                        " and tx2.open_level = " + unsignedIntToString(index::OL_PRIVATE) +
6482                  SQLUINTEGER sLinkID = 0;                        " group by t1.item_id " );
6483                  SQLLEN len = 0;                  if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){
6484                  SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len );                      SQLUINTEGER sLinkID = 0, sItemID = 0, sCount = 0;
6485                  while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){                      SQLLEN len1 = 0, len2 = 0, len3 = 0;
6486                      string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) );                      SQLBindCol( hstmt, 1, SQL_C_ULONG, &sLinkID, 0, &len1 );
6487                      result = querySimple( "deleteIndex", sql2 );                      SQLBindCol( hstmt, 2, SQL_C_ULONG, &sItemID, 0, &len2 );
6488                      if( result != RES_OK )                      SQLBindCol( hstmt, 3, SQL_C_ULONG, &sCount , 0, &len3 );
6489                        while ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){
6490                            if ( sCount == 1 ){
6491                                string sql2( "UPDATE " + linkTable + " set index_id= " + strParentXID + " where index_item_link_id = " + unsignedIntToString(sLinkID) );
6492                                result = querySimple( "deleteIndex", sql2 );
6493                                if( result != RES_OK )
6494                                    break;
6495                            }
6496                        }
6497                        if ( result != RES_OK )
6498                          break;                          break;
6499                    }else{
6500                        string s( "SQLExecDirect in deleteIndex" );
6501                        s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );
6502                        s += "sql=";
6503                        s += string( sql );
6504                        setLastErrorString( s.c_str( ) );
6505                        result = RES_DB_QUERY_ERROR;
6506                  }                  }
                 if ( result != RES_OK )  
                     break;  
             }else{  
                 string s( "SQLExecDirect in deleteIndex" );  
                 s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode );  
                 s += "sql=";  
                 s += string( sql );  
                 setLastErrorString( s.c_str( ) );  
                 result = RES_DB_QUERY_ERROR;  
                 break;  
6507              }              }
6508                            
6509              // descXID[i] のアイテムを全て削除              // descXID[i] のアイテムを全て削除
6510              sql = "DELETE from " + linkTable + " where index_id=" + strXID;              string sql = "DELETE from " + linkTable + " where index_id=" + strXID;
6511              result = querySimple( functionName, sql );              result = querySimple( functionName, sql );
6512              if ( result == RES_OK ){              if ( result == RES_OK ){
6513                  // descXID[i] を削除                  // descXID[i] を削除
# Line 6511  result_t deleteIndexInternal( sessionid_ Line 6528  result_t deleteIndexInternal( sessionid_
6528          for ( int i = 0; i < affectedIIDsLen; i++ ){          for ( int i = 0; i < affectedIIDsLen; i++ ){
6529              insertMetadataEventAuto( affectedIIDs[i] );              insertMetadataEventAuto( affectedIIDs[i] );
6530          }          }
           
6531      }else{      }else{
6532          string s( "SQLAllocHandle in deleteIndex" );          string s( "SQLAllocHandle in deleteIndex" );
6533          s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );          s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode );
# Line 6638  result_t setConfigValue( const char* key Line 6654  result_t setConfigValue( const char* key
6654      SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS;      SQLLEN cbKey = SQL_NTS, cbValue = SQL_NTS;
6655      result_t ret = RES_ERROR;      result_t ret = RES_ERROR;
6656            
6657        // nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする.
6658        bool isNijcOrGuest = ( strcmp( key, XNP_CONFIG_REPOSITORY_NIJC_CODE ) == 0 || strcmp( key, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY ) == 0 );
6659        char *oldValue = 0;
6660        if ( isNijcOrGuest )
6661            getConfigValue( key, &oldValue );
6662        
6663      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {      if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) {
6664          string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?");          string sql( "UPDATE " + dbprefix + "_xoonips_config SET value=? WHERE name=?");
6665          syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() );          syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() );
# Line 6708  result_t setConfigValue( const char* key Line 6730  result_t setConfigValue( const char* key
6730          setLastErrorString( s.c_str( ) );          setLastErrorString( s.c_str( ) );
6731          ret = RES_ERROR;          ret = RES_ERROR;
6732      }      }
6733        
6734        // nijc_code か guestのON/OFF を書き換えたときは、item_statusをリセットする.
6735        if ( ret == RES_OK && isNijcOrGuest && ( oldValue == 0 || strcmp( value, oldValue ) != 0 ) )
6736            refreshItemStatus();
6737        if ( oldValue )
6738            freeString( oldValue );
6739        
6740      return ret;      return ret;
6741  }  }
6742    

Legend:
Removed from v.1.119  
changed lines
  Added in v.1.120

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26