DBD-DBMaker

 view release on metacpan or  search on metacpan

dbdimp.c  view on Meta::CPAN

		       {
		       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)

dbdimp.c  view on Meta::CPAN

   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 )