| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- /*
- * Program type: API Interface
- *
- * Description:
- * This program executes a stored procedure and selects from
- * a stored procedure. First, a list of projects an employee
- * is involved in is printed. Then the employee is added to
- * another project. The new list of projects is printed again.
- * The contents of this file are subject to the Interbase Public
- * License Version 1.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy
- * of the License at http://www.Inprise.com/IPL.html
- *
- * Software distributed under the License is distributed on an
- * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
- * or implied. See the License for the specific language governing
- * rights and limitations under the License.
- *
- * The Original Code was created by Inprise Corporation
- * and its predecessors. Portions created by Inprise Corporation are
- * Copyright (C) Inprise Corporation.
- *
- * All Rights Reserved.
- * Contributor(s): ______________________________________.
- */
- #include <stdlib.h>
- #include <string.h>
- #include <ibase.h>
- #include <stdio.h>
- #include "example.h"
- #define PROJLEN 5
- #define BUFLEN 128
- int select_projects (isc_db_handle db, int emp_no);
- int add_emp_proj (isc_db_handle db, int emp_no, char * proj_id);
- int get_params (isc_db_handle db, int * emp_no, char * proj_id);
- int main (int argc, char** argv)
- {
- int emp_no;
- char proj_id[PROJLEN + 2];
- isc_db_handle db = NULL;
- ISC_STATUS_ARRAY status;
- 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)
- }
- /*
- * Add employee with id 8 to project 'MAPDB'.
- */
- if (get_params(db, &emp_no, proj_id))
- return 1;
- /*
- * Display employee's current projects.
- */
- printf("\nCurrent projects for employee id: %d\n\n", emp_no);
- if (select_projects(db, emp_no))
- return 1;
- /*
- * Insert a new employee project row.
- */
- printf("\nAdd employee id: %d to project: %s\n", emp_no, proj_id);
- if (add_emp_proj(db, emp_no, proj_id))
- return 1;
- /*
- * Display employee's new current projects.
- */
- printf("\nCurrent projects for employee id: %d\n\n", emp_no);
- if (select_projects(db, emp_no))
- return 1;
-
- if (isc_detach_database(status, &db))
- {
- ERREXIT(status, 1)
- }
- return 0 ;
- }
- /*
- * Select from a stored procedure.
- * Procedure 'get_emp_proj' gets employee's projects.
- */
- int select_projects (isc_db_handle db, int emp_no)
- {
- char proj_id[PROJLEN + 2];
- char selstr[BUFLEN];
- short flag0 = 0;
- isc_tr_handle trans = NULL;
- ISC_STATUS_ARRAY status;
- isc_stmt_handle stmt = NULL;
- XSQLDA *sqlda;
- long fetch_stat;
- sprintf(selstr, "SELECT proj_id FROM get_emp_proj (%d) ORDER BY proj_id",
- emp_no);
- sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(1));
- sqlda->sqln = 1;
- sqlda->version = 1;
- if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
- {
- ERREXIT(status, 1)
- }
- if (isc_dsql_allocate_statement(status, &db, &stmt))
- {
- ERREXIT(status, 1)
- }
- if (isc_dsql_prepare(status, &trans, &stmt, 0, selstr, 1, sqlda))
- {
- ERREXIT(status, 1)
- }
- sqlda->sqlvar[0].sqldata = (char *) proj_id;
- sqlda->sqlvar[0].sqlind = &flag0;
- sqlda->sqlvar[0].sqltype = SQL_TEXT + 1;
- if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
- {
- ERREXIT(status, 1)
- }
- while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)
- {
- proj_id[PROJLEN] = '\0';
- printf("\t%s\n", proj_id);
- }
- if (fetch_stat != 100L)
- {
- ERREXIT(status, 1)
- }
- if (isc_dsql_free_statement(status, &stmt, DSQL_close))
- {
- ERREXIT(status, 1)
- }
-
- if (isc_commit_transaction(status, &trans))
- {
- ERREXIT(status, 1)
- }
- free(sqlda);
- return 0;
- }
- /*
- * Execute a stored procedure.
- * Procedure 'add_emp_proj' adds an employee to a project.
- */
- int add_emp_proj (isc_db_handle db, int emp_no, char *proj_id)
- {
- char exec_str[BUFLEN];
- isc_tr_handle trans = NULL;
- ISC_STATUS_ARRAY status;
- sprintf(exec_str, "EXECUTE PROCEDURE add_emp_proj %d, \"%s\"",
- emp_no, proj_id);
- if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
- {
- ERREXIT(status, 1)
- }
- if (isc_dsql_execute_immediate(status, &db, &trans, 0, exec_str, 1, NULL))
- {
- ERREXIT(status, 1)
- }
-
- if (isc_commit_transaction(status, &trans))
- {
- ERREXIT (status, 1)
- }
- return 0;
- }
- /*
- * Set-up procedure parameters and clean-up old data.
- */
- int get_params (isc_db_handle db, int *emp_no, char *proj_id)
- {
- isc_tr_handle trans = NULL;
- ISC_STATUS_ARRAY status;
- *emp_no = 8;
- strcpy(proj_id, "MAPDB");
-
- /* Cleanup: delete row from the previous run. */
- if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
- {
- ERREXIT(status, 1)
- }
- if (isc_dsql_execute_immediate(status, &db, &trans, 0,
- "DELETE FROM employee_project \
- WHERE emp_no = 8 AND proj_id = 'MAPDB'", 1,
- NULL))
- {
- ERREXIT(status, 1)
- }
- if (isc_commit_transaction(status, &trans))
- {
- ERREXIT(status, 1)
- }
- return 0;
- }
|