DBD-Sybase

 view release on metacpan or  search on metacpan

dbdimp.c  view on Meta::CPAN

  imp_dbh->database[0] = 0;
  imp_dbh->curr_db[0] = 0;
  imp_dbh->encryptPassword[0] = 0;
  imp_dbh->showSql = 0;
  imp_dbh->showEed = 0;
  imp_dbh->flushFinish = FLUSH_FINISH;
  imp_dbh->doRealTran = NO_CHAINED_TRAN; /* default to use chained transaction mode */
  imp_dbh->chainedSupported = 1;
  imp_dbh->quotedIdentifier = 0;
  imp_dbh->rowcount = 0;
  imp_dbh->doProcStatus = PROC_STATUS;
  imp_dbh->useBin0x = 0;
  imp_dbh->binaryImage = 0;
  imp_dbh->deadlockRetry = 0;
  imp_dbh->deadlockSleep = 0;
  imp_dbh->deadlockVerbose = 0;
  imp_dbh->nsqlNoStatus = 0;
  imp_dbh->noChildCon = 0;
  imp_dbh->failedDbUseFatal = fetchAttrib(attribs, "syb_failed_db_fatal");
  imp_dbh->bindEmptyStringNull = fetchAttrib(attribs, "syb_bind_empty_string_as_null");
  imp_dbh->err_handler = fetchSvAttrib(attribs, "syb_err_handler");
  imp_dbh->alwaysForceFailure = 1;
  imp_dbh->kerberosPrincipal[0] = 0;
  imp_dbh->kerbGetTicket = fetchSvAttrib(attribs, "syb_kerberos_serverprincipal");
  imp_dbh->disconnectInChild = fetchAttrib(attribs, "syb_disconnect_in_child");
  imp_dbh->host[0] = 0;
  imp_dbh->port[0] = 0;
  imp_dbh->enable_utf8 = fetchAttrib(attribs, "syb_enable_utf8");
#if !defined(DBD_CAN_HANDLE_UTF8)
  if (imp_dbh->enable_utf8) {
    warn("The current version of OpenClient can't handle utf8 data.");
  }
  imp_dbh->enable_utf8 = 0;
#endif

  imp_dbh->blkLogin[0] = 0;

  imp_dbh->dateFmt = 0;
  imp_dbh->inUse = 0;
  imp_dbh->init_done = 0;

  if (strchr(dsn, '=')) {
    extractFromDsn("server=", dsn, imp_dbh->server, 64);
    extractFromDsn("charset=", dsn, imp_dbh->charset, 64);
    extractFromDsn("database=", dsn, imp_dbh->database, 260);
    extractFromDsn("packetSize=", dsn, imp_dbh->packetSize, 64);
    extractFromDsn("language=", dsn, imp_dbh->language, 64);
    extractFromDsn("interfaces=", dsn, imp_dbh->ifile, 255);
    extractFromDsn("loginTimeout=", dsn, imp_dbh->loginTimeout, 64);
    extractFromDsn("timeout=", dsn, imp_dbh->timeout, 64);
    extractFromDsn("scriptName=", dsn, imp_dbh->scriptName, 255);
    extractFromDsn("hostname=", dsn, imp_dbh->hostname, 255);
    extractFromDsn("tdsLevel=", dsn, imp_dbh->tdsLevel, 30);
    extractFromDsn("encryptPassword=", dsn, imp_dbh->encryptPassword, 10);
    extractFromDsn("kerberos=", dsn, imp_dbh->kerberosPrincipal, 255);
    extractFromDsn("host=", dsn, imp_dbh->host, 64);
    extractFromDsn("port=", dsn, imp_dbh->port, 20);
    extractFromDsn("maxConnect=", dsn, imp_dbh->maxConnect, 25);
    extractFromDsn("sslCAFile=", dsn, imp_dbh->sslCAFile, 255);
    extractFromDsn("bulkLogin=", dsn, imp_dbh->blkLogin, 10);
    extractFromDsn("tds_keepalive=", dsn, imp_dbh->tds_keepalive, 10);
    extractFromDsn("serverType=", dsn, imp_dbh->serverType, 30);
  } else {
    strncpy(imp_dbh->server, dsn, 64);
    imp_dbh->server[63] = 0;
  }

  strncpy(imp_dbh->uid, uid, UID_PWD_SIZE);
  imp_dbh->uid[UID_PWD_SIZE - 1] = 0;
  strncpy(imp_dbh->pwd, pwd, UID_PWD_SIZE);
  imp_dbh->pwd[UID_PWD_SIZE - 1] = 0;

  sv_setpv(DBIc_ERRSTR(imp_dbh), "");

  if (imp_dbh->kerbGetTicket) {
    fetchKerbTicket(imp_dbh);
  }

  imp_dbh->pid = getpid();

