/ Check-in [80e42183]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Work around bugs in older versions of the OS/2 conversion library by trying to minimize calls to UniCreateUconvObject() etc. Use global uconv objects instead. (CVS 5418)
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 80e42183066b53129778ae8cbb16e495f7a82990
User & Date: pweilbacher 2008-07-15 22:59:05
Context
2008-07-16
12:25
Activate testing of mem3 and mem5. Fix problems found. Tickets #3223 and #3225. Other test configuration changes. (CVS 5419) check-in: a3a78205 user: drh tags: trunk
2008-07-15
22:59
Work around bugs in older versions of the OS/2 conversion library by trying to minimize calls to UniCreateUconvObject() etc. Use global uconv objects instead. (CVS 5418) check-in: 80e42183 user: pweilbacher tags: trunk
21:32
Implement optimize() function. This merges all segments in the fts index into a single segment, including dropping delete cookies. (CVS 5417) check-in: b22e187b user: shess tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to src/os_os2.c.

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
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
...
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
....
1055
1056
1057
1058
1059
1060
1061


1062
1063
1064
1065
1066
1067
1068
....
1080
1081
1082
1083
1084
1085
1086

1087
1088
1089
1090
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
**
******************************************************************************
**
** This file contains code that is specific to OS/2.
**
** $Id: os_os2.c,v 1.49 2008/07/08 22:34:07 pweilbacher Exp $
*/

#include "sqliteInt.h"

#if SQLITE_OS_OS2

/*
................................................................................
/*
** Return a vector of device characteristics.
*/
static int os2DeviceCharacteristics(sqlite3_file *id){
  return 0;
}
































/*
** Helper function to convert UTF-8 filenames to local OS/2 codepage.
** The two-step process: first convert the incoming UTF-8 string
** into UCS-2 and then from UCS-2 to the current codepage.
** The returned char pointer has to be freed.
*/
static char *convertUtf8PathToCp(const char *in)



{
  UconvObject uconv;
  UniChar ucsUtf8Cp[12],
          tempPath[CCHMAXPATH];
  char *out;
  int rc = 0;

  out = (char *)calloc(CCHMAXPATH, 1);


  /* determine string for the conversion of UTF-8 which is CP1208 */
  rc = UniMapCpToUcsCp(1208, ucsUtf8Cp, 12);
  rc = UniCreateUconvObject(ucsUtf8Cp, &uconv);
  rc = UniStrToUcs(uconv, tempPath, (char *)in, CCHMAXPATH);
  rc = UniFreeUconvObject(uconv);


  /* conversion for current codepage which can be used for paths */
  rc = UniCreateUconvObject((UniChar *)L"@path=yes", &uconv);
  rc = UniStrFromUcs(uconv, out, tempPath, CCHMAXPATH);
  rc = UniFreeUconvObject(uconv);


  return out;
}

/*
** Helper function to convert filenames from local codepage to UTF-8.
** The two-step process: first convert the incoming codepage-specific
** string into UCS-2 and then from UCS-2 to the codepage of UTF-8.
** The returned char pointer has to be freed.



*/
static char *convertCpPathToUtf8(const char *in)
{
  UconvObject uconv;
  UniChar ucsUtf8Cp[12],
          tempPath[CCHMAXPATH];
  char *out;
  int rc = 0;

  out = (char *)calloc(CCHMAXPATH, 1);





  /* conversion for current codepage which can be used for paths */
  rc = UniCreateUconvObject((UniChar *)L"@path=yes", &uconv);
  rc = UniStrToUcs(uconv, tempPath, (char *)in, CCHMAXPATH);
  rc = UniFreeUconvObject(uconv);


  /* determine string for the conversion of UTF-8 which is CP1208 */
  rc = UniMapCpToUcsCp(1208, ucsUtf8Cp, 12);
  rc = UniCreateUconvObject(ucsUtf8Cp, &uconv);
  rc = UniStrFromUcs(uconv, out, tempPath, CCHMAXPATH);
  rc = UniFreeUconvObject(uconv);


  return out;
}

