text* String_createText(jstring javaString) { text* result = 0; if(javaString != 0) { /* Would be nice if a direct conversion from UTF16 was provided. */ char* utf8 = (char*)JNI_getStringUTFChars(javaString, 0); char* denc = (char*)pg_do_encoding_conversion( (unsigned char*)utf8, strlen(utf8), PG_UTF8, GetDatabaseEncoding()); int dencLen = strlen(denc); int varSize = dencLen + VARHDRSZ; /* Allocate and initialize the text structure. */ result = (text*)palloc(varSize); #if (PGSQL_MAJOR_VER == 8 && PGSQL_MINOR_VER < 3) VARATT_SIZEP(result) = varSize; /* Total size of structure, not just data */ #else SET_VARSIZE(result, varSize); /* Total size of structure, not just data */ #endif memcpy(VARDATA(result), denc, dencLen); /* pg_do_encoding_conversion will return the source argument * when no conversion is required. We don't want to accidentally * free that pointer. */ if(denc != utf8) pfree(denc); JNI_releaseStringUTFChars(javaString, utf8); } return result; }
char* String_createNTS(jstring javaString) { char* result = 0; if( 0 == javaString ) return result; if ( uninitialized ) { const char* u8buf; s_server_encoding = GetDatabaseEncoding(); u8buf = JNI_getStringUTFChars( javaString, NULL); if ( 0 == u8buf ) return result; result = (char*)pg_do_encoding_conversion( (unsigned char *)u8buf, (int)strlen( u8buf), PG_UTF8, s_server_encoding); if ( result == u8buf ) result = pstrdup( result); JNI_releaseStringUTFChars( javaString, u8buf); return result; } else { jobject charbuf = JNI_callStaticObjectMethodLocked(s_CharBuffer_class, s_CharBuffer_wrap, javaString); StringInfoData sid; initStringInfo(&sid); appendCharBuffer(&sid, charbuf); JNI_deleteLocalRef(charbuf); result = (char*)pg_do_encoding_conversion( (unsigned char *)sid.data, sid.len, PG_UTF8, s_server_encoding); /* pg_do_encoding_conversion will return the source argument * when no conversion is required. Don't free it in that case. */ if(result != sid.data) pfree(sid.data); } return result; }
char* String_createNTS(jstring javaString) { char* result = 0; if(javaString != 0) { /* Would be nice if a direct conversion from UTF16 was provided. */ char* utf8 = (char*)JNI_getStringUTFChars(javaString, 0); result = (char*)pg_do_encoding_conversion( (unsigned char*)utf8, strlen(utf8), PG_UTF8, GetDatabaseEncoding()); /* pg_do_encoding_conversion will return the source argument * when no conversion is required. We always want a copy here. */ if(result == utf8) result = pstrdup(result); JNI_releaseStringUTFChars(javaString, utf8); } return result; }
void String_appendJavaString(StringInfoData* buf, jstring javaString) { if(javaString != 0) { /* Would be nice if a direct conversion from UTF16 was provided. */ char* utf8 = (char*)JNI_getStringUTFChars(javaString, 0); char* dbEnc = (char*)pg_do_encoding_conversion( (unsigned char*)utf8, strlen(utf8), PG_UTF8, GetDatabaseEncoding()); appendStringInfoString(buf, dbEnc); /* pg_do_encoding_conversion will return the source argument * when no conversion is required. We don't want to accidentally * free that pointer. */ if(dbEnc != utf8) pfree(dbEnc); JNI_releaseStringUTFChars(javaString, utf8); } }