DBD-DBMaker
view release on metacpan or search on metacpan
{
memcpy(&f2, fbh->data, sizeof(double));
sprintf(cvbuf, "%E", f2);
}
sv_setpvn(sv, (char*)fbh->data, strlen(cvbuf));
sv_setpv(sv, cvbuf);
break;
}
default:
if (fbh->ColSqlType == SQL_CHAR
&& DBIc_is(imp_sth, DBIcf_ChopBlanks)
&& fbh->datalen > 0)
{
int len = fbh->datalen;
char *p0 = (char *)(fbh->data);
char *p = (char *)(fbh->data) + len;
while (p-- != p0)
{
if (*p != ' ')
break;
len--;
}
sv_setpvn(sv, p0, len);
break;
}
/* no ChopBlank */
if (fbh->ftype == SQL_C_FILE) /* #007 */
sv_setpvn(sv, (char*)fbh->data, strlen(fbh->data));
else
sv_setpvn(sv, (char*)fbh->data, fbh->datalen);
break;
}
}
else
{
SvOK_off(sv);
}
}
#if DBMAKER_FILE_INOUT
/*
* #004 This can be done by SQLGetData, but use dbmaker's way seems easier.
*/
if (imp_sth->fgBindColToFile)
{
int i;
imp_fbh_t *fbh;
for (fbh=imp_sth->fbh, i=0; i<imp_sth->n_result_cols; i++, fbh++)
{
if (fbh->ftype == SQL_C_FILE)
{
char buf[MAX_FILE_NAME_LEN];
struct stat fbuf;
do {
fbh->file_idxno++;
if (fbh->file_ext)
sprintf(fbh->data, "%s%d%s", fbh->file_prefix, fbh->file_idxno,fbh->file_ext);
else
sprintf(fbh->data, "%s%d", fbh->file_prefix, fbh->file_idxno);
} while(!fbh->fgOverwrite && !stat(fbh->data, &fbuf)); /* #008 */
if (dbis->debug >= 2)
fprintf(DBILOGFP,
"\tRebind/BindColToFile: col#%d to file:[%s]\n", i+1, fbh->data);
}
}
}
#endif
return av;
}
int
dbd_st_finish(sth)
SV *sth;
{
D_imp_sth(sth);
D_imp_dbh_from_sth;
D_imp_drh_from_dbh;
RETCODE rc;
int ret = 1;
/* Cancel further fetches from this cursor. */
/* We don't close the cursor till DESTROY (dbd_st_destroy). */
/* The application may re execute(...) it. */
if (DBIc_ACTIVE(imp_sth) && imp_dbh->hdbc != SQL_NULL_HDBC)
{
rc = SQLFreeStmt(imp_sth->hstmt, SQL_CLOSE);
dbmaker_error(sth, rc, "st_finish/SQLFreeStmt(SQL_CLOSE)");
if (rc != SQL_SUCCESS)
ret = 0;
#ifdef SOL22_AUTOCOMMIT_BUG
if (DBIc_is(imp_dbh, DBIcf_AutoCommit))
{
rc = SQLTransact(imp_drh->henv,
imp_dbh->hdbc,
SQL_COMMIT);
}
#endif
}
DBIc_ACTIVE_off(imp_sth);
return ret;
}
void
dbd_st_destroy(sth)
SV *sth;
{
D_imp_sth(sth);
D_imp_dbh_from_sth;
D_imp_drh_from_dbh;
RETCODE rc;
/* SQLxxx functions dump core when no connection exists. This happens
* when the db was disconnected before perl ending.
*/
if (imp_dbh->hdbc != SQL_NULL_HDBC)
SV *sth;
int colno;
char *file_prefix;
int fgOverwrite;
{
dTHR;
D_imp_sth(sth);
RETCODE rc;
imp_fbh_t *fbh;
struct stat fbuf;
int i, j, len1; /* #007 */
if (colno == 0) {
dbmaker_error(sth, SQL_ERROR,
"can not bind column 0 to a file");
return 0;
}
fbh = &imp_sth->fbh[colno-1];
if (strlen(file_prefix) > (MAX_FILE_NAME_LEN - MAX_DISPLAY_FILE_NUM))
croak("file name length must not exceed %d", MAX_FILE_NAME_LEN - MAX_DISPLAY_FILE_NUM);
if (fbh->ColDisplaySize <= MAX_FILE_NAME_LEN)
{
Newz(42, fbh->data, MAX_FILE_NAME_LEN, UCHAR);
}
fbh->ColDisplaySize = MAX_FILE_NAME_LEN-1;
fbh->ftype = SQL_C_FILE;
fbh->file_idxno = 0;
imp_sth->fgBindColToFile = 1;
len1 = strlen(file_prefix);
/* #007 check file seperator '.' */
for (j=0, i = len1-1; i > 0 && j < MAX_FILE_EXTENSION_LEN; i--,j++)
{
if (file_prefix[i] == '.' || file_prefix[i] == '\\' || file_prefix[i] == '/')
break;
}
if (file_prefix[i] == '.') /* #007 */
{
Newz(42, fbh->file_prefix, i+1, UCHAR);
Newz(42, fbh->file_ext, len1-i+1, UCHAR);
strncpy(fbh->file_prefix, file_prefix, i);
fbh->file_prefix[i] = '\0';
strcpy(fbh->file_ext, &file_prefix[i]);
}
else
{
Newz(42, fbh->file_prefix, len1+1, UCHAR);
strcpy(fbh->file_prefix, file_prefix);
fbh->file_ext = NULL;
}
sprintf(fbh->data, file_prefix);
if (!fgOverwrite) /* #008 */
{
while (!stat(fbh->data, &fbuf))
{
fbh->file_idxno++;
if (fbh->file_ext)
sprintf(fbh->data, "%s%d%s", fbh->file_prefix, fbh->file_idxno,fbh->file_ext);
else
sprintf(fbh->data, "%s%d", fbh->file_prefix, fbh->file_idxno);
} while(!stat(fbh->data, &fbuf));
}
fbh->fgOverwrite = fgOverwrite; /* #008 */
rc = SQLBindCol(imp_sth->hstmt,
colno,
fbh->ftype,
fbh->data,
fbh->ColDisplaySize,
&fbh->datalen);
if (dbis->debug >= 2)
fprintf(DBILOGFP,
"\tRebind/BindColToFile: col#%d to file:[%s] len(%d,%d)\n", colno, fbh->data,
fbh->ColDisplaySize, fbh->datalen);
if (!SQL_ok(rc)) {
dbmaker_error(sth, rc, "dbmaker_bind_col_to_file/SQLBindColToFile");
return 0;
}
return 1;
}
#endif
( run in 1.210 second using v1.01-cache-2.11-cpan-39bf76dae61 )