Advertisement
Guest User

Untitled

a guest
Jun 30th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Eiffel 4.37 KB | None | 0 0
  1. note
  2.     description:
  3.         "[
  4.             Skeleton database.
  5.            
  6.             This database connects via ODBC to a data source
  7.             called "dose2010" with user "dose" and password "1234".
  8.  
  9.         ]"
  10.     date: "$Date: 2010-11-05 10:26:09 -0300 (Fri, 05 Nov 2010) $"
  11.     revision: "$Revision: 968 $"
  12.  
  13. class
  14.     S_DATABASE
  15.  
  16. inherit
  17.  
  18.     SYSTEM_ENCODINGS
  19.         export {NONE} all end
  20.  
  21. create
  22.     make
  23.  
  24. feature {NONE} -- Initialization
  25.  
  26.     make
  27.             -- Initialize database.
  28.         do
  29.             create odbc_database
  30.         end
  31.  
  32. feature -- Access
  33.  
  34.     change: DB_CHANGE
  35.             -- Access to database changing functions.
  36.  
  37.     selection: DB_SELECTION
  38.             -- Access to database selecting functions.
  39.  
  40.     session_control: DB_CONTROL
  41.             -- Database session control.
  42.  
  43. feature -- Status report
  44.  
  45.     is_connected: BOOLEAN
  46.             -- Is database connected?
  47.         do
  48.             Result := session_control /= Void and then session_control.is_connected
  49.         end
  50.  
  51.     table_exists (a_table: STRING): BOOLEAN
  52.             -- Does table `a_table' exist in database?
  53.         require
  54.             connected: is_connected
  55.         local
  56.             l_tuple: DB_TUPLE
  57.         do
  58.             selection.clear_all
  59.             selection.set_map_name (a_table, "table_name")
  60.             selection.query ("SELECT CASE WHEN EXISTS((SELECT * FROM information_schema.tables WHERE table_name = :table_name)) THEN 1 ELSE 0 END")
  61.             if selection.is_ok then
  62.                 selection.load_result
  63.                 create l_tuple.copy (selection.cursor)
  64.                 Result := l_tuple.item (1).out ~ "1"
  65.             else
  66.                 print_sql_error_and_reset
  67.             end
  68.             selection.terminate
  69.         end
  70.  
  71. feature -- Basic operations
  72.  
  73.     connect
  74.             -- Connect to database.
  75.         do
  76.             odbc_database.set_data_source ("store-dose")
  77.             odbc_database.login ("group4", "dose2010")
  78.             odbc_database.set_base
  79.  
  80.             create session_control.make
  81.             create selection.make
  82.             create change.make
  83.  
  84.             session_control.connect
  85.         end
  86.  
  87.     disconnect
  88.             -- Disconnect from database.
  89.         do
  90.             if is_connected then
  91.                 session_control.disconnect
  92.             end
  93.         ensure
  94.             not_connected: not is_connected
  95.         end
  96.  
  97.     execute_sql_file (a_filename: STRING)
  98.             -- Execute SQL statements in file `a_filename'.
  99.             -- This function assumes that there is exactly one statement per line.
  100.         require
  101.             connected: is_connected
  102.             file_exists: (create {RAW_FILE}.make (a_filename)).exists
  103.         local
  104.             l_raw: RAW_FILE
  105.             l_file: PLAIN_TEXT_FILE
  106.             l_sql: STRING
  107.         do
  108.             from
  109.                 create l_file.make_open_read (a_filename)
  110.             until
  111.                 l_file.end_of_file
  112.             loop
  113.                 l_file.read_line
  114.  
  115.                 l_sql := l_file.last_string
  116.  
  117.                 l_sql.left_adjust
  118.                 l_sql.right_adjust
  119.                 if not l_sql.is_empty then
  120.                     change.modify (l_sql)
  121.                     if not change.is_ok then
  122.                         print_sql_error_and_reset
  123.                     end
  124.                 end
  125.             end
  126.         end
  127.  
  128.     insert_string_32 (a_value: STRING_32)
  129.             -- Store `a_value' in database.
  130.         local
  131.             l_utf8_data: STRING_8
  132.         do
  133.             utf32.convert_to (utf8, a_value)
  134.             l_utf8_data := utf32.last_converted_stream
  135.  
  136.             change.clear_all
  137.             change.set_map_name (l_utf8_data, "data")
  138.             change.modify ("INSERT INTO s_skeleton_table (field) VALUES (:data)")
  139.             if not change.is_ok then
  140.                 print_sql_error_and_reset
  141.             end
  142.         end
  143.  
  144.     load_data
  145.             -- Load data from database and store it in `last_data'.
  146.         local
  147.             l_data_container: LINKED_LIST [DB_RESULT]
  148.             l_tuple: DB_TUPLE
  149.             l_id: INTEGER_REF
  150.             l_raw_data: STRING_8
  151.         do
  152.             create l_data_container.make
  153.             create last_data.make
  154.  
  155.             selection.clear_all
  156.             selection.query ("SELECT * FROM s_skeleton_table")
  157.  
  158.             if selection.is_ok then
  159.                 selection.set_container (l_data_container)
  160.                 selection.load_result
  161.                 from
  162.                     l_data_container.start
  163.                 until
  164.                     l_data_container.after
  165.                 loop
  166.                     create l_tuple.copy (l_data_container.item)
  167.  
  168.                     l_id ?= l_tuple.item (1)
  169.                     l_raw_data ?= l_tuple.item (2)
  170.                     utf8.convert_to (utf32, l_raw_data)
  171.  
  172.                     last_data.extend ([l_id.item, utf8.last_converted_string.as_string_32])
  173.  
  174.                     l_data_container.forth
  175.                 end
  176.             else
  177.                 print_sql_error_and_reset
  178.             end
  179.  
  180.             selection.terminate
  181.         end
  182.  
  183.     last_data: LINKED_LIST [TUPLE [id: INTEGER; field: STRING_32]]
  184.             -- Last loaded data.
  185.  
  186. feature {NONE} -- Implementation
  187.  
  188.     print_sql_error_and_reset
  189.             -- Print current SQL error and reset status.
  190.         require
  191.             has_error: not session_control.is_ok
  192.         do
  193.             print ("%N" + session_control.error_message + "%N")
  194.             session_control.reset
  195.         ensure
  196.             reset: session_control.is_ok
  197.         end
  198.  
  199.     odbc_database: DATABASE_APPL [ODBC]
  200.             -- ODBC database handle.
  201.  
  202. invariant
  203.     session_control_not_void: is_connected implies session_control /= Void
  204.     change_not_void: is_connected implies change /= Void
  205.     selection_not_void: is_connected implies selection /= Void
  206.  
  207. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement