db_postgres/val.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "../../db/db_val.h"
00038 #include "../../db/db_ut.h"
00039 #include "../../dprint.h"
00040 #include "pg_con.h"
00041
00042 #include "../../mem/mem.h"
00043 #include "val.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 int db_postgres_str2val(const db_type_t _t, db_val_t* _v, const char* _s, const int _l)
00059 {
00060
00061 if ( _t != DB_BLOB || _s == NULL || _v == NULL) {
00062 return db_str2val(_t, _v, _s, _l, 1);
00063 } else {
00064 char * tmp_s = NULL;
00065 LM_DBG("converting BLOB [%.*s]\n", _l, _s);
00066
00067
00068
00069
00070 tmp_s = (char*)PQunescapeBytea((unsigned char*)_s, (size_t*)(void*)&(VAL_BLOB(_v).len));
00071 if(tmp_s==NULL) {
00072 LM_ERR("PQunescapeBytea failed\n");
00073 return -7;
00074 }
00075 VAL_BLOB(_v).s = pkg_malloc(VAL_BLOB(_v).len);
00076 if (VAL_BLOB(_v).s == NULL) {
00077 LM_ERR("no private memory left\n");
00078 PQfreemem(tmp_s);
00079 return -8;
00080 }
00081 LM_DBG("allocate %d bytes memory for BLOB at %p", VAL_BLOB(_v).len, VAL_BLOB(_v).s);
00082 memcpy(VAL_BLOB(_v).s, tmp_s, VAL_BLOB(_v).len);
00083 PQfreemem(tmp_s);
00084
00085 VAL_TYPE(_v) = DB_BLOB;
00086 VAL_FREE(_v) = 1;
00087
00088 LM_DBG("got blob len %d\n", _l);
00089 return 0;
00090
00091 }
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 int db_postgres_val2str(const db_con_t* _con, const db_val_t* _v, char* _s, int* _len)
00106 {
00107 int l, ret, tmp;
00108 int pgret;
00109 char *tmp_s;
00110 size_t tmp_len;
00111 char* old_s;
00112
00113 tmp = db_val2str(_con, _v, _s, _len);
00114 if (tmp < 1)
00115 return tmp;
00116
00117 switch(VAL_TYPE(_v)) {
00118 case DB_STRING:
00119 l = strlen(VAL_STRING(_v));
00120 if (*_len < (l * 2 + 3)) {
00121 LM_ERR("destination buffer too short for string\n");
00122 return -6;
00123 } else {
00124 old_s = _s;
00125 *_s++ = '\'';
00126 ret = PQescapeStringConn(CON_CONNECTION(_con), _s, VAL_STRING(_v),
00127 l, &pgret);
00128 if(pgret!=0)
00129 {
00130 LM_ERR("PQescapeStringConn failed\n");
00131 return -6;
00132 }
00133 LM_DBG("PQescapeStringConn: in: %d chars,"
00134 " out: %d chars\n", l, ret);
00135 _s += ret;
00136 *_s++ = '\'';
00137 *_s = '\0';
00138 *_len = _s - old_s;
00139 return 0;
00140 }
00141 break;
00142
00143 case DB_STR:
00144 l = VAL_STR(_v).len;
00145 if (*_len < (l * 2 + 3)) {
00146 LM_ERR("destination buffer too short for str\n");
00147 return -7;
00148 } else {
00149 old_s = _s;
00150 *_s++ = '\'';
00151 ret = PQescapeStringConn(CON_CONNECTION(_con), _s, VAL_STRING(_v),
00152 l, &pgret);
00153 if(pgret!=0)
00154 {
00155 LM_ERR("PQescapeStringConn failed \n");
00156 return -7;
00157 }
00158 LM_DBG("PQescapeStringConn: in: %d chars, out: %d chars\n", l, ret);
00159 _s += ret;
00160 *_s++ = '\'';
00161 *_s = '\0';
00162 *_len = _s - old_s;
00163 return 0;
00164 }
00165 break;
00166
00167 case DB_BLOB:
00168 l = VAL_BLOB(_v).len;
00169
00170 if (*_len < (l * 2 + 3)) {
00171 LM_ERR("destination buffer too short for blob\n");
00172 return -9;
00173 } else {
00174 *_s++ = '\'';
00175 tmp_s = (char*)PQescapeByteaConn(CON_CONNECTION(_con), (unsigned char*)VAL_STRING(_v),
00176 (size_t)l, (size_t*)&tmp_len);
00177 if(tmp_s==NULL)
00178 {
00179 LM_ERR("PQescapeByteaConn failed\n");
00180 return -9;
00181 }
00182 if (tmp_len > *_len) {
00183 LM_ERR("escaped result too long\n");
00184 return -9;
00185 }
00186 memcpy(_s, tmp_s, tmp_len);
00187 PQfreemem(tmp_s);
00188 tmp_len = strlen(_s);
00189 *(_s + tmp_len) = '\'';
00190 *(_s + tmp_len + 1) = '\0';
00191 *_len = tmp_len + 2;
00192 return 0;
00193 }
00194 break;
00195
00196 default:
00197 LM_DBG("unknown data type\n");
00198 return -10;
00199 }
00200 }