/*
** This vector defines all the methods that can operate on an
** sqlite3_file for os2.
*/
................................................................................
  PSZ zTempPath = (PSZ)&zTempPathBuf;
  if( sqlite3_temp_directory ){
    zTempPath = sqlite3_temp_directory;
  }else{
    if( DosScanEnv( (PSZ)"TEMP", &zTempPath ) ){
      if( DosScanEnv( (PSZ)"TMP", &zTempPath ) ){
        if( DosScanEnv( (PSZ)"TMPDIR", &zTempPath ) ){
             ULONG ulDriveNum = 0, ulDriveMap = 0;
             DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap );
             sprintf( (char*)zTempPath, "%c:", (char)( 'A' + ulDriveNum - 1 ) );
        }
      }
    }
  }
  /* Strip off a trailing slashes or backslashes, otherwise we would get *
   * multiple (back)slashes which causes DosOpen() to fail.              *
   * Trailing spaces are not allowed, either.                            */
................................................................................
  return 0;
}

/*
** Initialize and deinitialize the operating system interface.
*/
int sqlite3_os_init(void){


  static sqlite3_vfs os2Vfs = {
    1,                 /* iVersion */
    sizeof(os2File),   /* szOsFile */
    CCHMAXPATH,        /* mxPathname */
    0,                 /* pNext */
    "os2",             /* zName */
    0,                 /* pAppData */
................................................................................
    os2CurrentTime,    /* xCurrentTime */
    os2GetLastError    /* xGetLastError */
  };
  sqlite3_vfs_register(&os2Vfs, 1);
  return SQLITE_OK;
}
int sqlite3_os_end(void){

  return SQLITE_OK;
}

#endif /* SQLITE_OS_OS2 */







|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






|
>
>
>
|
<
<
<
|
|

|
>


<
<
|
<
>


<
|
<

>








>
>
>

|
<
<
<
|
|
|

|
>

>
>
>

<
|
<
>


<
<
|
<

>







 







|
|
|







 







>
>







 







>




8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
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
...
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
....
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
....
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
**    May you find forgiveness for yourself and forgive others.
**    May you share freely, never taking more than you give.
**
******************************************************************************
**
** This file contains code that is specific to OS/2.
**
** $Id: os_os2.c,v 1.50 2008/07/15 22:59:05 pweilbacher Exp $
*/

#include "sqliteInt.h"

#if SQLITE_OS_OS2

/*
................................................................................
/*
** Return a vector of device characteristics.
*/
static int os2DeviceCharacteristics(sqlite3_file *id){
  return 0;
}


/*
** Character set conversion objects used by conversion routines.
*/
static UconvObject ucUtf8 = NULL; /* convert between UTF-8 and UCS-2 */
static UconvObject uclCp = NULL;  /* convert between local codepage and UCS-2 */

/*
** Helper function to initialize the conversion objects from and to UTF-8.
*/
static void initUconvObjects( void ){
	printf("init them\n");
  if( UniCreateUconvObject( UTF_8, &ucUtf8 ) != ULS_SUCCESS )
    ucUtf8 = NULL;
  if ( UniCreateUconvObject( (UniChar *)L"@path=yes", &uclCp ) != ULS_SUCCESS )
    uclCp = NULL;
}

/*
** Helper function to free the conversion objects from and to UTF-8.
*/
static void freeUconvObjects( void ){
	printf("free them\n");
  if ( ucUtf8 )
    UniFreeUconvObject( ucUtf8 );
  if ( uclCp )
    UniFreeUconvObject( uclCp );
  ucUtf8 = NULL;
  uclCp = NULL;
}

