Exemple #1
0
int execute( char * exec_str )
{
   isc_tr_handle trans = NULL;
   long          status[ 20 ];

   if( isc_start_transaction( status, &trans, 1, &db, 0, NULL ) )
      ERREXIT( status, 1 );

   if( isc_dsql_execute_immediate( status, &db, &trans, 0, exec_str, dialect, NULL ) )
      ERREXIT( status, 1 );

   if( isc_commit_transaction( status, &trans ) )
      ERREXIT( status, 1 );

   return 1;
}
void
IB_Statement::executeImmediate(const IB_STRING sqlString)
{
  if (stmtHandle_) // execute-immediate an open statement
    throw new IB_SQLException (IB_SQLException::bugCheck__0__, 
			       10007,
			       IB_SQLException::bugCheckException__);

  if (isc_dsql_execute_immediate (status_->vector(), 
				  connection_->dbHandleP(),
				  transaction_->trHandleP(),
				  0,
				  sqlString,
// CJL-IB6 add SQLDialect support, and obsolete sqldaVersion
				  connection_->attachmentSQLDialect_,
//			sqldaVersion__,
// CJL-IB6 end
				  NULL))
    throw new IB_SQLException (IB_SQLException::engine__default_0__, status_);
}
int main(int argc, char * argv[])
{
#if HAVE_PTHREAD_ATTR_GETSTACK
  pthread_attr_t  attr;
  pthread_attr_init(&attr);
  void *  stackaddr;
  size_t  stacksize;
  pthread_attr_getstack(&attr, &stackaddr, &stacksize);
  printf("stackaddr = %p, stacksize = %u\n", stackaddr, stacksize);
  pthread_attr_destroy(&attr);
#endif

  /*  sigset_t signal_set;
    sigemptyset(&signal_set);
    sigaddset(&signal_set, SIGHUP);
    sigaddset(&signal_set, SIGUSR1);
    sigaddset(&signal_set, SIGUSR2);
    sigaddset(&signal_set, SIGTERM);
    sigaddset(&signal_set, SIGINT);
    sigaddset(&signal_set, SIGQUIT);
    pthread_sigmask(SIG_BLOCK, &signal_set, NULL);*/

  void *  fbclient  = dlopen("libgds.so", 0);
  printf("fbclient = %p\n", fbclient);

  ISC_STATUS  status[20];

  union {
      ISC_STATUS ISC_EXPORT (* isc_dsql_execute_immediate)(ISC_STATUS *,
                                                           isc_db_handle *,
                                                           isc_tr_handle *,
                                                           unsigned short,
                                                           char *,
                                                           unsigned short,
                                                           XSQLDA *);
      void *  p0;
  };
  p0 = dlsym(fbclient, "isc_dsql_execute_immediate");
  if( p0 != NULL ){
    isc_db_handle dbHandle  = NULL;
    isc_tr_handle trHandle  = NULL;
    long          r         = isc_dsql_execute_immediate(status, &dbHandle, &trHandle, 0, "CREATE DATABASE 'localhost:/usr/local/firebird/MACROSCOPE.FDB' user 'sysdba' password 'masterkey'", 3, NULL);
    printf("isc_dsql_execute_immediate = %ld, dbHandle = %p, trHandle = %p\n", r, dbHandle, trHandle);

    union {
        ISC_STATUS ISC_EXPORT (* isc_detach_database)(ISC_STATUS * status,
                                                      isc_db_handle * handle);
        void *  p2;
    };
    p2 = dlsym(fbclient, "isc_detach_database");
    r = isc_detach_database(status, &dbHandle);
    printf("isc_detach_database = %ld, dbHandle = %p\n", r, dbHandle);

    union {
        ISC_STATUS ISC_EXPORT (* isc_attach_database)(ISC_STATUS * status,
                                                      short dbNameLen,
                                                      const char * dbName,
                                                      isc_db_handle * handle,
                                                      short dpbLen,
                                                      const char * dpb);
        void *  p1;
    };
    p1 = dlsym(fbclient, "isc_attach_database");
    printf("isc_attach_database = %p\n", p1);

    char  dpb[] = {
      isc_dpb_version1, isc_dpb_user_name, 6, 'S', 'Y', 'S', 'D', 'B', 'A', isc_dpb_password, 9, 'm', 'a', 's', 't', 'e', 'r', 'k', 'e', 'y'
    };
    r = isc_attach_database(status, 0, "localhost:/usr/local/firebird/MACROSCOPE.FDB", &dbHandle, sizeof(dpb), dpb);
    printf("isc_attach_database = %ld, dbHandle = %p\n", r, dbHandle);
    r = isc_detach_database(status, &dbHandle);
    printf("isc_detach_database = %ld, dbHandle = %p\n", r, dbHandle);
  }
  dlclose(fbclient);
  return 0;
}
Exemple #4
0
int main (int argc, char** argv)
{
    char            dept_no[4];
    double          percent_inc;
    short           flag0 = 0, flag1 = 0;
    XSQLDA         *sqlda;
    long            sqlcode;
    char            empdb[128];

    if (argc > 1)
        strcpy(empdb, argv[1]);
    else
        strcpy(empdb, "employee.fdb");
    
    if (isc_attach_database(status, 0, empdb, &DB, 0, NULL))
    {
        ERREXIT(status, 1)
    }

    /* Allocate an input SQLDA.  There are two unknown parameters. */
    sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(2));
    sqlda->sqln = 2;
    sqlda->sqld = 2;
    sqlda->version = 1;

    sqlda->sqlvar[0].sqldata = (char *) &percent_inc;
    sqlda->sqlvar[0].sqltype = SQL_DOUBLE + 1;
    sqlda->sqlvar[0].sqllen  = sizeof(percent_inc);
    sqlda->sqlvar[0].sqlind  = &flag0;
    flag0 = 0;

    sqlda->sqlvar[1].sqldata = dept_no;
    sqlda->sqlvar[1].sqltype = SQL_TEXT + 1;
    sqlda->sqlvar[1].sqllen  = 3;
    sqlda->sqlvar[1].sqlind  = &flag1;
    flag1 = 0;               

    /*
     *  Get the next department-percent increase input pair.
     */
    while (get_input(dept_no, &percent_inc))
    {
        printf("\nIncreasing budget for department:  %s  by %5.2lf percent.\n",
               dept_no, percent_inc);

        if (isc_start_transaction(status, &trans, 1, &DB, 0, NULL))
        {
            ERREXIT(status, 1)
        }

        /* Update the budget. */
        isc_dsql_execute_immediate(status, &DB, &trans, 0, updstr, 1, sqlda);
        sqlcode = isc_sqlcode(status);
        if (sqlcode)
        {
            /* Don't save the update, if the new budget exceeds the limit. */
            if (sqlcode == -625)
            {
                printf("\tExceeded budget limit -- not updated.\n");

                if (isc_rollback_transaction(status, &trans))
                {
                    ERREXIT(status, 1)
                }
                continue;
            }
            /* Undo all changes, in case of an error. */
            else
            {
                isc_print_status(status);
                printf("SQLCODE=%d\n", sqlcode);

                isc_rollback_transaction(status, &trans);
                ERREXIT(status, 1)
            }
        }
Exemple #5
0
/**
 * This function provides the create class method for Database class.
 *
 * @param  usused    Like it says, not used.
 * @param  file      A String containing the  name of the primary file for the
 *                   database to be created.
 * @param  user      The database user that will be used in creating the new
 *                   database.
 * @param  password  A String containing the password for the user to be used
 *                   in creating the database.
 * @param  size      The size of pages that will be used by the database.
 * @param  set       A String containing the name of the character set to be
 *                   used in creating the database.
 *
 * @return  A reference to a Database object on success, nil on failure.
 *
 */
static VALUE createDatabase(int argc, VALUE *argv, VALUE unused) {
  VALUE database    = Qnil,
        set         = Qnil,
        tmp_str     = Qnil;
  char sql[512]    = "",
  *text       = NULL;
  int value       = 1024;
  isc_db_handle connection  = 0;
  isc_tr_handle transaction = 0;
  ISC_STATUS status[ISC_STATUS_LENGTH];

  /* Check that sufficient parameters have been provided. */
  if(argc < 3) {
    rb_raise(rb_eArgError, "Wrong number of parameters (%d for %d).", argc,
             3);
  }

  /* Check values that are permitted restricted values. */
  if(argc > 3) {
    value = FIX2INT(argv[3]);
    if(value != 1024 && value != 2048 && value != 4096 && value != 8192) {
      rb_raise(rb_eException,
               "Invalid database page size value . Valid values are 1024, " \
               "2048 4096 or 8192.");
    }
  }

  /* Prepare the SQL statement. */
  tmp_str = rb_funcall(argv[0], rb_intern("to_s"), 0);
  sprintf(sql, "CREATE DATABASE '%s'", StringValuePtr(tmp_str));

  tmp_str = rb_funcall(argv[1], rb_intern("to_s"), 0);
  text = StringValuePtr(tmp_str);
  if(strlen(text) > 0) {
    strcat(sql, " USER '");
    strcat(sql, text);
    strcat(sql, "'");
  }

  tmp_str = rb_funcall(argv[2], rb_intern("to_s"), 0);
  text = StringValuePtr(tmp_str);
  if(strlen(text) > 0) {
    strcat(sql, " PASSWORD '");
    strcat(sql, text);
    strcat(sql, "'");
  }

  if(argc > 3) {
    char text[50];

    sprintf(text, " PAGE_SIZE = %d", value);
    strcat(sql, text);
  }

  if(argc > 4 && argv[4] != Qnil) {
    char *text = NULL;

    set  = rb_funcall(argv[4], rb_intern("to_s"), 0);
    text = StringValuePtr(set);
    if(strlen(text) > 0) {
      strcat(sql, " DEFAULT CHARACTER SET ");
      strcat(sql, text);
    }
  }
  strcat(sql, ";");

  if(isc_dsql_execute_immediate(status, &connection, &transaction, 0, sql,
                                3, NULL) != 0) {
    rb_fireruby_raise(status, "Database creation error.");
  }

  if(connection != 0) {
    isc_detach_database(status, &connection);
  }

  database = rb_database_new(argv[0]);
  if(set != Qnil) {
    setDatabaseCharacterSet(database, set);
  }

  return(database);
}