| 22 |
* |
* |
| 23 |
* $Revision$ |
* $Revision$ |
| 24 |
* $Log$ |
* $Log$ |
| 25 |
|
* Revision 1.115 2005/11/17 10:59:36 tani |
| 26 |
|
* アイテム間リンク機能: insertRelatedTo, deleteRelatedTo, getRelatedToを追加. |
| 27 |
|
* |
| 28 |
* Revision 1.114 2005/11/16 03:59:06 tani |
* Revision 1.114 2005/11/16 03:59:06 tani |
| 29 |
* XOONIPS_STABLEの分岐点〜MergePnt_20051116間のXooNIps_STABLE上の修正をCURRENTにマージ. |
* XOONIPS_STABLEの分岐点〜MergePnt_20051116間のXooNIps_STABLE上の修正をCURRENTにマージ. |
| 30 |
* |
* |
| 8375 |
} |
} |
| 8376 |
|
|
| 8377 |
|
|
| 8378 |
|
/** |
| 8379 |
|
* |
| 8380 |
|
* アイテム間リンク情報を追加する. |
| 8381 |
|
* Platformユーザ以上の権限が必要. |
| 8382 |
|
* |
| 8383 |
|
* TODO itemidが閲覧できないアイテムをさしている場合,追加できない |
| 8384 |
|
* TODO parentid,itemidの何れかまたは一方が指すアイテムが存在しないとき,追加できない |
| 8385 |
|
* |
| 8386 |
|
* @param sid セッションID |
| 8387 |
|
* @param parentid リンク元アイテムのID |
| 8388 |
|
* @param itemid リンク先(被リンク)アイテムのID |
| 8389 |
|
* @return RES_OK |
| 8390 |
|
* @return RES_ERROR |
| 8391 |
|
* @return RES_NO_SUCH_SESSION |
| 8392 |
|
* @return RES_DB_QUERY_ERROR |
| 8393 |
|
* @return RES_DB_NOT_INITIALIZED |
| 8394 |
|
* @return RES_NO_WRITE_ACCESS_RIGHT parentidが編集できないアイテムをさしている,<br/>またはitemidが閲覧できないアイテムを指している,<br/>または XooNIpsユーザでない(activate待ち) |
| 8395 |
|
* |
| 8396 |
|
*/ |
| 8397 |
|
result_t insertRelatedTo( sessionid_t sid, itemid_t parentid, itemid_t itemid ) |
| 8398 |
|
{ |
| 8399 |
|
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 8400 |
|
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 8401 |
|
if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT; |
| 8402 |
|
if( !getItemPermission( sid, parentid, item::OP_MODIFY ) ) return RES_NO_WRITE_ACCESS_RIGHT; |
| 8403 |
|
if( !getItemPermission( sid, itemid, item::OP_READ ) ) return RES_NO_WRITE_ACCESS_RIGHT; |
| 8404 |
|
|
| 8405 |
|
string sql; |
| 8406 |
|
SQLHANDLE hstmt = NULL; |
| 8407 |
|
SQLRETURN sqlcode; |
| 8408 |
|
result_t ret = RES_ERROR; |
| 8409 |
|
|
| 8410 |
|
|
| 8411 |
|
sql = "SELECT * FROM " + dbprefix + "_xoonips_related_to WHERE parent_id=" |
| 8412 |
|
+ string( unsignedIntToString( parentid ) ) + " AND item_id=" + string( unsignedIntToString( itemid ) ); |
| 8413 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 8414 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 8415 |
|
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 8416 |
|
//nothing to do because already registered |
| 8417 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 8418 |
|
return RES_OK; |
| 8419 |
|
} |
| 8420 |
|
} |
| 8421 |
|
}else{ |
| 8422 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertRelatedTo" ); |
| 8423 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 8424 |
|
setLastErrorString( s.c_str( ) ); |
| 8425 |
|
return RES_ERROR; |
| 8426 |
|
} |
| 8427 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 8428 |
|
|
| 8429 |
|
sql = "INSERT INTO " + dbprefix + "_xoonips_related_to (parent_id, item_id) VALUES (" |
| 8430 |
|
+ string( unsignedIntToString( parentid ) ) + ", " + string( unsignedIntToString( itemid ) ) + ")"; |
| 8431 |
|
|
| 8432 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 8433 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 8434 |
|
ret = RES_OK; |
| 8435 |
|
}else{ |
| 8436 |
|
string s( "SQLExecuteDirect in insertRelatedTo " ); |
| 8437 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 8438 |
|
setLastErrorString( s.c_str( ) ); |
| 8439 |
|
ret = RES_DB_QUERY_ERROR; |
| 8440 |
|
} |
| 8441 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 8442 |
|
}else{ |
| 8443 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertRelatedTo" ); |
| 8444 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 8445 |
|
setLastErrorString( s.c_str( ) ); |
| 8446 |
|
ret = RES_ERROR; |
| 8447 |
|
} |
| 8448 |
|
|
| 8449 |
|
return ret; |
| 8450 |
|
} |
| 8451 |
|
|
| 8452 |
|
|
| 8453 |
|
/** |
| 8454 |
|
* |
| 8455 |
|
* アイテム間リンク情報を削除する. |
| 8456 |
|
* |
| 8457 |
|
* @param sid セッションID |
| 8458 |
|
* @param parentid 削除したいリンクのリンク元アイテムのID |
| 8459 |
|
* @param itemid 削除したいリンクのリンク先(被リンク)アイテムのID |
| 8460 |
|
* @return RES_OK 削除に成功した,または指定されたリンク情報が存在しなかった. |
| 8461 |
|
* @return RES_ERROR |
| 8462 |
|
* @return RES_NO_SUCH_SESSION |
| 8463 |
|
* @return RES_DB_QUERY_ERROR |
| 8464 |
|
* @return RES_DB_NOT_INITIALIZED |
| 8465 |
|
* @return RES_NO_WRITE_ACCESS_RIGHT XooNIpsユーザでない(activate待ち),またはparentidのアイテム編集権限が無い |
| 8466 |
|
*/ |
| 8467 |
|
result_t deleteRelatedTo( sessionid_t sid, itemid_t parentid, itemid_t itemid ) |
| 8468 |
|
{ |
| 8469 |
|
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 8470 |
|
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 8471 |
|
if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT; |
| 8472 |
|
if( !getItemPermission( sid, parentid, item::OP_MODIFY ) ) return RES_NO_WRITE_ACCESS_RIGHT; |
| 8473 |
|
|
| 8474 |
|
result_t ret = RES_ERROR; |
| 8475 |
|
string sql; |
| 8476 |
|
SQLRETURN sqlcode; |
| 8477 |
|
SQLHANDLE hstmt = NULL; |
| 8478 |
|
|
| 8479 |
|
sql = "DELETE FROM " + dbprefix + "_xoonips_related_to "; |
| 8480 |
|
sql += "WHERE parent_id=" + string( unsignedIntToString( parentid ) ) |
| 8481 |
|
+ " AND item_id = " + string( unsignedIntToString( itemid ) ); |
| 8482 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 8483 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 8484 |
|
ret = RES_OK; |
| 8485 |
|
}else{ |
| 8486 |
|
string s( "SQLExecuteDirect in deleteRelatedTo " ); |
| 8487 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 8488 |
|
setLastErrorString( s.c_str( ) ); |
| 8489 |
|
ret = RES_DB_QUERY_ERROR; |
| 8490 |
|
} |
| 8491 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 8492 |
|
}else{ |
| 8493 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteRelatedTo" ); |
| 8494 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 8495 |
|
setLastErrorString( s.c_str( ) ); |
| 8496 |
|
ret = RES_ERROR; |
| 8497 |
|
} |
| 8498 |
|
return ret; |
| 8499 |
|
} |
| 8500 |
|
|
| 8501 |
|
/** |
| 8502 |
|
* |
| 8503 |
|
* アイテム間リンク情報を取得する. |
| 8504 |
|
* リンク先アイテムの閲覧権限が無い場合,そのリンク情報は返さない. |
| 8505 |
|
* |
| 8506 |
|
* @param sid セッションID |
| 8507 |
|
* @param parentid リンク元アイテムのID |
| 8508 |
|
* @param itemids 結果を受け取る配列(paerntidからリンクしているアイテムのID) |
| 8509 |
|
* @param itemidsLen itemidsの数を受け取る変数 |
| 8510 |
|
* @return RES_OK |
| 8511 |
|
* @return RES_ERROR |
| 8512 |
|
* @return RES_NO_SUCH_SESSION |
| 8513 |
|
* @return RES_DB_QUERY_ERROR |
| 8514 |
|
* @return RES_DB_NOT_INITIALIZED |
| 8515 |
|
* @return RES_NO_WRITE_ACCESS_RIGHT parentidが指すにアクセス権が無い, XooNIpsユーザでない(activate待ち) |
| 8516 |
|
*/ |
| 8517 |
|
result_t getRelatedTo( sessionid_t sid, itemid_t parentid, itemid_t** itemids, int* itemidsLen ) |
| 8518 |
|
{ |
| 8519 |
|
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 8520 |
|
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 8521 |
|
if( !isActivatedBySession( sid ) ) return RES_NO_WRITE_ACCESS_RIGHT; |
| 8522 |
|
if( !getItemPermission( sid, parentid, item::OP_READ ) ) return RES_NO_WRITE_ACCESS_RIGHT; |
| 8523 |
|
|
| 8524 |
|
result_t ret = RES_ERROR; |
| 8525 |
|
string sql; |
| 8526 |
|
SQLRETURN sqlcode; |
| 8527 |
|
SQLHANDLE hstmt = NULL; |
| 8528 |
|
|
| 8529 |
|
sql = "SELECT count(*) FROM " + dbprefix + "_xoonips_related_to "; |
| 8530 |
|
sql += "WHERE parent_id=" + string( unsignedIntToString( parentid ) ); |
| 8531 |
|
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 8532 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 8533 |
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 8534 |
|
SQLUINTEGER cnt_tmp = 0;//リンクの総数(閲覧権限の有無に拘らない数) |
| 8535 |
|
SQLLEN len = 0; |
| 8536 |
|
SQLBindCol( hstmt, 1, SQL_C_ULONG, &cnt_tmp, 0, &len ); |
| 8537 |
|
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 8538 |
|
int count = 0; //閲覧可能なアイテムへのリンクの数 |
| 8539 |
|
itemid_t *ids_tmp = new itemid_t[ cnt_tmp ]; |
| 8540 |
|
if( cnt_tmp > 0 ){ |
| 8541 |
|
//retrieve IDs |
| 8542 |
|
SQLHANDLE hstmt2 = NULL; |
| 8543 |
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 8544 |
|
sql = "SELECT item_id FROM " + dbprefix + "_xoonips_related_to "; |
| 8545 |
|
sql += "WHERE parent_id=" + string( unsignedIntToString( parentid ) ); |
| 8546 |
|
syslog_printf( "\nsql at %d=%s", __LINE__, sql.c_str() ); |
| 8547 |
|
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 8548 |
|
SQLUINTEGER iid = 0; |
| 8549 |
|
SQLLEN len = 0; |
| 8550 |
|
SQLBindCol( hstmt2, 1, SQL_C_ULONG, &iid, 0, &len ); |
| 8551 |
|
for( SQLUINTEGER i = 0; ( sqlcode = SQLFetch( hstmt2 ) ) == SQL_SUCCESS && i < cnt_tmp ; i++ ){ |
| 8552 |
|
if( getItemPermission( sid, iid, item::OP_READ ) ){ |
| 8553 |
|
ids_tmp[ count ] = iid; |
| 8554 |
|
count++; |
| 8555 |
|
} |
| 8556 |
|
} |
| 8557 |
|
*itemids = new itemid_t[ count ]; |
| 8558 |
|
if( count > 0 ) memcpy( *itemids, ids_tmp, sizeof( itemid_t ) * count ); |
| 8559 |
|
*itemidsLen = count; |
| 8560 |
|
delete[] ids_tmp; |
| 8561 |
|
ret = RES_OK; |
| 8562 |
|
}else{ |
| 8563 |
|
setLastErrorString( "SQLExecDirect in getRelatedTo" ); |
| 8564 |
|
ret = RES_DB_QUERY_ERROR; |
| 8565 |
|
} |
| 8566 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 8567 |
|
}else{ |
| 8568 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getRelatedTo" ); |
| 8569 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 8570 |
|
setLastErrorString( s.c_str( ) ); |
| 8571 |
|
ret = RES_ERROR; |
| 8572 |
|
} |
| 8573 |
|
}else{ |
| 8574 |
|
*itemids = new itemid_t[ 0 ]; |
| 8575 |
|
*itemidsLen = 0; |
| 8576 |
|
ret = RES_OK; |
| 8577 |
|
} |
| 8578 |
|
|
| 8579 |
|
}else{ |
| 8580 |
|
string s( "SQLFetch in getRelatedTo " ); |
| 8581 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 8582 |
|
setLastErrorString( s.c_str( ) ); |
| 8583 |
|
ret = RES_DB_QUERY_ERROR; |
| 8584 |
|
} |
| 8585 |
|
}else{ |
| 8586 |
|
string s( "SQLExecuteDirect in getRelatedTo " ); |
| 8587 |
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 8588 |
|
setLastErrorString( s.c_str( ) ); |
| 8589 |
|
ret = RES_DB_QUERY_ERROR; |
| 8590 |
|
} |
| 8591 |
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 8592 |
|
}else{ |
| 8593 |
|
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getRelatedTo" ); |
| 8594 |
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 8595 |
|
setLastErrorString( s.c_str( ) ); |
| 8596 |
|
ret = RES_ERROR; |
| 8597 |
|
} |
| 8598 |
|
return ret; |
| 8599 |
|
} |