PageRenderTime 51ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/trunk/source/PostGISGDO/PGSRecordset.cpp

#
C++ | 5121 lines | 3996 code | 433 blank | 692 comment | 806 complexity | c340f46aa961673929493a677456d12a MD5 | raw file
Possible License(s): Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. // Copyright 2011 Intergraph Corporation
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "PGSRecordset.hpp"
  15. #include "../Common/LogFiles.hpp"
  16. #include "../Common/PGtoGDOmaps.hpp"
  17. #include "../Common/VarUtils.hpp"
  18. #include "../Common/GDOtoEWKB.hpp"
  19. #include "../Common/pg_const.h"
  20. #include <stdio.h>
  21. #include "PostGISGDO.hpp"
  22. #include "PostGIS.rh"
  23. LPWSTR GetTableName(LPWSTR sSQL)
  24. {
  25. LPWSTR sRes = NULL;
  26. if(!wcschr(sSQL, ' '))
  27. {
  28. sRes = (LPWSTR)malloc((wcslen(sSQL) + 1)*sizeof(wchar_t));
  29. wcscpy(sRes, sSQL);
  30. }
  31. else
  32. {
  33. LPWSTR sFrom = wcsstr(sSQL, L" FROM ");
  34. if(!sFrom) sFrom = wcsstr(sSQL, L" from ");
  35. if(!sFrom) sFrom = wcsstr(sSQL, L" From ");
  36. if(sFrom)
  37. {
  38. sFrom += 6;
  39. while((sFrom[0] == ' ') && (sFrom[0] != 0))
  40. {
  41. sFrom++;
  42. }
  43. int slen = wcslen(sFrom);
  44. LPWSTR sSpace = wcschr(sFrom, ' ');
  45. LPWSTR sFirstDblQ = wcschr(sFrom, '\"');
  46. bool bDoubleQuoted = false;
  47. if(sFirstDblQ)
  48. {
  49. if(sSpace)
  50. {
  51. if(sFirstDblQ < sSpace) bDoubleQuoted = true;
  52. else slen = sSpace - sFrom;
  53. }
  54. else bDoubleQuoted = true;
  55. }
  56. else if(sSpace) slen = sSpace - sFrom;
  57. if(bDoubleQuoted)
  58. {
  59. LPWSTR sNextDblQ = wcschr(sFirstDblQ + 1, '\"');
  60. LPWSTR sDot = wcschr(sFrom, '.');
  61. if(sDot)
  62. {
  63. if(sDot < sFirstDblQ)
  64. {
  65. if(sNextDblQ) slen = sNextDblQ - sFrom + 1;
  66. }
  67. else if(sNextDblQ)
  68. {
  69. if(sDot == sNextDblQ + 1)
  70. {
  71. sDot++;
  72. if(sDot[0] == '\"')
  73. {
  74. sDot++;
  75. sNextDblQ = wcschr(sDot, '\"');
  76. if(sNextDblQ) slen = sNextDblQ - sFrom + 1;
  77. }
  78. else
  79. {
  80. sSpace = wcschr(sDot, ' ');
  81. if(sSpace) slen = sSpace - sFrom;
  82. }
  83. }
  84. else slen = sNextDblQ - sFrom + 1;
  85. }
  86. }
  87. else
  88. {
  89. if(sNextDblQ) slen = sNextDblQ - sFrom + 1;
  90. }
  91. }
  92. sRes = (LPWSTR)malloc((slen + 1)*sizeof(wchar_t));
  93. wcsncpy(sRes, sFrom, slen);
  94. sRes[slen] = 0;
  95. #if DBGLEVEL > 2
  96. WriteMallocReport(1, slen, wcslen(sRes));
  97. #endif
  98. }
  99. else
  100. {
  101. // the table name contains space(s}. If it is correctly enclosed
  102. // double quotes, then it should work
  103. sRes = (LPWSTR)malloc((wcslen(sSQL) + 1)*sizeof(wchar_t));
  104. wcscpy(sRes, sSQL);
  105. }
  106. }
  107. return(sRes);
  108. }
  109. bool IsMetatable(PConnStruct pConnStruct, LPSTR sName)
  110. {
  111. if(stricmp(pConnStruct->sGAlias, sName) == 0) return(true);
  112. bool bTrans = (pConnStruct->iSysTrans | pConnStruct->iGdoTrans);
  113. int iLen = 40 + strlen(pConnStruct->sGAlias) + strlen(sName);
  114. LPSTR sSql = (LPSTR)malloc(iLen*sizeof(char));
  115. sprintf(sSql, "select * from %s where tablename = '%s'",
  116. pConnStruct->sGAlias, sName);
  117. #if DBGLEVEL > 2
  118. WriteMallocReport(2, iLen - 1, strlen(sSql));
  119. #endif
  120. SetSP(pConnStruct->pConn, bTrans);
  121. //LPSTR lsCmd = GetSaveSQL(sSql, bTrans);
  122. PGresult *res = PQexec(pConnStruct->pConn, sSql);
  123. //free(lsCmd);
  124. free(sSql);
  125. if(PQresultStatus(res) != PGRES_TUPLES_OK)
  126. {
  127. PQclear(res);
  128. RollbackSP(pConnStruct->pConn, bTrans);
  129. return(false);
  130. }
  131. long nrows = PQntuples(res);
  132. PQclear(res);
  133. ReleaseSP(pConnStruct->pConn, bTrans);
  134. return(nrows > 0);
  135. /*if(stricmp(pConnStruct->sGFeatures, sName) == 0) return(true);
  136. if(stricmp(pConnStruct->sFieldLookup, sName) == 0) return(true);
  137. if(stricmp(pConnStruct->sAttributeProperties, sName) == 0) return(true);
  138. if(stricmp(pConnStruct->sGeometryProperties, sName) == 0) return(true);
  139. if(stricmp(pConnStruct->sCoordSystems, sName) == 0) return(true);
  140. if(stricmp(pConnStruct->sModTables, sName) == 0) return(true);
  141. if(stricmp(pConnStruct->sModLog, sName) == 0) return(true);
  142. if(stricmp(pConnStruct->sPickLists, sName) == 0) return(true);
  143. return(false);*/
  144. }
  145. // FldExtendedPropertySet
  146. FldExtendedPropertySet::FldExtendedPropertySet(IUnknown *pUnkOuter, ITypeLib *ALib) :
  147. CCOMDispatch(pUnkOuter, ALib, 0)
  148. {
  149. #if DBGLEVEL > 1
  150. WriteLogFile("FldExtendedPropertySet::FldExtendedPropertySet-1\r\n", true);
  151. #endif // DBGLEVEL
  152. m_lSinglePass = 0;
  153. m_lCache = 0;
  154. m_pField = NULL;
  155. }
  156. FldExtendedPropertySet::FldExtendedPropertySet(IUnknown *pUnkOuter, ITypeLib *ALib,
  157. int iIndex) : CCOMDispatch(pUnkOuter, ALib, iIndex)
  158. {
  159. #if DBGLEVEL > 1
  160. WriteLogFile("FldExtendedPropertySet::FldExtendedPropertySet-2\r\n", true);
  161. #endif // DBGLEVEL
  162. m_lSinglePass = 0;
  163. m_lCache = 0;
  164. m_pField = NULL;
  165. }
  166. FldExtendedPropertySet::~FldExtendedPropertySet()
  167. {
  168. #if DBGLEVEL > 1
  169. WriteLogFile("FldExtendedPropertySet::~FldExtendedPropertySet\r\n", true);
  170. #endif // DBGLEVEL
  171. }
  172. HRESULT FldExtendedPropertySet::QueryInterface(REFIID iid, void **ppvObject)
  173. {
  174. #if DBGLEVEL > 2
  175. WriteLogFile("FldExtendedPropertySet::QueryInterface\r\n", true);
  176. #endif // DBGLEVEL
  177. HRESULT hres = CCOMDispatch::QueryInterface(iid, ppvObject);
  178. if(hres != S_OK)
  179. {
  180. if(IsEqualIID(iid, DIID_ExtendedPropertySet))
  181. {
  182. hres = S_OK;
  183. *ppvObject = this;
  184. ((IUnknown*)*ppvObject)->AddRef();
  185. }
  186. else
  187. {
  188. hres = E_NOINTERFACE;
  189. #if DBGLEVEL > 2
  190. char buf[128];
  191. FormatGuid(buf, "Unknown Interface: ", "\r\n", iid);
  192. WriteLogFile(buf, true);
  193. #endif // DBGLEVEL
  194. }
  195. }
  196. return(hres);
  197. }
  198. ULONG FldExtendedPropertySet::Release()
  199. {
  200. ULONG lRest;
  201. IUnknown *pUnkOuter = m_pUnkOuter;
  202. if(pUnkOuter) lRest = pUnkOuter->Release();
  203. else lRest = --m_lRefCount;
  204. #if DBGLEVEL > 2
  205. char buf[64];
  206. if(pUnkOuter) sprintf(buf, "FldExtendedPropertySet::Release (aggregated) - %d\r\n", lRest);
  207. else sprintf(buf, "FldExtendedPropertySet::Release - %d\r\n", lRest);
  208. WriteLogFile(buf, true);
  209. #endif // DBGLEVEL
  210. if(pUnkOuter || (lRest > 0)) return lRest;
  211. delete(this);
  212. return(0);
  213. }
  214. HRESULT FldExtendedPropertySet::GetValue(BSTR PropertyName, VARIANT *Value)
  215. {
  216. #if DBGLEVEL > 0
  217. WriteLogFile("FldExtendedPropertySet::GetValue\r\n ", true);
  218. WriteLogFile("Name: ", false);
  219. WriteLogFile(PropertyName, false);
  220. WriteLogFile("\r\n", false);
  221. if(m_pField)
  222. {
  223. WriteLogFile(" Field Name: ", false);
  224. WriteLogFile(m_pField->GetNamePtr(), false);
  225. WriteLogFile("\r\n", false);
  226. WriteLogFile(" Field Table Name: ", false);
  227. WriteLogFile(m_pField->GetTblNamePtr(), false);
  228. WriteLogFile("\r\n", false);
  229. }
  230. #endif // DBGLEVEL
  231. if(!Value) return(E_POINTER);
  232. if(wcsicmp(PropertyName, L"Single Pass") == 0)
  233. {
  234. VariantClear(Value);
  235. Value->vt = VT_I4;
  236. Value->lVal = m_lSinglePass;
  237. return(S_OK);
  238. }
  239. else if(wcsicmp(PropertyName, L"Cache") == 0)
  240. {
  241. VariantClear(Value);
  242. Value->vt = VT_I4;
  243. Value->lVal = m_lCache;
  244. return(S_OK);
  245. }
  246. else if(wcsicmp(PropertyName, L"Key") == 0)
  247. {
  248. VariantClear(Value);
  249. if(m_pField)
  250. {
  251. Value->vt = VT_BOOL;
  252. if(m_pField->IsKeyField()) Value->boolVal = VARIANT_TRUE;
  253. else Value->boolVal = VARIANT_FALSE;
  254. return(S_OK);
  255. }
  256. }
  257. /*else if(wcsicmp(PropertyName, L"Description") == 0)
  258. {
  259. Value->vt = VT_BSTR;
  260. Value->bstrVal = SysAllocString(L"Desc");
  261. return(S_OK);
  262. }
  263. else if(wcsicmp(PropertyName, L"GeometryType") == 0)
  264. {
  265. if(m_pField)
  266. {
  267. Value->vt = VT_I4;
  268. Value->lVal = m_pField->GetGeomType();
  269. return(S_OK);
  270. }
  271. }
  272. else if(wcsicmp(PropertyName, L"PrimaryGeometryFlag") == 0)
  273. {
  274. if(m_pField)
  275. {
  276. Value->vt = VT_BOOL;
  277. Value->boolVal = VARIANT_FALSE;
  278. return(S_OK);
  279. }
  280. }
  281. else if(wcsicmp(PropertyName, L"GCoordSystemGUID") == 0)
  282. {
  283. if(m_pField)
  284. {
  285. return(m_pField->get_CoordSystemGUID(Value));
  286. }
  287. }
  288. else if(wcsicmp(PropertyName, L"Locatable") == 0)
  289. {
  290. Value->vt = VT_BOOL;
  291. Value->boolVal = VARIANT_TRUE;
  292. return(S_OK);
  293. }
  294. else if(wcsicmp(PropertyName, L"Type") == 0)
  295. {
  296. if(m_pField)
  297. {
  298. Value->vt = VT_I2;
  299. Value->iVal = m_pField->GetType();
  300. return(S_OK);
  301. }
  302. }
  303. else if(wcsicmp(PropertyName, L"Displayable") == 0)
  304. {
  305. Value->vt = VT_BOOL;
  306. Value->boolVal = VARIANT_TRUE;
  307. return(S_OK);
  308. }
  309. else if(wcsicmp(PropertyName, L"Format") == 0)
  310. {
  311. Value->vt = VT_BSTR;
  312. Value->bstrVal = SysAllocString(L"general");
  313. return(S_OK);
  314. }
  315. else if(wcsicmp(PropertyName, L"Precision") == 0)
  316. {
  317. if((m_pField->GetType() == 7) || m_pField->GetType() == 8))
  318. {
  319. Value->vt = VT_I4;
  320. Value->lVal = 8;
  321. return(S_OK);
  322. }
  323. }*/
  324. Value->vt = VT_NULL;
  325. //return(S_OK);
  326. return(E_NOTIMPL);
  327. }
  328. HRESULT FldExtendedPropertySet::SetValue(BSTR PropertyName, VARIANT Value, long *Status)
  329. {
  330. #if DBGLEVEL > 0
  331. WriteLogFile("FldExtendedPropertySet::SetValue\r\n ", true);
  332. WriteLogFile("Name: ", false);
  333. WriteLogFile(PropertyName, false);
  334. WriteLogFile("\r\n", false);
  335. #endif // DBGLEVEL
  336. if(wcsicmp(PropertyName, L"Single Pass") == 0)
  337. {
  338. m_lSinglePass = VarToLong(Value);
  339. *Status = S_OK;
  340. return(S_OK);
  341. }
  342. else if(wcsicmp(PropertyName, L"Cache") == 0)
  343. {
  344. m_lCache = VarToLong(Value);
  345. *Status = S_OK;
  346. return(S_OK);
  347. }
  348. return(E_NOTIMPL);
  349. }
  350. void FldExtendedPropertySet::SetTDField(GTDField *pField)
  351. {
  352. m_pField = pField;
  353. return;
  354. }
  355. // GField
  356. GField::GField(IUnknown *pUnkOuter, ITypeLib *ALib) : CCOMDispatch(pUnkOuter, ALib, 20)
  357. {
  358. #if DBGLEVEL > 1
  359. WriteLogFile("GField::GField-1\r\n", true);
  360. #endif // DBGLEVEL
  361. m_sOrigName = NULL;
  362. m_wsName = NULL;
  363. m_pConnStruct = NULL;
  364. m_pExt = NULL;
  365. m_pLitConv = NULL;
  366. m_sNewIdCmd = NULL;
  367. m_sGenIdCmd = NULL;
  368. m_pvBuffer = NULL;
  369. InitFldAttrs(&m_cAttrs);
  370. VariantInit(&m_vNewVal);
  371. m_vNewVal.vt = VT_EMPTY;
  372. m_iSpecType = 0;
  373. m_iSpecField = 0;
  374. m_pSpecField = NULL;
  375. m_bIsMetatable = false;
  376. }
  377. GField::GField(IUnknown *pUnkOuter, ITypeLib *ALib, int iIndex) :
  378. CCOMDispatch(pUnkOuter, ALib, iIndex)
  379. {
  380. #if DBGLEVEL > 1
  381. WriteLogFile("GField::GField-2\r\n", true);
  382. #endif // DBGLEVEL
  383. m_sOrigName = NULL;
  384. m_wsName = NULL;
  385. m_pConnStruct = NULL;
  386. m_pExt = NULL;
  387. m_pLitConv = NULL;
  388. m_sNewIdCmd = NULL;
  389. m_sGenIdCmd = NULL;
  390. m_pvBuffer = NULL;
  391. InitFldAttrs(&m_cAttrs);
  392. VariantInit(&m_vNewVal);
  393. m_vNewVal.vt = VT_EMPTY;
  394. m_iSpecType = 0;
  395. m_iSpecField = 0;
  396. m_pSpecField = NULL;
  397. m_bIsMetatable = false;
  398. }
  399. GField::~GField()
  400. {
  401. #if DBGLEVEL > 1
  402. WriteLogFile("GField::~GField\r\n", true);
  403. #endif // DBGLEVEL
  404. if(m_pSpecField) m_pSpecField->Release();
  405. VariantClear(&m_vNewVal);
  406. ClearFldAttrs(&m_cAttrs);
  407. if(m_sGenIdCmd) free(m_sGenIdCmd);
  408. if(m_sNewIdCmd) free(m_sNewIdCmd);
  409. if(m_pExt) m_pExt->SetOuter(NULL);
  410. if(m_pLitConv) m_pLitConv->SetOuter(NULL);
  411. if(m_wsName) free(m_wsName);
  412. if(m_sOrigName) free(m_sOrigName);
  413. }
  414. HRESULT GField::QueryInterface(REFIID iid, void **ppvObject)
  415. {
  416. #if DBGLEVEL > 2
  417. WriteLogFile("GField::QueryInterface\r\n", true);
  418. #endif // DBGLEVEL
  419. HRESULT hres = CCOMDispatch::QueryInterface(iid, ppvObject);
  420. if(hres != S_OK)
  421. {
  422. if(IsEqualIID(iid, DIID_GField))
  423. {
  424. hres = S_OK;
  425. *ppvObject = this;
  426. ((IUnknown*)*ppvObject)->AddRef();
  427. }
  428. else
  429. {
  430. hres = E_NOINTERFACE;
  431. #if DBGLEVEL > 2
  432. char buf[128];
  433. FormatGuid(buf, "Unknown Interface: ", "\r\n", iid);
  434. WriteLogFile(buf, true);
  435. #endif // DBGLEVEL
  436. }
  437. }
  438. return(hres);
  439. }
  440. ULONG GField::Release()
  441. {
  442. ULONG lRest;
  443. IUnknown *pUnkOuter = m_pUnkOuter;
  444. if(pUnkOuter) lRest = pUnkOuter->Release();
  445. else lRest = --m_lRefCount;
  446. #if DBGLEVEL > 2
  447. char buf[64];
  448. if(pUnkOuter) sprintf(buf, "GField::Release (aggregated) - %d\r\n", lRest);
  449. else sprintf(buf, "GField::Release - %d\r\n", lRest);
  450. WriteLogFile(buf, true);
  451. #endif // DBGLEVEL
  452. if(pUnkOuter || (lRest > 0)) return lRest;
  453. delete(this);
  454. return(0);
  455. }
  456. HRESULT GField::get_Value(VARIANT *pValue)
  457. {
  458. #if DBGLEVEL > 0
  459. WriteLogFile("GField::get_Value (", true);
  460. WriteLogFile(m_wsName, false);
  461. WriteLogFile(")\r\n", false);
  462. GFields *pFlds = (GFields*)m_pUnkOuter;
  463. GRecordset *pRS = pFlds->GetParentRecordset();
  464. WriteLogFile(" Recordset (", false);
  465. WriteLogFile(pRS->GetNamePtr(), false);
  466. WriteLogFile(")\r\n", false);
  467. #endif // DBGLEVEL
  468. if(m_iSpecField == 1)
  469. {
  470. HRESULT hres = m_pSpecField->get_Value(pValue);
  471. if(pValue->vt > VT_NULL) return(hres);
  472. }
  473. if(!pValue) return(E_POINTER);
  474. //if(!m_pvBuffer) return(E_POINTER);
  475. // It looks like GeoMedia is able to pass an uninitialized VARIANT into
  476. // this method. When the vt is somehow od (e.g. 83 in our case),
  477. // the system does not know how to clear it and refuses to copy into it
  478. // So we try to clear it and if it fails, we simply set the vt to empty
  479. //VariantClear(pValue);
  480. pValue->vt = VT_EMPTY;
  481. // end of hack
  482. if(m_vNewVal.vt > VT_EMPTY) VariantCopy(pValue, &m_vNewVal);
  483. else if(m_pvBuffer) VariantCopy(pValue, m_pvBuffer);
  484. /*WriteVariantToLogFile(L" Value: ", *pValue);
  485. char buf[32];
  486. sprintf(buf, " VType: %d\r\n", pValue->vt);
  487. WriteLogFile(buf, false);*/
  488. return(S_OK);
  489. }
  490. HRESULT GField::set_Value(VARIANT pValue)
  491. {
  492. ValidateVariant(&pValue);
  493. #if DBGLEVEL > 0
  494. WriteLogFile("GField::set_Value\r\n", true);
  495. WriteLogFile(" Field name: ", false);
  496. WriteLogFile(m_wsName, false);
  497. WriteVariantToLogFile(L"\r\n Value: ", pValue);
  498. char buf[32];
  499. sprintf(buf, " VType: %d\r\n", pValue.vt);
  500. WriteLogFile(buf, false);
  501. #endif // DBGLEVEL
  502. if(m_iSpecField > 0) m_pSpecField->set_Value(pValue);
  503. // hack for G/I Toolkit
  504. if((pValue.vt == VT_BSTR) && (m_cAttrs.iType < 8))
  505. {
  506. int iVal;
  507. float fltVal;
  508. switch(m_cAttrs.iType)
  509. {
  510. case 1:
  511. VariantClear(&m_vNewVal);
  512. m_vNewVal.vt = VT_BOOL;
  513. m_vNewVal.boolVal = (wcslen(pValue.bstrVal) > 0) &&
  514. ((pValue.bstrVal[0] == 'T') || (pValue.bstrVal[0] == 't'));
  515. return(S_OK);
  516. case 2:
  517. VariantClear(&m_vNewVal);
  518. if(swscanf(pValue.bstrVal, L"%d", &iVal) == 1)
  519. {
  520. m_vNewVal.vt = VT_UI1;
  521. m_vNewVal.bVal = (BYTE)iVal;
  522. }
  523. return(S_OK);
  524. case 3:
  525. VariantClear(&m_vNewVal);
  526. if(swscanf(pValue.bstrVal, L"%d", &iVal) == 1)
  527. {
  528. m_vNewVal.vt = VT_I2;
  529. m_vNewVal.iVal = iVal;
  530. }
  531. return(S_OK);
  532. case 4:
  533. VariantClear(&m_vNewVal);
  534. if(swscanf(pValue.bstrVal, L"%d", &iVal) == 1)
  535. {
  536. m_vNewVal.vt = VT_I4;
  537. m_vNewVal.lVal = iVal;
  538. }
  539. return(S_OK);
  540. case 5:
  541. VariantClear(&m_vNewVal);
  542. m_vNewVal.vt = VT_CY;
  543. m_vNewVal.cyVal.int64 = CurrencyFromBSTR(pValue.bstrVal, m_pConnStruct->sDecSep);
  544. return(S_OK);
  545. case 6:
  546. VariantClear(&m_vNewVal);
  547. if(swscanf(pValue.bstrVal, L"%f", &fltVal) == 1)
  548. {
  549. m_vNewVal.vt = VT_R4;
  550. m_vNewVal.fltVal = fltVal;
  551. }
  552. return(S_OK);
  553. case 7:
  554. VariantClear(&m_vNewVal);
  555. if(swscanf(pValue.bstrVal, L"%f", &fltVal) == 1)
  556. {
  557. m_vNewVal.vt = VT_R8;
  558. m_vNewVal.dblVal = fltVal;
  559. }
  560. return(S_OK);
  561. }
  562. }
  563. // end of hack
  564. VariantCopy(&m_vNewVal, &pValue);
  565. return(S_OK);
  566. }
  567. HRESULT GField::get_AllowZeroLength(VARIANT_BOOL *pAllow)
  568. {
  569. #if DBGLEVEL > 0
  570. WriteLogFile("GField::get_AllowZeroLength\r\n", true);
  571. #endif // DBGLEVEL
  572. if(!pAllow) return(E_POINTER);
  573. /*if((m_iSpecType == 2) && (wcsicmp(m_wsName, L"csguid") == 0))
  574. {
  575. *pAllow = VARIANT_FALSE;
  576. return(S_OK);
  577. }*/
  578. *pAllow = VARIANT_TRUE;
  579. return(S_OK);
  580. }
  581. HRESULT GField::set_AllowZeroLength(VARIANT_BOOL pAllow)
  582. {
  583. #if DBGLEVEL > 0
  584. WriteLogFile("GField::set_AllowZeroLength\r\n", true);
  585. #endif // DBGLEVEL
  586. return(E_NOTIMPL);
  587. }
  588. HRESULT GField::get_Attributes(long *pAttr)
  589. {
  590. #if DBGLEVEL > 0
  591. WriteLogFile("GField::get_Attributes\r\n", true);
  592. #endif // DBGLEVEL
  593. if(!pAttr) return(E_POINTER);
  594. *pAttr = m_cAttrs.lAttr;
  595. return(S_OK);
  596. }
  597. HRESULT GField::set_Attributes(long pAttr)
  598. {
  599. #if DBGLEVEL > 0
  600. WriteLogFile("GField::set_Attributes\r\n", true);
  601. #endif // DBGLEVEL
  602. return(E_NOTIMPL);
  603. }
  604. HRESULT GField::get_CollatingOrder(long *pOrder)
  605. {
  606. #if DBGLEVEL > 0
  607. WriteLogFile("GField::get_CollatingOrder\r\n", true);
  608. #endif // DBGLEVEL
  609. if(!pOrder) return(E_POINTER);
  610. *pOrder = 0;
  611. return(S_OK);
  612. }
  613. HRESULT GField::get_CoordSystemGUID(VARIANT *CSGuid)
  614. {
  615. #if DBGLEVEL > 0
  616. WriteLogFile("GField::get_CoordSystemGUID\r\n", true);
  617. #endif // DBGLEVEL
  618. if(!CSGuid) return(E_POINTER);
  619. if((m_cAttrs.ulSrid == 0) && (!m_cAttrs.sCSGuid[0])) return(E_FAIL);
  620. VariantClear(CSGuid);
  621. if(m_cAttrs.sCSGuid[0])
  622. {
  623. CSGuid->vt = VT_BSTR;
  624. CSGuid->bstrVal = SysAllocString(m_cAttrs.sCSGuid);
  625. }
  626. else
  627. {
  628. VARIANT *pRow = FindCSTableRow(&m_pConnStruct->cCSTable,
  629. m_cAttrs.ulSrid);
  630. if(pRow) VariantCopy(CSGuid, &pRow[1]);
  631. else CSGuid->vt = VT_NULL;
  632. }
  633. #if DBGLEVEL > 0
  634. WriteVariantToLogFile(L"CS GUID: ", *CSGuid);
  635. #endif // DBGLEVEL
  636. return(S_OK);
  637. }
  638. HRESULT GField::set_CoordSystemGUID(VARIANT CSGuid)
  639. {
  640. #if DBGLEVEL > 0
  641. WriteLogFile("GField::set_CoordSystemGUID\r\n", true);
  642. #endif // DBGLEVEL
  643. return(E_NOTIMPL);
  644. }
  645. HRESULT GField::get_DataUpdatable(VARIANT_BOOL *pUpdatable)
  646. {
  647. #if DBGLEVEL > 0
  648. WriteLogFile("GField::get_DataUpdatable\r\n", true);
  649. #endif // DBGLEVEL
  650. if(!pUpdatable) return(E_POINTER);
  651. if(m_cAttrs.bUpdatable) *pUpdatable = VARIANT_TRUE;
  652. else *pUpdatable = VARIANT_FALSE;
  653. return(S_OK);
  654. }
  655. HRESULT GField::set_DefaultValue(BSTR pValue)
  656. {
  657. #if DBGLEVEL > 0
  658. WriteLogFile("GField::set_DefaultValue\r\n", true);
  659. #endif // DBGLEVEL
  660. return(E_NOTIMPL);
  661. }
  662. HRESULT GField::get_DefaultValue(BSTR *pValue)
  663. {
  664. #if DBGLEVEL > 0
  665. WriteLogFile("GField::get_DefaultValue\r\n", true);
  666. #endif // DBGLEVEL
  667. if(!pValue) return(E_POINTER);
  668. //if(*pValue) SysFreeString(*pValue);
  669. *pValue = NULL;
  670. if(m_cAttrs.wsDefVal) *pValue = SysAllocString(m_cAttrs.wsDefVal);
  671. else *pValue = SysAllocString(L"");
  672. return(S_OK);
  673. }
  674. HRESULT GField::get_Name(BSTR *pName)
  675. {
  676. #if DBGLEVEL > 0
  677. WriteLogFile("GField::get_Name\r\n", true);
  678. #if DBGLEVEL > 2
  679. WriteLogFile(" FieldName: ", false);
  680. WriteLogFile(m_wsName, false);
  681. if(m_cAttrs.wsTblName)
  682. {
  683. WriteLogFile("\r\n TableName: ", false);
  684. WriteLogFile(m_cAttrs.wsTblName, false);
  685. }
  686. WriteLogFile("\r\n", false);
  687. #endif // DBGLEVEL
  688. #endif // DBGLEVEL
  689. if(!pName) return(E_POINTER);
  690. //if(*pName) SysFreeString(*pName);
  691. // Hack for GCoordSystem table
  692. // at some point, GeoMedia requires that the GCoordSystem table fields
  693. // are in uppercase
  694. if(m_iSpecType == 2)
  695. {
  696. if(m_wsName)
  697. {
  698. wchar_t wsbuf[64];
  699. wcscpy(wsbuf, m_wsName);
  700. _wcsupr(wsbuf);
  701. *pName = SysAllocString(wsbuf);
  702. }
  703. else *pName = SysAllocString(L"");
  704. return(S_OK);
  705. }
  706. if(m_wsName) *pName = SysAllocString(m_wsName);
  707. else *pName = SysAllocString(L"");
  708. return(S_OK);
  709. }
  710. HRESULT GField::set_Name(BSTR pName)
  711. {
  712. #if DBGLEVEL > 0
  713. WriteLogFile("GField::set_Name\r\n", true);
  714. #endif // DBGLEVEL
  715. return(E_NOTIMPL);
  716. }
  717. HRESULT GField::get_Required(VARIANT_BOOL *pRequired)
  718. {
  719. #if DBGLEVEL > 0
  720. WriteLogFile("GField::get_Required\r\n", true);
  721. #endif // DBGLEVEL
  722. if(!pRequired) return(E_POINTER);
  723. if(!m_cAttrs.wsTblName)
  724. {
  725. *pRequired = VARIANT_FALSE;
  726. return(S_OK);
  727. }
  728. if((m_iSpecType == 2) && (wcsicmp(m_wsName, L"csguid") == 0))
  729. {
  730. *pRequired = VARIANT_TRUE;
  731. return(S_OK);
  732. }
  733. if(m_cAttrs.bRequired) *pRequired = VARIANT_TRUE;
  734. else *pRequired = VARIANT_FALSE;
  735. return(S_OK);
  736. }
  737. HRESULT GField::set_Required(VARIANT_BOOL pRequired)
  738. {
  739. #if DBGLEVEL > 0
  740. WriteLogFile("GField::set_Required\r\n", true);
  741. #endif // DBGLEVEL
  742. return(E_NOTIMPL);
  743. }
  744. HRESULT GField::get_Size(long *pSize)
  745. {
  746. #if DBGLEVEL > 0
  747. WriteLogFile("GField::get_Size\r\n", true);
  748. #endif // DBGLEVEL
  749. if(!pSize) return(E_POINTER);
  750. *pSize = m_cAttrs.lSize;
  751. return(S_OK);
  752. }
  753. HRESULT GField::set_Size(long pSize)
  754. {
  755. #if DBGLEVEL > 0
  756. WriteLogFile("GField::set_Size\r\n", true);
  757. #endif // DBGLEVEL
  758. return(E_NOTIMPL);
  759. }
  760. HRESULT GField::get_SourceDatabase(BSTR *pDatabase)
  761. {
  762. #if DBGLEVEL > 0
  763. WriteLogFile("GField::get_SourceDatabase\r\n", true);
  764. #endif // DBGLEVEL
  765. if(!pDatabase) return(E_POINTER);
  766. //if(*pDatabase) SysFreeString(*pDatabase);
  767. *pDatabase = NULL;
  768. if(m_pConnStruct->wsServerName)
  769. *pDatabase = SysAllocString(m_pConnStruct->wsServerName);
  770. return(S_OK);
  771. }
  772. HRESULT GField::get_SourceField(BSTR *pField)
  773. {
  774. #if DBGLEVEL > 0
  775. WriteLogFile("GField::get_SourceField\r\n", true);
  776. #endif // DBGLEVEL
  777. if(!pField) return(E_POINTER);
  778. //if(*pField) SysFreeString(*pField);
  779. if(m_wsName) *pField = SysAllocString(m_wsName);
  780. else *pField = SysAllocString(L"");
  781. return(S_OK);
  782. }
  783. HRESULT GField::get_SourceTable(BSTR *pTable)
  784. {
  785. #if DBGLEVEL > 0
  786. WriteLogFile("GField::get_SourceTable\r\n", true);
  787. #endif // DBGLEVEL
  788. if(!pTable) return(E_POINTER);
  789. //if(*pTable) SysFreeString(*pTable);
  790. *pTable = NULL;
  791. if(m_cAttrs.wsTblName) *pTable = SysAllocString(m_cAttrs.wsTblName);
  792. return(S_OK);
  793. }
  794. HRESULT GField::get_SubType(long *pGeometryType)
  795. {
  796. #if DBGLEVEL > 0
  797. WriteLogFile("GField::get_SubType\r\n", true);
  798. #endif // DBGLEVEL
  799. if(!pGeometryType) return(E_POINTER);
  800. *pGeometryType = m_cAttrs.lSubType;
  801. return(S_OK);
  802. }
  803. HRESULT GField::set_SubType(long pGeometryType)
  804. {
  805. #if DBGLEVEL > 0
  806. WriteLogFile("GField::set_SubType\r\n", true);
  807. #endif // DBGLEVEL
  808. return(E_NOTIMPL);
  809. }
  810. HRESULT GField::get_Type(short *pType)
  811. {
  812. #if DBGLEVEL > 0
  813. WriteLogFile("GField::get_Type\r\n", true);
  814. #if DBGLEVEL > 2
  815. WriteLogFile(" FieldName: ", false);
  816. WriteLogFile(m_wsName, false);
  817. if(m_cAttrs.wsTblName)
  818. {
  819. WriteLogFile("\r\n TableName: ", false);
  820. WriteLogFile(m_cAttrs.wsTblName, false);
  821. }
  822. WriteLogFile("\r\n", false);
  823. #endif // DBGLEVEL
  824. char buf[32];
  825. sprintf(buf, " Type: %d\r\n", m_cAttrs.iType);
  826. WriteLogFile(buf, false);
  827. #endif // DBGLEVEL
  828. if(!pType) return(E_POINTER);
  829. *pType = m_cAttrs.iType;
  830. return(S_OK);
  831. }
  832. HRESULT GField::set_Type(short pType)
  833. {
  834. #if DBGLEVEL > 0
  835. WriteLogFile("GField::set_Type\r\n", true);
  836. #endif // DBGLEVEL
  837. return(E_NOTIMPL);
  838. }
  839. HRESULT GField::AppendChunk(VARIANT Val)
  840. {
  841. #if DBGLEVEL > 0
  842. WriteLogFile("GField::AppendChunk\r\n", true);
  843. #endif // DBGLEVEL
  844. return(E_NOTIMPL);
  845. }
  846. HRESULT GField::FieldSize(long *pSize)
  847. {
  848. #if DBGLEVEL > 0
  849. WriteLogFile("GField::FieldSize\r\n", true);
  850. #endif // DBGLEVEL
  851. if(!pSize) return(E_POINTER);
  852. if(!m_pvBuffer) return(S_FALSE);
  853. *pSize = VarGetSize(*m_pvBuffer);
  854. return(S_OK);
  855. }
  856. HRESULT GField::GetChunk(long Offset, long Bytes, VARIANT *pChunk)
  857. {
  858. #if DBGLEVEL > 0
  859. WriteLogFile("GField::GetChunk\r\n", true);
  860. #endif // DBGLEVEL
  861. if(!pChunk) return(E_POINTER);
  862. return(E_NOTIMPL);
  863. }
  864. HRESULT GField::GetExtension(BSTR Name, IDispatch * *ppGExtension)
  865. {
  866. #if DBGLEVEL > 0
  867. WriteLogFile("GField::GetExtension\r\n", true);
  868. WriteLogFile(" FieldName: ", false);
  869. WriteLogFile(m_wsName, false);
  870. if(m_cAttrs.wsTblName)
  871. {
  872. WriteLogFile("\r\n TableName: ", false);
  873. WriteLogFile(m_cAttrs.wsTblName, false);
  874. }
  875. WriteLogFile("\r\n Name: ", false);
  876. WriteLogFile(Name, false);
  877. WriteLogFile("\r\n", false);
  878. #endif // DBGLEVEL
  879. //if(m_bIsMetatable && (m_iSpecType != 2)) return(E_NOTIMPL);
  880. if(m_bIsMetatable) return(E_NOTIMPL);
  881. if(wcsicmp(Name, L"DefaultValueLiteralConversion") == 0)
  882. {
  883. //return(E_NOTIMPL);
  884. if(!m_pLitConv)
  885. {
  886. m_pLitConv = new FldLitConvExt(this,
  887. ((ITypeLib**)m_pConnStruct->ppTypeLibs)[2]);
  888. }
  889. if(!ppGExtension) return(E_POINTER);
  890. if(*ppGExtension) (*ppGExtension)->Release();
  891. m_pLitConv->AddRef();
  892. *ppGExtension = m_pLitConv;
  893. return(S_OK);
  894. }
  895. if(wcsicmp(Name, L"ExtendedPropertySet") == 0)
  896. {
  897. if(!m_pExt) return(E_NOTIMPL);
  898. if(!ppGExtension) return(E_POINTER);
  899. if(*ppGExtension) (*ppGExtension)->Release();
  900. m_pExt->AddRef();
  901. *ppGExtension = m_pExt;
  902. return(S_OK);
  903. }
  904. return(E_NOTIMPL);
  905. }
  906. LPWSTR GField::GetNamePtr()
  907. {
  908. return(m_wsName);
  909. }
  910. LPSTR GField::GetOrigNamePtr()
  911. {
  912. return(m_sOrigName);
  913. }
  914. Oid GField::GetTableOid()
  915. {
  916. return(m_cAttrs.lTblOid);
  917. }
  918. void GField::SetAttrs(PConnStruct pConnStruct, PGresult *pRes, int iPos,
  919. Oid lType, bool bUpdatable, int iSpecType, bool bMetatable)
  920. {
  921. m_pConnStruct = pConnStruct;
  922. m_pErrors = (GErrors*)m_pConnStruct->pErrors;
  923. m_iPos = iPos;
  924. m_iSpecType = iSpecType;
  925. m_bIsMetatable = bMetatable;
  926. if(m_sOrigName) free(m_sOrigName);
  927. m_sOrigName = NULL;
  928. if(m_wsName) free(m_wsName);
  929. m_wsName = NULL;
  930. LPSTR sVal = PQfname(pRes, iPos);
  931. if(sVal)
  932. {
  933. m_sOrigName = (LPSTR)malloc((strlen(sVal) + 1)*sizeof(char));
  934. strcpy(m_sOrigName, sVal);
  935. m_wsName = DBStrToWChar(sVal, m_pConnStruct->lDBEnc);
  936. }
  937. //if(!iSpecType)
  938. {
  939. m_pExt = new FldExtendedPropertySet(this,
  940. ((ITypeLib**)pConnStruct->ppTypeLibs)[1]);
  941. }
  942. m_cAttrs.lTblOid = PQftable(pRes, iPos);
  943. m_cAttrs.iTblPos = PQftablecol(pRes, iPos);
  944. m_cAttrs.bUpdatable = bUpdatable;
  945. int iMod = PQfmod(pRes, iPos);
  946. int iSize = PQfsize(pRes, iPos);
  947. m_cAttrs.lTypeOid = lType;
  948. m_cAttrs.iType = OidToGdoType(lType, iSize, iMod, &m_cAttrs.lSize);
  949. #if DBGLEVEL > 1
  950. WriteLogFile("GField::SetAttrs\r\n", true);
  951. char sbuf[128];
  952. sprintf(sbuf, " Name: %s, PG Type: %d, GDO Type: %d\r\n",
  953. m_sOrigName, lType, m_cAttrs.iType);
  954. WriteLogFile(sbuf, false);
  955. #endif // DBGLEVEL
  956. return;
  957. }
  958. int GField::UpdateField(GTableDefs *pGTbls)
  959. {
  960. GTableDef *ptd = pGTbls->FindByOid(m_cAttrs.lTblOid);
  961. GTDField *pfld = NULL;
  962. if(ptd)
  963. {
  964. ptd->BuildFromConnection();
  965. pfld = ptd->GetFieldPtrByTblPos(m_cAttrs.iTblPos);
  966. }
  967. if(pfld)
  968. {
  969. pfld->CopyAttributes(&m_cAttrs);
  970. // this was formerly intended for tables without key, however
  971. // but the oposite way seems to be usually used in GM
  972. //if(!ptd->GetHasUniqueIndex()) m_pExt->SetTDField(pfld);
  973. if(m_pExt && ptd->GetHasUniqueIndex()) m_pExt->SetTDField(pfld);
  974. }
  975. if(m_cAttrs.sDefValDef)
  976. {
  977. LPSTR sEnd = NULL;
  978. LPSTR sStart = strchr(m_cAttrs.sDefValDef, '\'');
  979. if(sStart)
  980. {
  981. sStart++;
  982. sEnd = strchr(sStart, '\'');
  983. }
  984. if(sEnd)
  985. {
  986. m_cAttrs.bUpdatable = false;
  987. m_cAttrs.lAttr &= ~32;
  988. m_cAttrs.lAttr |= 16;
  989. int ilen = sEnd - sStart;
  990. m_sNewIdCmd = (LPSTR)malloc((ilen + 38)*sizeof(char));
  991. strcpy(m_sNewIdCmd, "select last_value, is_called from ");
  992. int icurlen = strlen(m_sNewIdCmd);
  993. strncat(m_sNewIdCmd, sStart, ilen);
  994. m_sNewIdCmd[icurlen + ilen] = 0;
  995. #if DBGLEVEL > 2
  996. WriteMallocReport(4, ilen + 37, strlen(m_sNewIdCmd));
  997. #endif
  998. m_sGenIdCmd = (LPSTR)malloc((ilen + 22)*sizeof(char));
  999. strcpy(m_sGenIdCmd, "select nextval('");
  1000. icurlen = strlen(m_sGenIdCmd);
  1001. strncat(m_sGenIdCmd, sStart, ilen);
  1002. m_sGenIdCmd[icurlen + ilen] = 0;
  1003. strcat(m_sGenIdCmd, "')");
  1004. #if DBGLEVEL > 2
  1005. WriteMallocReport(5, ilen + 21, strlen(m_sGenIdCmd));
  1006. #endif
  1007. }
  1008. }
  1009. else if(m_cAttrs.wsDefVal)
  1010. {
  1011. if(m_cAttrs.iType == gdbGuid)
  1012. {
  1013. if(wcschr(m_cAttrs.wsDefVal, '(') != NULL)
  1014. {
  1015. m_cAttrs.lAttr &= ~32;
  1016. m_cAttrs.bUpdatable = false;
  1017. }
  1018. }
  1019. }
  1020. #if DBGLEVEL > 1
  1021. WriteLogFile("GField::UpdateField\r\n", true);
  1022. char sbuf[128];
  1023. sprintf(sbuf, " Name: %s, GDO Type: %d, SubType: %ld\r\n",
  1024. m_sOrigName, m_cAttrs.iType, m_cAttrs.lSubType);
  1025. #if DBGLEVEL > 2
  1026. WriteMallocReport(6, 127, strlen(sbuf));
  1027. #endif
  1028. WriteLogFile(sbuf, false);
  1029. #endif // DBGLEVEL
  1030. return(m_cAttrs.iGeomDim);
  1031. }
  1032. void GField::SetNewVal()
  1033. {
  1034. VariantClear(&m_vNewVal);
  1035. m_vNewVal.vt = VT_EMPTY;
  1036. if(m_sNewIdCmd)
  1037. {
  1038. bool bTrans = (m_pConnStruct->iSysTrans | m_pConnStruct->iGdoTrans);
  1039. SetSP(m_pConnStruct->pConn, bTrans);
  1040. //LPSTR lsCmd = GetSaveSQL(m_sNewIdCmd, bTrans);
  1041. PGresult *res = PQexecParams(m_pConnStruct->pConn, m_sNewIdCmd, 0,
  1042. NULL, NULL, NULL, NULL, 1);
  1043. //free(lsCmd);
  1044. if(PQresultStatus(res) != PGRES_TUPLES_OK)
  1045. {
  1046. WritePQErrorToLog("Spot 1: ", m_pConnStruct->pConn);
  1047. PQclear(res);
  1048. RollbackSP(m_pConnStruct->pConn, bTrans);
  1049. }
  1050. else
  1051. {
  1052. long nrows = PQntuples(res);
  1053. if(nrows > 0)
  1054. {
  1055. Oid piTypes[2];
  1056. VARIANT vVals[2];
  1057. VariantInit(&vVals[0]);
  1058. VariantInit(&vVals[1]);
  1059. DescribeFieldTypes(res, 2, piTypes);
  1060. GetRecordBin(res, 0, 2, piTypes, vVals,
  1061. m_pConnStruct->lDBEnc, m_pConnStruct->lGeomOid, NULL, m_pConnStruct->iCurrDigits);
  1062. m_vNewVal.vt = VT_I4;
  1063. if(VarToBool(vVals[1]))
  1064. m_vNewVal.lVal = VarToLong(vVals[0]) + 1;
  1065. else m_vNewVal.lVal = 1;
  1066. }
  1067. PQclear(res);
  1068. ReleaseSP(m_pConnStruct->pConn, bTrans);
  1069. }
  1070. }
  1071. else if(m_cAttrs.wsDefVal)
  1072. {
  1073. int iVal;
  1074. float fVal;
  1075. SYSTEMTIME sTime;
  1076. switch(m_cAttrs.iType)
  1077. {
  1078. case gdbBoolean:
  1079. m_vNewVal.vt = VT_BOOL;
  1080. m_vNewVal.boolVal = FALSE;
  1081. if((m_cAttrs.wsDefVal[0] == 'T') || (m_cAttrs.wsDefVal[0] == 't'))
  1082. m_vNewVal.boolVal = TRUE;
  1083. break;
  1084. case gdbByte:
  1085. if(swscanf(m_cAttrs.wsDefVal, L"%d", &iVal) == 1)
  1086. {
  1087. m_vNewVal.vt = VT_UI1;
  1088. m_vNewVal.bVal = iVal;
  1089. }
  1090. break;
  1091. case gdbInteger:
  1092. if(swscanf(m_cAttrs.wsDefVal, L"%d", &iVal) == 1)
  1093. {
  1094. m_vNewVal.vt = VT_I2;
  1095. m_vNewVal.iVal = iVal;
  1096. }
  1097. break;
  1098. case gdbLong:
  1099. if(swscanf(m_cAttrs.wsDefVal, L"%d", &iVal) == 1)
  1100. {
  1101. m_vNewVal.vt = VT_I4;
  1102. m_vNewVal.lVal = iVal;
  1103. }
  1104. break;
  1105. case gdbSingle:
  1106. if(swscanf(m_cAttrs.wsDefVal, L"%f", &fVal) == 1)
  1107. {
  1108. m_vNewVal.vt = VT_R4;
  1109. m_vNewVal.fltVal = fVal;
  1110. }
  1111. break;
  1112. case gdbDouble:
  1113. if(swscanf(m_cAttrs.wsDefVal, L"%f", &fVal) == 1)
  1114. {
  1115. m_vNewVal.vt = VT_R8;
  1116. m_vNewVal.dblVal = fVal;
  1117. }
  1118. break;
  1119. case gdbDate:
  1120. if(wcsicmp(m_cAttrs.wsDefVal, L"now()") == 0)
  1121. {
  1122. m_vNewVal.vt = VT_DATE;
  1123. GetLocalTime(&sTime);
  1124. SystemTimeToVariantTime(&sTime, &m_vNewVal.date);
  1125. }
  1126. break;
  1127. default:
  1128. if(wcschr(m_cAttrs.wsDefVal, '(') == NULL)
  1129. {
  1130. m_vNewVal.vt = VT_BSTR;
  1131. m_vNewVal.bstrVal = SysAllocString(m_cAttrs.wsDefVal);
  1132. }
  1133. // else the default value is most likely a function, which result we don't know
  1134. }
  1135. }
  1136. return;
  1137. }
  1138. void GField::SetBuffer(VARIANT *pBuffer)
  1139. {
  1140. m_pvBuffer = pBuffer;
  1141. return;
  1142. }
  1143. void GField::CancelNewVal()
  1144. {
  1145. VariantClear(&m_vNewVal);
  1146. m_vNewVal.vt = VT_EMPTY;
  1147. return;
  1148. }
  1149. bool GField::Modified()
  1150. {
  1151. return(!m_sNewIdCmd && (m_vNewVal.vt > VT_EMPTY));
  1152. }
  1153. bool GField::HasSeq()
  1154. {
  1155. return(m_sNewIdCmd);
  1156. }
  1157. VARIANT GField::GetModVal()
  1158. {
  1159. if(m_vNewVal.vt > VT_EMPTY) return(m_vNewVal);
  1160. if(m_pvBuffer) return(*m_pvBuffer);
  1161. return(m_vNewVal);
  1162. }
  1163. void GField::UpdateVal(VARIANT *pvVal)
  1164. {
  1165. VariantClear(&m_vNewVal);
  1166. m_vNewVal.vt = VT_EMPTY;
  1167. m_pvBuffer = pvVal;
  1168. return;
  1169. }
  1170. bool GField::GetRequired()
  1171. {
  1172. return(m_cAttrs.bRequired);
  1173. }
  1174. Oid GField::GetTypeOid()
  1175. {
  1176. return(m_cAttrs.lTypeOid);
  1177. }
  1178. LPSTR GField::GetSchemaNamePtr()
  1179. {
  1180. return(m_cAttrs.sOrigSchema);
  1181. }
  1182. LPSTR GField::GetTableNamePtr()
  1183. {
  1184. return(m_cAttrs.sOrigTable);
  1185. }
  1186. void GField::FillGeomInfo(PGeomInfo pgInfo)
  1187. {
  1188. pgInfo->iGdoType = m_cAttrs.iType;
  1189. pgInfo->lSubType = m_cAttrs.lSubType;
  1190. pgInfo->iGeomDim = m_cAttrs.iGeomDim;
  1191. pgInfo->ulSrid = m_cAttrs.ulSrid;
  1192. pgInfo->iPsgType = m_cAttrs.iPsgType;
  1193. return;
  1194. }
  1195. void GField::ChangeCSGuid(LPWSTR wsOldCSGuid, LPWSTR wsNewCSGuid)
  1196. {
  1197. if(wcsicmp(m_cAttrs.sCSGuid, wsOldCSGuid) == 0)
  1198. wcscpy(m_cAttrs.sCSGuid, wsNewCSGuid);
  1199. return;
  1200. }
  1201. void GField::SetSpecField(GField *pSpecFld, int iSpecFld)
  1202. {
  1203. #if DBGLEVEL > 2
  1204. char buf[64];
  1205. WriteLogFile("GField::SetSpecField\r\n", true);
  1206. WriteLogFile(" Field name: ", false);
  1207. WriteLogFile(m_wsName, false);
  1208. sprintf(buf, "\r\n SpecType: %d\r\n", iSpecFld, false);
  1209. WriteLogFile(buf, false);
  1210. #endif // DBGLEVEL
  1211. m_iSpecField = iSpecFld; // 1 - has INGR field, 2 - has Native field;
  1212. m_pSpecField = pSpecFld;
  1213. m_pSpecField->AddRef();
  1214. return;
  1215. }
  1216. void GField::SetSpecFldAttrs(unsigned long ulSrid, long iGDOGeomType,
  1217. LPSTR sSchema, LPSTR sTable)
  1218. {
  1219. #if DBGLEVEL > 2
  1220. char buf[64];
  1221. WriteLogFile("GField::SetSpecFldAttrs\r\n", true);
  1222. WriteLogFile(" Field name: ", false);
  1223. WriteLogFile(m_wsName, false);
  1224. sprintf(buf, "\r\n GeomType: %d\r\n", iGDOGeomType);
  1225. WriteLogFile(buf, false);
  1226. #endif // DBGLEVEL
  1227. m_cAttrs.sOrigSchema = sSchema;
  1228. m_cAttrs.sOrigTable = sTable;
  1229. m_cAttrs.iGeomDim = 2;
  1230. m_cAttrs.ulSrid = ulSrid;
  1231. if(iGDOGeomType == 4) // raster
  1232. {
  1233. m_cAttrs.iType = 32;
  1234. m_cAttrs.lSubType = 2;
  1235. m_cAttrs.iPsgType = 3;
  1236. }
  1237. else if(iGDOGeomType == 5) // text
  1238. {
  1239. m_cAttrs.iType = 32;
  1240. m_cAttrs.lSubType = 10;
  1241. m_cAttrs.iPsgType = 1;
  1242. }
  1243. else
  1244. {
  1245. m_cAttrs.iType = 11;
  1246. m_cAttrs.lSubType = 0;
  1247. m_cAttrs.iPsgType = 0;
  1248. m_cAttrs.iGeomDim = 0;
  1249. }
  1250. return;
  1251. }
  1252. bool GField::IsThisField(LPSTR sSchema, LPSTR sTable, LPSTR sName)
  1253. {
  1254. bool bRes = (strcmp(sTable, m_cAttrs.sOrigTable) == 0) &&
  1255. (strcmp(sName, m_sOrigName) == 0);
  1256. if(sSchema)
  1257. {
  1258. if(m_cAttrs.sOrigSchema)
  1259. bRes &= (strcmp(sSchema, m_cAttrs.sOrigSchema) == 0);
  1260. else bRes = false;
  1261. }
  1262. else bRes &= (m_cAttrs.sOrigSchema == NULL);
  1263. return(bRes);
  1264. }
  1265. // GFields
  1266. GFields::GFields(IUnknown *pUnkOuter, ITypeLib *ALib) :
  1267. _IGDynaCollection(true, pUnkOuter, ALib, 23)
  1268. {
  1269. #if DBGLEVEL > 1
  1270. WriteLogFile("GFields::GFields-1\r\n", true);
  1271. #endif // DBGLEVEL
  1272. m_pConnStruct = NULL;
  1273. m_pTblDefs = NULL;
  1274. m_iCtidCol = -1;
  1275. m_bIsMetatable = false;
  1276. m_iSpecFields = 0;
  1277. m_piListIndex = NULL;
  1278. }
  1279. GFields::GFields(IUnknown *pUnkOuter, ITypeLib *ALib, int iIndex) :
  1280. _IGDynaCollection(true, pUnkOuter, ALib, iIndex)
  1281. {
  1282. #if DBGLEVEL > 1
  1283. WriteLogFile("GFields::GFields-2\r\n", true);
  1284. #endif // DBGLEVEL
  1285. m_pConnStruct = NULL;
  1286. m_pTblDefs = NULL;
  1287. m_iCtidCol = -1;
  1288. m_bIsMetatable = false;
  1289. m_iSpecFields = 0;
  1290. m_piListIndex = NULL;
  1291. }
  1292. GFields::~GFields()
  1293. {
  1294. #if DBGLEVEL > 1
  1295. WriteLogFile("GFields::~GFields\r\n", true);
  1296. #endif // DBGLEVEL
  1297. if(m_piListIndex) free(m_piListIndex);
  1298. }
  1299. HRESULT GFields::QueryInterface(REFIID iid, void **ppvObject)
  1300. {
  1301. #if DBGLEVEL > 2
  1302. WriteLogFile("GFields::QueryInterface\r\n", true);
  1303. #endif // DBGLEVEL
  1304. HRESULT hres = _IGDynaCollection::QueryInterface(iid, ppvObject);
  1305. if(hres != S_OK)
  1306. {
  1307. if(IsEqualIID(iid, DIID_GFields))
  1308. {
  1309. hres = S_OK;
  1310. *ppvObject = this;
  1311. ((IUnknown*)*ppvObject)->AddRef();
  1312. }
  1313. else
  1314. {
  1315. hres = E_NOINTERFACE;
  1316. #if DBGLEVEL > 2
  1317. char buf[128];
  1318. FormatGuid(buf, "Unknown Interface: ", "\r\n", iid);
  1319. WriteLogFile(buf, true);
  1320. #endif // DBGLEVEL
  1321. }
  1322. }
  1323. return(hres);
  1324. }
  1325. ULONG GFields::Release()
  1326. {
  1327. ULONG lRest;
  1328. IUnknown *pUnkOuter = m_pUnkOuter;
  1329. if(pUnkOuter) lRest = pUnkOuter->Release();
  1330. else lRest = --m_lRefCount;
  1331. #if DBGLEVEL > 2
  1332. char buf[64];
  1333. if(pUnkOuter) sprintf(buf, "GFields::Release (aggregated) - %d\r\n", lRest);
  1334. else sprintf(buf, "GFields::Release - %d\r\n", lRest);
  1335. WriteLogFile(buf, true);
  1336. #endif // DBGLEVEL
  1337. if(pUnkOuter || (lRest > 0)) return lRest;
  1338. delete(this);
  1339. return(0);
  1340. }
  1341. HRESULT GFields::get_Count(short *Count)
  1342. {
  1343. #if DBGLEVEL > 0
  1344. WriteLogFile("_IGCollection::get_Count\r\n", true);
  1345. #endif // DBGLEVEL
  1346. if(!Count) return(E_POINTER);
  1347. *Count = m_iDataLen - m_iSpecFields;
  1348. return(S_OK);
  1349. }
  1350. HRESULT GFields::_NewEnum(IUnknown * *Enum)
  1351. {
  1352. #if DBGLEVEL > 0
  1353. WriteLogFile("GFields::_NewEnum\r\n", true);
  1354. #endif // DBGLEVEL
  1355. if(!Enum) return(E_POINTER);
  1356. if(*Enum) (*Enum)->Release();
  1357. *Enum = new CEnumGDO(0, m_iDataLen - m_iSpecFields, m_pData);
  1358. (*Enum)->AddRef();
  1359. return(S_OK);
  1360. }
  1361. HRESULT GFields::Append(IDispatch * Object)
  1362. {
  1363. #if DBGLEVEL > 0
  1364. WriteLogFile("GFields::Append\r\n", true);
  1365. #endif // DBGLEVEL
  1366. return(E_NOTIMPL);
  1367. }
  1368. HRESULT GFields::Delete(BSTR Name)
  1369. {
  1370. #if DBGLEVEL > 0
  1371. WriteLogFile("GFields::Delete\r\n", true);
  1372. #endif // DBGLEVEL
  1373. return(E_NOTIMPL);
  1374. }
  1375. HRESULT GFields::get_Item(VARIANT index, GField* *ppGField)
  1376. {
  1377. ValidateVariant(&index);
  1378. #if DBGLEVEL > 0
  1379. WriteLogFile("GFields::get_Item\r\n", true);
  1380. WriteVariantToLogFile(L" index: ", index);
  1381. #endif // DBGLEVEL
  1382. if(!ppGField) return(E_POINTER);
  1383. // a "get_CollectionItem" method is probably an exception from the COM
  1384. // standards - it can accept uninitialized return values, similary as
  1385. // QueryInterface method
  1386. //if(*ppGField) (*ppGField)->Release();
  1387. *ppGField = NULL;
  1388. GField *pFld = NULL;
  1389. if(index.vt == VT_BSTR) pFld = FindByWName(index.bstrVal);
  1390. else if(index.vt == (VT_BYREF | VT_BSTR))
  1391. pFld = FindByWName(*index.pbstrVal);
  1392. else
  1393. {
  1394. int i = VarToInt(index);
  1395. if(m_piListIndex) i = m_piListIndex[i];
  1396. pFld = (GField*)_IGCollection::GetItem(i);
  1397. }
  1398. if(!pFld) return(ResultFromScode(S_FALSE));
  1399. pFld->AddRef();
  1400. *ppGField = pFld;
  1401. return(S_OK);
  1402. }
  1403. void GFields::ClearAll()
  1404. {
  1405. _IGCollection::ClearAll();
  1406. return;
  1407. }
  1408. void GFields::BuildFromConn(PConnStruct pConnStruct, PGresult *pRes,
  1409. GTableDefs *pGTbls, int iCtidCol, Oid *plTypes, int iSpecType,
  1410. bool bIsMetatable)
  1411. {
  1412. m_pConnStruct = pConnStruct;
  1413. m_pTblDefs = pGTbls;
  1414. m_iCtidCol = iCtidCol;
  1415. m_bIsMetatable = bIsMetatable;
  1416. GField *pFld;
  1417. int ncols = PQnfields(pRes);
  1418. for(int i = 0; i < ncols; i++)
  1419. {
  1420. if(i != m_iCtidCol)
  1421. {
  1422. pFld = new GField(NULL, m_pTypeLib);
  1423. pFld->SetAttrs(pConnStruct, pRes, i, plTypes[i], m_iCtidCol > -1,
  1424. iSpecType, bIsMetatable);
  1425. _IGCollection::AddItem(pFld);
  1426. }
  1427. }
  1428. return;
  1429. }
  1430. GField* FindBaseField(GField *pSpecFld, int iNameLen, int iSpecPos, int iFields,
  1431. GField **ppFields)
  1432. {
  1433. bool bFound = false;
  1434. int i = 0;
  1435. GField *pFld = NULL;
  1436. LPSTR sName = pSpecFld->GetOrigNamePtr();
  1437. while(!bFound && (i < iFields))
  1438. {
  1439. if(i != iSpecPos)
  1440. {
  1441. pFld = ppFields[i++];
  1442. bFound = (strncmp(sName, pFld->GetOrigNamePtr(), iNameLen) == 0);
  1443. }
  1444. else i++;
  1445. }
  1446. return(bFound ? pFld : NULL);
  1447. }
  1448. void GFields::UpdateFields(int *piGeomDims)
  1449. {
  1450. bool bBuildIndex = false;
  1451. CGeomInfo gInfo;
  1452. GField *pFld;
  1453. for(int i = 0; i < m_iDataLen; i++)
  1454. {
  1455. pFld = (GField*)m_pData[i];
  1456. piGeomDims[i] = pFld->UpdateField(m_pTblDefs);
  1457. pFld->FillGeomInfo(&gInfo);
  1458. bBuildIndex |= (gInfo.iGdoType > 31);
  1459. }
  1460. if(bBuildIndex)
  1461. {
  1462. m_piListIndex = (int*)malloc(m_iDataLen*sizeof(int));
  1463. int i = 0;
  1464. int j = 0;
  1465. int iSpecFld, iLen;
  1466. LPSTR sName;
  1467. GField *pBaseFld;
  1468. while(i < m_iDataLen)
  1469. {
  1470. pBaseFld = NULL;
  1471. iSpecFld = 0;
  1472. m_piListIndex[i] = -1;
  1473. m_piListIndex[j] = i;
  1474. pFld = (GField*)m_pData[i++];
  1475. sName = pFld->GetOrigNamePtr();
  1476. iLen = strlen(sName);
  1477. if(iLen > 4)
  1478. {
  1479. iLen -= 4;
  1480. if(strcmp(&sName[iLen], "_igr") == 0) iSpecFld = 1;
  1481. else if(strcmp(&sName[iLen], "_nat") == 0) iSpecFld = 2;
  1482. }
  1483. if(iSpecFld > 0)
  1484. pBaseFld = FindBaseField(pFld, iLen, i - 1, m_iDataLen,
  1485. (GField**)m_pData);
  1486. if(pBaseFld)
  1487. {
  1488. if(iSpecFld == 1) piGeomDims[i - 1] = 0;
  1489. else piGeomDims[i - 1] = 2;
  1490. pBaseFld->SetSpecField(pFld, iSpecFld);
  1491. pBaseFld->FillGeomInfo(&gInfo);
  1492. pFld->SetSpecFldAttrs(gInfo.ulSrid, gInfo.lSubType,
  1493. pBaseFld->GetSchemaNamePtr(), pBaseFld->GetTableNamePtr());
  1494. m_iSpecFields++;
  1495. }
  1496. else j++;
  1497. }
  1498. }
  1499. return;
  1500. }
  1501. /*GField* GFields::FindKeyField()
  1502. {
  1503. GField *pFld;
  1504. bool bFound = false;
  1505. int i = 0;
  1506. while(!bFound && (i < GetCount()))
  1507. {
  1508. pFld = (GField*)GetItem(i++);
  1509. bFound = pFld->IsKey();
  1510. }
  1511. return(bFound ? pFld : NULL);
  1512. }*/
  1513. /*GField* GFields::FindByName(LPSTR sVal)
  1514. {
  1515. bool bFound = false;
  1516. GField *pFld = NULL;
  1517. int i = 0;
  1518. while(!bFound && (i < _IGCollection::GetCount()))
  1519. {
  1520. pFld = (GField*)m_pData[i++];
  1521. bFound = (stricmp(pFld->GetNamePtr(), sVal) == 0);
  1522. }
  1523. return(bFound ? pFld : NULL);
  1524. }*/
  1525. GField* GFields::FindByWName(BSTR bsVal)
  1526. {
  1527. bool bFound = false;
  1528. GField *pFld = NULL;
  1529. int i = 0;
  1530. if(m_bIsMetatable)
  1531. {
  1532. while(!bFound && (i < m_iDataLen))
  1533. {
  1534. pFld = (GField*)m_pData[i++];
  1535. bFound = (wcsicmp(pFld->GetNamePtr(), bsVal) == 0);
  1536. }
  1537. }
  1538. else
  1539. {
  1540. while(!bFound && (i < m_iDataLen))
  1541. {
  1542. pFld = (GField*)m_pData[i++];
  1543. bFound = (wcscmp(pFld->GetNamePtr(), bsVal) == 0);
  1544. }
  1545. }
  1546. return(bFound ? pFld : NULL);
  1547. }
  1548. void GFields::SetNewRow()
  1549. {
  1550. GField *pFld;
  1551. for(int i = 0; i < m_iDataLen; i++)
  1552. {
  1553. pFld = (GField*)GetItem(i);
  1554. pFld->SetNewVal();
  1555. }
  1556. return;
  1557. }
  1558. void GFields::SetBuffer(VARIANT *pBuffer)
  1559. {
  1560. GField *pFld;
  1561. if(pBuffer)
  1562. {
  1563. for(int i = 0; i < m_iDataLen; i++)
  1564. {
  1565. pFld = (GField*)GetItem(i);
  1566. pFld->SetBuffer(&pBuffer[i]);
  1567. }
  1568. }
  1569. else
  1570. {
  1571. for(int i = 0; i < m_iDataLen; i++)
  1572. {
  1573. pFld = (GField*)GetItem(i);
  1574. pFld->SetBuffer(NULL);
  1575. }
  1576. }
  1577. return;
  1578. }
  1579. void GFields::CancelNewRow()
  1580. {
  1581. GField *pFld;
  1582. for(int i = 0; i < m_iDataLen; i++)
  1583. {
  1584. pFld = (GField*)GetItem(i);
  1585. pFld->CancelNewVal();
  1586. }
  1587. return;
  1588. }
  1589. void GFields::UpdateRow(VARIANT *pBuffer)
  1590. {
  1591. GField *pFld;
  1592. for(int i = 0; i < m_iDataLen; i++)
  1593. {
  1594. pFld = (GField*)GetItem(i);
  1595. pFld->UpdateVal(&pBuffer[i]);
  1596. }
  1597. return;
  1598. }
  1599. GTableDefs* GFields::GetTableDefsPtr()
  1600. {
  1601. return(m_pTblDefs);
  1602. }
  1603. void GFields::BroadcastCSChange(LPWSTR wsOldCSGuid, LPWSTR wsNewCSGuid)
  1604. {
  1605. GField *pFld;
  1606. for(int i = 0; i < m_iDataLen; i++)
  1607. {
  1608. pFld = (GField*)GetItem(i);
  1609. pFld->ChangeCSGuid(wsOldCSGuid, wsNewCSGuid);
  1610. }
  1611. return;
  1612. }
  1613. int GFields::HasField(LPSTR sSchema, LPSTR sTable, LPSTR sName)
  1614. {
  1615. GField *pFld;
  1616. bool bFound = false;
  1617. int i = 0;
  1618. while(!bFound && (i < m_iDataLen))
  1619. {
  1620. pFld = (GField*)GetItem(i++);
  1621. bFound = pFld->IsThisField(sSchema, sTable, sName);
  1622. }
  1623. return(bFound ? i - 1 : -1);
  1624. }
  1625. #if DBGLEVEL > 0
  1626. GRecordset* GFields::GetParentRecordset()
  1627. {
  1628. return (GRecordset*)m_pUnkOuter;
  1629. }
  1630. #endif
  1631. // GFeatureClass
  1632. GFeatureClassExt::GFeatureClassExt(IUnknown *pUnkOuter, ITypeLib *ALib) :
  1633. CCOMDispatch(pUnkOuter, ALib, 4)
  1634. {
  1635. #if DBGLEVEL > 2
  1636. WriteLogFile("GFeatureClassExt::GFeatureClassExt-1\r\n", true);
  1637. #endif // DBGLEVEL
  1638. m_wsTblName = NULL;
  1639. }
  1640. GFeatureClassExt::GFeatureClassExt(IUnknown *pUnkOuter, ITypeLib *ALib,
  1641. int iIndex) : CCOMDispatch(pUnkOuter, ALib, iIndex)
  1642. {
  1643. #if DBGLEVEL > 2
  1644. WriteLogFile("GFeatureClassExt::GFeatureClassExt-2\r\n", true);
  1645. #endif // DBGLEVEL
  1646. m_wsTblName = NULL;
  1647. }
  1648. GFeatureClassExt::~GFeatureClassExt()
  1649. {
  1650. #if DBGLEVEL > 2
  1651. WriteLogFile("GFeatureClassExt::~GFeatureClassExt\r\n", true);
  1652. #endif // DBGLEVEL
  1653. if(m_wsTblName) free(m_wsTblName);
  1654. }
  1655. HRESULT GFeatureClassExt::QueryInterface(REFIID iid, void **ppvObject)
  1656. {
  1657. #if DBGLEVEL > 2
  1658. WriteLogFile("GFeatureClassExt::QueryInterface\r\n", true);
  1659. #endif // DBGLEVEL
  1660. HRESULT hres = CCOMDispatch::QueryInterface(iid, ppvObject);
  1661. if(hres != S_OK)
  1662. {
  1663. if(IsEqualIID(iid, DIID__GFeatureClass))
  1664. {
  1665. hres = S_OK;
  1666. *ppvObject = this;
  1667. ((IUnknown*)*ppvObject)->AddRef();
  1668. }
  1669. else
  1670. {
  1671. hres = E_NOINTERFACE;
  1672. #if DBGLEVEL > 2
  1673. char buf[128];
  1674. FormatGuid(buf, "Unknown Interface: ", "\r\n", iid);
  1675. WriteLogFile(buf, true);
  1676. #endif // DBGLEVEL
  1677. }
  1678. }
  1679. return(hres);
  1680. }
  1681. ULONG GFeatureClassExt::Release()
  1682. {
  1683. ULONG

Large files files are truncated, but you can click here to view the full file