PostgreSQL Source Code: src/interfaces/ecpg/ecpglib/sqlda.c Source File (original) (raw)

1

2

3

4

5

6

7

8

9#define POSTGRES_ECPG_INTERNAL

11

12#include "catalog/pg_type_d.h"

22

23

24

25

26

27

28

29

30

31

32static void

34{

35 if (offset % alignment)

36 offset += alignment - (offset % alignment);

37 if (current)

38 *current = offset;

39 offset += size;

41 *next = offset;

42}

43

44static long

46{

47 long offset;

48 int i;

50

51

53

54

55 for (i = 0; i < sqld; i++)

56 offset += strlen(PQfname(res, i)) + 1;

57

58

60

61 return offset;

62}

63

64static long

66{

68 int i;

69 long next_offset;

70

71

72 for (i = 0; i < sqld; i++)

73 {

75

77 {

81 break;

85 break;

89 break;

93 break;

96 break;

99 break;

102 break;

105 break;

107

108

109

110

111

112

113

114

115

118 {

121

123 if (!num)

124 break;

125 if (num->buf)

128 }

129 break;

132 break;

135 break;

138 break;

142 default:

143 {

144 long datalen = strlen(PQgetvalue(res, row, i)) + 1;

145

147 break;

148 }

149 }

150 offset = next_offset;

151 }

152 return offset;

153}

154

155

156static long

158{

159 long offset;

160

162

163 if (row < 0)

164 return offset;

165

167 return offset;

168}

169

170static long

172{

173 long offset;

175

176

178

179

181

182 return offset;

183}

184

185static long

187{

188 long offset;

189

191

192 if (row < 0)

193 return offset;

194

196 return offset;

197}

198

199

200

201

202

203

206{

209 char *fname;

210 long size;

211 int sqld;

212 int i;

213

216 if (!sqlda)

217 return NULL;

218

219 memset(sqlda, 0, size);

222 fname = (char *) (sqlvar + sqld);

223

224 sqlda->sqld = sqld;

225 ecpg_log("ecpg_build_compat_sqlda on line %d sqld = %d\n", line, sqld);

226 sqlda->desc_occ = size;

227 sqlda->sqlvar = sqlvar;

228

229 for (i = 0; i < sqlda->sqld; i++)

230 {

232 strcpy(fname, PQfname(res, i));

235

236

237

238

239

240

243 }

244

245 return sqlda;

246}

247

248

249

250

253

254void

256{

258 int i;

259 long offset,

260 next_offset;

261

262 if (row < 0)

263 return;

264

265

267

268

269

270

271 for (i = 0; i < sqlda->sqld; i++)

272 {

273 int isnull;

274 int datalen;

275 bool set_data = true;

276

278 {

284 break;

290 break;

296 break;

302 break;

307 break;

312 break;

317 break;

322 break;

324 {

326 char *val;

327

328 set_data = false;

329

333

335 {

337 break;

338 }

339

342 if (!num)

343 {

345 break;

346 }

347

349

350 if (num->buf)

351 {

353 memcpy((char *) sqlda + offset, num->buf, num->digits - num->buf + num->ndigits);

354

357 }

358

360

361 break;

362 }

367 break;

372 break;

377 break;

381 default:

382 datalen = strlen(PQgetvalue(res, row, i)) + 1;

386 if (datalen > 32768)

388 break;

389 }

390

392 ecpg_log("ecpg_set_compat_sqlda on line %d row %d col %d %s\n", lineno, row, i, isnull ? "IS NULL" : "IS NOT NULL");

396 if (!isnull)

397 {

398 if (set_data)

403 }

404 else

406

407 offset = next_offset;

408 }

409}

410

413{

415 long size;

416 int i;

417

420 if (!sqlda)

421 return NULL;

422

423 memset(sqlda, 0, size);

424

427 ecpg_log("ecpg_build_native_sqlda on line %d sqld = %d\n", line, sqlda->sqld);

429

430 for (i = 0; i < sqlda->sqld; i++)

431 {

432 char *fname;

433

438 }

439

440 return sqlda;

441}

442

443void

445{

447 int i;

448 long offset,

449 next_offset;

450

451 if (row < 0)

452 return;

453

454

456

457

458

459

460 for (i = 0; i < sqlda->sqld; i++)

461 {

462 int isnull;

463 int datalen;

464 bool set_data = true;

465

467 {

473 break;

479 break;

485 break;

491 break;

496 break;

501 break;

506 break;

511 break;

513 {

515 char *val;

516

517 set_data = false;

518

522

524 {

526 break;

527 }

528

531 if (!num)

532 {

534 break;

535 }

536

538

539 if (num->buf)

540 {

542 memcpy((char *) sqlda + offset, num->buf, num->digits - num->buf + num->ndigits);

543

546 }

547

549

550 break;

551 }

556 break;

561 break;

566 break;

570 default:

571 datalen = strlen(PQgetvalue(res, row, i)) + 1;

575 break;

576 }

577

579 ecpg_log("ecpg_set_native_sqlda on line %d row %d col %d %s\n", lineno, row, i, isnull ? "IS NULL" : "IS NOT NULL");

581 if (!isnull)

582 {

583 if (set_data)

588 }

589

590 offset = next_offset;

591 }

592}

Datum numeric(PG_FUNCTION_ARGS)

bool ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno, enum ECPGttype type, enum ECPGttype ind_type, char *var, char *ind, long varcharsize, long offset, long ind_offset, enum ARRAY_TYPE isarray, enum COMPAT_MODE compat, bool force_indicator)

char * ecpg_alloc(long size, int lineno)

void ecpg_log(const char *format,...) pg_attribute_printf(1

int sqlda_dynamic_type(Oid type, enum COMPAT_MODE compat)

@ ECPGt_unsigned_long_long

Oid PQftype(const PGresult *res, int field_num)

char * PQgetvalue(const PGresult *res, int tup_num, int field_num)

char * PQfname(const PGresult *res, int field_num)

int PQgetisnull(const PGresult *res, int tup_num, int field_num)

int PQnfields(const PGresult *res)

int PQfsize(const PGresult *res, int field_num)

void ECPGset_noind_null(enum ECPGttype type, void *ptr)

void PGTYPESnumeric_free(numeric *var)

numeric * PGTYPESnumeric_from_asc(char *str, char **endptr)

static long sqlda_compat_total_size(const PGresult *res, int row, enum COMPAT_MODE compat)

static void ecpg_sqlda_align_add_size(long offset, int alignment, int size, long *current, long *next)

static long sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, long offset)

struct sqlda_struct * ecpg_build_native_sqlda(int line, PGresult *res, int row, enum COMPAT_MODE compat)

static long sqlda_compat_empty_size(const PGresult *res)

struct sqlda_compat * ecpg_build_compat_sqlda(int line, PGresult *res, int row, enum COMPAT_MODE compat)

static long sqlda_native_empty_size(const PGresult *res)

void ecpg_set_compat_sqlda(int lineno, struct sqlda_compat **_sqlda, const PGresult *res, int row, enum COMPAT_MODE compat)

static long sqlda_native_total_size(const PGresult *res, int row, enum COMPAT_MODE compat)

static int16 value_is_null

void ecpg_set_native_sqlda(int lineno, struct sqlda_struct **_sqlda, const PGresult *res, int row, enum COMPAT_MODE compat)

static int16 value_is_not_null

struct sqlvar_compat * sqlvar

struct sqlvar_struct sqlvar[1]