sws 0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. data/doc/DOC.otl +34 -0
  2. data/doc/Makefile +13 -0
  3. data/doc/architecture.dia +0 -0
  4. data/doc/docbook/architecture.png +0 -0
  5. data/doc/docbook/concepts.docbook +474 -0
  6. data/doc/docbook/installation.docbook +57 -0
  7. data/doc/docbook/introduction.docbook +130 -0
  8. data/doc/docbook/sws_manual.docbook +35 -0
  9. data/doc/docbook/todo.docbook +38 -0
  10. data/doc/docbook/tutorial.docbook +594 -0
  11. data/examples/README +1 -0
  12. data/examples/addressbook/CardBrowse/CardBrowse.html +43 -0
  13. data/examples/addressbook/CardBrowse/CardBrowse.rb +65 -0
  14. data/examples/addressbook/CardBrowse/CardBrowse.sws +92 -0
  15. data/examples/addressbook/Login/LoginPage.html +12 -0
  16. data/examples/addressbook/Login/LoginPage.rb +19 -0
  17. data/examples/addressbook/Login/LoginPage.sws +15 -0
  18. data/examples/addressbook/README +1 -0
  19. data/examples/addressbook/addressbook.rb +70 -0
  20. data/examples/addressbook/application.yaml +8 -0
  21. data/examples/addressbook/db.yaml +7 -0
  22. data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.html +11 -0
  23. data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.rb +21 -0
  24. data/examples/component_demo/CheckBoxDemo/CheckBoxDemo.sws +25 -0
  25. data/examples/component_demo/ComponentDemo.rb +21 -0
  26. data/examples/component_demo/ConditionalDemo/ConditionalDemo.html +18 -0
  27. data/examples/component_demo/ConditionalDemo/ConditionalDemo.rb +2 -0
  28. data/examples/component_demo/ConditionalDemo/ConditionalDemo.sws +22 -0
  29. data/examples/component_demo/FileUploadDemo/FileUploadDemo.html +10 -0
  30. data/examples/component_demo/FileUploadDemo/FileUploadDemo.rb +9 -0
  31. data/examples/component_demo/FileUploadDemo/FileUploadDemo.sws +33 -0
  32. data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.html +12 -0
  33. data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.rb +21 -0
  34. data/examples/component_demo/FormFieldsDemo/FormFieldsDemo.sws +40 -0
  35. data/examples/component_demo/FormListsDemo/FormListsDemo.html +11 -0
  36. data/examples/component_demo/FormListsDemo/FormListsDemo.rb +37 -0
  37. data/examples/component_demo/FormListsDemo/FormListsDemo.sws +47 -0
  38. data/examples/component_demo/GenericDemo/GenericDemo.html +4 -0
  39. data/examples/component_demo/GenericDemo/GenericDemo.rb +2 -0
  40. data/examples/component_demo/GenericDemo/GenericDemo.sws +10 -0
  41. data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.html +8 -0
  42. data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.rb +20 -0
  43. data/examples/component_demo/HyperlinkDemo/HyperlinkDemo.sws +19 -0
  44. data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.html +11 -0
  45. data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.rb +2 -0
  46. data/examples/component_demo/ImageLinkDemo/ImageLinkDemo.sws +14 -0
  47. data/examples/component_demo/PageWrapper/PageWrapper.html +23 -0
  48. data/examples/component_demo/PageWrapper/PageWrapper.rb +2 -0
  49. data/examples/component_demo/PageWrapper/PageWrapper.sws +42 -0
  50. data/examples/component_demo/README +1 -0
  51. data/examples/component_demo/RepetitionDemo/RepetitionDemo.html +13 -0
  52. data/examples/component_demo/RepetitionDemo/RepetitionDemo.rb +19 -0
  53. data/examples/component_demo/RepetitionDemo/RepetitionDemo.sws +20 -0
  54. data/examples/component_demo/StringDemo/StringDemo.html +5 -0
  55. data/examples/component_demo/StringDemo/StringDemo.rb +16 -0
  56. data/examples/component_demo/StringDemo/StringDemo.sws +14 -0
  57. data/examples/component_demo/application.yaml +28 -0
  58. data/examples/component_demo/poweredby.jpg +0 -0
  59. data/examples/component_demo/style.css +1 -0
  60. data/examples/movies/Menu/Menu.html +3 -0
  61. data/examples/movies/Menu/Menu.rb +7 -0
  62. data/examples/movies/Menu/Menu.sws +7 -0
  63. data/examples/movies/MovieBrowse/MovieBrowse.html +68 -0
  64. data/examples/movies/MovieBrowse/MovieBrowse.rb +178 -0
  65. data/examples/movies/MovieBrowse/MovieBrowse.sws +127 -0
  66. data/examples/movies/README +1 -0
  67. data/examples/movies/UserBrowse/UserBrowse.html +50 -0
  68. data/examples/movies/UserBrowse/UserBrowse.rb +69 -0
  69. data/examples/movies/UserBrowse/UserBrowse.sws +49 -0
  70. data/examples/movies/application.yaml +11 -0
  71. data/examples/movies/da.rb +36 -0
  72. data/examples/movies/dbmovies.rb +44 -0
  73. data/examples/movies/frameworks/TestFramework/framework.yaml +4 -0
  74. data/examples/movies/frameworks/TestFramework/resources/im1.jpg +0 -0
  75. data/examples/movies/images/pbr1b.jpg +0 -0
  76. data/examples/movies/movies.rb +28 -0
  77. data/examples/movies/movies.sds +119 -0
  78. data/examples/movies/movies.sqlite +0 -0
  79. data/examples/movies/movies_mysql.sql +28 -0
  80. data/examples/movies/movies_postgres.sql +27 -0
  81. data/examples/movies/movies_sqlite.sql +28 -0
  82. data/lib/sws.rb +89 -0
  83. data/lib/sws/Core/components/CheckBox/CheckBox.api +5 -0
  84. data/lib/sws/Core/components/CheckBox/CheckBox.rb +45 -0
  85. data/lib/sws/Core/components/CheckBoxList/CheckBoxList.api +13 -0
  86. data/lib/sws/Core/components/CheckBoxList/CheckBoxList.rb +54 -0
  87. data/lib/sws/Core/components/Conditional/Conditional.api +3 -0
  88. data/lib/sws/Core/components/Conditional/Conditional.html +1 -0
  89. data/lib/sws/Core/components/Conditional/Conditional.rb +39 -0
  90. data/lib/sws/Core/components/Conditional/Conditional.sws +2 -0
  91. data/lib/sws/Core/components/Content/Content.rb +18 -0
  92. data/lib/sws/Core/components/ExceptionPage/ExceptionPage.html +13 -0
  93. data/lib/sws/Core/components/ExceptionPage/ExceptionPage.rb +18 -0
  94. data/lib/sws/Core/components/ExceptionPage/ExceptionPage.sws +16 -0
  95. data/lib/sws/Core/components/FileUpload/FileUpload.api +16 -0
  96. data/lib/sws/Core/components/FileUpload/FileUpload.rb +62 -0
  97. data/lib/sws/Core/components/Form/Form.api +9 -0
  98. data/lib/sws/Core/components/Form/Form.html +3 -0
  99. data/lib/sws/Core/components/Form/Form.rb +55 -0
  100. data/lib/sws/Core/components/Form/Form.sws +12 -0
  101. data/lib/sws/Core/components/GenericContainer/GenericContainer.api +10 -0
  102. data/lib/sws/Core/components/GenericContainer/GenericContainer.html +1 -0
  103. data/lib/sws/Core/components/GenericContainer/GenericContainer.rb +39 -0
  104. data/lib/sws/Core/components/GenericContainer/GenericContainer.sws +12 -0
  105. data/lib/sws/Core/components/GenericElement/GenericElement.api +10 -0
  106. data/lib/sws/Core/components/GenericElement/GenericElement.rb +34 -0
  107. data/lib/sws/Core/components/HiddenField/HiddenField.api +7 -0
  108. data/lib/sws/Core/components/HiddenField/HiddenField.rb +37 -0
  109. data/lib/sws/Core/components/Hyperlink/Hyperlink.api +13 -0
  110. data/lib/sws/Core/components/Hyperlink/Hyperlink.html +1 -0
  111. data/lib/sws/Core/components/Hyperlink/Hyperlink.rb +102 -0
  112. data/lib/sws/Core/components/Hyperlink/Hyperlink.sws +12 -0
  113. data/lib/sws/Core/components/Image/Image.api +11 -0
  114. data/lib/sws/Core/components/Image/Image.rb +49 -0
  115. data/lib/sws/Core/components/ImageButton/ImageButton.api +16 -0
  116. data/lib/sws/Core/components/ImageButton/ImageButton.rb +76 -0
  117. data/lib/sws/Core/components/Link/Link.api +11 -0
  118. data/lib/sws/Core/components/Link/Link.rb +39 -0
  119. data/lib/sws/Core/components/PasswordField/PasswordField.api +7 -0
  120. data/lib/sws/Core/components/PasswordField/PasswordField.rb +41 -0
  121. data/lib/sws/Core/components/RadioButton/RadioButton.api +7 -0
  122. data/lib/sws/Core/components/RadioButton/RadioButton.rb +44 -0
  123. data/lib/sws/Core/components/RadioButtonList/RadioButtonList.api +20 -0
  124. data/lib/sws/Core/components/RadioButtonList/RadioButtonList.rb +76 -0
  125. data/lib/sws/Core/components/Repetition/Repetition.api +10 -0
  126. data/lib/sws/Core/components/Repetition/Repetition.html +1 -0
  127. data/lib/sws/Core/components/Repetition/Repetition.rb +137 -0
  128. data/lib/sws/Core/components/Repetition/Repetition.sws +2 -0
  129. data/lib/sws/Core/components/ResetButton/ResetButton.api +5 -0
  130. data/lib/sws/Core/components/ResetButton/ResetButton.rb +28 -0
  131. data/lib/sws/Core/components/Select/Select.api +24 -0
  132. data/lib/sws/Core/components/Select/Select.rb +57 -0
  133. data/lib/sws/Core/components/String/String.api +5 -0
  134. data/lib/sws/Core/components/String/String.rb +28 -0
  135. data/lib/sws/Core/components/SubmitButton/SubmitButton.api +6 -0
  136. data/lib/sws/Core/components/SubmitButton/SubmitButton.rb +53 -0
  137. data/lib/sws/Core/components/TextArea/TextArea.api +9 -0
  138. data/lib/sws/Core/components/TextArea/TextArea.rb +28 -0
  139. data/lib/sws/Core/components/TextField/TextField.api +9 -0
  140. data/lib/sws/Core/components/TextField/TextField.rb +46 -0
  141. data/lib/sws/Core/framework.yaml +25 -0
  142. data/lib/sws/JSComponents/components/JSMenu/JSMenu.api +5 -0
  143. data/lib/sws/JSComponents/components/JSMenu/JSMenu.html +58 -0
  144. data/lib/sws/JSComponents/components/JSMenu/JSMenu.rb +34 -0
  145. data/lib/sws/JSComponents/components/JSMenu/JSMenu.sws +37 -0
  146. data/lib/sws/JSComponents/framework.yaml +3 -0
  147. data/lib/sws/adaptor.rb +334 -0
  148. data/lib/sws/application.rb +604 -0
  149. data/lib/sws/component.rb +656 -0
  150. data/lib/sws/cookie.rb +27 -0
  151. data/lib/sws/direct_action.rb +38 -0
  152. data/lib/sws/extensions.rb +49 -0
  153. data/lib/sws/parsers.rb +374 -0
  154. data/lib/sws/request.rb +308 -0
  155. data/lib/sws/response.rb +70 -0
  156. data/lib/sws/session.rb +195 -0
  157. data/lib/sws/slot.rb +198 -0
  158. metadata +263 -0