#if PERL_VERSION >= 8 && defined(_REENTRANT)
  MUTEX_LOCK(context_alloc_mutex);
#endif

  if ((imp_dbh->connection = syb_db_connect(imp_dbh)) == NULL) {
    retval = 0;
  } else {
    retval = 1;
  }

#if PERL_VERSION >= 8 && defined(_REENTRANT)
  MUTEX_UNLOCK(context_alloc_mutex);
#endif

  if (!retval) {
    return retval;
  }

  if (!imp_dbh->serverType[0] || !strncasecmp(imp_dbh->serverType, "ase", 3)) {
    get_server_version(dbh, imp_dbh, imp_dbh->connection);
  }

  DBIc_IMPSET_on(imp_dbh); /* imp_dbh set up now		*/
  DBIc_ACTIVE_on(imp_dbh); /* call disconnect before freeing*/

  DBIc_LongReadLen(imp_dbh) = 32768;

  return 1;
}

static CS_CONNECTION *syb_db_connect(imp_dbh_t *imp_dbh) {
  dTHR;
  CS_RETCODE retcode;
  CS_CONNECTION *connection = NULL;
  char ofile[255];
  int len;

  /* Allow increase of the max number of connections - patch supplied by Ed Avis */
  if (imp_dbh->maxConnect[0]) {
    /* Maximum number of connections. */
    const char * const s = imp_dbh->maxConnect;

dbdimp.c  view on Meta::CPAN

    }
    if ((retcode = ct_config(context, CS_SET, CS_TIMEOUT, &timeout, CS_UNUSED, NULL)) != CS_SUCCEED) {
      warn("ct_config(CS_SET, CS_TIMEOUT) failed");
    }
  }

  if (imp_dbh->language[0] == 0 && imp_dbh->charset[0] == 0) {
    if (DBIc_DBISTATE(imp_dbh)->debug >= 3) {
      PerlIO_printf(DBIc_LOGPIO(imp_dbh),"    syb_db_login() -> using global CS_LOCALE data\n");
    }
  } else {
    CS_INT type = CS_DATES_SHORT;

    if (DBIc_DBISTATE(imp_dbh)->debug >= 3) {
      PerlIO_printf(DBIc_LOGPIO(imp_dbh), "    syb_db_login() -> using private CS_LOCALE data\n");
    }
    /* Set up the proper locale - to handle character sets, etc. */
    if ((retcode = cs_loc_alloc(context, &imp_dbh->locale) != CS_SUCCEED)) {
      warn("cs_loc_alloc failed");
      return 0;
    }
    if (cs_locale(context, CS_SET, imp_dbh->locale, CS_LC_ALL, (CS_CHAR*) NULL, CS_UNUSED, (CS_INT*) NULL) 
        != CS_SUCCEED) {
      warn("cs_locale(CS_LC_ALL) failed");
      return 0;
    }
    if (imp_dbh->language[0] != 0) {
      if (DBIc_DBISTATE(imp_dbh)->debug >= 3) {
        PerlIO_printf(DBIc_LOGPIO(imp_dbh), "    syb_db_login() -> cs_locale(CS_SYB_LANG,%s)\n",
            imp_dbh->language);
      }
      if (cs_locale(context, CS_SET, imp_dbh->locale, CS_SYB_LANG,
          (CS_CHAR*) imp_dbh->language, CS_NULLTERM, (CS_INT*) NULL)
          != CS_SUCCEED) {
        warn("cs_locale(CS_SYB_LANG, %s) failed", imp_dbh->language);
        return 0;
      }
    }
    if (imp_dbh->charset[0] != 0) {
      if (DBIc_DBISTATE(imp_dbh)->debug >= 3) {
        PerlIO_printf(DBIc_LOGPIO(imp_dbh),
            "    syb_db_login() -> cs_locale(CS_SYB_CHARSET,%s)\n",
            imp_dbh->charset);
      }
      if (cs_locale(context, CS_SET, imp_dbh->locale, CS_SYB_CHARSET,
          (CS_CHAR*) imp_dbh->charset, CS_NULLTERM, (CS_INT*) NULL)
          != CS_SUCCEED) {
        warn("cs_locale(CS_SYB_CHARSET, %s) failed", imp_dbh->charset);
        return 0;
      }
    }

    if (cs_dt_info(context, CS_SET, imp_dbh->locale, CS_DT_CONVFMT,
        CS_UNUSED, (CS_VOID*) &type, CS_SIZEOF(CS_INT), NULL)
        != CS_SUCCEED) {
        warn("cs_dt_info() failed");
    }
  }

