summaryrefslogtreecommitdiff
path: root/1Tdata/xbase/xbase64-4.1.4/src/core/xbssv.cpp
blob: 532f94284eebb89fca4c8d6958b2030b9fb88165 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
/* xbssv.cpp

XBase64 Software Library

Copyright (c) 1997,2003,2014,2022,2023 Gary A Kunkel

The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.

Email Contact:

    XDB-devel@lists.sourceforge.net
    XDB-users@lists.sourceforge.net

*/

#include "xbase.h"

namespace xb{

const xbErrorMessage xbErrorMessages[] = {
  { XB_NO_ERROR,                "No Error" },
  { XB_NO_MEMORY,               "No Memory" },
  { XB_INVALID_OPTION,          "Invalid Option" },
  { XB_INVALID_PARAMETER,       "Invalid Parameter" },
  { XB_DUP_TABLE_OR_ALIAS,      "Duplicate Alias/Table Name" },
  { XB_INVALID_NODELINK,        "Invalid Node Link" },
  { XB_KEY_NOT_UNIQUE,          "Key Not Unique" },
  { XB_MEMCPY_ERROR,            "Memory copy failure" },
  { XB_FILE_EXISTS,             "File Already Exists" },
  { XB_ALREADY_OPEN,            "Database already open" },
  { XB_DBF_FILE_NOT_OPEN,       "DBF File Not Open" },
  { XB_FILE_NOT_FOUND,          "File not found" },
  { XB_FILE_TYPE_NOT_SUPPORTED, "Not an Xbase type database" },
  { XB_RENAME_ERROR,            "Unable to rename file" },
  { XB_INVALID_OBJECT,          "Invalid Object" },
  { XB_NOT_OPEN,                "Database not open" },
  { XB_NOT_FOUND,               "Not Found" },
  { XB_OPEN_ERROR,              "Open Error" },
  { XB_CLOSE_ERROR,             "Close Error" },
  { XB_SEEK_ERROR,              "Seek Error" },
  { XB_READ_ERROR,              "Read Error" },
  { XB_WRITE_ERROR,             "Error writing to disk drive" },
  { XB_EOF,                     "End Of File" },
  { XB_BOF,                     "Beginning Of File" },
  { XB_INVALID_BLOCK_SIZE,      "Invalid Block Size" },
  { XB_INVALID_BLOCK_NO,        "Invalid Block Number" },
  { XB_INVALID_RECORD,          "Invalid Record Number" },
  { XB_DELETE_FAILED,           "Delete Failed" },
  { XB_INVALID_TABLE_NAME,      "Invalid Table Name" },
  { XB_EMPTY,                   "Empty Table or Index" },
  { XB_LIMIT_REACHED,           "Limit Reached" },
  { XB_BLOCKREAD_NOT_ENABLED,   "Block Read Mode is not enabled" },
  { XB_DIRECTORY_ERROR,         "Directory Read/Write error" },
  { XB_INVALID_FIELD_TYPE,      "Unknown Field Type" },
  { XB_INVALID_FIELD_NO,        "Invalid Field Number" },
  { XB_INVALID_DATA,            "Invalid Data" },
  { XB_INVALID_FIELD_NAME,      "Invalid Field Name" },
  { XB_INVALID_MEMO_FIELD,      "Not a Memo field" },
  { XB_INVALID_FIELD,           "Invalid Field" },
  { XB_INVALID_FIELD_LEN,       "Invalid Field Length" },
  { XB_INVALID_DATE,            "Invalid Date" },
  { XB_INVALID_LOCK_OPTION,     "Invalid Lock Option" },
  { XB_LOCK_FAILED,             "Lock Failed" },
  { XB_TABLE_NOT_LOCKED,        "Table Not Locked" },
  { XB_PARSE_ERROR,             "Parse Error" },
  { XB_INVALID_FUNCTION,        "Invalid or Undefined Function" },
  { XB_INVALID_PARM,            "Invalid Parm" },
  { XB_INCONSISTENT_PARM_LENS,  "Inconsistent parm lengths" },
  { XB_INCOMPATIBLE_OPERANDS,   "Incompatible operands" },
  { XB_UNBALANCED_PARENS,       "Unbalanced Parens" },
  { XB_UNBALANCED_QUOTES,       "Unbalanced Quotes" },
  { XB_INVALID_EXPRESSION,      "Invalid expression" },
  { XB_INVALID_KEYNO,           "Invalid Key Number" },
  { XB_INVALID_INDEX,           "Index File Error" },
  { XB_INVALID_TAG,             "Invalid index tag" },
  { XB_SYNTAX_ERROR,            "Invalid SQL Syntax" },
  { XB_MAX_ERROR_NO,            "End of Error List" }
};
// see also xbretcod.h

xbInt16  xbSsv::iEndianType             = 0;
xbString xbSsv::sDefaultDateFormat      = "MM/DD/YY";

xbInt16  xbSsv::iDefaultFileVersion     = 4;
xbString xbSsv::sNullString             = "";
xbBool   xbSsv::bDefaultAutoCommit      = xbTrue;

xbString xbSsv::sDataDirectory          = PROJECT_DATA_DIR;
xbString xbSsv::sTempDirectory          = PROJECT_TEMP_DIR;

#ifdef XB_LOGGING_SUPPORT
xbString xbSsv::sLogDirectory           = PROJECT_LOG_DIR;
xbString xbSsv::sLogFileName            = PROJECT_DFLT_LOGFILE;
#endif  // XB_LOGGING_SUPPORT

#ifdef XB_LOCKING_SUPPORT
xbInt32  xbSsv::lDefaultLockWait        = 100;
xbInt16  xbSsv::iDefaultLockRetries     = 3;
xbBool   xbSsv::bDefaultAutoLock        = xbTrue;
xbInt16  xbSsv::iDefaultLockFlavor      = 1;
xbBool   xbSsv::bMultiUser              = xbTrue;
#else
xbBool   xbSsv::bMultiUser              = xbFalse;
#endif  // XB_LOCKING_SUPPORT

#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)
xbInt16  xbSsv::iUniqueKeyOpt = XB_HALT_ON_DUPKEY;
  // is one of XB_HALT_ON_DUPKEY || XB_EMULATE_DBASE
#endif  // defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)


#ifdef XB_MDX_SUPPORT
xbInt16  xbSsv::iCreateMdxBlockSize     = 1024;   // 1024 is DBase 7 default size for MDX index blocks
#endif  // XB_MDX_SUPPORT

#ifdef XB_BLOCKREAD_SUPPORT
xbUInt32 xbSsv::ulDefaultBlockReadSize  = 32768;  // 32K buffer for block DBF datafile reads
#endif  // XB_BLOCKREAD_SUPPORT

/*************************************************************************/
//! @brief Class Constructor.
xbSsv::xbSsv(){}
/*************************************************************************/
void xbSsv::BitDump( unsigned char c ) const {
  for( int i = 7; i >= 0; i-- )
    std::cout << (BitSet( c, i ) ? 1 : 0);
}
void xbSsv::BitDump( char c ) const {
  BitDump( (unsigned char) c );
}
/*************************************************************************/
//! @brief Check a bit in a one byte field and see if it is set.
/*!
    \param c One byte char field to examine.
    \param iBitNo which bit to examine.
    \returns xbTrue Bit is set<br>
             xbFalse Bit is not set
*/
xbBool xbSsv::BitSet( unsigned char c, xbInt16 iBitNo ) const {
  return c & 1 << iBitNo;
}
/*************************************************************************/
//! @brief Display error message on console for a given error number.
/*!
   \param iErrorCode Error number to reference
*/
void xbSsv::DisplayError( xbInt16 iErrorCode ) const {
  std::cout << (const char *) GetErrorMessage( iErrorCode ) << std::endl;
}
/*************************************************************************/
//! @brief Get the default auto commit setting.
/*!

   When auto commit is enabled, the library will automatically post any updates 
   when moving off an updated record or closing files. 
   If auto commit is disabled, the application program will need to explicitly
   update the tables using  using dbf->Put() and dbf->AppendRecord().

   \returns xbTrue if auto commit is turned on<br>
            xbFalse is auto commit is turned off
*/

xbBool xbSsv::GetDefaultAutoCommit() const {
  return bDefaultAutoCommit;
}
/*************************************************************************/
//! @brief Get the current data directory.
/*!
   \returns xbString containing the current data directory
            where the database files are stored.
*/

xbString &xbSsv::GetDataDirectory() const {
  return sDataDirectory;
}
/*************************************************************************/
//! @brief Get the default date format.
/*!
   \returns xbString containing the default date format. 
*/

xbString & xbSsv::GetDefaultDateFormat() const {
  return sDefaultDateFormat;
}
/*************************************************************************/
//! @brief Get the Endian type.
/*!
   \returns B - Big endian<br>
            L - Little endian<br>
*/
xbInt16  xbSsv::GetEndianType() const {
  return iEndianType;
}
/*************************************************************************/
//! @brief Get an error message.
/*!
   \param iErrorCode  ErrorCode is the error number of description to be returned.
   \returns Returns a pointer to a string containing a text description for the error code.
*/

const char * xbSsv::GetErrorMessage( xbInt16 iErrorCode ) const{

  if( iErrorCode > 0 || iErrorCode <= XB_MAX_ERROR_NO )
    return "";

   xbBool bFound = xbFalse;
   xbInt16 iCtr = 0;
   while( !bFound ){
     if( xbErrorMessages[iCtr].iErrorNo == XB_MAX_ERROR_NO )
       return "Unknown Error";
     if( xbErrorMessages[iCtr].iErrorNo == iErrorCode )
       return xbErrorMessages[iCtr].sErrorText;
     iCtr++;
   }
   return "";
}
/*************************************************************************/
//! @brief Get home directory.
/*!
   \param sHomeDirOut - Output home directory for current user.
*/

void xbSsv::GetHomeDir( xbString &sHomeDirOut ){

  #ifdef HAVE_GETENV_S_F

    char sPath[MAX_PATH];
    size_t lSize;

    sHomeDirOut = "";
    memset( sPath, 0x00, MAX_PATH );

    getenv_s( &lSize, NULL, 0, "HOMEDRIVE" );
    if( lSize > 0 ){
      getenv_s( &lSize, sPath, lSize, "HOMEDRIVE" );
      sHomeDirOut = sPath;
      memset( sPath, 0x00, MAX_PATH );
    }

    getenv_s( &lSize, NULL, 0, "HOMEPATH" );
    if( lSize > 0 ){
      getenv_s( &lSize, sPath, lSize, "HOMEPATH" );
      sHomeDirOut += sPath;
    }
    if( sHomeDirOut == "" )
      sHomeDirOut = "C:\xbase64";

  #elif defined(WIN32)
    sHomeDirOut.Sprintf( "%s%s", getenv( "HOMEDRIVE" ), getenv( "HOMEPATH" ));

  #else
    sHomeDirOut.Sprintf( "%s", getenv( "HOME" ));
    sHomeDirOut.Trim();
    if( sHomeDirOut == "" )
      sHomeDirOut.Sprintf( "%s", getpwuid( getuid())->pw_dir );
  #endif

  sHomeDirOut.Trim();
}


/*************************************************************************/
//! @brief Set the data directory.
/*!
   \param sDataDirectory Set the data directory.
*/

void xbSsv::SetDataDirectory( const xbString &sDataDirectory ){
  this->sDataDirectory = sDataDirectory;

  #ifdef WIN32
    this->sDataDirectory.SwapChars( '/', '\\' );
  #else
    this->sDataDirectory.SwapChars( '\\', '/' );
  #endif

}

/*************************************************************************/
//! @brief Set the default date format.
/*!
   \param sDefaultDateFormat Set the default date format.
*/

void xbSsv::SetDefaultDateFormat( const xbString &sDefaultDateFormat ) {
  this->sDefaultDateFormat = sDefaultDateFormat;
}

/*************************************************************************/
//! @brief Set the default auto commit.
/*!

   Disabling auto commit requires the application execute explicit updates 
   using dbf->Put() and dbf->AppendRecord().  With auto commit on, the library 
   posts updates automatically when moving off the current record or closing 
   a file.

   \param bDefaultAutoCommit xbTrue - Enable default auto commit.<br>
                            xbFalse - Disable default auto commit.<br> 
*/

void xbSsv::SetDefaultAutoCommit( xbBool bDefaultAutoCommit ) {
  this->bDefaultAutoCommit = bDefaultAutoCommit;
}
/*************************************************************************/
//! @brief Set the endian type
/*!
    This routine determines the Endian-ness at run time instead of
    compile time as some processers (ie; Sparc,ARM) can be switched either way.
    This routine is called automatically by the library at startup and does not
    need to be called in an application program.

*/

void xbSsv::SetEndianType() {
  xbInt16 e = 1;
  iEndianType = *(char *) &e;
  if( iEndianType )
    iEndianType = 'L';
  else
    iEndianType = 'B';
  return;
}

/*************************************************************************/
//! @brief Set the temp directory.
/*!
   \param sTempDirectory Set the data direcroty.
*/

void xbSsv::SetTempDirectory( const xbString &sTempDirectory ){
  this->sTempDirectory = sTempDirectory;

  #ifdef WIN32
    this->sTempDirectory.SwapChars( '/', '\\' );
  #else
    this->sTempDirectory.SwapChars( '\\', '/' );
  #endif

}

/*************************************************************************/
//! @brief Get the OS dependent path separator.
/*!
   \returns Returns '\' for windows environment, otherwise returns '/'.
*/

char xbSsv::GetPathSeparator() const {
  #ifdef WIN32
  return '\\';
  #else
  return '/';
  #endif
}

/*************************************************************************/
//! @brief Get the current temp directory.
/*!
   \returns xbString containing the current data directory
            where the database files are stored.
*/

xbString &xbSsv::GetTempDirectory() const {
  return sTempDirectory;
}

/*************************************************************************/
#ifdef XB_LOGGING_SUPPORT

//! @brief Get the default log file name.
/*!
   \returns Returns the log file name.
*/

xbString & xbSsv::GetLogFileName() const {
  return sLogFileName;
}

/*************************************************************************/
//! @brief Get the default log directory.
/*!
   \returns Returns the log directory.
*/


xbString & xbSsv::GetLogDirectory() const {
  return sLogDirectory;
}
/*************************************************************************/
//! @brief Set the default log directory name.
/*!
   \param sLogDirectory  Name of desired log directory.

*/

void xbSsv::SetLogDirectory( const xbString &sLogDirectoryIn ){

  this->sLogDirectory = sLogDirectoryIn;
  #ifdef WIN32
    this->sLogDirectory.SwapChars( '/', '\\' );
  #else
    this->sLogDirectory.SwapChars( '\\', '/' );
  #endif

}

//! @brief Set the log file name.
/*!
  \param sLogFileName - Log File Name.
  \return void
*/

void xbSsv::SetLogFileName( const xbString & sLogFileName ){

  this->sLogFileName = sLogFileName;
}


#else

xbString & xbSsv::GetLogFileName() const {
  return sNullString;
}


xbString & xbSsv::GetLogDirectory() const {

std::cout << "xbSsv::GetLogDirectory() returning null\n";

  return sNullString;
}

void xbSsv::SetLogDirectory( const xbString &sLogDirectory ){
  return;
}

void xbSsv::SetLogFileName( const xbString & sLogFileName ){
  return;
}

#endif

/*************************************************************************/

#ifdef XB_LOCKING_SUPPORT

//! @brief Get the default lock retries.
/*!
   This is the number of lock attempts the libary will make before returning
   failure if the file can not be locked.
   \returns Default lock retry count.
*/
xbInt16 xbSsv::GetDefaultLockRetries() const {
  return iDefaultLockRetries;
}

//! @brief Set the default lock retries.
/*!
   \param iDefaultLockRetries - Number of lock attempts before returning failure.
*/
void xbSsv::SetDefaultLockRetries( xbInt16 iDefaultLockRetries ) {
  this->iDefaultLockRetries = iDefaultLockRetries;
}

//! @brief Get the default auto lock setting.
/*!
   When auto locking is turned on, the library automatically locks and unlocks
   files and indices as needed in a multi user environment.
   \returns Number of lock attempt settings.
*/
xbBool xbSsv::GetDefaultAutoLock() const {
  return bDefaultAutoLock;
}


//! @brief Set the default auto lock setting.
/*!
   When auto locking is turned on, the library automatically locks and unlocks
   files and indices as needed in a multi user environment.  Locking is not required
   in single a single user environment.

   \param bDefaultAutoLock xbTrue - Turn autolocking on<br>
                           xbFalse - Turn autolocking off<br>
*/
void xbSsv::SetDefaultAutoLock( xbBool bDefaultAutoLock ) {
  this->bDefaultAutoLock = bDefaultAutoLock;
}

//! @brief Enable default auto locking.
/*!
   When auto locking is turned on, the library automatically locks and unlocks
   files and indices as needed in a multi user environment.
*/
void xbSsv::EnableDefaultAutoLock() {
  this->bDefaultAutoLock = xbTrue;
}

//! @brief Disable defalt auto locking.
/*!
   When auto locking is turned off, the library does not automatically lock 
   and unlock files and indices as needed in a multi user environment.
   Locking is not needed in a single user environment.

*/
void xbSsv::DisableDefaultAutoLock() {
  this->bDefaultAutoLock = xbFalse;
}
/***************************************************************************/
//! @brief Get default lock flavor
/*!
  Currently one flavor.  This routine is part of the structure to support
  future additional locking scenarios for Clipper and Foxpro.
   \returns 1
*/
xbInt16 xbSsv::GetDefaultLockFlavor() const {
  return iDefaultLockFlavor;
}

/***************************************************************************/
//! @brief Set default lock flavor
/*!
  Currently one flavor.  This routine is part of the structure to support
  future additional locking scenarios for Clipper and Foxpro.
*/
void xbSsv::SetDefaultLockFlavor( xbInt16 iDefaultLockFlavor ) {
  this->iDefaultLockFlavor = iDefaultLockFlavor;
}

/***************************************************************************/
//! @brief Set default lock wait
/*!
   \param lLockWait Set default lock wait in milliseconds.
*/
void xbSsv::SetDefaultLockWait( xbInt32 lLockWait ) {
  this->lDefaultLockWait = lLockWait;
}

/***************************************************************************/
//! @brief Get default lock wait
/*!
  \returns Lock wait time in milliseconds.
  
*/
xbInt32 xbSsv::GetDefaultLockWait() const {
  return lDefaultLockWait;
}
#endif

/***************************************************************************/
//! @brief Get the multi user setting.
/*!
  \returns xbTrue - Multi user mode turned on.<br>
           xbFalse - Multi user mode turned off.<br>
*/
xbBool xbSsv::GetMultiUser() const {
  return bMultiUser;
}

//! @brief Get the multi user setting.
/*!
  \param bMultiUser xbTrue - Turn on Multi user mode.<br>
                    xbFalse - Turn off Multi user mode.<br>
*/
void xbSsv::SetMultiUser( xbBool bMultiUser ) {
  this->bMultiUser = bMultiUser;
}



/************************************************************************/
#ifdef XB_MDX_SUPPORT
//! @brief Get the mdx file block size used when creating a memo file. 
/*!
  \returns system default setting for MDX block size.
*/
xbInt16 xbSsv::GetCreateMdxBlockSize() const {
  return iCreateMdxBlockSize;
}

/************************************************************************/
//! @brief Create mdx block size.
/*!
   This routine sets the mdx file block size at the system level. This value is 
   used when the mdx index file is initially created so if you want to change it, 
   this must be called before creating the table.

  \param iBlockSize - Block size, must be evenly divisible by 512 and <= 16384
  \returns XB_INVALID_BLOCK_SIZE<br>XB_NO_ERROR
*/

xbInt16 xbSsv::SetCreateMdxBlockSize( xbInt16 iBlockSize ){

  if( iBlockSize < 512 || iBlockSize > 16384 || iBlockSize % 512  )
    return XB_INVALID_BLOCK_SIZE;
  else
    iCreateMdxBlockSize = iBlockSize;

  return XB_NO_ERROR;
}
#endif

/************************************************************************/
#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)
//! @brief Get Unique Key Opt
/*!
  This routine returns the Unique Key Processing Option which is one of:
     XB_HALT_ON_DUPKEY
     XB_EMULATE_DBASE
*/

xbInt16 xbSsv::GetUniqueKeyOpt() const {
  return iUniqueKeyOpt;
}

//! @brief Set Unique Key Opt
/*! @brief Set Unique Key Opt
  This routine Sets the Unique Key Processing Option which is one of:
     XB_HALT_ON_DUPKEY
     XB_EMULATE_DBASE
*/
xbInt16 xbSsv::SetUniqueKeyOpt( xbInt16 iOpt ){
  if( iOpt == XB_HALT_ON_DUPKEY || iOpt == XB_EMULATE_DBASE ){
    iUniqueKeyOpt = iOpt;
    return XB_NO_ERROR;
  } else {
    return XB_INVALID_OPTION;
  }
}
#endif
/************************************************************************/
#ifdef XB_BLOCKREAD_SUPPORT

//! @brief Get Default Read Block Size
/*!
  This routine returns the default read block size used when allocating
  buffer space for block reads of table data.  Initial setting is 32768 bytes.
*/
xbUInt32 xbSsv::GetDefaultBlockReadSize() const {
  return ulDefaultBlockReadSize;
}


//! @brief Set Default Read Block Size
/*!
  This routine sets the default read block size used when allocating
  buffer space for block reads of table data.  Initial setting is 32768 bytes.
*/
void xbSsv::SetDefaultBlockReadSize( xbUInt32 ulDfltBlockReadSize ){
   ulDefaultBlockReadSize = ulDfltBlockReadSize;
}

#endif  // XB_BLOCKREAD_SUPPORT
/************************************************************************/




}   /* namespace */