/*
** Helper function to convert UTF-8 filenames to local OS/2 codepage.
** The two-step process: first convert the incoming UTF-8 string
** into UCS-2 and then from UCS-2 to the current codepage.
** The returned char pointer has to be freed.
*/
static char *convertUtf8PathToCp( const char *in ){
  UniChar tempPath[CCHMAXPATH];
  char *out = (char *)calloc( CCHMAXPATH, 1 );
printf("convertUtf8PathToCp(%s)\n", in);




  if( !out )
    return NULL;

  if( !ucUtf8 || !uclCp )
    initUconvObjects();

  /* determine string for the conversion of UTF-8 which is CP1208 */


  if( UniStrToUcs( ucUtf8, tempPath, (char *)in, CCHMAXPATH ) != ULS_SUCCESS )

    return out; /* if conversion fails, return the empty string */

  /* conversion for current codepage which can be used for paths */

  UniStrFromUcs( uclCp, out, tempPath, CCHMAXPATH );


	printf("%s -> Cp = %s\n", in, out);
  return out;
}

/*
** Helper function to convert filenames from local codepage to UTF-8.
** The two-step process: first convert the incoming codepage-specific
** string into UCS-2 and then from UCS-2 to the codepage of UTF-8.
** The returned char pointer has to be freed.
**
** This function is non-static to be able to use this in shell.c and
** similar applications that take command line arguments.
*/
char *convertCpPathToUtf8( const char *in ){



  UniChar tempPath[CCHMAXPATH];
  char *out = (char *)calloc( CCHMAXPATH, 1 );
printf("convertCpPathToUtf8(%s)\n", in);

  if( !out )
    return NULL;

  if( !ucUtf8 || !uclCp )
    initUconvObjects();

  /* conversion for current codepage which can be used for paths */

  if( UniStrToUcs( uclCp, tempPath, (char *)in, CCHMAXPATH ) != ULS_SUCCESS )

    return out; /* if conversion fails, return the empty string */

  /* determine string for the conversion of UTF-8 which is CP1208 */


  UniStrFromUcs( ucUtf8, out, tempPath, CCHMAXPATH );


	printf("%s -> Utf8 = %s\n", in, out);
  return out;
}

/*
** This vector defines all the methods that can operate on an
** sqlite3_file for os2.
*/
................................................................................
  PSZ zTempPath = (PSZ)&zTempPathBuf;
  if( sqlite3_temp_directory ){
    zTempPath = sqlite3_temp_directory;
  }else{
    if( DosScanEnv( (PSZ)"TEMP", &zTempPath ) ){
      if( DosScanEnv( (PSZ)"TMP", &zTempPath ) ){
        if( DosScanEnv( (PSZ)"TMPDIR", &zTempPath ) ){
           ULONG ulDriveNum = 0, ulDriveMap = 0;
           DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap );
           sprintf( (char*)zTempPath, "%c:", (char)( 'A' + ulDriveNum - 1 ) );
        }
      }
    }
  }
  /* Strip off a trailing slashes or backslashes, otherwise we would get *
   * multiple (back)slashes which causes DosOpen() to fail.              *
   * Trailing spaces are not allowed, either.                            */
................................................................................
  return 0;
}

/*
** Initialize and deinitialize the operating system interface.
*/
int sqlite3_os_init(void){
  initUconvObjects();

  static sqlite3_vfs os2Vfs = {
    1,                 /* iVersion */
    sizeof(os2File),   /* szOsFile */
    CCHMAXPATH,        /* mxPathname */
    0,                 /* pNext */
    "os2",             /* zName */
    0,                 /* pAppData */
................................................................................
    os2CurrentTime,    /* xCurrentTime */
    os2GetLastError    /* xGetLastError */
  };
  sqlite3_vfs_register(&os2Vfs, 1);
  return SQLITE_OK;
}
int sqlite3_os_end(void){
  freeUconvObjects();
  return SQLITE_OK;
}

#endif /* SQLITE_OS_OS2 */