#if defined(CS_CON_KEEPALIVE)
    if (imp_dbh->tds_keepalive[0]) {
      int tds_keepalive = atoi(imp_dbh->tds_keepalive);

      if (tds_keepalive != 1) {
        tds_keepalive = 0;
      }

      if(DBIc_DBISTATE(imp_dbh)->debug >= 3) {
        PerlIO_printf(DBIc_LOGPIO(imp_dbh), "syb_db_login() -> ct_config(CS_CON_KEEPALIVE,%d)\n", tds_keepalive);
      }

      if((retcode = ct_config(context, CS_SET, CS_CON_KEEPALIVE, &tds_keepalive, CS_UNUSED, NULL)) != CS_SUCCEED) {
        warn("ct_config(CS_SET, CS_CON_KEEPALIVE) failed");
      }
    }
#endif

    if ((retcode = ct_con_alloc(context, &connection)) != CS_SUCCEED) {
      warn("ct_con_alloc failed");
      return 0;
    }

    if (imp_dbh->locale) {
      if (ct_con_props(connection, CS_SET, CS_LOC_PROP,
              (CS_VOID*)imp_dbh->locale, CS_UNUSED, (CS_INT*)NULL)
          != CS_SUCCEED) {

        warn("ct_con_props(CS_LOC_PROP) failed");
        return 0;
      }
    }

    if ((retcode = ct_con_props(connection, CS_SET, CS_USERDATA, &imp_dbh,
                CS_SIZEOF(imp_dbh), NULL)) != CS_SUCCEED) {
      warn("ct_con_props(CS_USERDATA) failed");
      return 0;
    }
    if (imp_dbh->tdsLevel[0] != 0) {
      CS_INT value = 0;
      if (strEQ(imp_dbh->tdsLevel, "CS_TDS_40")) {
        value = CS_TDS_40;
      } else if (strEQ(imp_dbh->tdsLevel, "CS_TDS_42")) {
        value = CS_TDS_42;
      } else if (strEQ(imp_dbh->tdsLevel, "CS_TDS_46")) {
        value = CS_TDS_46;
      } else if (strEQ(imp_dbh->tdsLevel, "CS_TDS_495")) {
        value = CS_TDS_495;
      } else if (strEQ(imp_dbh->tdsLevel, "CS_TDS_50")) {
        value = CS_TDS_50;
      }

      if (value) {
        if (DBIc_DBISTATE(imp_dbh)->debug >= 3) {
          PerlIO_printf(DBIc_LOGPIO(imp_dbh), "    syb_db_login() -> ct_con_props(CS_TDS_VERSION,%s)\n", 
            imp_dbh->tdsLevel);
        }

        if (ct_con_props(connection, CS_SET, CS_TDS_VERSION,
                (CS_VOID*)&value, CS_UNUSED, (CS_INT*)NULL) != CS_SUCCEED) {
          warn("ct_con_props(CS_TDS_VERSION, %s) failed", imp_dbh->tdsLevel);
        }
      } else {
        warn("Unkown tdsLevel value %s found", imp_dbh->tdsLevel);
      }
    }

    if (imp_dbh->packetSize[0] != 0) {
      int i = atoi(imp_dbh->packetSize);
      if (DBIc_DBISTATE(imp_dbh)->debug >= 3) {
        PerlIO_printf(DBIc_LOGPIO(imp_dbh), "    syb_db_login() -> ct_con_props(CS_PACKETSIZE,%d)\n", i);
      }
      if (ct_con_props(connection, CS_SET, CS_PACKETSIZE, (CS_VOID*)&i,



( run in 3.343 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )