Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: VFK Reader - Data block property definition 4 : * Purpose: Implements VFKPropertyDefn class. 5 : * Author: Martin Landa, landa.martin gmail.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2009-2010, 2012, Martin Landa <landa.martin gmail.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "vfkreader.h" 14 : #include "vfkreaderp.h" 15 : 16 : #include "cpl_conv.h" 17 : #include "cpl_error.h" 18 : 19 : /*! 20 : \brief VFKPropertyDefn constructor 21 : 22 : \param pszName property name 23 : \param pszType property type (original, string) 24 : \param pszEncoding encoding (only for "text" type) 25 : */ 26 9232 : VFKPropertyDefn::VFKPropertyDefn(const char *pszName, const char *pszType, 27 9232 : const char *pszEncoding) 28 27696 : : m_pszName(CPLStrdup(pszName)), m_pszType(CPLStrdup(pszType)), 29 9232 : m_pszEncoding(nullptr), m_nWidth(0), m_nPrecision(0) 30 : { 31 9232 : char *poWidth = m_pszType + 1; 32 9232 : char *poChar = m_pszType + 1; 33 9232 : int nLength = 0; // Used after for. 34 21696 : for (; *poChar && *poChar != '.'; nLength++, poChar++) 35 : ; 36 : 37 9232 : char *pszWidth = static_cast<char *>(CPLMalloc(nLength + 1)); 38 9232 : strncpy(pszWidth, poWidth, nLength); 39 9232 : pszWidth[nLength] = '\0'; 40 : 41 9232 : m_nWidth = atoi(pszWidth); 42 9232 : CPLFree(pszWidth); 43 : 44 : // Type. 45 9232 : if (*m_pszType == 'N') 46 : { 47 5328 : if (*poChar == '.') 48 : { 49 480 : m_eFType = OFTReal; 50 480 : m_nPrecision = atoi(poChar + 1); 51 : } 52 : else 53 : { 54 4848 : if (m_nWidth < 10) 55 2384 : m_eFType = OFTInteger; 56 : else 57 : { 58 2464 : m_eFType = OFTInteger64; 59 : } 60 : } 61 : } 62 3904 : else if (*m_pszType == 'T') 63 : { 64 : // String. 65 2288 : m_eFType = OFTString; 66 2288 : m_pszEncoding = CPLStrdup(pszEncoding); 67 : } 68 1616 : else if (*m_pszType == 'D') 69 : { 70 : // Date. 71 : // m_eFType = OFTDateTime; 72 1616 : m_eFType = OFTString; 73 1616 : m_nWidth = 25; 74 : } 75 : else 76 : { 77 : // Unknown - string. 78 0 : m_eFType = OFTString; 79 0 : m_pszEncoding = CPLStrdup(pszEncoding); 80 : } 81 9232 : } 82 : 83 : /*! 84 : \brief VFKPropertyDefn destructor 85 : */ 86 27696 : VFKPropertyDefn::~VFKPropertyDefn() 87 : { 88 9232 : CPLFree(m_pszName); 89 9232 : CPLFree(m_pszType); 90 9232 : if (m_pszEncoding) 91 2288 : CPLFree(m_pszEncoding); 92 18464 : } 93 : 94 : /*! 95 : \brief Get SQL data type 96 : 97 : \return string with data type ("text" by default) 98 : */ 99 8655 : CPLString VFKPropertyDefn::GetTypeSQL() const 100 : { 101 8655 : switch (m_eFType) 102 : { 103 2235 : case OFTInteger: 104 2235 : return CPLString("integer"); 105 2310 : case OFTInteger64: 106 2310 : return CPLString("bigint"); 107 450 : case OFTReal: 108 450 : return CPLString("real"); 109 3660 : case OFTString: 110 3660 : return CPLString("text"); 111 0 : default: 112 0 : return CPLString("text"); 113 : } 114 : }