Exemple #1
0
void FoxPro::saveFields(WriteStream &dbf) const {
	for (size_t i = 0; i < _fields.size(); i++) {
		const Field &field = _fields[i];

		int l = strlen(field.name.c_str());

		dbf.write(field.name.c_str(), MIN(10, l));
		dbf.writeByte(0x00);

		while ((10 - l++) > 0)
			dbf.writeByte(0x00);

		dbf.writeByte((byte) ((char) field.type));

		dbf.writeUint32LE(field.offset);

		dbf.writeByte(field.size);
		dbf.writeByte(field.decimals);
		dbf.writeByte(field.flags);

		dbf.writeUint32LE(field.autoIncNext);
		dbf.writeByte    (field.autoIncStep);

		dbf.writeUint32LE(0x00000000); // Reserved
		dbf.writeUint32LE(0x00000000); // Reserved
	}

	dbf.writeByte(0x0D); // Field end marker
}
Exemple #2
0
void FoxPro::saveHeader(WriteStream &dbf) const {
	dbf.writeByte(0xF5); // Version

	dbf.writeByte(_lastUpdate.year() - 2000);
	dbf.writeByte(_lastUpdate.month());
	dbf.writeByte(_lastUpdate.day());

	dbf.writeUint32LE(_records.size());

	//                    Header + fields + field end marker
	uint16 firstRecordPos = 32 + _fields.size() * 32 + 1;
	dbf.writeUint16LE(firstRecordPos);

	uint16 recordSize = _fields.back().offset + _fields.back().size;
	dbf.writeUint16LE(recordSize);

	dbf.writeUint32LE(0x00000000); // Reserved
	dbf.writeUint32LE(0x00000000); // Reserved
	dbf.writeUint32LE(0x00000000); // Reserved
	dbf.writeUint32LE(0x00000000); // Reserved

	uint8 flags = (_hasIndex ? 0x01 : 0x00) | (_hasMemo ? 0x02 : 0x00);
	dbf.writeByte(flags);

	dbf.writeByte(0x00); // Codepage marker

	dbf.writeUint16LE(0x0000); // Reserved
}