@@ -0,0 +1 @@
1
+ This is quite a complicated example, which uses SDS database access and O-R mapping library (available at http://www.starware.one.pl/software/sds/index.html). The application goal is to manage a database of movie CDs. While it is far from complete, it gives an overview of SWS/SDS database applications.
@@ -0,0 +1,50 @@
1
+ <html>
2
+ <head>
3
+ <title>Folks browsing</title>
4
+ </head>
5
+ <body>
6
+ <!-- menu component -->
7
+ <span sws="menu"/>
8
+
9
+ <!-- main browsing table -->
10
+ <form sws="browse_form">
11
+ <table align="center" border="1">
12
+ <!-- header row -->
13
+ <tr>
14
+ <th>Name</th>
15
+ <th>Rented movies</th>
16
+ <th>Actions</th>
17
+ </tr>
18
+ <!-- user data row - wrapped in repetition, so it will appear several times -->
19
+ <span sws="user_repetition">
20
+ <tr>
21
+ <!-- name and number of movies rented by user -->
22
+ <td><span sws="cursor_name"/></td>
23
+ <td><span sws="cursor_rental_count"/></td>
24
+ <td>
25
+ <!-- action buttons -->
26
+ <input type="submit" sws="submit_delete"/>
27
+ <input type="submit" sws="submit_edit"/>
28
+ </td>
29
+ </tr>
30
+ </span>
31
+ <tr><td colspan="6" align="center"><input type="submit" sws="submit_add"/></td></tr>
32
+ </table>
33
+
34
+ </form>
35
+
36
+ <!-- edit form - appears only if @current_user is set -->
37
+ <span sws="conditional_current">
38
+ <form sws="edit_form">
39
+ <table align="center" border="1">
40
+
41
+ <!-- text field for user name -->
42
+ <tr><th>Name</th><td><input type="text" sws="current_name"/></td></tr>
43
+ <!-- save button -->
44
+ <tr><th></th><td><input type="submit" sws="submit_confirm"/></td></tr>
45
+ </table>
46
+ </form>
47
+ </span>
48
+
49
+ </body>
50
+ </html>
@@ -0,0 +1,69 @@
1
+ # Component representing user browsing page. You can also add, edit and delete users here
2
+
3
+ class UserBrowse < SWS::Component
4
+
5
+ attr_accessor :users, :user_cursor, :current_user
6
+
7
+
8
+ # Create new instance of component. Note that all args should be passed to super
9
+ def initialize (*args)
10
+
11
+ super( *args )
12
+ @context = SDS::Context.new( app().store )
13
+ @users = @context.fetch( "User" )
14
+
15
+ end
16
+
17
+
18
+ # Delete @user_cursor - this is the user in the line in which the "Delete" button
19
+ # was clicked. The method returns self, so the same component will serve the next
20
+ # request in this session
21
+ def delete_user ()
22
+
23
+ puts "Deleting user #{@user_cursor.name}"
24
+ @user_cursor.rentals.each { |rental| rental.movie.rented = 0 }
25
+ @context.delete( @user_cursor )
26
+ @context.save()
27
+ @users.delete( @user_cursor )# = @context.fetch( "User" )
28
+ return self
29
+
30
+ end
31
+
32
+
33
+ # Schedules a user for editing. Causes the edit table to appear. Returns self -
34
+ # serves next request
35
+ def edit_user ()
36
+
37
+ @current_user = @user_cursor
38
+ return self
39
+
40
+ end
41
+
42
+
43
+ # Creates new user - causes the edit table to appear. Note the new user is not
44
+ # immediately saved.
45
+ def add_user ()
46
+
47
+ @current_user = User.create( @context )
48
+ return self
49
+
50
+ end
51
+
52
+
53
+ # Returns true if a user has been selected
54
+ def has_current? ()
55
+ return @current_user != nil
56
+ end
57
+
58
+
59
+ # Saves the user being edited into database
60
+ def confirm_changes ()
61
+
62
+ @context.save()
63
+ @users = @context.fetch( "User" )
64
+ @current_user = nil
65
+ return self
66
+
67
+ end
68
+
69
+ end
@@ -0,0 +1,49 @@
1
+ menu:
2
+ _class: Menu
3
+
4
+ browse_form:
5
+ _class: SWS::Form
6
+
7
+ user_repetition:
8
+ _class: SWS::Repetition
9
+ list: users
10
+ item: user_cursor
11
+
12
+ cursor_name:
13
+ _class: SWS::String
14
+ value: user_cursor.name
15
+
16
+ cursor_rental_count:
17
+ _class: SWS::String
18
+ value: user_cursor.rentals.size
19
+
20
+ submit_delete:
21
+ _class: SWS::SubmitButton
22
+ value: "'Delete'"
23
+ action: delete_user
24
+
25
+ submit_edit:
26
+ _class: SWS::SubmitButton
27
+ value: "'Edit'"
28
+ action: edit_user
29
+
30
+ submit_add:
31
+ _class: SWS::SubmitButton
32
+ value: "'New user'"
33
+ action: add_user
34
+
35
+ conditional_current:
36
+ _class: SWS::Conditional
37
+ condition: has_current?
38
+
39
+ edit_form:
40
+ _class: SWS::Form
41
+
42
+ current_name:
43
+ _class: SWS::TextField
44
+ value: current_user.name
45
+
46
+ submit_confirm:
47
+ _class: SWS::SubmitButton
48
+ value: "'Save'"
49
+ action: confirm_changes
@@ -0,0 +1,11 @@
1
+ components:
2
+ UserBrowse: UserBrowse
3
+ MovieBrowse: MovieBrowse
4
+ Menu: Menu
5
+ frameworks:
6
+ Core: SYSTEM/sws/Core
7
+ TestFramework: frameworks/TestFramework
8
+ adaptor_class: SWS::Adaptor::Standalone
9
+ session_class: Session
10
+ default_component_class: MovieBrowse
11
+ default_encoding: iso-8859-2
@@ -0,0 +1,36 @@
1
+ class PageAction < SWS::DirectAction
2
+
3
+
4
+ def movie_action ( request )
5
+
6
+ component = SWS::Component.create( "MovieBrowse", request )
7
+ return component.process_request( request )
8
+
9
+ end
10
+
11
+
12
+ def user_action ( request )
13
+
14
+ component = SWS::Component.create( "UserBrowse", request )
15
+ return component.process_request( request )
16
+
17
+ end
18
+
19
+
20
+ def simple_action ( request )
21
+
22
+ response = SWS::Response.new( request )
23
+ response << <<-END
24
+ <html>
25
+ <head><title>Simple Action</title></head>
26
+ <body>
27
+ This is a result of a simple DirectAction
28
+ </body>
29
+ </html>
30
+ END
31
+
32
+ return nil, response
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ SDS::Store.get( "movies.sds" )
4
+
5
+ class Movie
6
+
7
+ include SDS::Object
8
+
9
+
10
+ def rented? ()
11
+ return self.rented == 1
12
+ end
13
+
14
+
15
+ def rental_state ()
16
+
17
+ if rented?
18
+ return "#{rentals.last.user.name}, at #{rentals.last.rental_date}"
19
+ else
20
+ return "Available"
21
+ end
22
+
23
+ end
24
+
25
+
26
+ def initialize ()
27
+ @rented = 0 if (@rented == nil)
28
+ end
29
+
30
+ end
31
+
32
+
33
+ class User
34
+
35
+ include SDS::Object
36
+
37
+ end
38
+
39
+
40
+ class Rental
41
+
42
+ include SDS::Object
43
+
44
+ end
@@ -0,0 +1,4 @@
1
+ resources:
2
+ im1.jpg:
3
+ filename: resources/im1.jpg
4
+ mime-type: image/jpg
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "sws"
4
+ require "sds"
5
+
6
+ require "dbmovies"
7
+ require "English"
8
+ require "da"
9
+
10
+ class Application < SWS::Application
11
+
12
+ attr_reader :store
13
+
14
+ def initialize ()
15
+ super()
16
+ @store = SDS::Store.get("movies.sds")
17
+ end
18
+
19
+ end
20
+
21
+ class Session < SWS::Session
22
+
23
+ end
24
+
25
+
26
+ application = Application.new()
27
+ application.run()
28
+
@@ -0,0 +1,119 @@
1
+ name: mysql
2
+ connection:
3
+ url: "DBI:SQLite:movies.sqlite"
4
+ user: "filmy"
5
+ password: "filmy"
6
+ adaptor: SQLite
7
+ entities:
8
+ Movie:
9
+ ruby_class: Movie
10
+ table_name: movie
11
+ attributes:
12
+ id_movie:
13
+ column_name: id
14
+ primary_key: true
15
+ ruby_type: Fixnum
16
+ column_type: integer
17
+ generate_value: true
18
+ size: 10
19
+ polish_title:
20
+ column_name: polish_title
21
+ ruby_type: String
22
+ column_type: varchar
23
+ size: 50
24
+ allows_null: false
25
+ english_title:
26
+ column_name: english_title
27
+ ruby_type: String
28
+ column_type: varchar
29
+ size: 50
30
+ allows_null: false
31
+ cd_count:
32
+ column_name: cd_count
33
+ ruby_type: Fixnum
34
+ column_type: integer
35
+ size: 2
36
+ allows_null: false
37
+ description:
38
+ column_name: description
39
+ ruby_type: String
40
+ column_type: varchar
41
+ allows_null: true
42
+ size: 250
43
+ rented:
44
+ column_name: rented
45
+ column_type: integer
46
+ ruby_type: Fixnum
47
+ allows_null: false
48
+ relationships:
49
+ rentals:
50
+ type: to-many
51
+ source_attribute: id_movie
52
+ destination_attribute: id_movie
53
+ destination_entity: Rental
54
+ delete_rule: cascade
55
+ User:
56
+ ruby_class: User
57
+ table_name: user
58
+ attributes:
59
+ id_user:
60
+ column_name: id
61
+ column_type: integer
62
+ ruby_type: Fixnum
63
+ primary_key: true
64
+ generate_value: true
65
+ size: 10
66
+ name:
67
+ column_name: name
68
+ column_type: varchar
69
+ ruby_type: String
70
+ size: 100
71
+ allows_null: false
72
+ relationships:
73
+ rentals:
74
+ type: to-many
75
+ source_attribute: id_user
76
+ destination_attribute: id_user
77
+ destination_entity: Rental
78
+ delete_rule: cascade
79
+ Rental:
80
+ ruby_class: Rental
81
+ table_name: rental
82
+ attributes:
83
+ id_user:
84
+ column_name: id_user
85
+ column_type: integer
86
+ ruby_type: Fixnum
87
+ size: 10
88
+ allows_null: false
89
+ primary_key: true
90
+ id_movie:
91
+ column_name: id_movie
92
+ column_type: integer
93
+ ruby_type: Fixnum
94
+ size: 10
95
+ allows_null: false
96
+ primary_key: true
97
+ rental_date:
98
+ column_name: rental_date
99
+ column_type: date
100
+ ruby_type: Date
101
+ allows_null: false
102
+ return_date:
103
+ column_name: return_date
104
+ column_type: date
105
+ ruby_type: Date
106
+ allows_null: true
107
+ relationships:
108
+ movie:
109
+ type: to-one
110
+ source_attribute: id_movie
111
+ destination_attribute: id_movie
112
+ destination_entity: Movie
113
+ delete_rule: nullify
114
+ user:
115
+ type: to-one
116
+ source_attribute: id_user
117
+ destination_attribute: id_user
118
+ destination_entity: User
119
+ delete_rule: nullify
@@ -0,0 +1,28 @@
1
+ create table _pk_support (table_name varchar(250), pk integer(10)) type=InnoDB;
2
+ create table rental (
3
+ id_movie integer(10) NOT NULL,
4
+ id_user integer(10) NOT NULL,
5
+ return_date date,
6
+ rental_date date NOT NULL,
7
+ primary key ( id_movie,id_user )
8
+ ) TYPE = InnoDB;
9
+ create table user (
10
+ name varchar(100) NOT NULL,
11
+ id integer(10) NOT NULL,
12
+ primary key ( id )
13
+ ) TYPE = InnoDB;
14
+ insert into _pk_support (table_name,pk) values ('user',1);
15
+ create table movie (
16
+ id integer(10) NOT NULL,
17
+ english_title varchar(50) NOT NULL,
18
+ rented integer NOT NULL,
19
+ description varchar(250) NOT NULL,
20
+ cd_count integer(2) NOT NULL,
21
+ polish_title varchar(50) NOT NULL,
22
+ primary key ( id )
23
+ ) TYPE = InnoDB;
24
+ insert into _pk_support (table_name,pk) values ('movie',1);
25
+ create index rental_user on rental (id_user);
26
+ alter table rental add constraint fk_rental_user foreign key (id_user) references user (id);
27
+ create index rental_movie on rental (id_movie);
28
+ alter table rental add constraint fk_rental_movie foreign key (id_movie) references movie (id);