Go to the documentation of this file.00001 #ifndef PL_PERL_HELPERS_H
00002 #define PL_PERL_HELPERS_H
00003
00004
00005
00006
00007
00008
00009 static inline char *
00010 utf_u2e(char *utf8_str, size_t len)
00011 {
00012 int enc = GetDatabaseEncoding();
00013 char *ret;
00014
00015
00016
00017
00018
00019
00020
00021 if (enc == PG_UTF8 || enc == PG_SQL_ASCII)
00022 {
00023 pg_verify_mbstr_len(enc, utf8_str, len, false);
00024 ret = utf8_str;
00025 }
00026 else
00027 ret = (char *) pg_do_encoding_conversion((unsigned char *) utf8_str,
00028 len, PG_UTF8, enc);
00029
00030 if (ret == utf8_str)
00031 ret = pstrdup(ret);
00032
00033 return ret;
00034 }
00035
00036
00037
00038
00039
00040
00041 static inline char *
00042 utf_e2u(const char *str)
00043 {
00044 char *ret =
00045 (char *) pg_do_encoding_conversion((unsigned char *) str, strlen(str),
00046 GetDatabaseEncoding(), PG_UTF8);
00047
00048 if (ret == str)
00049 ret = pstrdup(ret);
00050 return ret;
00051 }
00052
00053
00054
00055
00056
00057
00058
00059 static inline char *
00060 sv2cstr(SV *sv)
00061 {
00062 char *val,
00063 *res;
00064 STRLEN len;
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 if (SvREADONLY(sv) ||
00078 isGV_with_GP(sv) ||
00079 (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM))
00080 sv = newSVsv(sv);
00081 else
00082 {
00083
00084
00085
00086
00087 SvREFCNT_inc_simple_void(sv);
00088 }
00089
00090
00091
00092
00093
00094
00095 if (GetDatabaseEncoding() == PG_SQL_ASCII)
00096 val = SvPV(sv, len);
00097 else
00098 val = SvPVutf8(sv, len);
00099
00100
00101
00102
00103
00104 res = utf_u2e(val, len);
00105
00106
00107 SvREFCNT_dec(sv);
00108
00109 return res;
00110 }
00111
00112
00113
00114
00115
00116 static inline SV *
00117 cstr2sv(const char *str)
00118 {
00119 SV *sv;
00120 char *utf8_str;
00121
00122
00123 if (GetDatabaseEncoding() == PG_SQL_ASCII)
00124 return newSVpv(str, 0);
00125
00126 utf8_str = utf_e2u(str);
00127
00128 sv = newSVpv(utf8_str, 0);
00129 SvUTF8_on(sv);
00130 pfree(utf8_str);
00131
00132 return sv;
00133 }
00134
00135 #endif