Develop and Download Open Source Software

Browse CVS Repository

Annotation of /xoonips/AL/commonal.cc

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


Revision 1.81 - (hide annotations) (download) (as text)
Fri Mar 11 00:34:57 2005 UTC (19 years, 1 month ago) by tani
Branch: MAIN
Changes since 1.80: +50 -11 lines
File MIME type: text/x-c++src
・「・、・ニ・爨ホ・「・ッ・サ・ケク「・チ・ァ・テ・ッ、ヒcertify_stateトノイテ.

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