/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
namespace connectivity::dbase
{ typedef file::OFileTable ODbaseTable_BASE; class ODbaseConnection;
class ODbaseTable : public ODbaseTable_BASE
{ // The first byte of a dBase file specifies its type public: enum DBFType { dBaseIII = 0x03,
dBaseIV = 0x04,
dBaseV = 0x05,
VisualFoxPro = 0x30,
VisualFoxProAuto = 0x31, // Visual FoxPro with AutoIncrement field
dBaseFS = 0x43,
dBaseFSMemo = 0xB3,
dBaseIIIMemo = 0x83,
dBaseIVMemo = 0x8B,
dBaseIVMemoSQL = 0x8E,
FoxProMemo = 0xF5
}; enum DBFMemoType { MemodBaseIII = 0,
MemodBaseIV,
MemoFoxPro
};
private: // sources: https://www.clicketyclick.dk/databases/xbase/format/dbf.html (dBASE III and 5) // http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm (dBASE 7) which is similar at least for this part struct DBFHeader { // address/pos in trailer
DBFType type; // dBASE/xBASE type, see DBFType 00h
sal_uInt8 dateElems[3]; // Date of last change (YYMMDD) 01h
sal_uInt32 nbRecords; // Number of records 04h
sal_uInt16 headerLength; // 08h
sal_uInt16 recordLength; // Length of 1 record 10h
sal_uInt8 trailer[20]; // this last field contains these data: // - reserved:2 bytes:should be filled with 0 12h/0 // - incomplete transaction:1 byte:dBASE IV 14h/2 // 00h Transaction ended (or rolled back) // 01h Transaction started // - encryptionFlag:1 byte: dBASE IV 15h/3 // 00h not encrypted // 01h for encrypted // - freeRecordThread:4 bytes:reserved for LAN only 16h/4 // - multiUserdBASE:8 bytes:reserved for multi-user dBASE (dBASE III+) 20h/8 // - MDXFlag:1 byte:dBASE IV 28h/16 // 0x01 if a production .MDX file exists for this table // 0x00 if no .MDX file exists // - languageDriver:1 byte:codepage (from Foxpro) 29h/17 // - reserved:2 bytes: should be filled with 0 30h/18
}; struct DBFColumn { /* Column descriptors */
sal_uInt8 db_fnm[11]; /* Field name */
sal_uInt8 db_typ; /* Field type */
sal_uInt32 db_adr; /* Field address */
sal_uInt8 db_flng; /* Field length */
sal_uInt8 db_dez; /* Decimal places for N */
sal_uInt8 db_free2[14]; /* Reserved */
}; struct DBFMemoHeader
{
DBFMemoType db_typ; /* File type */
sal_uInt32 db_next; /* Next free block */
sal_uInt16 db_size; /* Block size: dBase 3 fixed */
DBFMemoHeader()
: db_typ(MemodBaseIII)
, db_next(0)
, db_size(0)
{
}
};
std::vector<sal_Int32> m_aTypes; // holds all types for columns just to avoid to ask the propertyset
std::vector<sal_Int32> m_aPrecisions; // same as above
std::vector<sal_Int32> m_aScales;
std::vector<sal_Int32> m_aRealFieldLengths;
DBFHeader m_aHeader = {};
DBFMemoHeader m_aMemoHeader;
std::unique_ptr<SvStream> m_pMemoStream;
rtl_TextEncoding m_eEncoding;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.