| 1 |
youi |
1.1 |
/* |
| 2 |
|
|
* |
| 3 |
orrisroot |
1.83 |
* $Revision: 1.82 $ |
| 4 |
youi |
1.2 |
* $Log: commonal.cc,v $ |
| 5 |
orrisroot |
1.83 |
* Revision 1.82 2005/03/11 07:11:30 tani |
| 6 |
|
|
* itemid_t配列の長さ(*iidsLen)の初期化処理を追加. |
| 7 |
|
|
* |
| 8 |
tani |
1.82 |
* Revision 1.81 2005/03/11 00:34:57 tani |
| 9 |
|
|
* アイテムのアクセス権チェックにcertify_state追加. |
| 10 |
|
|
* |
| 11 |
tani |
1.81 |
* Revision 1.80 2005/03/09 07:27:37 aga4096 |
| 12 |
|
|
* ・activate=0ならloginUserに失敗するよう修正. |
| 13 |
|
|
* |
| 14 |
aga4096 |
1.80 |
* Revision 1.79 2005/03/07 01:20:09 aga4096 |
| 15 |
|
|
* ・getItemCountGroupByIndexで未承認アイテム・インデックスを数えないよう修正. |
| 16 |
|
|
* |
| 17 |
aga4096 |
1.79 |
* Revision 1.78 2005/03/05 02:28:05 aga4096 |
| 18 |
|
|
* ・個人領域のインデックスが Private と表示されるよう修正. |
| 19 |
|
|
* |
| 20 |
aga4096 |
1.78 |
* Revision 1.77 2005/03/05 01:48:35 aga4096 |
| 21 |
|
|
* ・getItemCountGroupByIndexを作成. |
| 22 |
|
|
* |
| 23 |
aga4096 |
1.77 |
* Revision 1.76 2005/03/04 06:13:28 aga4096 |
| 24 |
|
|
* ・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした. |
| 25 |
|
|
* |
| 26 |
aga4096 |
1.76 |
* Revision 1.75 2005/03/03 10:13:00 aga4096 |
| 27 |
|
|
* ・isValidSessionでtimestampを更新するよう修正. |
| 28 |
|
|
* ・sessionはisValidSessionしない限り1時間でタイムアウトするよう修正. |
| 29 |
|
|
* ・loginUser, createSessionでタイムアウトしたsessionを削除するよう修正. |
| 30 |
|
|
* |
| 31 |
aga4096 |
1.75 |
* Revision 1.74 2005/02/26 05:11:31 tani |
| 32 |
|
|
* getGroupItemID追加. |
| 33 |
|
|
* |
| 34 |
tani |
1.74 |
* Revision 1.73 2005/02/25 07:41:35 tani |
| 35 |
|
|
* getGroupItemID追加. |
| 36 |
|
|
* item, indexのlimitフィールドを登録,更新処理に追加. |
| 37 |
|
|
* |
| 38 |
tani |
1.73 |
* Revision 1.72 2005/02/25 01:03:42 tani |
| 39 |
|
|
* dbtype==DBTYPE_SQLITEの時の処理を分岐. |
| 40 |
|
|
* |
| 41 |
tani |
1.72 |
* Revision 1.71 2005/02/24 11:32:55 aga4096 |
| 42 |
|
|
* ・updateGroupでグループインデックスの名前を変更するよう修正. |
| 43 |
|
|
* |
| 44 |
aga4096 |
1.71 |
* Revision 1.70 2005/02/23 06:39:28 tani |
| 45 |
|
|
* isGuestEnabled: 設定を読み込むテーブルを変更. |
| 46 |
|
|
* |
| 47 |
tani |
1.70 |
* Revision 1.69 2005/02/22 02:39:30 tani |
| 48 |
|
|
* public_item_target_user_all関数を追加. |
| 49 |
|
|
* SQL中のpublic_item_target_user_allの比較式をpublic_item_target_user_all関数に置換. |
| 50 |
|
|
* sessionテーブルのLEFT JOINの条件にsidのチェックを追加. |
| 51 |
|
|
* DB問合せ処理の高速化. |
| 52 |
|
|
* |
| 53 |
tani |
1.69 |
* Revision 1.68 2005/02/21 05:46:18 tani |
| 54 |
|
|
* getItemCountを追加. |
| 55 |
|
|
* dumpItemID, getItemsの問合せを高速化. |
| 56 |
|
|
* |
| 57 |
tani |
1.68 |
* Revision 1.67 2005/02/19 02:06:11 tani |
| 58 |
|
|
* 承認状態の権限チェックに作成者を追加. |
| 59 |
|
|
* |
| 60 |
tani |
1.67 |
* Revision 1.66 2005/02/16 10:03:13 youi |
| 61 |
|
|
* publication_year/month/mdayに対応. |
| 62 |
|
|
* |
| 63 |
youi |
1.66 |
* Revision 1.65 2005/02/16 07:37:17 youi |
| 64 |
|
|
* insertItem, updateItem, getItems: publication_dateに対応. |
| 65 |
|
|
* |
| 66 |
youi |
1.65 |
* Revision 1.64 2005/02/15 02:35:47 youi |
| 67 |
|
|
* SQLINTEGERからSQLLENへ型変更. |
| 68 |
|
|
* |
| 69 |
youi |
1.64 |
* Revision 1.63 2005/02/10 02:33:16 aga |
| 70 |
|
|
* ・zipCreateをコメントアウトしていたのを戻した. |
| 71 |
|
|
* |
| 72 |
aga |
1.63 |
* Revision 1.62 2005/02/09 11:11:52 youi |
| 73 |
|
|
* deleteItemにアイテムに関係するエントリの削除処理を追加. |
| 74 |
|
|
* |
| 75 |
youi |
1.62 |
* Revision 1.61 2005/02/09 07:23:50 aga |
| 76 |
|
|
* ・URL to My Personal Archive をDB・ALから消した. |
| 77 |
|
|
* |
| 78 |
aga |
1.61 |
* Revision 1.60 2005/02/09 02:14:15 aga |
| 79 |
|
|
* ・initializeDB()にdbtype引数を追加(SQLite用). |
| 80 |
|
|
* |
| 81 |
aga |
1.60 |
* Revision 1.59 2005/02/08 07:15:02 youi |
| 82 |
|
|
* pubmedパース処理: |
| 83 |
|
|
* |
| 84 |
youi |
1.59 |
* Revision 1.58 2005/02/08 06:40:51 youi |
| 85 |
|
|
* pubmedComplete:ジャーナルの完全なタイトルを取得してpubmed_tにセット. |
| 86 |
|
|
* |
| 87 |
youi |
1.58 |
* Revision 1.57 2005/02/03 12:04:58 youi |
| 88 |
|
|
* getOwnPublicItemIDを定義. |
| 89 |
|
|
* binder_item_linkのテーブル名を修正. |
| 90 |
|
|
* |
| 91 |
youi |
1.57 |
* Revision 1.56 2005/01/29 09:49:22 youi |
| 92 |
|
|
* syslog_printf: デバッグメッセージ出力関数を定義した. |
| 93 |
|
|
* getCertifyPermission: チェック用のsqlを定義した. |
| 94 |
|
|
* SQLINTEGER->SQLLENへ型を変更した. |
| 95 |
|
|
* getItemPermission: モデレータであるか?の判断条件を修正. |
| 96 |
|
|
* |
| 97 |
youi |
1.56 |
* Revision 1.55 2005/01/28 07:01:38 youi |
| 98 |
|
|
* getItemIDByIndexID: 対象となるアイテムの条件見直し. |
| 99 |
|
|
* SQLAllocHandle失敗時のメッセージを追加. |
| 100 |
|
|
* |
| 101 |
youi |
1.55 |
* Revision 1.54 2005/01/28 00:36:58 aga |
| 102 |
|
|
* ・freeStringで落ちることがあるのを修正. |
| 103 |
|
|
* |
| 104 |
aga |
1.54 |
* Revision 1.53 2005/01/27 08:30:35 youi |
| 105 |
|
|
* getIndexIDByItemIDを定義した. |
| 106 |
|
|
* |
| 107 |
youi |
1.53 |
* Revision 1.52 2005/01/25 06:46:50 aga |
| 108 |
|
|
* ・Bindersを含むindexはdeleteIndex不可. |
| 109 |
|
|
* ・getItemsがエラーを出すことがあるのを修正. |
| 110 |
|
|
* |
| 111 |
aga |
1.52 |
* Revision 1.51 2005/01/24 10:50:29 youi |
| 112 |
|
|
* freeItemType,getItemTypes関数を追加した. |
| 113 |
|
|
* |
| 114 |
youi |
1.51 |
* Revision 1.50 2005/01/24 01:54:38 youi |
| 115 |
|
|
* 引数の型修飾を変更. |
| 116 |
|
|
* dumpItemID, getItemIDByBinderID, getItemIDByIndexID |
| 117 |
|
|
* 関数追加 |
| 118 |
|
|
* getPrivateItemID, getUncertifiedLink |
| 119 |
|
|
* |
| 120 |
youi |
1.50 |
* Revision 1.49 2005/01/22 09:30:58 youi |
| 121 |
|
|
* setLastErrorStringの宣言を追加した. |
| 122 |
|
|
* |
| 123 |
youi |
1.49 |
* Revision 1.48 2005/01/22 04:18:22 aga |
| 124 |
|
|
* ・loginUser, insertAccount内ではmd5()を行わないよう修正. |
| 125 |
|
|
* |
| 126 |
aga |
1.48 |
* Revision 1.47 2005/01/22 02:41:14 aga |
| 127 |
|
|
* ・amazon補完を作成. |
| 128 |
|
|
* |
| 129 |
aga |
1.47 |
* Revision 1.46 2005/01/21 01:36:11 youi |
| 130 |
|
|
* pubmed補完機能を追加した. |
| 131 |
|
|
* |
| 132 |
youi |
1.46 |
* Revision 1.45 2005/01/19 10:07:53 aga |
| 133 |
|
|
* ・ゲストユーザ向けの修正. |
| 134 |
|
|
* |
| 135 |
aga |
1.45 |
* Revision 1.44 2005/01/19 06:01:59 youi |
| 136 |
|
|
* 関数追加 |
| 137 |
|
|
* getConfigValue |
| 138 |
|
|
* setConfigValue |
| 139 |
|
|
* getChangeLogs |
| 140 |
|
|
* insertChangeLog |
| 141 |
|
|
* getItemIDByBinderID |
| 142 |
|
|
* registerBinderItem |
| 143 |
|
|
* unregisterBinderItem |
| 144 |
|
|
* getIndexPermission |
| 145 |
|
|
* freeString |
| 146 |
|
|
* freeChangeLog |
| 147 |
|
|
* 引数にcriteria_tを追加 |
| 148 |
|
|
* getItemIDByIndexID |
| 149 |
|
|
* 引数の順序を変更 |
| 150 |
|
|
* getCertifyState |
| 151 |
|
|
* setCertifyState |
| 152 |
|
|
* getCertifyPermission |
| 153 |
|
|
* sessionID2UID,querySimple,queryGetUnsignedIntの利用 |
| 154 |
|
|
* insertItemの内部でPrivateIndexへ登録を行なう |
| 155 |
|
|
* getItems: getItemPermissionを使った読み込み権限チェック. |
| 156 |
|
|
* |
| 157 |
youi |
1.44 |
* Revision 1.43 2005/01/19 01:42:15 aga |
| 158 |
|
|
* ・x_xnpaccount_indexのgid,uidが0にならないよう修正. |
| 159 |
|
|
* |
| 160 |
aga |
1.43 |
* Revision 1.42 2005/01/19 00:51:29 aga |
| 161 |
|
|
* ・insertIndexでx_xnpaccount_index.index_idがおかしいのを修正. |
| 162 |
|
|
* |
| 163 |
aga |
1.42 |
* Revision 1.41 2005/01/19 00:06:51 aga |
| 164 |
|
|
* ・updateIndexで、同じ名前の兄弟があるか名前が空であるならエラーにした. |
| 165 |
|
|
* ・createSessionで、uidがPlatformユーザでないかactivateされていないならエラーにした. |
| 166 |
|
|
* |
| 167 |
aga |
1.41 |
* Revision 1.40 2005/01/17 00:15:05 aga |
| 168 |
|
|
* ・deleteIndex, updateIndexに失敗することがあるのを修正. |
| 169 |
|
|
* |
| 170 |
aga |
1.40 |
* Revision 1.39 2005/01/15 05:38:10 youi |
| 171 |
|
|
* insertAccount: 文字列バッファのサイズ調整など. |
| 172 |
|
|
* updateAccount: 文字列バッファのサイズ調整など. |
| 173 |
|
|
* アイテム管理関数を定義した. |
| 174 |
|
|
* insertItem, getItem, getItems, dumpItemID, updateItem, deleteItemなど. |
| 175 |
|
|
* freeGID, freeUID: 引数の型を修正. |
| 176 |
|
|
* |
| 177 |
youi |
1.39 |
* Revision 1.38 2005/01/15 00:39:16 aga |
| 178 |
|
|
* ・x_xnpaccount_item_basicの構造を変更. |
| 179 |
|
|
* |
| 180 |
aga |
1.38 |
* Revision 1.37 2005/01/14 10:36:59 aga |
| 181 |
|
|
* ・index関係の処理を追加. |
| 182 |
|
|
* ・insertAccountでprivate indexを作成するよう修正. |
| 183 |
|
|
* ・insertGroupでgroup index を作成するよう修正. |
| 184 |
|
|
* |
| 185 |
aga |
1.37 |
* Revision 1.36 2005/01/13 04:19:22 aga |
| 186 |
|
|
* ・VPをXNPに変換. |
| 187 |
|
|
* |
| 188 |
aga |
1.36 |
* Revision 1.35 2005/01/06 07:20:17 youi |
| 189 |
|
|
* WIN32定義時のインクルードの追加. |
| 190 |
|
|
* MySQL APIに関するヘッダファイルを削除. |
| 191 |
|
|
* deleteAccount: 所属するPlatformグループからの削除を内蔵した. |
| 192 |
|
|
* insertAccount: ユーザ登録と同時にデフォルトPlatformグループへ登録する. |
| 193 |
|
|
* deleteMember: デフォルトPlatformグループからの削除を禁止する. |
| 194 |
|
|
* deleteMemberNoLimitの定義. |
| 195 |
|
|
* |
| 196 |
youi |
1.35 |
* Revision 1.34 2004/12/28 04:38:14 aga |
| 197 |
|
|
* ・logoutUser()の修正. |
| 198 |
|
|
* |
| 199 |
aga |
1.34 |
* Revision 1.33 2004/12/27 05:56:23 youi |
| 200 |
|
|
* odbcDiagString: STMT以外のハンドルも処理するように変更した. |
| 201 |
|
|
* syslogメッセージの処理を追加した. |
| 202 |
|
|
* |
| 203 |
youi |
1.33 |
* Revision 1.32 2004/12/25 09:46:47 youi |
| 204 |
|
|
* MySQL+MyODBCで動作するように修正した. |
| 205 |
|
|
* |
| 206 |
youi |
1.32 |
* Revision 1.31 2004/12/21 11:42:59 youi |
| 207 |
|
|
* コメントの引数,戻り値の説明などを追加. |
| 208 |
|
|
* |
| 209 |
youi |
1.31 |
* Revision 1.30 2004/12/18 10:24:54 youi |
| 210 |
|
|
* IMPORT_MYSQLDLLを定義したとき,MYSQLのDLLを動的リンクするプロトタイプ宣言が |
| 211 |
|
|
* 有効になるように修正した. |
| 212 |
|
|
* |
| 213 |
youi |
1.30 |
* Revision 1.29 2004/12/18 01:12:29 youi |
| 214 |
|
|
* freeResultの関数名をfree<データ型>に変更した. |
| 215 |
|
|
* |
| 216 |
youi |
1.29 |
* Revision 1.28 2004/12/14 12:02:08 youi |
| 217 |
|
|
* __WIN__を定義したときはwindowsのdll作成に必要な処理を行なう. |
| 218 |
|
|
* USE_SYSLOGを定義したときはsyslogdへメッセージを出力する. |
| 219 |
|
|
* getAccounts: uidsLenが0のときの処理を追加した. |
| 220 |
|
|
* |
| 221 |
youi |
1.28 |
* Revision 1.27 2004/12/06 11:34:47 aga |
| 222 |
|
|
* ・uninitializeDB()を追加. |
| 223 |
|
|
* |
| 224 |
aga |
1.27 |
* Revision 1.26 2004/12/06 10:17:36 youi |
| 225 |
|
|
* mysql_use_resultの取得結果を残さず取り出すため, |
| 226 |
|
|
* while( row = mysql_fetch_row(result) );を挿入. |
| 227 |
|
|
* |
| 228 |
youi |
1.26 |
* Revision 1.25 2004/12/06 07:24:33 youi |
| 229 |
|
|
* insertAccount, insertGroup: |
| 230 |
|
|
* 新規追加した情報に対応するユーザID,グループIDを第三引数に書き込む. |
| 231 |
|
|
* |
| 232 |
youi |
1.25 |
* Revision 1.24 2004/12/06 01:45:50 aga |
| 233 |
|
|
* ・コメントつけ. |
| 234 |
|
|
* ・開放忘れ修正. |
| 235 |
|
|
* |
| 236 |
aga |
1.24 |
* Revision 1.23 2004/12/04 09:21:10 aga |
| 237 |
aga |
1.36 |
* ・xnp_config → xnpaccount_config. |
| 238 |
aga |
1.24 |
* |
| 239 |
aga |
1.23 |
* Revision 1.22 2004/12/03 07:17:21 youi |
| 240 |
|
|
* isModeratorでアクセスするデータベーステーブル名を修正. |
| 241 |
|
|
* |
| 242 |
youi |
1.22 |
* Revision 1.21 2004/12/01 10:28:58 youi |
| 243 |
|
|
* DBカラム名の変更に伴う修正 |
| 244 |
|
|
* institute -> division |
| 245 |
|
|
* organizaion -> company_name |
| 246 |
|
|
* |
| 247 |
aga |
1.61 |
* Revis1.20 2004/12/01 04:37:04 youi |
| 248 |
youi |
1.21 |
* freeResult: unsigned int* を int* へ修正. |
| 249 |
|
|
* コメント部に関数の説明を追記. |
| 250 |
|
|
* |
| 251 |
youi |
1.20 |
* Revision 1.19 2004/11/30 06:40:11 youi |
| 252 |
|
|
* 関数を追加(gidExists, uidExists) |
| 253 |
|
|
* getGroupCountを定義. |
| 254 |
|
|
* getGroupsByUidを定義. |
| 255 |
|
|
* isGroupAdminを修正. |
| 256 |
|
|
* dumpGroupAdminsを定義. |
| 257 |
|
|
* deleteMemberを定義. |
| 258 |
|
|
* insertMemberを定義. |
| 259 |
|
|
* getMembersを定義. |
| 260 |
|
|
* isModeratorを定義. |
| 261 |
|
|
* |
| 262 |
youi |
1.19 |
* Revision 1.18 2004/11/30 05:46:32 aga |
| 263 |
|
|
* ・sessionからremoteHostを削除. |
| 264 |
|
|
* |
| 265 |
aga |
1.18 |
* Revision 1.17 2004/11/27 09:35:49 youi |
| 266 |
|
|
* isActivatedを定義. |
| 267 |
|
|
* activateを定義. |
| 268 |
|
|
* dumpUidを定義. |
| 269 |
|
|
* |
| 270 |
youi |
1.17 |
* Revision 1.16 2004/11/27 06:29:29 youi |
| 271 |
|
|
* getAccountCountを定義. |
| 272 |
|
|
* dumpGidsを定義. |
| 273 |
|
|
* insertGroup, deleteGroup, updateGroupを定義. |
| 274 |
|
|
* getGroup, getGroupsを定義. |
| 275 |
|
|
* データベース初期前の呼出に対し,RES_DB_NOT_INITIALIZEDを返す処理を各関数に追加 |
| 276 |
|
|
* (未対応の関数が残っている) |
| 277 |
|
|
* |
| 278 |
youi |
1.16 |
* Revision 1.15 2004/11/27 02:22:22 aga |
| 279 |
|
|
* ・initializeDB前にaddSlashes()を呼ぶと落ちるのを修正. |
| 280 |
|
|
* |
| 281 |
aga |
1.15 |
* Revision 1.14 2004/11/27 01:07:31 youi |
| 282 |
|
|
* criteria2str: LIMITとORDER BYの順番を入れ替えた. |
| 283 |
|
|
* |
| 284 |
youi |
1.14 |
* Revision 1.13 2004/11/27 00:35:39 youi |
| 285 |
|
|
* getAccountsを定義. |
| 286 |
|
|
* getAccountを修正,内部でgetAccountsを呼び出す. |
| 287 |
|
|
* criteria2strを定義. |
| 288 |
|
|
* |
| 289 |
youi |
1.13 |
* Revision 1.12 2004/11/26 09:45:28 youi |
| 290 |
|
|
* getAccountを定義. |
| 291 |
|
|
* |
| 292 |
youi |
1.12 |
* Revision 1.11 2004/11/26 08:16:26 aga |
| 293 |
|
|
* ・getSession, loginUser, createSession, freeResult(const session_t*) 修正. |
| 294 |
|
|
* |
| 295 |
aga |
1.11 |
* Revision 1.10 2004/11/26 07:57:42 youi |
| 296 |
|
|
* updateAccount, deleteAccountを定義. |
| 297 |
|
|
* mysql_query失敗時はstderrへエラーコードとエラーメッセージを出力. |
| 298 |
|
|
* |
| 299 |
youi |
1.10 |
* Revision 1.9 2004/11/26 07:38:02 aga |
| 300 |
|
|
* ・FAILUE -> FAILURE. |
| 301 |
|
|
* |
| 302 |
aga |
1.9 |
* Revision 1.8 2004/11/26 06:36:55 aga |
| 303 |
|
|
* ・createSession, getSession を作成. |
| 304 |
|
|
* |
| 305 |
aga |
1.8 |
* Revision 1.7 2004/11/26 04:51:47 youi |
| 306 |
|
|
* dbprefixを定義した. |
| 307 |
|
|
* insertAccountを定義した. |
| 308 |
|
|
* isValidSessionIDを定義した. |
| 309 |
|
|
* |
| 310 |
youi |
1.7 |
* Revision 1.6 2004/11/26 04:35:55 aga |
| 311 |
|
|
* ・loginUser(), logoutUser()を作成. |
| 312 |
|
|
* |
| 313 |
aga |
1.6 |
* Revision 1.5 2004/11/26 01:08:25 aga |
| 314 |
|
|
* ・addSlashes()作成. |
| 315 |
|
|
* |
| 316 |
aga |
1.5 |
* Revision 1.4 2004/11/25 12:14:29 youi |
| 317 |
|
|
* getUidの処理を定義した. |
| 318 |
|
|
* |
| 319 |
youi |
1.4 |
* Revision 1.3 2004/11/25 11:13:59 youi |
| 320 |
|
|
* getLastErrorString/setLastErrorStringを定義. |
| 321 |
|
|
* |
| 322 |
youi |
1.3 |
* Revision 1.2 2004/11/25 08:55:19 youi |
| 323 |
|
|
* 引数の型を修正. |
| 324 |
|
|
* freeResultを追加. |
| 325 |
|
|
* |
| 326 |
youi |
1.2 |
* Revision 1.1 2004/11/25 05:14:58 youi |
| 327 |
|
|
* initial version |
| 328 |
|
|
* |
| 329 |
youi |
1.1 |
* |
| 330 |
|
|
*/ |
| 331 |
youi |
1.35 |
#ifdef WIN32 |
| 332 |
|
|
#include <windows.h> |
| 333 |
youi |
1.28 |
#endif |
| 334 |
|
|
|
| 335 |
|
|
#ifdef USE_SYSLOG |
| 336 |
|
|
#include <syslog.h> |
| 337 |
|
|
#endif |
| 338 |
|
|
|
| 339 |
youi |
1.1 |
#include <stdio.h> |
| 340 |
aga |
1.6 |
#include <stdlib.h> |
| 341 |
youi |
1.1 |
#include <string.h> |
| 342 |
youi |
1.3 |
#include <string> |
| 343 |
aga |
1.27 |
#include <assert.h> |
| 344 |
orrisroot |
1.83 |
#include <time.h> |
| 345 |
youi |
1.32 |
#include <sql.h> |
| 346 |
|
|
#include <sqlext.h> |
| 347 |
youi |
1.46 |
#include <libxml/xmlreader.h> |
| 348 |
|
|
|
| 349 |
youi |
1.7 |
using namespace std; |
| 350 |
youi |
1.1 |
|
| 351 |
|
|
#include "common.h" |
| 352 |
|
|
#include "account.h" |
| 353 |
|
|
#include "group.h" |
| 354 |
|
|
#include "session.h" |
| 355 |
youi |
1.39 |
#include "item.h" |
| 356 |
|
|
#include "itemtype.h" |
| 357 |
youi |
1.1 |
#include "criteria.h" |
| 358 |
|
|
#include "commonal.h" |
| 359 |
aga |
1.37 |
#include "item.h" |
| 360 |
|
|
#include "index.h" |
| 361 |
youi |
1.44 |
#include "changelog.h" |
| 362 |
youi |
1.46 |
#include "pubmed.h" |
| 363 |
aga |
1.47 |
#include "amazonbook.h" |
| 364 |
youi |
1.1 |
|
| 365 |
youi |
1.32 |
static string dbprefix; //!< XOOPSデータベーステーブルのPREFIX |
| 366 |
aga |
1.60 |
static dbtype_t dbtype; //!< MySQL/SQLite |
| 367 |
youi |
1.32 |
|
| 368 |
|
|
static SQLHANDLE henv = NULL; |
| 369 |
|
|
static SQLHANDLE hdbc = NULL; |
| 370 |
|
|
static SQLHANDLE hstmt = NULL; |
| 371 |
|
|
|
| 372 |
youi |
1.58 |
static bool processEsummary(xmlTextReaderPtr reader, pubmed_t* p); |
| 373 |
|
|
static bool processEsearch(xmlTextReaderPtr reader, pubmed_t* p, int* DocID ); |
| 374 |
youi |
1.46 |
static void processEfetch(xmlTextReaderPtr reader, pubmed_t* p); |
| 375 |
|
|
static int streamPubmedFile(const char *filename, pubmed_t* p); |
| 376 |
aga |
1.37 |
static result_t insertIndexInternal( sessionid_t sid, index_t *index, indexid_t *xid ); |
| 377 |
youi |
1.33 |
static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode ); |
| 378 |
youi |
1.35 |
static result_t deleteMemberNoLimit( sessionid_t sid, groupid_t gid, userid_t uid ); |
| 379 |
youi |
1.56 |
static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value ); |
| 380 |
youi |
1.49 |
static void setLastErrorString( const char* str ); |
| 381 |
aga4096 |
1.76 |
static result_t checkTitleConflict( sessionid_t sid, indexid_t parentIndexID, const char *title, bool *conflict ); |
| 382 |
youi |
1.32 |
|
| 383 |
youi |
1.56 |
void syslog_printf( char* format, ... ) |
| 384 |
|
|
{ |
| 385 |
|
|
#ifdef USE_SYSLOG |
| 386 |
|
|
va_list ap; |
| 387 |
|
|
va_start(ap, format); |
| 388 |
|
|
openlog( "commonal", LOG_ODELAY, LOG_USER ); |
| 389 |
|
|
vsyslog( LOG_DEBUG, format, ap ); |
| 390 |
tani |
1.72 |
#endif |
| 391 |
youi |
1.56 |
} |
| 392 |
|
|
|
| 393 |
tani |
1.69 |
/** |
| 394 |
|
|
* |
| 395 |
|
|
* public_item_target_userの設定値が'all'ならtrueをかえす |
| 396 |
|
|
* 設定値の取得に失敗した場合,'all'以外の場合はfalseをかえす |
| 397 |
|
|
* |
| 398 |
|
|
*/ |
| 399 |
|
|
static bool public_item_target_user_all( ) |
| 400 |
|
|
{ |
| 401 |
|
|
char* value = 0; |
| 402 |
|
|
bool public_item_target_user_all = false; |
| 403 |
|
|
if( getConfigValue( XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY, &value ) == RES_OK ){ |
| 404 |
|
|
public_item_target_user_all = ( strcmp( value, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL ) == 0 ); |
| 405 |
|
|
freeString( value ); |
| 406 |
|
|
} |
| 407 |
|
|
return public_item_target_user_all; |
| 408 |
|
|
} |
| 409 |
|
|
|
| 410 |
youi |
1.56 |
static result_t countResultRows( const char* sql, SQLLEN* count ) |
| 411 |
youi |
1.32 |
{ |
| 412 |
|
|
result_t ret = RES_ERROR; |
| 413 |
|
|
SQLRETURN sqlcode; |
| 414 |
|
|
SQLHANDLE hstmt = NULL; |
| 415 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 416 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql, strlen( sql ) ) ) == SQL_SUCCESS ){ |
| 417 |
|
|
*count = 0; |
| 418 |
|
|
while( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ) ( *count )++; |
| 419 |
|
|
ret = RES_OK; |
| 420 |
|
|
}else{ |
| 421 |
|
|
string s( "SQLExecDirect in countResultRows " ); |
| 422 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 423 |
youi |
1.32 |
s += "sql="; |
| 424 |
|
|
s += string( sql ); |
| 425 |
|
|
setLastErrorString( s.c_str( ) ); |
| 426 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 427 |
|
|
} |
| 428 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 429 |
|
|
} |
| 430 |
|
|
return ret; |
| 431 |
|
|
} |
| 432 |
|
|
|
| 433 |
youi |
1.44 |
|
| 434 |
youi |
1.39 |
/** |
| 435 |
|
|
* |
| 436 |
youi |
1.44 |
* インデックス登録,アイテム更新を行なったときの承認状態の初期値を, |
| 437 |
|
|
* システム設定にしたがって返します. |
| 438 |
|
|
* |
| 439 |
youi |
1.39 |
*/ |
| 440 |
youi |
1.44 |
static certify_t getInitialCertifyStateFromConfig( ) |
| 441 |
youi |
1.39 |
{ |
| 442 |
youi |
1.44 |
char* certify_item_val; |
| 443 |
|
|
certify_t ret = index::NOT_CERTIFIED; |
| 444 |
|
|
|
| 445 |
|
|
if( getConfigValue( XNP_CONFIG_CERTIFY_ITEM_KEY, &certify_item_val ) == RES_OK ){ |
| 446 |
|
|
if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_AUTO ) == 0 ){ |
| 447 |
|
|
//certify automatic |
| 448 |
|
|
ret = index::CERTIFIED; |
| 449 |
|
|
}else if( strcmp( certify_item_val, XNP_CONFIG_CERTIFY_ITEM_ON ) == 0 ){ |
| 450 |
|
|
//certify by moderator or group admin |
| 451 |
|
|
ret = index::CERTIFY_REQUIRED; |
| 452 |
|
|
} |
| 453 |
tani |
1.72 |
syslog_printf( "\ngetInitialCertifyStateFromConfig certify_item_val=%s", certify_item_val ); |
| 454 |
youi |
1.44 |
freeString( certify_item_val ); |
| 455 |
youi |
1.39 |
} |
| 456 |
youi |
1.44 |
return ret; |
| 457 |
youi |
1.39 |
} |
| 458 |
|
|
|
| 459 |
|
|
/** |
| 460 |
|
|
* |
| 461 |
|
|
* セッションに対応付けられたユーザが,PlatformユーザとしてActivateさ |
| 462 |
|
|
* れているかを返す |
| 463 |
|
|
* |
| 464 |
|
|
* @param sid セッションID |
| 465 |
|
|
* @return true Activateされている |
| 466 |
|
|
* @return false Activateされている,またはエラー |
| 467 |
|
|
* |
| 468 |
|
|
*/ |
| 469 |
|
|
static bool isActivatedBySession( sessionid_t sid ) |
| 470 |
|
|
{ |
| 471 |
|
|
const session_t* session; |
| 472 |
|
|
if( getSession( sid, &session ) == RES_OK ){ |
| 473 |
|
|
userid_t sess_uid = session -> getUID( ); |
| 474 |
|
|
freeSession( session ); |
| 475 |
|
|
return isActivated( sid, sess_uid ); |
| 476 |
|
|
} |
| 477 |
|
|
return false; |
| 478 |
|
|
} |
| 479 |
|
|
|
| 480 |
|
|
/** |
| 481 |
|
|
* |
| 482 |
|
|
* セッションに対応付けられたユーザが,モデレータであるか? |
| 483 |
|
|
* |
| 484 |
|
|
* |
| 485 |
|
|
* @param sid セッションID |
| 486 |
|
|
* @return true モデレータ |
| 487 |
|
|
* @return false モデレータでない,またはエラー |
| 488 |
|
|
* |
| 489 |
|
|
*/ |
| 490 |
|
|
static bool isModeratorBySession( sessionid_t sid ) |
| 491 |
|
|
{ |
| 492 |
|
|
const session_t* session; |
| 493 |
|
|
if( getSession( sid, &session ) == RES_OK ){ |
| 494 |
|
|
userid_t sess_uid = session -> getUID( ); |
| 495 |
|
|
freeSession( session ); |
| 496 |
|
|
return isModerator( sid, sess_uid ); |
| 497 |
|
|
} |
| 498 |
|
|
return false; |
| 499 |
|
|
} |
| 500 |
|
|
|
| 501 |
aga |
1.45 |
|
| 502 |
|
|
|
| 503 |
|
|
|
| 504 |
aga |
1.37 |
/** SQLを実行する。結果は捨てる。 |
| 505 |
|
|
* @param sql sql |
| 506 |
|
|
* @return result_t |
| 507 |
|
|
*/ |
| 508 |
|
|
static result_t querySimple( const char *functionName, string &sql ){ |
| 509 |
|
|
result_t ret = RES_ERROR; |
| 510 |
|
|
SQLRETURN sqlcode; |
| 511 |
|
|
SQLHANDLE hstmt = NULL; |
| 512 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 513 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){ |
| 514 |
|
|
ret = RES_OK; |
| 515 |
|
|
}else{ |
| 516 |
|
|
string s( "SQLExecDirect in querySimple " ); |
| 517 |
|
|
s += functionName; |
| 518 |
|
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 519 |
|
|
s += "sql="; |
| 520 |
|
|
s += sql; |
| 521 |
|
|
setLastErrorString( s.c_str( ) ); |
| 522 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 523 |
|
|
} |
| 524 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 525 |
|
|
} |
| 526 |
|
|
else { |
| 527 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in querySimple " ); |
| 528 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 529 |
|
|
setLastErrorString( s.c_str( ) ); |
| 530 |
aga |
1.37 |
ret = RES_ERROR; |
| 531 |
|
|
} |
| 532 |
|
|
return ret; |
| 533 |
|
|
} |
| 534 |
|
|
|
| 535 |
|
|
/** SQLを実行し、1行目の最初の整数値(NULLなら0とみなす)のみ受け取る。 |
| 536 |
|
|
* @param sql sql |
| 537 |
|
|
* @param u 整数値を受け取る変数。 |
| 538 |
|
|
* @return result_t |
| 539 |
|
|
*/ |
| 540 |
|
|
static result_t queryGetUnsignedInt( const char *functionName, string &sql, unsigned int *u ){ |
| 541 |
|
|
result_t ret = RES_ERROR; |
| 542 |
|
|
SQLRETURN sqlcode; |
| 543 |
|
|
SQLHANDLE hstmt = NULL; |
| 544 |
youi |
1.53 |
|
| 545 |
aga |
1.37 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 546 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){ |
| 547 |
|
|
SQLUINTEGER sInt = 0; |
| 548 |
youi |
1.56 |
SQLLEN len = 0; |
| 549 |
aga |
1.37 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &sInt, 0, &len ); |
| 550 |
|
|
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 551 |
|
|
if ( len == SQL_NULL_DATA ) |
| 552 |
|
|
sInt = 0; |
| 553 |
|
|
*u = sInt; |
| 554 |
|
|
ret = RES_OK; |
| 555 |
|
|
}else{ |
| 556 |
|
|
string s( "SQLFetch in queryGetUnsignedInt " ); |
| 557 |
|
|
s += functionName; |
| 558 |
youi |
1.44 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 559 |
aga |
1.37 |
setLastErrorString( s.c_str( ) ); |
| 560 |
|
|
ret = RES_ERROR; |
| 561 |
|
|
} |
| 562 |
|
|
}else{ |
| 563 |
|
|
string s( "SQLExecDirect in queryGetUnsignedInt " ); |
| 564 |
|
|
s += functionName; |
| 565 |
|
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 566 |
|
|
s += "sql="; |
| 567 |
|
|
s += sql; |
| 568 |
|
|
setLastErrorString( s.c_str( ) ); |
| 569 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 570 |
|
|
} |
| 571 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 572 |
|
|
} |
| 573 |
|
|
else { |
| 574 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in queryGetUnsignedInt " ); |
| 575 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 576 |
|
|
setLastErrorString( s.c_str( ) ); |
| 577 |
aga |
1.37 |
ret = RES_ERROR; |
| 578 |
|
|
} |
| 579 |
|
|
return ret; |
| 580 |
|
|
} |
| 581 |
|
|
|
| 582 |
youi |
1.32 |
/** |
| 583 |
|
|
* |
| 584 |
|
|
* 文字列コピー. |
| 585 |
|
|
* 指定文字数をコピーし,バッファの最後をNULL終端する. |
| 586 |
|
|
* ( dstのサイズ >= len + 1 )であること |
| 587 |
|
|
* |
| 588 |
|
|
*/ |
| 589 |
|
|
static char* strncpy2( char* dst, const char* src, int len ) |
| 590 |
|
|
{ |
| 591 |
|
|
strncpy( dst, src, len ); |
| 592 |
|
|
dst[ len ] = '\0'; |
| 593 |
youi |
1.56 |
syslog_printf( "\nstrncpy2 '%s'\n", dst ); |
| 594 |
youi |
1.32 |
return dst; |
| 595 |
|
|
} |
| 596 |
|
|
|
| 597 |
|
|
/** |
| 598 |
|
|
* |
| 599 |
|
|
* SQLの実行結果からエラー文字列を生成する |
| 600 |
|
|
* |
| 601 |
|
|
* @param hstmt SQL文のハンドル |
| 602 |
|
|
* @param sqlcode SQLExecDirect,SQLExecuteの戻り値 |
| 603 |
|
|
* @return エラー文字列 |
| 604 |
|
|
*/ |
| 605 |
youi |
1.33 |
static string odbcDiagString( SQLSMALLINT HandleType, SQLHANDLE hstmt, SQLRETURN sqlcode ) |
| 606 |
youi |
1.32 |
{ |
| 607 |
|
|
string s; |
| 608 |
|
|
if( sqlcode == SQL_ERROR || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 609 |
|
|
SQLCHAR SQLState[6]; |
| 610 |
|
|
SQLINTEGER NativeError; |
| 611 |
|
|
SQLCHAR MessageText[ 1024 ]; |
| 612 |
|
|
SQLSMALLINT TextLength; |
| 613 |
youi |
1.33 |
SQLGetDiagRec( HandleType, hstmt, 1, SQLState, &NativeError, MessageText, 1024, &TextLength ); |
| 614 |
youi |
1.32 |
|
| 615 |
|
|
s += string( (char*)MessageText ); |
| 616 |
|
|
s += " SQLSTATE="; |
| 617 |
|
|
s += string( (char*)SQLState ); |
| 618 |
|
|
|
| 619 |
|
|
} |
| 620 |
|
|
s += " sqlcode="; |
| 621 |
|
|
s += intToString( sqlcode ); |
| 622 |
|
|
return s; |
| 623 |
|
|
} |
| 624 |
|
|
|
| 625 |
|
|
/** |
| 626 |
|
|
* |
| 627 |
|
|
* 指定カラムの値を取り出してその文字列を返す |
| 628 |
|
|
* |
| 629 |
|
|
*/ |
| 630 |
|
|
string getResultCol( SQLHANDLE hstmt, int col ) |
| 631 |
|
|
{ |
| 632 |
|
|
string s; |
| 633 |
youi |
1.64 |
SQLRETURN sqlcode; |
| 634 |
|
|
SQLCHAR BinaryPtr[5000]; |
| 635 |
|
|
SQLLEN BinaryLenOrInd; |
| 636 |
|
|
SQLINTEGER NumBytes; |
| 637 |
youi |
1.32 |
|
| 638 |
tani |
1.72 |
syslog_printf( "getResultCol" ); |
| 639 |
youi |
1.32 |
while ( ( sqlcode = SQLGetData(hstmt, col, SQL_C_CHAR, BinaryPtr, sizeof(BinaryPtr), |
| 640 |
|
|
&BinaryLenOrInd)) != SQL_NO_DATA) { |
| 641 |
tani |
1.72 |
syslog_printf( "SQLGetData BinaryLenOrInd=%d", BinaryLenOrInd ); |
| 642 |
youi |
1.32 |
NumBytes = (BinaryLenOrInd > 5000) || (BinaryLenOrInd == SQL_NO_TOTAL) ? 5000 : BinaryLenOrInd; |
| 643 |
tani |
1.72 |
if( NumBytes <= 0 ) break; |
| 644 |
|
|
else if( NumBytes > 0 ){ |
| 645 |
youi |
1.33 |
s += string( (char*)BinaryPtr, NumBytes ); |
| 646 |
|
|
} |
| 647 |
youi |
1.32 |
} |
| 648 |
tani |
1.72 |
syslog_printf( "getResultCol returns %s", s.c_str() ); |
| 649 |
youi |
1.32 |
return s; |
| 650 |
|
|
} |
| 651 |
youi |
1.7 |
|
| 652 |
aga |
1.5 |
|
| 653 |
|
|
/** |
| 654 |
|
|
* |
| 655 |
youi |
1.32 |
* クォートなどを\記号でエスケープする |
| 656 |
aga |
1.5 |
* |
| 657 |
youi |
1.32 |
* @param str addslashesすべき文字列。NULL指定不可。 |
| 658 |
|
|
* @return 変換後の文字列 |
| 659 |
aga |
1.5 |
*/ |
| 660 |
|
|
string addSlashes( const char *str ) |
| 661 |
|
|
{ |
| 662 |
youi |
1.32 |
if ( hdbc == NULL ){ |
| 663 |
aga |
1.15 |
string s; |
| 664 |
|
|
return s; |
| 665 |
youi |
1.32 |
}else{ |
| 666 |
|
|
string s( str ); |
| 667 |
|
|
return s; |
| 668 |
|
|
} |
| 669 |
|
|
|
| 670 |
|
|
int len = strlen(str) * 3; |
| 671 |
|
|
char* dst = new char[ len ]; |
| 672 |
|
|
const char* from = str; |
| 673 |
|
|
char* to = dst; |
| 674 |
|
|
while( *from != '\0' ){ |
| 675 |
|
|
switch( *from ){ |
| 676 |
|
|
case '\'': |
| 677 |
|
|
case '\"': |
| 678 |
|
|
case ';': |
| 679 |
|
|
*to = '\\'; to++; |
| 680 |
|
|
break; |
| 681 |
|
|
} |
| 682 |
|
|
*to = *from; to++; |
| 683 |
|
|
from++; |
| 684 |
|
|
} |
| 685 |
|
|
*to = '\0'; |
| 686 |
|
|
string s( dst ); |
| 687 |
|
|
delete[] dst; |
| 688 |
aga |
1.5 |
return s; |
| 689 |
|
|
} |
| 690 |
|
|
|
| 691 |
aga |
1.45 |
/** Xoops Module の設定を調べる |
| 692 |
|
|
* @param module モジュールのdirname |
| 693 |
|
|
* @param key 設定のkey |
| 694 |
|
|
* @param value 設定を返す変数。 |
| 695 |
|
|
* @return |
| 696 |
|
|
*/ |
| 697 |
|
|
static result_t getXoopsModuleConfigValue( const char *module, const char *key, char **value ){ |
| 698 |
|
|
SQLRETURN sqlcode; |
| 699 |
|
|
SQLHANDLE hstmt = NULL; |
| 700 |
|
|
result_t result = RES_ERROR; |
| 701 |
|
|
|
| 702 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 703 |
|
|
string sql = "SELECT conf_value " |
| 704 |
|
|
" from " + dbprefix + "_config as tc, " + dbprefix + "_modules as tm " |
| 705 |
|
|
" where tm.mid=tc.conf_modid and tm.dirname = ? and tc.conf_name = ? "; |
| 706 |
|
|
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 707 |
youi |
1.56 |
SQLLEN cbModule = SQL_NTS, cbKey = SQL_NTS; |
| 708 |
aga |
1.45 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(module), 0, (SQLCHAR *)module, 0, &cbModule ); |
| 709 |
|
|
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, strlen(key), 0, (SQLCHAR *)key, 0, &cbKey ); |
| 710 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), strlen( sql.c_str() ) ) ) == SQL_SUCCESS ){ |
| 711 |
|
|
if ( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 712 |
|
|
string s = getResultCol( hstmt, 1 ); |
| 713 |
|
|
*value = new char[s.length()+1]; |
| 714 |
|
|
strcpy( *value, s.c_str() ); |
| 715 |
|
|
result = RES_OK; |
| 716 |
|
|
} |
| 717 |
|
|
else if ( sqlcode == SQL_NO_DATA ){ |
| 718 |
aga |
1.54 |
*value = 0; |
| 719 |
aga |
1.45 |
result = RES_OK; |
| 720 |
|
|
} |
| 721 |
|
|
else { |
| 722 |
|
|
string s( "SQLFetch in getXoopsModuleConfig " ); |
| 723 |
|
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 724 |
|
|
s += "sql="; |
| 725 |
|
|
s += sql; |
| 726 |
|
|
setLastErrorString( s.c_str( ) ); |
| 727 |
|
|
result = RES_ERROR; |
| 728 |
|
|
} |
| 729 |
|
|
}else{ |
| 730 |
|
|
string s( "SQLExecDirect in getXoopsModuleConfig " ); |
| 731 |
|
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 732 |
|
|
s += "sql="; |
| 733 |
|
|
s += sql; |
| 734 |
|
|
setLastErrorString( s.c_str( ) ); |
| 735 |
|
|
result = RES_DB_QUERY_ERROR; |
| 736 |
|
|
} |
| 737 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 738 |
|
|
} |
| 739 |
|
|
else { |
| 740 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getXoopsModuleConfig " ); |
| 741 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 742 |
|
|
setLastErrorString( s.c_str( ) ); |
| 743 |
aga |
1.45 |
result = RES_ERROR; |
| 744 |
|
|
} |
| 745 |
|
|
return result; |
| 746 |
|
|
} |
| 747 |
|
|
|
| 748 |
|
|
/** ゲストユーザがXooNiPsのPublicなアイテムを見ることができるかどうかを返す。 |
| 749 |
|
|
*/ |
| 750 |
|
|
static bool isGuestEnabled(){ |
| 751 |
|
|
char *value = 0; |
| 752 |
tani |
1.70 |
result_t result = getConfigValue( XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_KEY, &value ); |
| 753 |
aga |
1.45 |
if ( result != RES_OK ) |
| 754 |
|
|
return false; |
| 755 |
|
|
if ( value == 0 ) |
| 756 |
|
|
return false; |
| 757 |
tani |
1.70 |
bool enabled = ( strcmp( value, XNP_CONFIG_PUBLIC_ITEM_TARGET_USER_ALL ) == 0 ); |
| 758 |
aga |
1.45 |
freeString( value ); |
| 759 |
|
|
return enabled; |
| 760 |
|
|
} |
| 761 |
|
|
|
| 762 |
|
|
/** sidからuidを得る。 |
| 763 |
|
|
* @param sid session id |
| 764 |
|
|
* @param uid uidを受け取る変数 |
| 765 |
|
|
* @return RES_OK |
| 766 |
|
|
* sidは有効なsessionidである。この場合*uidには有効なuidが入る。 |
| 767 |
|
|
* あるいは、公開アイテムを非XooNiPsユーザに公開 かつsidがsession::SID_GUEST(=0)である。この場合、*uidにはaccount::UID_GUEST(=0)が入る。 |
| 768 |
|
|
* @return その他 エラー |
| 769 |
|
|
*/ |
| 770 |
|
|
static result_t sessionID2UID( sessionid_t sid, userid_t *uid ){ |
| 771 |
|
|
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 772 |
|
|
|
| 773 |
|
|
if ( sid == session::SID_GUEST ){ |
| 774 |
|
|
if ( isGuestEnabled() ){ |
| 775 |
|
|
*uid = account::UID_GUEST; |
| 776 |
|
|
return RES_OK; |
| 777 |
|
|
} |
| 778 |
|
|
return RES_NO_SUCH_SESSION; |
| 779 |
|
|
} |
| 780 |
|
|
else { |
| 781 |
|
|
string sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_session WHERE sid=" + unsignedIntToString(sid); |
| 782 |
tani |
1.72 |
syslog_printf( "sql=%s", sql.c_str() ); |
| 783 |
aga |
1.45 |
return queryGetUnsignedInt( "sessionID2UID", sql, uid ); |
| 784 |
|
|
} |
| 785 |
|
|
} |
| 786 |
|
|
|
| 787 |
|
|
|
| 788 |
|
|
|
| 789 |
youi |
1.13 |
/** |
| 790 |
|
|
* |
| 791 |
youi |
1.19 |
* gidの存在をチェック. |
| 792 |
|
|
* DBのアクセス失敗などもfalseとなる. |
| 793 |
|
|
* |
| 794 |
|
|
* @param gid チェックしたいGID |
| 795 |
|
|
* @return true 存在する |
| 796 |
|
|
* @return false 存在しない |
| 797 |
|
|
* |
| 798 |
|
|
*/ |
| 799 |
|
|
static bool gidExists( groupid_t gid ) |
| 800 |
|
|
{ |
| 801 |
|
|
string sql; |
| 802 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 803 |
|
|
SQLHANDLE hstmt = NULL; |
| 804 |
youi |
1.19 |
|
| 805 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) != SQL_SUCCESS ) { |
| 806 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in gidExists" ); |
| 807 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 808 |
|
|
setLastErrorString( s.c_str( ) ); |
| 809 |
youi |
1.32 |
return false; |
| 810 |
|
|
} |
| 811 |
|
|
|
| 812 |
aga |
1.36 |
sql = "SELECT * FROM " + dbprefix + "_xnpaccount_groups "; |
| 813 |
youi |
1.19 |
sql += "WHERE gid=" + string( unsignedIntToString( gid ) ); |
| 814 |
youi |
1.32 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) != SQL_SUCCESS ){ |
| 815 |
|
|
setLastErrorString( "SQLExecDirect in gidExists" ); |
| 816 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 817 |
youi |
1.19 |
return false; |
| 818 |
|
|
} |
| 819 |
youi |
1.32 |
|
| 820 |
|
|
if( ( sqlcode = SQLFetch( hstmt ) ) != SQL_SUCCESS ){ |
| 821 |
|
|
setLastErrorString( "SQLFetch in gidExists" ); |
| 822 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 823 |
youi |
1.19 |
return false; |
| 824 |
|
|
} |
| 825 |
youi |
1.32 |
|
| 826 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 827 |
youi |
1.19 |
return true; |
| 828 |
|
|
} |
| 829 |
|
|
|
| 830 |
|
|
|
| 831 |
|
|
/** |
| 832 |
|
|
* |
| 833 |
youi |
1.20 |
* Platformユーザ情報にuidが存在するかをチェック. |
| 834 |
youi |
1.19 |
* DBのアクセス失敗などもfalseとなる. |
| 835 |
|
|
* |
| 836 |
|
|
* @param uid チェックしたいUID |
| 837 |
|
|
* @return true 存在する |
| 838 |
|
|
* @return false 存在しない |
| 839 |
|
|
* |
| 840 |
|
|
*/ |
| 841 |
|
|
static bool uidExists( userid_t uid ) |
| 842 |
|
|
{ |
| 843 |
youi |
1.32 |
bool ret = false; |
| 844 |
youi |
1.19 |
string sql; |
| 845 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 846 |
youi |
1.19 |
|
| 847 |
aga |
1.36 |
sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users "; |
| 848 |
youi |
1.19 |
sql += "WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 849 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 850 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 851 |
|
|
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 852 |
|
|
ret = true; |
| 853 |
|
|
}else{ |
| 854 |
|
|
string s( "SQLFetch in uidExists "); |
| 855 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 856 |
youi |
1.32 |
s += string( ", sql=" ) + string( sql ); |
| 857 |
|
|
setLastErrorString( s.c_str( ) ); |
| 858 |
|
|
ret = false; |
| 859 |
|
|
} |
| 860 |
|
|
}else{ |
| 861 |
|
|
string s( "SQLExecDirect in uidExists "); |
| 862 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 863 |
youi |
1.32 |
s += string( ", sql=" ) + string( sql ); |
| 864 |
|
|
setLastErrorString( s.c_str( ) ); |
| 865 |
|
|
ret = false; |
| 866 |
|
|
} |
| 867 |
|
|
}else{ |
| 868 |
|
|
string s( "SQLAllocHandle in uidExists "); |
| 869 |
youi |
1.35 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 870 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 871 |
|
|
ret = false; |
| 872 |
youi |
1.19 |
} |
| 873 |
youi |
1.32 |
return ret; |
| 874 |
youi |
1.19 |
} |
| 875 |
|
|
|
| 876 |
|
|
|
| 877 |
|
|
/** |
| 878 |
|
|
* |
| 879 |
youi |
1.13 |
* criteria を SQLに変換する |
| 880 |
|
|
* |
| 881 |
|
|
* |
| 882 |
|
|
* |
| 883 |
|
|
*/ |
| 884 |
|
|
string criteria2str( criteria* cri ) |
| 885 |
|
|
{ |
| 886 |
|
|
string sql; |
| 887 |
|
|
|
| 888 |
|
|
const orderby* odrby = cri -> headOrderBy( ); |
| 889 |
|
|
if( odrby != 0 ){ |
| 890 |
|
|
sql += " ORDER BY " + string( odrby -> getColumn( ) ); |
| 891 |
|
|
sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " "; |
| 892 |
|
|
while( ( odrby = cri -> nextOrderBy( ) ) != 0 ){ |
| 893 |
|
|
sql += ", " + string( odrby -> getColumn( ) ); |
| 894 |
|
|
sql += ( odrby -> getOrder( ) == orderby::DESC ) ? " DESC" : " "; |
| 895 |
|
|
} |
| 896 |
youi |
1.14 |
} |
| 897 |
|
|
|
| 898 |
|
|
if( cri -> getLimitStart( ) != 0 || cri -> getLimitRows( ) != 0 ){ |
| 899 |
|
|
sql += " LIMIT " + string( intToString( cri -> getLimitStart( ) ) ) |
| 900 |
|
|
+ ", " + string( intToString( cri -> getLimitRows( ) ) ); |
| 901 |
youi |
1.13 |
} |
| 902 |
|
|
return sql; |
| 903 |
|
|
} |
| 904 |
youi |
1.1 |
|
| 905 |
youi |
1.32 |
|
| 906 |
youi |
1.1 |
/** |
| 907 |
|
|
* |
| 908 |
|
|
* データベースの初期化 |
| 909 |
|
|
* |
| 910 |
youi |
1.32 |
* @param dsn DSN |
| 911 |
youi |
1.1 |
* @param user データベースにアクセスするユーザ名 |
| 912 |
|
|
* @param password 上記ユーザのパスワード |
| 913 |
youi |
1.32 |
* @param dbname ダミー |
| 914 |
youi |
1.1 |
* @param prefix XOOPSデータベーステーブルのPREFIX |
| 915 |
aga |
1.60 |
* @param dbtype DBTYPE_MYSQL or DBTYPE_SQLITE |
| 916 |
youi |
1.31 |
* @return RES_OK |
| 917 |
|
|
* @return RES_DB_INITIALIZE_ERROR |
| 918 |
|
|
* @return RES_DB_CONNECT_ERROR |
| 919 |
youi |
1.1 |
* @refer result_t |
| 920 |
|
|
*/ |
| 921 |
aga |
1.60 |
result_t initializeDB( const char* dsn, const char* user, const char* password, const char* dbname, const char* prefix, dbtype_t type ) |
| 922 |
youi |
1.1 |
{ |
| 923 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 924 |
|
|
|
| 925 |
youi |
1.1 |
// 既に接続中なら、一旦切断 |
| 926 |
youi |
1.32 |
if ( hdbc != NULL ) |
| 927 |
|
|
SQLDisconnect( hdbc ); |
| 928 |
youi |
1.1 |
|
| 929 |
youi |
1.7 |
dbprefix = prefix; |
| 930 |
aga |
1.60 |
dbtype = type; |
| 931 |
youi |
1.7 |
|
| 932 |
youi |
1.32 |
// 初期化と接続 |
| 933 |
|
|
// if( SQLAllocEnv( &henv ) != SQL_SUCCESS ) { |
| 934 |
youi |
1.56 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ) != SQL_SUCCESS ) { |
| 935 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_ENV,...) in initializeDB" ); |
| 936 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 937 |
|
|
setLastErrorString( s.c_str( ) ); |
| 938 |
tani |
1.72 |
syslog_printf( "initializeDB %s", getLastErrorString( ) ); |
| 939 |
youi |
1.32 |
return RES_DB_INITIALIZE_ERROR; |
| 940 |
|
|
} |
| 941 |
|
|
//ODBC Ver.3 として振舞うように属性を設定 |
| 942 |
|
|
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); |
| 943 |
aga |
1.27 |
|
| 944 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_DBC, henv, &hdbc ) ) != SQL_SUCCESS ) { |
| 945 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_DBC,...) in initializeDB" ); |
| 946 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 947 |
|
|
setLastErrorString( s.c_str( ) ); |
| 948 |
tani |
1.72 |
syslog_printf( "initializeDB %s", getLastErrorString( ) ); |
| 949 |
youi |
1.1 |
return RES_DB_INITIALIZE_ERROR; |
| 950 |
|
|
} |
| 951 |
youi |
1.32 |
//ログインに5秒以上要したらタイムアウトする設定 |
| 952 |
|
|
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0); |
| 953 |
youi |
1.33 |
|
| 954 |
youi |
1.32 |
if ( ( sqlcode = SQLConnect( hdbc, (SQLCHAR*)dsn, strlen( dsn ), (SQLCHAR*)user, strlen( user ), (SQLCHAR*)password, strlen( password ) ) ) != SQL_SUCCESS ){ |
| 955 |
youi |
1.33 |
string s( "SQLConnect in initializeDB " ); |
| 956 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 957 |
|
|
setLastErrorString( s.c_str( ) ); |
| 958 |
tani |
1.72 |
syslog_printf( "initializeDB %s", getLastErrorString( ) ); |
| 959 |
youi |
1.1 |
return RES_DB_CONNECT_ERROR; |
| 960 |
aga |
1.27 |
} |
| 961 |
tani |
1.72 |
syslog_printf( "initializeDB succeed" ); |
| 962 |
aga |
1.27 |
return RES_OK; |
| 963 |
|
|
} |
| 964 |
|
|
|
| 965 |
|
|
/** |
| 966 |
|
|
* |
| 967 |
|
|
* DB接続があれば、それを開放する。 |
| 968 |
|
|
* |
| 969 |
|
|
* @param なし |
| 970 |
|
|
* @return RES_OK |
| 971 |
|
|
*/ |
| 972 |
|
|
result_t uninitializeDB() |
| 973 |
|
|
{ |
| 974 |
youi |
1.32 |
if ( hdbc != NULL ){ |
| 975 |
|
|
SQLDisconnect( hdbc ); |
| 976 |
|
|
hdbc = NULL; |
| 977 |
youi |
1.1 |
} |
| 978 |
youi |
1.2 |
return RES_OK; |
| 979 |
youi |
1.1 |
} |
| 980 |
|
|
|
| 981 |
|
|
/** |
| 982 |
|
|
* |
| 983 |
|
|
* Platformユーザ承認状態取得 |
| 984 |
|
|
* |
| 985 |
youi |
1.31 |
* @param sid セッションID |
| 986 |
|
|
* @param uid 状態を取得したいユーザのUID |
| 987 |
|
|
* @return true 承認済み |
| 988 |
|
|
* @return false 未承認 |
| 989 |
youi |
1.1 |
* |
| 990 |
|
|
*/ |
| 991 |
youi |
1.2 |
bool isActivated( sessionid_t sid, userid_t uid ) |
| 992 |
youi |
1.1 |
{ |
| 993 |
youi |
1.32 |
if( hdbc == NULL ) return false; |
| 994 |
youi |
1.17 |
if( !isValidSessionID( sid ) ) return false; |
| 995 |
|
|
|
| 996 |
youi |
1.32 |
bool ret = false; |
| 997 |
youi |
1.17 |
string sql; |
| 998 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 999 |
|
|
SQLHANDLE hstmt = NULL; |
| 1000 |
youi |
1.17 |
|
| 1001 |
aga |
1.36 |
sql = "SELECT * FROM " + dbprefix + "_xnpaccount_users "; |
| 1002 |
youi |
1.17 |
sql += "WHERE activate=1 and uid=" + string( unsignedIntToString( uid ) ); |
| 1003 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1004 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1005 |
|
|
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 1006 |
|
|
ret = true; |
| 1007 |
|
|
}else{ |
| 1008 |
|
|
string s( "SQLFetch in isActivated " ); |
| 1009 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1010 |
youi |
1.32 |
s += ", sql=" + sql; |
| 1011 |
|
|
setLastErrorString( s.c_str() ); |
| 1012 |
|
|
ret = false; |
| 1013 |
|
|
} |
| 1014 |
|
|
}else{ |
| 1015 |
|
|
string s( "SQLExecDirect in isActivated " ); |
| 1016 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1017 |
youi |
1.32 |
s += ", sql=" + sql; |
| 1018 |
|
|
setLastErrorString( s.c_str() ); |
| 1019 |
|
|
ret = false; |
| 1020 |
|
|
} |
| 1021 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1022 |
|
|
}else{ |
| 1023 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in isActivated" ); |
| 1024 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1025 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1026 |
youi |
1.32 |
ret = false; |
| 1027 |
youi |
1.17 |
} |
| 1028 |
youi |
1.32 |
return ret; |
| 1029 |
youi |
1.1 |
} |
| 1030 |
|
|
|
| 1031 |
|
|
/** |
| 1032 |
|
|
* |
| 1033 |
|
|
* Platformユーザ承認状態変更 |
| 1034 |
|
|
* |
| 1035 |
youi |
1.31 |
* @param sid セッションID |
| 1036 |
|
|
* @param uid 変更したいユーザのUID |
| 1037 |
|
|
* @param activate 承認(true) / 未承認(false)の指定 |
| 1038 |
|
|
* @return RES_OK |
| 1039 |
|
|
* @return RES_DB_QUERY_ERROR |
| 1040 |
|
|
* @return RES_NO_SUCH_USER |
| 1041 |
youi |
1.1 |
*/ |
| 1042 |
youi |
1.2 |
result_t activate( sessionid_t sid, userid_t uid, bool activate ) |
| 1043 |
youi |
1.1 |
{ |
| 1044 |
youi |
1.32 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1045 |
youi |
1.17 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1046 |
|
|
|
| 1047 |
|
|
string sql; |
| 1048 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 1049 |
|
|
result_t ret = RES_ERROR; |
| 1050 |
youi |
1.17 |
|
| 1051 |
aga |
1.36 |
sql = "UPDATE " + dbprefix + "_xnpaccount_users "; |
| 1052 |
youi |
1.17 |
sql += "SET activate=" + string( activate ? "1" : "0" ); |
| 1053 |
|
|
sql += " WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 1054 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1055 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1056 |
youi |
1.64 |
SQLLEN count = 0; |
| 1057 |
youi |
1.32 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1058 |
|
|
ret = RES_OK; |
| 1059 |
|
|
}else{ |
| 1060 |
|
|
string s( "SQLRowCount in activate "); |
| 1061 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1062 |
youi |
1.32 |
s += string( ", sql=" ) + string( sql ); |
| 1063 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1064 |
|
|
ret = RES_NO_SUCH_USER; |
| 1065 |
|
|
} |
| 1066 |
|
|
}else{ |
| 1067 |
|
|
string s( "SQLExecDirect in activate " ); |
| 1068 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1069 |
youi |
1.32 |
s += ", sql="; |
| 1070 |
|
|
s += string( sql ); |
| 1071 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1072 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1073 |
|
|
} |
| 1074 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1075 |
|
|
}else{ |
| 1076 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in activate" ); |
| 1077 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1078 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1079 |
youi |
1.32 |
ret = RES_ERROR; |
| 1080 |
youi |
1.17 |
} |
| 1081 |
youi |
1.32 |
return ret; |
| 1082 |
youi |
1.1 |
} |
| 1083 |
|
|
|
| 1084 |
|
|
/** |
| 1085 |
|
|
* |
| 1086 |
youi |
1.31 |
* アカウント数を取得する. |
| 1087 |
youi |
1.1 |
* |
| 1088 |
youi |
1.31 |
* @param sid セッションID |
| 1089 |
|
|
* @return アカウント数 |
| 1090 |
youi |
1.1 |
* |
| 1091 |
|
|
*/ |
| 1092 |
youi |
1.2 |
int getAccountCount( sessionid_t sid ) |
| 1093 |
youi |
1.1 |
{ |
| 1094 |
youi |
1.32 |
if( hdbc == NULL ) return 0; |
| 1095 |
youi |
1.16 |
if( !isValidSessionID( sid ) ) return 0; |
| 1096 |
|
|
|
| 1097 |
|
|
int ret = 0; |
| 1098 |
|
|
string sql; |
| 1099 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 1100 |
|
|
SQLHANDLE hstmt = NULL; |
| 1101 |
youi |
1.16 |
|
| 1102 |
|
|
//アカウント数を求める |
| 1103 |
aga |
1.36 |
sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_users "; |
| 1104 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1105 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1106 |
|
|
SQLUINTEGER count = 0; |
| 1107 |
youi |
1.56 |
SQLLEN len = 0; |
| 1108 |
youi |
1.32 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len ); |
| 1109 |
|
|
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 1110 |
|
|
ret = count; |
| 1111 |
|
|
}else { |
| 1112 |
|
|
string s( "SQLFetch in getAccountCount sql=" ); |
| 1113 |
|
|
s += string( sql ); |
| 1114 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1115 |
|
|
ret = 0; |
| 1116 |
|
|
} |
| 1117 |
|
|
}else{ |
| 1118 |
|
|
setLastErrorString( "SQLExecDirect in getAccountCount" ); |
| 1119 |
|
|
ret = 0; |
| 1120 |
|
|
} |
| 1121 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1122 |
youi |
1.16 |
}else{ |
| 1123 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccountCount" ); |
| 1124 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1125 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1126 |
youi |
1.32 |
ret = 0; |
| 1127 |
youi |
1.16 |
} |
| 1128 |
|
|
return ret; |
| 1129 |
youi |
1.1 |
} |
| 1130 |
|
|
|
| 1131 |
|
|
/** |
| 1132 |
|
|
* |
| 1133 |
|
|
* アカウント削除 |
| 1134 |
youi |
1.35 |
* グループからの削除とユーザ情報の削除を行ないます. |
| 1135 |
youi |
1.1 |
* |
| 1136 |
|
|
* @param |
| 1137 |
youi |
1.20 |
* @return RES_OK |
| 1138 |
youi |
1.35 |
* @return RES_ERROR |
| 1139 |
youi |
1.31 |
* @return RES_DB_NOT_INITIALIZED |
| 1140 |
youi |
1.20 |
* @return RES_NO_SUCH_SESSION |
| 1141 |
|
|
* @return RES_DB_QUERY_ERROR |
| 1142 |
youi |
1.1 |
* |
| 1143 |
|
|
*/ |
| 1144 |
youi |
1.2 |
result_t deleteAccount( sessionid_t sid, userid_t uid ) |
| 1145 |
youi |
1.1 |
{ |
| 1146 |
youi |
1.32 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1147 |
youi |
1.10 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1148 |
youi |
1.32 |
|
| 1149 |
|
|
result_t ret1 = RES_ERROR, ret2 = RES_ERROR; |
| 1150 |
youi |
1.35 |
criteria_t c; |
| 1151 |
youi |
1.32 |
string sql; |
| 1152 |
youi |
1.35 |
groupid_t* gids; |
| 1153 |
|
|
int gidsLen; |
| 1154 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 1155 |
|
|
SQLHANDLE hstmt = NULL; |
| 1156 |
youi |
1.10 |
|
| 1157 |
youi |
1.35 |
/* |
| 1158 |
|
|
1. delete user from default platform group |
| 1159 |
|
|
2. delete user profile from xoops_users |
| 1160 |
aga |
1.36 |
3. delete platform user from xnpaccount_users |
| 1161 |
youi |
1.35 |
*/ |
| 1162 |
|
|
|
| 1163 |
|
|
//1. delete user from platform groups |
| 1164 |
|
|
c.clearAll(); |
| 1165 |
|
|
if( getGroupsByUid( sid, uid, &c, &gids, &gidsLen ) == RES_OK ){ |
| 1166 |
|
|
for( int i = 0; i < gidsLen; i++ ) |
| 1167 |
|
|
deleteMemberNoLimit( sid, gids[ i ], uid ); |
| 1168 |
|
|
freeGID( gids ); |
| 1169 |
|
|
} |
| 1170 |
|
|
|
| 1171 |
|
|
//2. delete user profile from xoops_users |
| 1172 |
youi |
1.10 |
sql = "DELETE FROM " + dbprefix + "_users "; |
| 1173 |
|
|
sql += "WHERE uid = " + string( unsignedIntToString( uid ) ); |
| 1174 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1175 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1176 |
youi |
1.64 |
SQLLEN count = 0; |
| 1177 |
youi |
1.32 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1178 |
|
|
ret1 = RES_OK; |
| 1179 |
|
|
}else{ |
| 1180 |
|
|
string s( "SQLRowCount in deleteAccount" ); |
| 1181 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1182 |
youi |
1.32 |
s += string( ", sql=" ) + string( sql ); |
| 1183 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1184 |
|
|
ret1 = RES_NO_SUCH_USER; |
| 1185 |
|
|
} |
| 1186 |
|
|
}else{ |
| 1187 |
|
|
string s( "SQLExecDirect in deleteAccount" ); |
| 1188 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1189 |
youi |
1.32 |
s += ", sql="; |
| 1190 |
|
|
s += string( sql ); |
| 1191 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1192 |
|
|
ret1 = RES_DB_QUERY_ERROR; |
| 1193 |
|
|
} |
| 1194 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1195 |
|
|
}else{ |
| 1196 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" ); |
| 1197 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1198 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1199 |
youi |
1.32 |
ret1 = RES_ERROR; |
| 1200 |
youi |
1.10 |
} |
| 1201 |
|
|
|
| 1202 |
aga |
1.36 |
//3. delete platform user from xnpaccount_users |
| 1203 |
|
|
sql = "DELETE FROM " + dbprefix + "_xnpaccount_users "; |
| 1204 |
youi |
1.10 |
sql += "WHERE uid = " + string( unsignedIntToString( uid ) ); |
| 1205 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1206 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1207 |
youi |
1.64 |
SQLLEN count = 0; |
| 1208 |
youi |
1.32 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1209 |
|
|
ret2 = RES_OK; |
| 1210 |
|
|
}else{ |
| 1211 |
|
|
string s( "SQLRowCount in deleteAccount" ); |
| 1212 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1213 |
youi |
1.32 |
s += string( ", sql=" ) + string( sql ); |
| 1214 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1215 |
|
|
ret2 = RES_NO_SUCH_USER; |
| 1216 |
|
|
} |
| 1217 |
|
|
}else{ |
| 1218 |
|
|
string s( "SQLExecDirect in deleteAccount" ); |
| 1219 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1220 |
youi |
1.32 |
s += ", sql="; |
| 1221 |
|
|
s += string( sql ); |
| 1222 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1223 |
|
|
ret2 = RES_DB_QUERY_ERROR; |
| 1224 |
|
|
} |
| 1225 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1226 |
|
|
}else{ |
| 1227 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in deleteAccount" ); |
| 1228 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1229 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1230 |
youi |
1.32 |
ret2 = RES_ERROR; |
| 1231 |
youi |
1.10 |
} |
| 1232 |
|
|
|
| 1233 |
youi |
1.32 |
//一方でもエラーならエラーを返す |
| 1234 |
|
|
return ret1 != RES_OK ? ret1 : ret2; |
| 1235 |
youi |
1.1 |
} |
| 1236 |
|
|
|
| 1237 |
|
|
/** |
| 1238 |
|
|
* |
| 1239 |
|
|
* アカウント情報取得 |
| 1240 |
|
|
* |
| 1241 |
youi |
1.13 |
* @param sid セッションID |
| 1242 |
|
|
* @param uid 取得したいユーザのUID |
| 1243 |
|
|
* @param acc 取得したアカウント情報(account_t)のポインタを書き込む引数 |
| 1244 |
youi |
1.20 |
* @return RES_OK |
| 1245 |
youi |
1.31 |
* @return RES_DB_NOT_INITIALIZED |
| 1246 |
youi |
1.20 |
* @return RES_NO_SUCH_USER |
| 1247 |
|
|
* @return RES_NO_SUCH_SESSION |
| 1248 |
|
|
* @return RES_DB_QUERY_ERROR |
| 1249 |
youi |
1.1 |
* |
| 1250 |
|
|
*/ |
| 1251 |
youi |
1.12 |
result_t getAccount( sessionid_t sid, userid_t uid, const account_t** acc ) |
| 1252 |
youi |
1.1 |
{ |
| 1253 |
youi |
1.13 |
int len; |
| 1254 |
|
|
static criteria c; |
| 1255 |
|
|
result_t res = getAccounts( sid, &uid, 1, &c, acc, &len ); |
| 1256 |
|
|
if( len == 0 ) return RES_NO_SUCH_USER; |
| 1257 |
|
|
return res; |
| 1258 |
|
|
} |
| 1259 |
|
|
|
| 1260 |
|
|
/** |
| 1261 |
|
|
* |
| 1262 |
|
|
* アカウント情報取得 |
| 1263 |
|
|
* |
| 1264 |
|
|
* @param sid セッションID |
| 1265 |
|
|
* @param uids 取得したいユーザのUIDの配列 |
| 1266 |
|
|
* @param uidsLen uids配列の要素数 |
| 1267 |
|
|
* @param cri 結果の範囲指定,ソート条件指定 |
| 1268 |
|
|
* @param accounts 検索結果の配列のポインタを書き込む引数 |
| 1269 |
|
|
* @param accountsLen 検索結果の数(配列*accountsの要素数) |
| 1270 |
youi |
1.31 |
* @return RES_OK |
| 1271 |
|
|
* @return RES_DB_NOT_INITIALIZED |
| 1272 |
|
|
* @return RES_NO_SUCH_SESSION |
| 1273 |
youi |
1.20 |
* @return RES_DB_QUERY_ERROR |
| 1274 |
youi |
1.13 |
* |
| 1275 |
|
|
*/ |
| 1276 |
|
|
result_t getAccounts( sessionid_t sid, const userid_t* uids, int uidsLen, criteria_t* cri, const account_t** accounts, int* accountsLen ) |
| 1277 |
|
|
{ |
| 1278 |
youi |
1.32 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1279 |
youi |
1.12 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1280 |
youi |
1.28 |
if( uidsLen <= 0 ){ |
| 1281 |
|
|
*accounts = new account_t[ 0 ]; |
| 1282 |
|
|
*accountsLen = 0; |
| 1283 |
tani |
1.72 |
syslog_printf( "getAccounts succeed len=0" ); |
| 1284 |
youi |
1.28 |
return RES_OK; |
| 1285 |
|
|
} |
| 1286 |
youi |
1.12 |
|
| 1287 |
tani |
1.72 |
syslog_printf( "begin of getAccounts" ); |
| 1288 |
youi |
1.32 |
result_t ret = RES_ERROR; |
| 1289 |
|
|
SQLRETURN sqlcode; |
| 1290 |
|
|
SQLHANDLE hstmt = NULL; |
| 1291 |
youi |
1.12 |
string sql; |
| 1292 |
youi |
1.13 |
account_t* dst = new account_t[ uidsLen ]; |
| 1293 |
youi |
1.12 |
|
| 1294 |
tani |
1.73 |
sql += "SELECT u1.uid, u1.name, u1.uname, u1.email, u1.url, u1.user_avatar, u1.user_regdate, u1.user_icq, u1.user_from, u1.user_sig, u1.user_viewemail, u1.actkey, u1.user_aim, u1.user_yim, u1.user_msnm, u1.pass, u1.posts, u1.attachsig, u1.rank, u1.level, u1.theme, u1.timezone_offset, u1.last_login, u1.umode, u1.uorder, u1.notify_method, u1.notify_mode, u1.user_occ, u1.bio, u1.user_intrest, u1.user_mailok, u2.activate, u2.address, u2.division, u2.tel, u2.company_name, u2.country, u2.zipcode, u2.fax, u2.notice_mail, u2.notice_mail_since, u2.private_index_id, u2.private_item_number_limit, u2.private_index_number_limit, u2.private_item_storage_limit "; |
| 1295 |
aga |
1.36 |
sql += "FROM " + dbprefix + "_users AS u1, " + dbprefix + "_xnpaccount_users AS u2 "; |
| 1296 |
youi |
1.28 |
sql += "WHERE u1.uid = u2.uid "; |
| 1297 |
|
|
if( uidsLen > 0 ){ |
| 1298 |
tani |
1.72 |
syslog_printf( "set uid[%d] value=%d to ...", 0, uids[0] ); |
| 1299 |
youi |
1.28 |
sql += "AND ( u1.uid=" + string( unsignedIntToString( uids[ 0 ] ) ); |
| 1300 |
|
|
for( int i = 1; i < uidsLen; i++ ){ |
| 1301 |
tani |
1.72 |
syslog_printf( "set uid[%d] value=%d to ...", i, uids[i] ); |
| 1302 |
youi |
1.28 |
sql += " OR u1.uid=" + string( unsignedIntToString( uids[ i ] ) ); |
| 1303 |
|
|
} |
| 1304 |
|
|
sql += " ) "; |
| 1305 |
youi |
1.12 |
} |
| 1306 |
youi |
1.13 |
sql += criteria2str( cri ); |
| 1307 |
tani |
1.72 |
syslog_printf( "sql=%s", sql.c_str() ); |
| 1308 |
youi |
1.32 |
|
| 1309 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1310 |
tani |
1.72 |
syslog_printf( "SQLAllocHandle" ); |
| 1311 |
youi |
1.32 |
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1312 |
tani |
1.72 |
syslog_printf( "SQLExecDirect" ); |
| 1313 |
tani |
1.73 |
SQLLEN cbUid = 0, cbStorageLimit = 0; |
| 1314 |
youi |
1.32 |
userid_t uid = 0; |
| 1315 |
tani |
1.73 |
SQLDOUBLE storage_limit = 0; |
| 1316 |
|
|
SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &cbUid ); |
| 1317 |
|
|
SQLBindCol( hstmt, 45, SQL_C_DOUBLE, &storage_limit, 0, &cbStorageLimit ); |
| 1318 |
tani |
1.72 |
syslog_printf( "SQLBindCol" ); |
| 1319 |
youi |
1.32 |
*accountsLen=0; |
| 1320 |
|
|
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < uidsLen ; i++ ){ |
| 1321 |
tani |
1.72 |
syslog_printf( "SQLFetch" ); |
| 1322 |
youi |
1.32 |
dst[ i ].setUID( uid ); |
| 1323 |
|
|
dst[ i ].setName( getResultCol( hstmt, 2 ).c_str() ); |
| 1324 |
|
|
dst[ i ].setUname( getResultCol( hstmt, 3 ).c_str() ); |
| 1325 |
|
|
dst[ i ].setEmail( getResultCol( hstmt, 4 ).c_str() ); |
| 1326 |
|
|
dst[ i ].setURL( getResultCol( hstmt, 5 ).c_str() ); |
| 1327 |
|
|
dst[ i ].setUserAvatar( getResultCol( hstmt, 6 ).c_str() ); |
| 1328 |
|
|
dst[ i ].setUserRegdate( atoi( getResultCol( hstmt, 7 ).c_str() ) ); |
| 1329 |
|
|
dst[ i ].setUserIcq( getResultCol( hstmt, 8 ).c_str() ); |
| 1330 |
|
|
dst[ i ].setUserFrom( getResultCol( hstmt, 9 ).c_str() ); |
| 1331 |
|
|
dst[ i ].setUserSig( getResultCol( hstmt, 10 ).c_str() ); |
| 1332 |
|
|
dst[ i ].setUserViewemail( atoi( getResultCol( hstmt, 11 ).c_str() )); |
| 1333 |
|
|
dst[ i ].setActkey( getResultCol( hstmt, 12 ).c_str() ); |
| 1334 |
|
|
dst[ i ].setUserAim( getResultCol( hstmt, 13 ).c_str() ); |
| 1335 |
|
|
dst[ i ].setUserYim( getResultCol( hstmt, 14 ).c_str() ); |
| 1336 |
|
|
dst[ i ].setUserMsnm( getResultCol( hstmt, 15 ).c_str() ); |
| 1337 |
|
|
dst[ i ].setPass( getResultCol( hstmt, 16 ).c_str() ); |
| 1338 |
|
|
dst[ i ].setPosts( atoi( getResultCol( hstmt, 17 ).c_str() )); |
| 1339 |
|
|
dst[ i ].setAttachsig( atoi( getResultCol( hstmt, 18 ).c_str() )); |
| 1340 |
|
|
dst[ i ].setRank( atoi( getResultCol( hstmt, 19 ).c_str() )); |
| 1341 |
|
|
dst[ i ].setLevel( atoi( getResultCol( hstmt, 20 ).c_str() )); |
| 1342 |
|
|
dst[ i ].setTheme( getResultCol( hstmt, 21 ).c_str() ); |
| 1343 |
|
|
dst[ i ].setTimezoneOffset( atof( getResultCol( hstmt, 22 ).c_str() ) ); |
| 1344 |
|
|
dst[ i ].setLastLogin( atoi( getResultCol( hstmt, 23 ).c_str() )); |
| 1345 |
|
|
dst[ i ].setUmode( getResultCol( hstmt, 24 ).c_str() ); |
| 1346 |
|
|
dst[ i ].setUorder( atoi( getResultCol( hstmt, 25 ).c_str() )); |
| 1347 |
|
|
dst[ i ].setNotifyMethod( atoi( getResultCol( hstmt, 26 ).c_str() )); |
| 1348 |
|
|
dst[ i ].setNotifyMode( atoi( getResultCol( hstmt, 27 ).c_str() )); |
| 1349 |
|
|
dst[ i ].setUserOcc( getResultCol( hstmt, 28 ).c_str() ); |
| 1350 |
|
|
dst[ i ].setBio( getResultCol( hstmt, 29 ).c_str() ); |
| 1351 |
|
|
dst[ i ].setUserIntrest( getResultCol( hstmt, 30 ).c_str() ); |
| 1352 |
|
|
dst[ i ].setUserMailok( atoi( getResultCol( hstmt, 31 ).c_str() )); |
| 1353 |
|
|
dst[ i ].setActivate( atoi( getResultCol( hstmt, 32 ).c_str() )); |
| 1354 |
|
|
dst[ i ].setAddress( getResultCol( hstmt, 33 ).c_str() ); |
| 1355 |
|
|
dst[ i ].setDivision( getResultCol( hstmt, 34 ).c_str() ); |
| 1356 |
|
|
dst[ i ].setTel( getResultCol( hstmt, 35 ).c_str() ); |
| 1357 |
|
|
dst[ i ].setCompanyName( getResultCol( hstmt, 36 ).c_str() ); |
| 1358 |
|
|
dst[ i ].setCountry( getResultCol( hstmt, 37 ).c_str() ); |
| 1359 |
|
|
dst[ i ].setZipcode( getResultCol( hstmt, 38 ).c_str() ); |
| 1360 |
|
|
dst[ i ].setFax( getResultCol( hstmt, 39 ).c_str() ); |
| 1361 |
aga |
1.61 |
dst[ i ].setNoticeMail( atoi( getResultCol( hstmt, 40 ).c_str() )); |
| 1362 |
|
|
dst[ i ].setNoticeMailSince( atoi( getResultCol( hstmt, 41 ).c_str() )); |
| 1363 |
|
|
dst[ i ].setPrivateIndexID( atoi( getResultCol( hstmt, 42 ).c_str() )); |
| 1364 |
tani |
1.73 |
dst[ i ].setItemNumberLimit( atoi( getResultCol( hstmt, 43 ).c_str() )); |
| 1365 |
|
|
dst[ i ].setIndexNumberLimit( atoi( getResultCol( hstmt, 44 ).c_str() )); |
| 1366 |
|
|
dst[ i ].setItemStorageLimit( storage_limit ); |
| 1367 |
youi |
1.32 |
( *accountsLen )++; |
| 1368 |
|
|
} |
| 1369 |
|
|
*accounts = dst; |
| 1370 |
tani |
1.72 |
syslog_printf( "getAccounts succeed" ); |
| 1371 |
youi |
1.32 |
ret = RES_OK; |
| 1372 |
|
|
}else{ |
| 1373 |
youi |
1.33 |
string s( "SQLExecDirect in getAccounts" ); |
| 1374 |
|
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1375 |
|
|
s += string( ", sql=" ) + string( sql ); |
| 1376 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1377 |
tani |
1.72 |
syslog_printf( "getAccounts %s", getLastErrorString( ) ); |
| 1378 |
youi |
1.32 |
ret = RES_DB_QUERY_ERROR; |
| 1379 |
|
|
} |
| 1380 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1381 |
|
|
}else{ |
| 1382 |
youi |
1.33 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getAccounts" ); |
| 1383 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1384 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1385 |
tani |
1.72 |
syslog_printf( "getAccounts %s", getLastErrorString( ) ); |
| 1386 |
youi |
1.32 |
ret = RES_DB_QUERY_ERROR; |
| 1387 |
youi |
1.12 |
} |
| 1388 |
youi |
1.32 |
return ret; |
| 1389 |
youi |
1.1 |
} |
| 1390 |
|
|
|
| 1391 |
|
|
/** |
| 1392 |
|
|
* |
| 1393 |
youi |
1.25 |
* アカウント登録. |
| 1394 |
youi |
1.35 |
* |
| 1395 |
youi |
1.25 |
* ユーザ情報をデータベースに登録します. |
| 1396 |
youi |
1.35 |
* 登録したユーザ情報に対応するユーザIDをuidに格納します. |
| 1397 |
youi |
1.1 |
* |
| 1398 |
youi |
1.7 |
* @param sid セッション |
| 1399 |
youi |
1.10 |
* @param account 登録するアカウント情報 |
| 1400 |
youi |
1.25 |
* @param uid 登録したアカウント情報に対応するユーザID |
| 1401 |
youi |
1.20 |
* @return RES_OK |
| 1402 |
|
|
* @return RES_NO_SUCH_SESSION |
| 1403 |
|
|
* @return RES_DB_QUERY_ERROR |
| 1404 |
youi |
1.31 |
* @return RES_DB_NOT_INITIALIZED |
| 1405 |
youi |
1.1 |
* |
| 1406 |
|
|
*/ |
| 1407 |
youi |
1.25 |
result_t insertAccount( sessionid_t sid, const account_t* account, userid_t* uid ) |
| 1408 |
youi |
1.1 |
{ |
| 1409 |
youi |
1.32 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1410 |
youi |
1.10 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1411 |
|
|
|
| 1412 |
youi |
1.7 |
string sql; |
| 1413 |
|
|
string tmp; |
| 1414 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 1415 |
|
|
result_t ret = RES_ERROR; |
| 1416 |
youi |
1.7 |
|
| 1417 |
youi |
1.35 |
/* |
| 1418 |
|
|
1. insert user profile into xoops_users |
| 1419 |
aga |
1.36 |
2. insert platform user profile into xnpaccount_users |
| 1420 |
youi |
1.35 |
3. add user to default platform group |
| 1421 |
aga |
1.37 |
4. create private index |
| 1422 |
|
|
5. update account set private_index_id=... |
| 1423 |
youi |
1.35 |
*/ |
| 1424 |
|
|
|
| 1425 |
|
|
//1.xoopsのユーザテーブルに書き込む |
| 1426 |
youi |
1.39 |
SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1]; |
| 1427 |
youi |
1.32 |
SQLINTEGER user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok; |
| 1428 |
|
|
SQLDOUBLE timezone_offset; |
| 1429 |
|
|
|
| 1430 |
youi |
1.56 |
SQLLEN cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS; |
| 1431 |
|
|
SQLLEN cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode = 0, cbUser_mailok = 0, cbTimezone_offset = 0; |
| 1432 |
youi |
1.32 |
|
| 1433 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1434 |
|
|
string sql; |
| 1435 |
aga |
1.48 |
sql = "INSERT INTO " + dbprefix + "_users (uname, name, email, url, user_avatar, user_regdate, user_icq, user_from, user_sig, user_viewemail, actkey, user_aim, user_yim, user_msnm, pass, posts, attachsig, rank, level, theme, timezone_offset, last_login, umode, uorder, notify_method, notify_mode, user_occ, bio, user_intrest, user_mailok) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
| 1436 |
youi |
1.32 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1437 |
|
|
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1438 |
|
|
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname ); |
| 1439 |
|
|
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName ); |
| 1440 |
|
|
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail ); |
| 1441 |
|
|
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl ); |
| 1442 |
|
|
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar ); |
| 1443 |
|
|
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate ); |
| 1444 |
|
|
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq ); |
| 1445 |
|
|
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from ); |
| 1446 |
|
|
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig ); |
| 1447 |
|
|
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail ); |
| 1448 |
|
|
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey ); |
| 1449 |
|
|
SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim ); |
| 1450 |
|
|
SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim ); |
| 1451 |
|
|
SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm ); |
| 1452 |
|
|
SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass ); |
| 1453 |
|
|
SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts ); |
| 1454 |
|
|
SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig ); |
| 1455 |
|
|
SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank ); |
| 1456 |
|
|
SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel ); |
| 1457 |
|
|
SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme ); |
| 1458 |
|
|
SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset ); |
| 1459 |
|
|
SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login ); |
| 1460 |
|
|
SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode ); |
| 1461 |
|
|
SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder ); |
| 1462 |
|
|
SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_method, 0, &cbNotify_method ); |
| 1463 |
|
|
SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_mode, 0, &cbNotify_mode ); |
| 1464 |
|
|
SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ ); |
| 1465 |
|
|
SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio ); |
| 1466 |
|
|
SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest ); |
| 1467 |
|
|
SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok ); |
| 1468 |
|
|
|
| 1469 |
|
|
strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN ); |
| 1470 |
|
|
strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN ); |
| 1471 |
|
|
strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN ); |
| 1472 |
|
|
strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN ); |
| 1473 |
|
|
strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN ); |
| 1474 |
|
|
user_regdate = time( NULL ); |
| 1475 |
|
|
strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN ); |
| 1476 |
|
|
strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN ); |
| 1477 |
|
|
strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN ); |
| 1478 |
|
|
user_viewemail = account -> getUserViewemail( ); |
| 1479 |
|
|
strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN ); |
| 1480 |
|
|
strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN ); |
| 1481 |
|
|
strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN ); |
| 1482 |
|
|
strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN ); |
| 1483 |
|
|
strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN ); |
| 1484 |
|
|
posts = account -> getPosts( ); |
| 1485 |
|
|
attachsig = account -> getAttachsig( ); |
| 1486 |
|
|
rank = account -> getRank( ); |
| 1487 |
|
|
level = account -> getLevel( ); |
| 1488 |
|
|
strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN ); |
| 1489 |
|
|
timezone_offset = account -> getTimezoneOffset( ); |
| 1490 |
|
|
last_login = 0; |
| 1491 |
|
|
strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN ); |
| 1492 |
|
|
uorder = account -> getUorder( ); |
| 1493 |
|
|
notify_method = account -> getNotifyMethod( ); |
| 1494 |
|
|
notify_mode = account -> getNotifyMode( ); |
| 1495 |
|
|
strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN ); |
| 1496 |
|
|
strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN ); |
| 1497 |
|
|
strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN ); |
| 1498 |
|
|
user_mailok = account -> getUserMailok( ); |
| 1499 |
|
|
|
| 1500 |
|
|
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1501 |
youi |
1.64 |
SQLLEN count = 0; |
| 1502 |
youi |
1.32 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1503 |
|
|
//ユーザIDを取得する |
| 1504 |
tani |
1.72 |
if( dbtype == DBTYPE_MYSQL ){ |
| 1505 |
|
|
sql = "SELECT LAST_INSERT_ID()"; |
| 1506 |
|
|
}else if( dbtype == DBTYPE_SQLITE ){ |
| 1507 |
|
|
sql = "SELECT LAST_INSERT_ROWID()"; |
| 1508 |
|
|
} |
| 1509 |
youi |
1.44 |
ret = queryGetUnsignedInt( "insertAccount", sql, (unsigned int*)uid ); |
| 1510 |
youi |
1.32 |
}else{ |
| 1511 |
|
|
string s( "SQLRowCount in insertAccount sql=" ); |
| 1512 |
|
|
s += string( sql ); |
| 1513 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1514 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1515 |
|
|
} |
| 1516 |
|
|
}else{ |
| 1517 |
|
|
string s( "SQLExecute in insertAccount " ); |
| 1518 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1519 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 1520 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1521 |
|
|
} |
| 1522 |
|
|
}else{ |
| 1523 |
|
|
string s( "SQLPrepare in insertAccount " ); |
| 1524 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1525 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 1526 |
|
|
ret = RES_ERROR; |
| 1527 |
|
|
} |
| 1528 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1529 |
|
|
}else{ |
| 1530 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" ); |
| 1531 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1532 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1533 |
youi |
1.32 |
ret = RES_ERROR; |
| 1534 |
youi |
1.7 |
} |
| 1535 |
|
|
|
| 1536 |
youi |
1.35 |
if( ret == RES_OK ){ |
| 1537 |
aga |
1.36 |
//2.xnpaccountのユーザテーブルに残りの情報を書き込む |
| 1538 |
youi |
1.35 |
SQLUINTEGER activate; |
| 1539 |
aga |
1.36 |
SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1]; |
| 1540 |
|
|
SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1]; |
| 1541 |
|
|
SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1]; |
| 1542 |
|
|
SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1]; |
| 1543 |
|
|
SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1]; |
| 1544 |
|
|
SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1]; |
| 1545 |
|
|
SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1]; |
| 1546 |
aga |
1.61 |
SQLLEN cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS; |
| 1547 |
tani |
1.73 |
SQLLEN cbUid = 0, cbActivate = 0, cbNotice_mail = 0, cbNotice_mail_since = 0, cbItem_number_limit = 0, cbIndex_number_limit = 0, cbItem_storage_limit = 0; |
| 1548 |
youi |
1.35 |
SQLUINTEGER notice_mail; |
| 1549 |
|
|
SQLUINTEGER notice_mail_since; |
| 1550 |
tani |
1.73 |
SQLINTEGER item_number_limit; |
| 1551 |
|
|
SQLINTEGER index_number_limit; |
| 1552 |
|
|
SQLDOUBLE item_storage_limit; |
| 1553 |
|
|
|
| 1554 |
youi |
1.35 |
if( ret == RES_OK && ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1555 |
|
|
string sql; |
| 1556 |
tani |
1.73 |
sql = "INSERT INTO " + dbprefix + "_xnpaccount_users (uid, activate, address, division, tel, company_name, country, zipcode, fax, notice_mail, notice_mail_since, private_item_number_limit, private_index_number_limit, private_item_storage_limit) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"; |
| 1557 |
youi |
1.35 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1558 |
|
|
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1559 |
|
|
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, uid, 0, &cbUid); |
| 1560 |
|
|
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate); |
| 1561 |
aga |
1.36 |
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress); |
| 1562 |
|
|
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision); |
| 1563 |
|
|
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel); |
| 1564 |
|
|
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name); |
| 1565 |
|
|
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry); |
| 1566 |
|
|
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode); |
| 1567 |
|
|
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax); |
| 1568 |
aga |
1.61 |
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail, 0, &cbNotice_mail); |
| 1569 |
|
|
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail_since, 0, &cbNotice_mail_since); |
| 1570 |
tani |
1.73 |
SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &item_number_limit, 0, &cbItem_number_limit); |
| 1571 |
|
|
SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &index_number_limit, 0, &cbIndex_number_limit); |
| 1572 |
|
|
SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &item_storage_limit, 0, &cbItem_storage_limit); |
| 1573 |
youi |
1.32 |
|
| 1574 |
youi |
1.35 |
activate = account -> getActivate() ? 1 : 0; |
| 1575 |
aga |
1.36 |
strncpy2( (char*)address, account -> getAddress(), XNP_ACCOUNT_ADDRESS_LEN ); |
| 1576 |
|
|
strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN ); |
| 1577 |
|
|
strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN ); |
| 1578 |
|
|
strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN ); |
| 1579 |
|
|
strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN ); |
| 1580 |
|
|
strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN ); |
| 1581 |
|
|
strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN ); |
| 1582 |
youi |
1.35 |
notice_mail = account -> getNoticeMail( ); |
| 1583 |
tani |
1.81 |
notice_mail_since = time( NULL ); |
| 1584 |
tani |
1.73 |
item_number_limit = account -> getItemNumberLimit( ); |
| 1585 |
|
|
index_number_limit = account -> getIndexNumberLimit( ); |
| 1586 |
|
|
item_storage_limit = account -> getItemStorageLimit( ); |
| 1587 |
youi |
1.32 |
|
| 1588 |
youi |
1.35 |
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1589 |
youi |
1.64 |
SQLLEN count = 0; |
| 1590 |
youi |
1.35 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1591 |
|
|
ret = RES_OK; |
| 1592 |
|
|
if( ret == RES_OK ){ |
| 1593 |
|
|
//3.add new user to default group(not a group admin) |
| 1594 |
youi |
1.39 |
ret = insertMember( sid, group_t::GID_DEFAULT, *uid, false ); |
| 1595 |
youi |
1.35 |
}else{ |
| 1596 |
|
|
//xoops_usersへinsertしたレコードを削除する |
| 1597 |
|
|
sql = "DELETE FROM " + dbprefix + "_users where uid="; |
| 1598 |
|
|
sql += unsignedIntToString( *uid ); |
| 1599 |
|
|
SQLHANDLE hstmt2 = NULL; |
| 1600 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 1601 |
|
|
SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ); |
| 1602 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 1603 |
|
|
} |
| 1604 |
|
|
setLastErrorString( "insertMember in insertAccount" ); |
| 1605 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1606 |
|
|
} |
| 1607 |
|
|
}else{ |
| 1608 |
|
|
string s( "SQLRowCount in insertAccount sql=" ); |
| 1609 |
|
|
s += string( sql ); |
| 1610 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1611 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1612 |
|
|
} |
| 1613 |
youi |
1.32 |
}else{ |
| 1614 |
youi |
1.35 |
string s( "SQLExecute in insertAccount " ); |
| 1615 |
|
|
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1616 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 1617 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1618 |
|
|
} |
| 1619 |
|
|
}else{ |
| 1620 |
youi |
1.35 |
//xoops_usersへinsertしたレコードを削除する |
| 1621 |
|
|
sql = "DELETE FROM " + dbprefix + "_users where uid="; |
| 1622 |
|
|
sql += unsignedIntToString( *uid ); |
| 1623 |
|
|
SQLHANDLE hstmt2 = NULL; |
| 1624 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 1625 |
|
|
SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ); |
| 1626 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt2 ); |
| 1627 |
|
|
} |
| 1628 |
|
|
string s( "SQLExecDirect in insertAccount sql=" ); |
| 1629 |
|
|
s += string( sql ); |
| 1630 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 1631 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1632 |
|
|
} |
| 1633 |
youi |
1.35 |
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1634 |
youi |
1.32 |
}else{ |
| 1635 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in insertAccount" ); |
| 1636 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1637 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1638 |
youi |
1.35 |
ret = RES_ERROR; |
| 1639 |
youi |
1.32 |
} |
| 1640 |
youi |
1.7 |
} |
| 1641 |
aga |
1.37 |
|
| 1642 |
|
|
if ( ret == RES_OK ){ |
| 1643 |
|
|
//4.private indexを作成 |
| 1644 |
|
|
|
| 1645 |
|
|
// private index用のsort_number生成 |
| 1646 |
|
|
string sql = "select min(sort_number) from " + |
| 1647 |
|
|
dbprefix + "_xnpaccount_index where parent_index_id=" + unsignedIntToString(item::IID_ROOT) + |
| 1648 |
|
|
" and open_level=" + unsignedIntToString(index::OL_PRIVATE); |
| 1649 |
|
|
unsigned int sortNumber; |
| 1650 |
|
|
ret = queryGetUnsignedInt( "insertAccount", sql, &sortNumber ); |
| 1651 |
|
|
sortNumber--; |
| 1652 |
|
|
if ( ret == RES_OK ){ |
| 1653 |
|
|
// private index作成 |
| 1654 |
|
|
index_t index; |
| 1655 |
|
|
index.setItemTypeID(item::ITID_INDEX); |
| 1656 |
|
|
index.setContributorUID(*uid); |
| 1657 |
|
|
index.setParentIndexID(item::IID_ROOT); |
| 1658 |
|
|
index.setOwnerUID(*uid); |
| 1659 |
|
|
index.setOpenLevel(index::OL_PRIVATE); |
| 1660 |
|
|
index.setSortNumber(sortNumber); |
| 1661 |
|
|
index.setTitle(account->getUname()); |
| 1662 |
|
|
indexid_t privateXID; |
| 1663 |
|
|
ret = insertIndexInternal( sid, &index, &privateXID ); |
| 1664 |
|
|
if ( ret == RES_OK ){ |
| 1665 |
|
|
// xnpaccuont_usersのprivate_index_idの書き換え |
| 1666 |
|
|
sql = "UPDATE " + dbprefix + "_xnpaccount_users SET private_index_id=" |
| 1667 |
|
|
+ unsignedIntToString(privateXID) + " WHERE uid=" + unsignedIntToString(*uid); |
| 1668 |
|
|
ret = querySimple( "insertAccount", sql ); |
| 1669 |
|
|
} |
| 1670 |
|
|
} |
| 1671 |
|
|
} |
| 1672 |
|
|
|
| 1673 |
youi |
1.32 |
return ret; |
| 1674 |
youi |
1.1 |
} |
| 1675 |
|
|
|
| 1676 |
|
|
/** |
| 1677 |
|
|
* |
| 1678 |
youi |
1.20 |
* アカウント情報を変更する. |
| 1679 |
|
|
* |
| 1680 |
youi |
1.1 |
* |
| 1681 |
youi |
1.20 |
* @param sid セッションID |
| 1682 |
|
|
* @param account 変更したいアカウント情報 |
| 1683 |
|
|
* @return RES_OK |
| 1684 |
youi |
1.31 |
* @return RES_DB_NOT_INITIALIZED |
| 1685 |
youi |
1.20 |
* @return RES_NO_SUCH_SESSION |
| 1686 |
|
|
* @return RES_DB_QUERY_ERROR |
| 1687 |
|
|
* @return RES_NO_SUCH_USER |
| 1688 |
youi |
1.31 |
* @return RES_ERROR |
| 1689 |
youi |
1.1 |
* |
| 1690 |
|
|
*/ |
| 1691 |
youi |
1.2 |
result_t updateAccount( sessionid_t sid, const account_t* account ) |
| 1692 |
youi |
1.1 |
{ |
| 1693 |
youi |
1.32 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1694 |
youi |
1.20 |
if( account == NULL ) return RES_ERROR; |
| 1695 |
youi |
1.10 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1696 |
youi |
1.20 |
if( !uidExists( account -> getUID( ) ) ) return RES_NO_SUCH_USER; |
| 1697 |
youi |
1.39 |
|
| 1698 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 1699 |
|
|
result_t ret = RES_ERROR; |
| 1700 |
youi |
1.39 |
SQLHANDLE hstmt = NULL; |
| 1701 |
youi |
1.10 |
|
| 1702 |
|
|
//xoopsのユーザテーブルに書き込む |
| 1703 |
youi |
1.39 |
SQLCHAR uname[ACCOUNT_UNAME_LEN+1], name[ACCOUNT_NAME_LEN+1], email[ACCOUNT_EMAIL_LEN+1], url[ACCOUNT_URL_LEN+1], user_avatar[ACCOUNT_USER_AVATAR_LEN+1], user_icq[ACCOUNT_USER_ICQ_LEN+1], user_from[ACCOUNT_USER_FROM_LEN+1], user_sig[ACCOUNT_USER_SIG_LEN+1], actkey[ACCOUNT_ACTKEY_LEN+1], user_aim[ACCOUNT_USER_AIM_LEN+1], user_yim[ACCOUNT_USER_YIM_LEN+1], user_msnm[ACCOUNT_USER_MSNM_LEN+1], pass[ACCOUNT_PASS_LEN+1], theme[ACCOUNT_THEME_LEN+1], umode[ACCOUNT_UMODE_LEN+1], user_occ[ACCOUNT_USER_OCC_LEN+1], bio[ACCOUNT_BIO_LEN+1], user_intrest[ACCOUNT_USER_INTREST_LEN+1]; |
| 1704 |
youi |
1.32 |
SQLINTEGER uid, user_regdate, user_viewemail, posts, attachsig, rank, level, last_login, uorder, notify_method, notify_mode, user_mailok; |
| 1705 |
|
|
SQLDOUBLE timezone_offset; |
| 1706 |
|
|
|
| 1707 |
youi |
1.56 |
SQLLEN cbUname = SQL_NTS, cbName = SQL_NTS, cbEmail = SQL_NTS, cbUrl = SQL_NTS, cbUser_avatar = SQL_NTS, cbUser_icq = SQL_NTS, cbUser_from = SQL_NTS, cbUser_sig = SQL_NTS, cbActkey = SQL_NTS, cbUser_aim = SQL_NTS, cbUser_yim = SQL_NTS, cbUser_msnm = SQL_NTS, cbPass = SQL_NTS, cbTheme = SQL_NTS, cbUmode = SQL_NTS, cbUser_occ = SQL_NTS, cbBio = SQL_NTS, cbUser_intrest = SQL_NTS; |
| 1708 |
|
|
SQLLEN cbUid = 0, cbUser_regdate = 0, cbUser_viewemail = 0, cbPosts = 0, cbAttachsig = 0, cbRank = 0, cbLevel = 0, cbLast_login = 0, cbUorder = 0, cbNotify_method = 0, cbNotify_mode = 0, cbUser_mailok = 0, cbTimezone_offset = 0; |
| 1709 |
youi |
1.32 |
|
| 1710 |
|
|
SQLUINTEGER activate; |
| 1711 |
aga |
1.36 |
SQLCHAR address[XNP_ACCOUNT_ADDRESS_LEN+1]; |
| 1712 |
|
|
SQLCHAR division[XNP_ACCOUNT_DIVISION_LEN+1]; |
| 1713 |
|
|
SQLCHAR tel[XNP_ACCOUNT_TEL_LEN+1]; |
| 1714 |
|
|
SQLCHAR company_name[XNP_ACCOUNT_COMPANY_NAME_LEN+1]; |
| 1715 |
|
|
SQLCHAR country[XNP_ACCOUNT_COUNTRY_LEN+1]; |
| 1716 |
|
|
SQLCHAR zipcode[XNP_ACCOUNT_ZIPCODE_LEN+1]; |
| 1717 |
|
|
SQLCHAR fax[XNP_ACCOUNT_FAX_LEN+1]; |
| 1718 |
aga |
1.61 |
SQLLEN cbActivate = 0, cbAddress = SQL_NTS, cbDivision = SQL_NTS, cbTel = SQL_NTS, cbCompany_name = SQL_NTS, cbCountry = SQL_NTS, cbZipcode = SQL_NTS, cbFax = SQL_NTS; |
| 1719 |
youi |
1.39 |
SQLUINTEGER notice_mail, notice_mail_since; |
| 1720 |
youi |
1.56 |
SQLLEN cbNotice_mail = 0, cbNotice_mail_since = 0; |
| 1721 |
youi |
1.32 |
|
| 1722 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1723 |
|
|
string sql; |
| 1724 |
|
|
|
| 1725 |
|
|
sql = "UPDATE " + dbprefix + "_users SET "; |
| 1726 |
youi |
1.39 |
sql += "uname=?"; |
| 1727 |
|
|
sql += ", name=?"; |
| 1728 |
|
|
sql += ", email=?"; |
| 1729 |
|
|
sql += ", url=?"; |
| 1730 |
|
|
sql += ", user_avatar=?"; |
| 1731 |
|
|
sql += ", user_regdate=?"; |
| 1732 |
|
|
sql += ", user_icq=?"; |
| 1733 |
|
|
sql += ", user_from=?"; |
| 1734 |
|
|
sql += ", user_sig=?"; |
| 1735 |
|
|
sql += ", user_viewemail=?"; |
| 1736 |
|
|
sql += ", actkey=?"; |
| 1737 |
|
|
sql += ", user_aim=?"; |
| 1738 |
|
|
sql += ", user_yim=?"; |
| 1739 |
|
|
sql += ", user_msnm=?"; |
| 1740 |
|
|
sql += ", pass=?"; |
| 1741 |
|
|
sql += ", posts=?"; |
| 1742 |
|
|
sql += ", attachsig=?"; |
| 1743 |
|
|
sql += ", rank=?"; |
| 1744 |
|
|
sql += ", level=?"; |
| 1745 |
|
|
sql += ", theme=?"; |
| 1746 |
|
|
sql += ", timezone_offset=?"; |
| 1747 |
|
|
sql += ", last_login=?"; |
| 1748 |
|
|
sql += ", umode=?"; |
| 1749 |
|
|
sql += ", uorder=?"; |
| 1750 |
|
|
sql += ", notify_method=?"; |
| 1751 |
|
|
sql += ", notify_mode=?"; |
| 1752 |
|
|
sql += ", user_occ=?"; |
| 1753 |
|
|
sql += ", bio=?"; |
| 1754 |
|
|
sql += ", user_intrest=?"; |
| 1755 |
|
|
sql += ", user_mailok=? "; |
| 1756 |
youi |
1.32 |
sql += " WHERE uid = ?"; |
| 1757 |
youi |
1.39 |
|
| 1758 |
youi |
1.32 |
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1759 |
|
|
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1760 |
|
|
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UNAME_LEN, 0, uname, 0, &cbUname ); |
| 1761 |
|
|
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_NAME_LEN, 0, name, 0, &cbName ); |
| 1762 |
|
|
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_EMAIL_LEN, 0, email, 0, &cbEmail ); |
| 1763 |
|
|
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_URL_LEN, 0, url, 0, &cbUrl ); |
| 1764 |
|
|
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AVATAR_LEN, 0, user_avatar, 0, &cbUser_avatar ); |
| 1765 |
|
|
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_regdate, 0, &cbUser_regdate ); |
| 1766 |
|
|
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_ICQ_LEN, 0, user_icq, 0, &cbUser_icq ); |
| 1767 |
|
|
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_FROM_LEN, 0, user_from, 0, &cbUser_from ); |
| 1768 |
|
|
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_SIG_LEN, 0, user_sig, 0, &cbUser_sig ); |
| 1769 |
|
|
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_viewemail, 0, &cbUser_viewemail ); |
| 1770 |
|
|
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_ACTKEY_LEN, 0, actkey, 0, &cbActkey ); |
| 1771 |
|
|
SQLBindParameter(hstmt, 12, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_AIM_LEN, 0, user_aim, 0, &cbUser_aim ); |
| 1772 |
|
|
SQLBindParameter(hstmt, 13, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_YIM_LEN, 0, user_yim, 0, &cbUser_yim ); |
| 1773 |
|
|
SQLBindParameter(hstmt, 14, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_MSNM_LEN, 0, user_msnm, 0, &cbUser_msnm ); |
| 1774 |
|
|
SQLBindParameter(hstmt, 15, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_PASS_LEN, 0, pass, 0, &cbPass ); |
| 1775 |
|
|
SQLBindParameter(hstmt, 16, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &posts, 0, &cbPosts ); |
| 1776 |
|
|
SQLBindParameter(hstmt, 17, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &attachsig, 0, &cbAttachsig ); |
| 1777 |
|
|
SQLBindParameter(hstmt, 18, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &rank, 0, &cbRank ); |
| 1778 |
|
|
SQLBindParameter(hstmt, 19, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &level, 0, &cbLevel ); |
| 1779 |
|
|
SQLBindParameter(hstmt, 20, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_THEME_LEN, 0, theme, 0, &cbTheme ); |
| 1780 |
|
|
SQLBindParameter(hstmt, 21, SQL_PARAM_INPUT, SQL_C_DOUBLE, SQL_DOUBLE, 0, 0, &timezone_offset, 0, &cbTimezone_offset ); |
| 1781 |
|
|
SQLBindParameter(hstmt, 22, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &last_login, 0, &cbLast_login ); |
| 1782 |
|
|
SQLBindParameter(hstmt, 23, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_UMODE_LEN, 0, umode, 0, &cbUmode ); |
| 1783 |
|
|
SQLBindParameter(hstmt, 24, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uorder, 0, &cbUorder ); |
| 1784 |
|
|
SQLBindParameter(hstmt, 25, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_method, 0, &cbNotify_method ); |
| 1785 |
|
|
SQLBindParameter(hstmt, 26, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, ¬ify_mode, 0, &cbNotify_mode ); |
| 1786 |
|
|
SQLBindParameter(hstmt, 27, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_OCC_LEN, 0, user_occ, 0, &cbUser_occ ); |
| 1787 |
|
|
SQLBindParameter(hstmt, 28, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_BIO_LEN, 0, bio, 0, &cbBio ); |
| 1788 |
|
|
SQLBindParameter(hstmt, 29, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, ACCOUNT_USER_INTREST_LEN, 0, user_intrest, 0, &cbUser_intrest ); |
| 1789 |
|
|
SQLBindParameter(hstmt, 30, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &user_mailok, 0, &cbUser_mailok ); |
| 1790 |
|
|
SQLBindParameter(hstmt, 31, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid ); |
| 1791 |
youi |
1.39 |
|
| 1792 |
youi |
1.32 |
strncpy2( (char*)uname, account -> getUname( ), ACCOUNT_UNAME_LEN ); |
| 1793 |
|
|
strncpy2( (char*)name, account -> getName( ), ACCOUNT_NAME_LEN ); |
| 1794 |
|
|
strncpy2( (char*)email, account -> getEmail( ), ACCOUNT_EMAIL_LEN ); |
| 1795 |
|
|
strncpy2( (char*)url, account -> getURL( ), ACCOUNT_URL_LEN ); |
| 1796 |
|
|
strncpy2( (char*)user_avatar, account -> getUserAvatar( ), ACCOUNT_USER_AVATAR_LEN ); |
| 1797 |
|
|
user_regdate = time( NULL ); |
| 1798 |
|
|
strncpy2( (char*)user_icq, account -> getUserIcq( ), ACCOUNT_USER_ICQ_LEN ); |
| 1799 |
|
|
strncpy2( (char*)user_from, account -> getUserFrom( ), ACCOUNT_USER_FROM_LEN ); |
| 1800 |
|
|
strncpy2( (char*)user_sig, account -> getUserSig( ), ACCOUNT_USER_SIG_LEN ); |
| 1801 |
|
|
user_viewemail = account -> getUserViewemail( ); |
| 1802 |
|
|
strncpy2( (char*)actkey, account -> getActkey( ), ACCOUNT_ACTKEY_LEN ); |
| 1803 |
|
|
strncpy2( (char*)user_aim, account -> getUserAim( ), ACCOUNT_USER_AIM_LEN ); |
| 1804 |
|
|
strncpy2( (char*)user_yim, account -> getUserYim( ), ACCOUNT_USER_YIM_LEN ); |
| 1805 |
|
|
strncpy2( (char*)user_msnm, account -> getUserMsnm( ), ACCOUNT_USER_MSNM_LEN ); |
| 1806 |
|
|
strncpy2( (char*)pass, account -> getPass( ), ACCOUNT_PASS_LEN ); |
| 1807 |
|
|
posts = account -> getPosts( ); |
| 1808 |
|
|
attachsig = account -> getAttachsig( ); |
| 1809 |
|
|
rank = account -> getRank( ); |
| 1810 |
|
|
level = account -> getLevel( ); |
| 1811 |
|
|
strncpy2( (char*)theme, account -> getTheme( ), ACCOUNT_THEME_LEN ); |
| 1812 |
|
|
timezone_offset = account -> getTimezoneOffset( ); |
| 1813 |
|
|
last_login = 0; |
| 1814 |
|
|
strncpy2( (char*)umode, account -> getUmode( ), ACCOUNT_UMODE_LEN ); |
| 1815 |
|
|
uorder = account -> getUorder( ); |
| 1816 |
|
|
notify_method = account -> getNotifyMethod( ); |
| 1817 |
|
|
notify_mode = account -> getNotifyMode( ); |
| 1818 |
|
|
strncpy2( (char*)user_occ, account -> getUserOcc( ), ACCOUNT_USER_OCC_LEN ); |
| 1819 |
|
|
strncpy2( (char*)bio, account -> getBio( ), ACCOUNT_BIO_LEN ); |
| 1820 |
|
|
strncpy2( (char*)user_intrest, account -> getUserIntrest( ), ACCOUNT_USER_INTREST_LEN ); |
| 1821 |
|
|
user_mailok = account -> getUserMailok( ); |
| 1822 |
|
|
uid = account -> getUID( ); |
| 1823 |
|
|
|
| 1824 |
|
|
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1825 |
youi |
1.64 |
SQLLEN count = 0; |
| 1826 |
youi |
1.32 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1827 |
|
|
ret = RES_OK; |
| 1828 |
|
|
}else{ |
| 1829 |
|
|
string s( "SQLRowCount in updateAccount sql=" ); |
| 1830 |
|
|
s += string( sql ); |
| 1831 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1832 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1833 |
|
|
} |
| 1834 |
|
|
}else{ |
| 1835 |
youi |
1.39 |
string s( "SQLExecute in updateAccount 1 " ); |
| 1836 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1837 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 1838 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1839 |
|
|
} |
| 1840 |
|
|
}else{ |
| 1841 |
|
|
setLastErrorString( "SQLPrepare in updateAccount sql=" ); |
| 1842 |
|
|
ret = RES_ERROR; |
| 1843 |
|
|
} |
| 1844 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1845 |
youi |
1.39 |
hstmt = NULL; |
| 1846 |
youi |
1.32 |
}else{ |
| 1847 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" ); |
| 1848 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1849 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1850 |
youi |
1.32 |
ret = RES_ERROR; |
| 1851 |
youi |
1.10 |
} |
| 1852 |
|
|
|
| 1853 |
youi |
1.39 |
if( ret != RES_OK ){ |
| 1854 |
|
|
return ret; |
| 1855 |
|
|
} |
| 1856 |
|
|
|
| 1857 |
aga |
1.36 |
//xnpaccountのユーザテーブルに残りの情報を上書きする |
| 1858 |
youi |
1.39 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1859 |
youi |
1.32 |
string sql; |
| 1860 |
|
|
|
| 1861 |
aga |
1.36 |
sql = "UPDATE " + dbprefix + "_xnpaccount_users SET "; |
| 1862 |
youi |
1.32 |
sql += "activate=?, "; |
| 1863 |
|
|
sql += "address=?, "; |
| 1864 |
|
|
sql += "division=?, "; |
| 1865 |
|
|
sql += "tel=?, "; |
| 1866 |
|
|
sql += "company_name=?, "; |
| 1867 |
|
|
sql += "country=?, "; |
| 1868 |
|
|
sql += "zipcode=?, "; |
| 1869 |
|
|
sql += "fax=?, "; |
| 1870 |
|
|
sql += "notice_mail=?, "; |
| 1871 |
tani |
1.73 |
sql += "notice_mail_since=? ,"; |
| 1872 |
|
|
sql += "private_item_number_limit=" + unsignedIntToString( account -> getItemNumberLimit( ) ) + " ,"; |
| 1873 |
|
|
sql += "private_index_number_limit=" + unsignedIntToString( account -> getIndexNumberLimit( ) ) + " ,"; |
| 1874 |
|
|
sql += "private_item_storage_limit=" + doubleToString( account -> getItemStorageLimit( ) ) + " "; |
| 1875 |
youi |
1.32 |
sql += "WHERE uid=?"; |
| 1876 |
|
|
|
| 1877 |
|
|
sqlcode = SQLPrepare(hstmt, (SQLCHAR*)sql.c_str(), SQL_NTS); |
| 1878 |
|
|
if( sqlcode == SQL_SUCCESS || sqlcode == SQL_SUCCESS_WITH_INFO ){ |
| 1879 |
youi |
1.39 |
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &activate, 0, &cbActivate); |
| 1880 |
aga |
1.36 |
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ADDRESS_LEN, 0, address, 0, &cbAddress); |
| 1881 |
|
|
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_DIVISION_LEN, 0, division, 0, &cbDivision); |
| 1882 |
|
|
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_TEL_LEN, 0, tel, 0, &cbTel); |
| 1883 |
|
|
SQLBindParameter(hstmt, 5, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COMPANY_NAME_LEN, 0, company_name, 0, &cbCompany_name); |
| 1884 |
|
|
SQLBindParameter(hstmt, 6, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_COUNTRY_LEN, 0, country, 0, &cbCountry); |
| 1885 |
|
|
SQLBindParameter(hstmt, 7, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_ZIPCODE_LEN, 0, zipcode, 0, &cbZipcode); |
| 1886 |
|
|
SQLBindParameter(hstmt, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, XNP_ACCOUNT_FAX_LEN, 0, fax, 0, &cbFax); |
| 1887 |
aga |
1.61 |
SQLBindParameter(hstmt, 9, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail, 0, &cbNotice_mail); |
| 1888 |
|
|
SQLBindParameter(hstmt, 10, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, ¬ice_mail_since, 0, &cbNotice_mail_since); |
| 1889 |
|
|
SQLBindParameter(hstmt, 11, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &uid, 0, &cbUid ); |
| 1890 |
youi |
1.32 |
|
| 1891 |
|
|
activate = account -> getActivate() ? 1 : 0; |
| 1892 |
aga |
1.36 |
strncpy2( (char*)address, account -> getAddress( ) , XNP_ACCOUNT_ADDRESS_LEN ); |
| 1893 |
|
|
strncpy2( (char*)division, account -> getDivision(), XNP_ACCOUNT_DIVISION_LEN ); |
| 1894 |
|
|
strncpy2( (char*)tel, account -> getTel(), XNP_ACCOUNT_TEL_LEN ); |
| 1895 |
|
|
strncpy2( (char*)company_name, account -> getCompanyName(), XNP_ACCOUNT_COMPANY_NAME_LEN ); |
| 1896 |
|
|
strncpy2( (char*)country, account -> getCountry(), XNP_ACCOUNT_COUNTRY_LEN ); |
| 1897 |
|
|
strncpy2( (char*)zipcode, account -> getZipcode(), XNP_ACCOUNT_ZIPCODE_LEN ); |
| 1898 |
|
|
strncpy2( (char*)fax, account -> getFax(), XNP_ACCOUNT_FAX_LEN ); |
| 1899 |
youi |
1.32 |
notice_mail = account -> getNoticeMail( ); |
| 1900 |
|
|
notice_mail_since = account -> getNoticeMailSince( ); |
| 1901 |
|
|
uid = account -> getUID( ); |
| 1902 |
|
|
|
| 1903 |
|
|
if( ( sqlcode = SQLExecute( hstmt ) ) == SQL_SUCCESS ){ |
| 1904 |
youi |
1.64 |
SQLLEN count = 0; |
| 1905 |
youi |
1.32 |
if( ( sqlcode = SQLRowCount( hstmt, &count ) ) == SQL_SUCCESS && count > 0 ){ |
| 1906 |
|
|
ret = RES_OK; |
| 1907 |
|
|
}else{ |
| 1908 |
|
|
string s( "SQLRowCount in updateAccount sql=" ); |
| 1909 |
|
|
s += string( sql ); |
| 1910 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1911 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1912 |
|
|
} |
| 1913 |
|
|
}else{ |
| 1914 |
youi |
1.39 |
string s( "SQLExecute in updateAccount 2 " ); |
| 1915 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1916 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 1917 |
|
|
ret = RES_DB_QUERY_ERROR; |
| 1918 |
|
|
} |
| 1919 |
|
|
}else{ |
| 1920 |
|
|
setLastErrorString( "SQLPrepare in updateAccount sql=" ); |
| 1921 |
|
|
ret = RES_ERROR; |
| 1922 |
|
|
} |
| 1923 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1924 |
|
|
}else{ |
| 1925 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in updateAccount" ); |
| 1926 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1927 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1928 |
youi |
1.32 |
ret = RES_ERROR; |
| 1929 |
youi |
1.10 |
} |
| 1930 |
youi |
1.32 |
return ret; |
| 1931 |
youi |
1.1 |
} |
| 1932 |
|
|
|
| 1933 |
|
|
/** |
| 1934 |
|
|
* |
| 1935 |
youi |
1.17 |
* criteria_tで指定された範囲のユーザIDを返す. |
| 1936 |
|
|
* ユーザIDの配列を確保してそこに書き込み,配列のアドレスを*uidsに書き込む. |
| 1937 |
|
|
* 配列のサイズを*uidsLenに書き込む |
| 1938 |
youi |
1.1 |
* |
| 1939 |
youi |
1.17 |
* @param sid セッションID |
| 1940 |
|
|
* @param cri 結果の範囲指定,ソート条件指定 |
| 1941 |
youi |
1.31 |
* @param uids ユーザのUIDの配列の出力先 |
| 1942 |
|
|
* @param uidsLen uids配列の要素数の出力先 |
| 1943 |
|
|
* @return RES_OK |
| 1944 |
|
|
* @return RES_DB_NOT_INITIALIZED |
| 1945 |
|
|
* @return RES_NO_SUCH_SESSION |
| 1946 |
|
|
* @return RES_DB_QUERY_ERROR |
| 1947 |
youi |
1.1 |
* |
| 1948 |
|
|
*/ |
| 1949 |
youi |
1.13 |
result_t dumpUids( sessionid_t sid, criteria_t* cri, userid_t** uids, int* uidsLen ) |
| 1950 |
youi |
1.1 |
{ |
| 1951 |
youi |
1.32 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 1952 |
youi |
1.17 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 1953 |
|
|
|
| 1954 |
youi |
1.32 |
result_t ret = RES_ERROR; |
| 1955 |
|
|
userid_t* dst = 0; |
| 1956 |
youi |
1.17 |
string sql; |
| 1957 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 1958 |
youi |
1.64 |
SQLLEN count = 0; |
| 1959 |
youi |
1.32 |
|
| 1960 |
|
|
|
| 1961 |
aga |
1.36 |
sql = "SELECT uid FROM " + dbprefix + "_xnpaccount_users "; |
| 1962 |
youi |
1.17 |
sql += criteria2str( cri ); |
| 1963 |
youi |
1.32 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 1964 |
|
|
*uidsLen = count; |
| 1965 |
|
|
dst = new userid_t[ *uidsLen ]; |
| 1966 |
|
|
*uids = dst; |
| 1967 |
|
|
}else{ |
| 1968 |
|
|
return RES_ERROR; |
| 1969 |
|
|
} |
| 1970 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 1971 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 1972 |
youi |
1.44 |
userid_t uid = 0; |
| 1973 |
youi |
1.56 |
SQLLEN len = 0; |
| 1974 |
youi |
1.32 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &uid, 0, &len ); |
| 1975 |
|
|
|
| 1976 |
|
|
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *uidsLen ; i++ ){ |
| 1977 |
|
|
dst[ i ] = uid; |
| 1978 |
|
|
} |
| 1979 |
|
|
|
| 1980 |
tani |
1.72 |
syslog_printf( "dumpUids succeed" ); |
| 1981 |
youi |
1.32 |
ret = RES_OK; |
| 1982 |
|
|
}else{ |
| 1983 |
|
|
string s( "SQLExecDirect in dumpUids " ); |
| 1984 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 1985 |
youi |
1.32 |
s += "sql="; |
| 1986 |
|
|
s += string( sql ); |
| 1987 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1988 |
tani |
1.72 |
syslog_printf( "dumpUids %s", getLastErrorString( ) ); |
| 1989 |
youi |
1.32 |
ret = RES_DB_QUERY_ERROR; |
| 1990 |
|
|
} |
| 1991 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 1992 |
|
|
}else{ |
| 1993 |
youi |
1.33 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in dumpUids" ); |
| 1994 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 1995 |
|
|
setLastErrorString( s.c_str( ) ); |
| 1996 |
tani |
1.72 |
syslog_printf( "dumpUids %s", getLastErrorString( ) ); |
| 1997 |
youi |
1.44 |
ret = RES_ERROR; |
| 1998 |
youi |
1.17 |
} |
| 1999 |
youi |
1.32 |
return ret; |
| 2000 |
youi |
1.1 |
} |
| 2001 |
|
|
|
| 2002 |
|
|
/** |
| 2003 |
|
|
* |
| 2004 |
youi |
1.19 |
* グループ数を返す. |
| 2005 |
|
|
* 不正なセッションIDなら0を返す. |
| 2006 |
youi |
1.1 |
* |
| 2007 |
youi |
1.19 |
* @param sid セッションID |
| 2008 |
|
|
* @return グループ数 |
| 2009 |
youi |
1.1 |
* |
| 2010 |
|
|
*/ |
| 2011 |
youi |
1.2 |
int getGroupCount( sessionid_t sid ) |
| 2012 |
youi |
1.1 |
{ |
| 2013 |
youi |
1.32 |
if( hdbc == NULL ) return 0; |
| 2014 |
youi |
1.19 |
if( !isValidSessionID( sid ) ) return 0; |
| 2015 |
|
|
|
| 2016 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 2017 |
|
|
SQLHANDLE hstmt = NULL; |
| 2018 |
youi |
1.19 |
string sql; |
| 2019 |
youi |
1.32 |
int ret = 0; |
| 2020 |
youi |
1.19 |
|
| 2021 |
|
|
//グループ数を求める |
| 2022 |
aga |
1.36 |
sql = "SELECT COUNT(*) FROM " + dbprefix + "_xnpaccount_groups"; |
| 2023 |
youi |
1.32 |
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2024 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2025 |
|
|
SQLUINTEGER count = 0; |
| 2026 |
youi |
1.56 |
SQLLEN len = 0; |
| 2027 |
youi |
1.32 |
SQLBindCol( hstmt, 1, SQL_C_ULONG, &count, 0, &len ); |
| 2028 |
|
|
if( ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS ){ |
| 2029 |
|
|
ret = count; |
| 2030 |
|
|
}else { |
| 2031 |
|
|
string s( "SQLFetch in getGroupCount sql=" ); |
| 2032 |
|
|
s += string( sql ); |
| 2033 |
|
|
setLastErrorString( s.c_str( ) ); |
| 2034 |
|
|
ret = 0; |
| 2035 |
|
|
} |
| 2036 |
|
|
}else{ |
| 2037 |
|
|
setLastErrorString( "SQLExecDirect in getGroupCount" ); |
| 2038 |
|
|
ret = 0; |
| 2039 |
|
|
} |
| 2040 |
|
|
SQLFreeHandle( SQL_HANDLE_STMT, hstmt ); |
| 2041 |
|
|
}else{ |
| 2042 |
youi |
1.55 |
string s( "SQLAllocHandle(SQL_HANDLE_STMT,...) in getGroupCount" ); |
| 2043 |
|
|
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 2044 |
|
|
setLastErrorString( s.c_str( ) ); |
| 2045 |
youi |
1.32 |
ret = 0; |
| 2046 |
youi |
1.19 |
} |
| 2047 |
youi |
1.32 |
return ret; |
| 2048 |
youi |
1.1 |
} |
| 2049 |
|
|
|
| 2050 |
|
|
/** |
| 2051 |
|
|
* |
| 2052 |
youi |
1.31 |
* 所属グループ一覧取得. |
| 2053 |
|
|
* ユーザが所属しているグループのIDを取得する |
| 2054 |
youi |
1.1 |
* |
| 2055 |
youi |
1.31 |
* @param sid セッションID |
| 2056 |
|
|
* @param uid ユーザのUID |
| 2057 |
|
|
* @param cri 結果の範囲指定,ソート条件指定 |
| 2058 |
|
|
* @param gids グループIDの配列の出力先 |
| 2059 |
|
|
* @param gidsLen gids配列の要素数の出力先 |
| 2060 |
|
|
* @return RES_DB_NOT_INITIALIZED |
| 2061 |
|
|
* @return RES_NO_SUCH_SESSION |
| 2062 |
|
|
* @return RES_NO_SUCH_USER |
| 2063 |
|
|
* @return RES_DB_QUERY_ERROR |
| 2064 |
|
|
* @return RES_OK |
| 2065 |
youi |
1.1 |
* |
| 2066 |
|
|
*/ |
| 2067 |
youi |
1.13 |
result_t getGroupsByUid( sessionid_t sid, userid_t uid, criteria_t* cri, groupid_t** gids, int* gidsLen ) |
| 2068 |
youi |
1.1 |
{ |
| 2069 |
youi |
1.32 |
if( hdbc == NULL ) return RES_DB_NOT_INITIALIZED; |
| 2070 |
youi |
1.19 |
if( !isValidSessionID( sid ) ) return RES_NO_SUCH_SESSION; |
| 2071 |
|
|
if( !uidExists( uid ) ) return RES_NO_SUCH_USER; //uidの存在をチェック |
| 2072 |
|
|
|
| 2073 |
youi |
1.32 |
result_t ret = RES_ERROR; |
| 2074 |
youi |
1.19 |
string sql; |
| 2075 |
youi |
1.32 |
SQLRETURN sqlcode; |
| 2076 |
|
|
SQLHANDLE hstmt = NULL; |
| 2077 |
youi |
1.64 |
SQLLEN count = 0; |
| 2078 |
youi |
1.19 |
groupid_t* dst = 0; |
| 2079 |
|
|
|
| 2080 |
aga |
1.36 |
sql = "SELECT gid FROM " + dbprefix + "_xnpaccount_groups_users_link"; |
| 2081 |
youi |
1.19 |
sql += " WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 2082 |
|
|
sql += criteria2str( cri ); |
| 2083 |
youi |
1.32 |
if( countResultRows( sql.c_str(), &count ) == RES_OK ){ |
| 2084 |
|
|
*gidsLen = count; |
| 2085 |
|
|
dst = new groupid_t[ *gidsLen ]; |
| 2086 |
|
|
*gids = dst; |
| 2087 |
|
|
}else{ |
| 2088 |
|
|
return RES_ERROR; |
| 2089 |
youi |
1.19 |
} |
| 2090 |
|
|
|
| 2091 |
youi |
1.32 |
//所属するグループの最大個数を求める |
| 2092 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ) == SQL_SUCCESS ) { |
| 2093 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2094 |
|
|
if( count > 0 ){ |
| 2095 |
|
|
SQLHANDLE hstmt2 = NULL; |
| 2096 |
|
|
if( ( sqlcode = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt2 ) ) == SQL_SUCCESS ) { |
| 2097 |
aga |
1.36 |
sql = "SELECT gid, uid, is_admin FROM " + dbprefix + "_xnpaccount_groups_users_link"; |
| 2098 |
youi |
1.32 |
sql += " WHERE uid=" + string( unsignedIntToString( uid ) ); |
| 2099 |
|
|
sql += criteria2str( cri ); |
| 2100 |
|
|
if( ( sqlcode = SQLExecDirect( hstmt2, (SQLCHAR*)sql.c_str(), sql.length() ) ) == SQL_SUCCESS ){ |
| 2101 |
youi |
1.56 |
SQLLEN len = 0; |
| 2102 |
youi |
1.32 |
groupid_t gid = 0; |
| 2103 |
|
|
SQLBindCol( hstmt, 1, SQL_C_ULONG, &gid, 0, &len ); |
| 2104 |
|
|
for( int i = 0; ( sqlcode = SQLFetch( hstmt ) ) == SQL_SUCCESS && i < *gidsLen ; i++ ){ |
| 2105 |
|
|
dst[ i ] = gid; |
| 2106 |
|
|
} |
| 2107 |
|
|
ret = RES_OK; |
| 2108 |
|
|
}else{ |
| 2109 |
|
|
string s( "SQLExecDirect in getGroupsByUid " ); |
| 2110 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 2111 |
youi |
1.32 |
s += string( ", sql=" ) + string( sql ); |
| 2112 |
youi |
1.55 |
setLastErrorString( s.c_str( ) ); |
| 2113 |
youi |
1.32 |
ret = RES_DB_QUERY_ERROR; |
| 2114 |
|
|
} |
| 2115 |
|
|
}else{ |
| 2116 |
|
|
string s( "SQLAllocHandle in getGroupsByUid " ); |
| 2117 |
youi |
1.35 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 2118 |
youi |
1.55 |
setLastErrorString( s.c_str( ) ); |
| 2119 |
youi |
1.44 |
ret = RES_ERROR; |
| 2120 |
youi |
1.32 |
} |
| 2121 |
|
|
}else{ |
| 2122 |
|
|
ret = RES_OK; |
| 2123 |
|
|
} |
| 2124 |
|
|
}else{ |
| 2125 |
|
|
string s( "SQLExecDirect in getGroupsByUid " ); |
| 2126 |
youi |
1.33 |
s += odbcDiagString( SQL_HANDLE_STMT, hstmt, sqlcode ); |
| 2127 |
youi |
1.32 |
s += string( ", sql=" ) + string( sql ); |
| 2128 |
youi |
1.55 |
setLastErrorString( s.c_str( ) ); |
| 2129 |
youi |
1.32 |
ret = RES_DB_QUERY_ERROR; |
| 2130 |
|
|
} |
| 2131 |
|
|
}else{ |
| 2132 |
|
|
string s( "SQLAllocHandle in getGroupsByUid " ); |
| 2133 |
youi |
1.55 |
s += odbcDiagString( SQL_HANDLE_DBC, hdbc, sqlcode ); |
| 2134 |
youi |
1.32 |
setLastErrorString( s.c_str( ) ); |
| 2135 |
youi |
1.44 |
ret = RES_ERROR; |
| 2136 |
youi |
1.19 |
} |
| 2137 |
youi |
1.32 |
return ret; |
| 2138 |
youi |
1.1 |
} |
| 2139 |
|
|
|
| 2140 |
|
|
/** |
| 2141 |
|
|
* |
| 2142 |
youi |
1.31 |
* グループ管理権限問合せ. |
| 2143 |
|
|
* ユーザにループの管理権限があるか(グループ管理者であるか)を問い合わせる. |
| 2144 |
|
|
* ユーザやグループが存在しないなどの異常の場合,falseを返す. |
| 2145 |
youi |
1.1 |
* |
| 2146 |
youi |
1.31 |
* @param sid セッションID |
| 2147 |
|
|
* @param gid グループのUID |
| 2148 |
|
|
* @param uid ユーザのUID |
| 2149 |
|
|
* @return true 管理権限あり |
| 2150 |
|
|
* @return false 管理権限なし,または不明 |
| 2151 |
youi |
1.1 |
* |
| 2152 |
|
|
*/ |
| 2153 |
youi |
1.2 |
bool isGroupAdmin( sessionid_t sid, groupid_t gid, userid_t uid ) |
| 2154 |
youi |
1.1 |
{ |
| 2155 |
youi |
1.32 |
if( hdbc == NULL ) return false; |
| 2156 |
youi |
1.19 |
if( !isValidSessionID( sid ) ) return false; |
| 2157 |
|
|
if( !uidExists( uid ) ) return false; |
| 2158 |
|
|
if( !gidExists( gid ) ) return false; |
| 2159 |
|
|
|
| 2160 |
youi |
1.32 |
bool ret = false; |
| 2161 |
youi |
1.19 |
string sql; |
| 2162 |
youi |
1.64 |
SQLLEN count = 0; |
| 2163 |
youi |
1.19 |
|
| 2164 |
aga |
1.36 |
sql = "SELECT * FROM " + dbprefix |
|