C/C++ example
/* * (C) Copyright 1996-2012 ECMWF. * * This software is licensed under the terms of the Apache Licence Version 2.0 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. * In applying this licence, ECMWF does not waive the privileges and immunities * granted to it by virtue of its status as an intergovernmental organisation nor * does it submit to any jurisdiction. */ /// \file examples.cc /// /// This file contains examples of usage of public APIs. /// /// @author Piotr Kuchta, ECMWF, July 2016 #include "odb_api/odbql.h" // We need to include stdio.h for the fprintf declaration #include "stdio.h" #define checkRC(return_code, message, db) { \ if (return_code != ODBQL_OK) { \ fprintf(stderr, "%s: %s\n", message, odbql_errmsg(db)); \ odbql_close(db); \ return 1; \ } \ } int odbql_example_insert_data() { odbql *db; odbql_stmt *stmt; int i; int rc = odbql_open("", &db); checkRC(rc, "Cannot open database", db); rc = odbql_prepare_v2(db, "CREATE TYPE bf AS (f1 bit1, f2 bit2);\n" "CREATE TABLE foo AS" " (x INTEGER, y REAL, v STRING, status bf)" " ON 'new_api_c_example.odb';", -1, &stmt, 0); checkRC(rc, "Failed to prepare DDL statements", db); rc = odbql_prepare_v2(db, "INSERT INTO foo (x,y,v,status) VALUES (?,?,?,?);", -1, &stmt, 0); checkRC(rc, "Failed to prepare INSERT statement", db); // Populate first row with NULLs for (i = 0; i < 4; ++i) odbql_bind_null(stmt, i); rc = odbql_step(stmt); // Few more rows with some non-NULL values for (i = 0 ; i < 4; ++i) { rc = odbql_bind_int(stmt, 0, 1 * i); checkRC(rc, "Failed to bind int value", db); rc = odbql_bind_double(stmt, 1, 0.1 * i); checkRC(rc, "Failed to bind double value", db); rc = odbql_bind_text(stmt, 2, i%2 ? "hello" : "HELLO", 5 /* strlen("hello") */, ODBQL_STATIC); checkRC(rc, "Failed to bind string", db); rc = odbql_bind_int(stmt, 3, 3 * i); checkRC(rc, "Failed to bind bitfield value", db); rc = odbql_step(stmt); //checkRC(rc, "Failed to step and write row", db); } rc = odbql_finalize(stmt); checkRC(rc, "odbql_finalize failed", db); rc = odbql_close(db); checkRC(rc, "odbql_close failed", db); return 0; } int odbql_example_select_data_read_results() { odbql *db; odbql_stmt *res; int i, rc, column, number_of_columns; long long number_of_rows = 0, number_of_rows_in_current_dataset = 0; rc = odbql_open("new_api_c_example.odb", &db); checkRC(rc, "Cannot open file", db); //rc = odbql_prepare_v2(db, "SELECT x,y,v,status,status.* FROM foo;", -1, &res, 0); rc = odbql_prepare_v2(db, "SELECT * FROM 'new_api_c_example.odb';", -1, &res, 0); checkRC(rc, "Failed to prepare statement", db); // Print rows of data. while((rc = odbql_step(res)) != ODBQL_DONE) { if (number_of_rows == 0 || rc == ODBQL_METADATA_CHANGED) { number_of_columns = odbql_column_count(res); if (number_of_rows_in_current_dataset) printf("Number of rows: %d\n", number_of_rows_in_current_dataset); /* // Print CSV header. Each field is a colon separated pair of column name and type. printf("\nNew dataset. Number of columns: %d\n", number_of_columns); for (i = 0; i < number_of_columns; ++i) printf("%s:%d%s", odbql_column_name(res, i), odbql_column_type(res, i), ((i < number_of_columns - 1) ? "," : "")); printf("\n"); */ number_of_rows_in_current_dataset = 0; } if (rc == ODBQL_ROW) { column = 0; /* for (; column < number_of_columns; ++column) { printf("%s%s", odbql_column_value(res, column) ? odbql_column_text(res, column) : (unsigned char *) "NULL", ((column < number_of_columns - 1) ? "," : "")); } */ if (number_of_rows == 0) { for (i = 0; i < number_of_columns; ++i) if (odbql_column_value(res, i)) return 100; // first row should be all NULLL } else { // Check first column odbql_value* pv = odbql_column_value(res, 0); if ( pv == 0 ) { fprintf (stderr, "\nUnexpected NULL in column %ld of row %ld\n", 0L, number_of_rows); return 101; } int iv = odbql_value_int(pv); if ( iv != number_of_rows - 1) { fprintf (stderr, "\nUnexpected value in column %ld of row %ld\n", 0L, number_of_rows); return 102; } // Check last column (bitfield) // We have a NULL on the first column (set with odbql_bind_null) // but also on the second line, because 0 in a bitfield column means NULL // (ECMWF convention since ODB-1) if (number_of_rows > 1) { pv = odbql_column_value(res, 3); if ( pv == 0 ) { fprintf (stderr, "\nUnexpected NULL in column %ld of row %ld\n", 3L, number_of_rows); return 103; } iv = odbql_value_int(pv); if ( iv != 3 * (number_of_rows - 1)) { fprintf (stderr, "\nUnexpected value in column %ld of row %ld\n", 3L, number_of_rows); return 104; } } } printf("\n"); } ++ number_of_rows; ++ number_of_rows_in_current_dataset; } if (number_of_rows_in_current_dataset) printf("Number of rows: %d\n", number_of_rows_in_current_dataset); printf("\nProcessed %ld rows.\n", number_of_rows); return 0; } int odbql_example_execute_embedded_ecml() { odbql *db; odbql_stmt *res; int rc; rc = odbql_open("new_api_c_example.odb", &db); checkRC(rc, "Cannot open database", db); rc = odbql_prepare_v2(db, " { compare, left = new_api_c_example.odb, right = new_api_c_example.odb }; ", -1, &res, 0); checkRC(rc, "Failed to prepare embedded statement", db); // Print rows of data. while((rc = odbql_step(res)) != ODBQL_DONE) { printf("\n---\n"); } rc = odbql_finalize(res); checkRC(rc, "odbql_finalize failed", db); rc = odbql_close(db); checkRC(rc, "odbql_close failed", db); return 0; }