nitro 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS +3 -0
- data/ChangeLog +83 -0
- data/LICENCE +8 -8
- data/README +5 -1
- data/RELEASES +9 -0
- data/Rakefile +43 -23
- data/bin/cluster.rb +15 -12
- data/examples/ndb/README +5 -0
- data/examples/ndb/run.rb +271 -0
- data/examples/simple/README +27 -0
- data/examples/simple/app.rb +2 -2
- data/examples/simple/conf/config.rb +3 -8
- data/examples/simple/conf/debug-config.rb +6 -7
- data/examples/simple/conf/live-config.rb +2 -4
- data/examples/simple/conf/requires.rb +2 -10
- data/examples/simple/ctl +1 -1
- data/examples/simple/env.rb +2 -2
- data/examples/simple/root/article-form.ss +1 -1
- data/examples/simple/root/comments-form.ss +1 -1
- data/examples/tiny/README +15 -0
- data/examples/tiny/app.rb +2 -2
- data/examples/tiny/conf/config.rb +8 -13
- data/examples/tiny/conf/requires.rb +2 -8
- data/examples/tiny/ctl +2 -17
- data/examples/tiny/root/index.sx +1 -1
- data/lib/n/app/cluster.rb +15 -12
- data/lib/n/app/cookie.rb +10 -9
- data/lib/n/app/filters/autologin.rb +5 -4
- data/lib/n/app/fragment.rb +13 -10
- data/lib/n/app/handlers.rb +29 -22
- data/lib/n/app/handlers/code-handler.rb +2 -4
- data/lib/n/app/handlers/page-handler.rb +3 -5
- data/lib/n/app/request-part.rb +2 -7
- data/lib/n/app/request.rb +27 -22
- data/lib/n/app/script.rb +4 -15
- data/lib/n/app/server.rb +11 -7
- data/lib/n/app/session.rb +7 -11
- data/lib/n/app/user.rb +10 -11
- data/lib/n/app/webrick-servlet.rb +23 -10
- data/lib/n/app/webrick.rb +13 -10
- data/lib/n/application.rb +13 -6
- data/lib/n/config.rb +18 -7
- data/lib/n/db.rb +56 -40
- data/lib/n/db/connection.rb +18 -22
- data/lib/n/db/managed.rb +6 -8
- data/lib/n/db/mixins.rb +4 -7
- data/lib/n/db/mysql.rb +6 -3
- data/lib/n/db/psql.rb +15 -10
- data/lib/n/db/tools.rb +5 -9
- data/lib/n/db/utils.rb +11 -8
- data/lib/n/events.rb +14 -10
- data/lib/n/logger.rb +8 -2
- data/lib/n/macros.rb +5 -2
- data/lib/n/parts.rb +13 -10
- data/lib/n/properties.rb +17 -12
- data/lib/n/server.rb +3 -2
- data/lib/n/server/filter.rb +2 -4
- data/lib/n/shaders.rb +11 -13
- data/lib/n/sitemap.rb +23 -20
- data/lib/n/std.rb +15 -4
- data/lib/n/sync/clc.rb +4 -2
- data/lib/n/sync/handler.rb +20 -12
- data/lib/n/sync/server.rb +24 -18
- data/lib/n/ui/date-select.rb +2 -4
- data/lib/n/ui/pager.rb +10 -8
- data/lib/n/ui/popup.rb +5 -4
- data/lib/n/ui/select.rb +3 -4
- data/lib/n/ui/tabs.rb +3 -4
- data/lib/n/utils/array.rb +6 -14
- data/lib/n/utils/cache.rb +3 -7
- data/lib/n/utils/gfx.rb +5 -6
- data/lib/n/utils/hash.rb +7 -12
- data/lib/n/utils/html.rb +8 -4
- data/lib/n/utils/http.rb +10 -6
- data/lib/n/utils/mail.rb +6 -6
- data/lib/n/utils/number.rb +3 -4
- data/lib/n/utils/pool.rb +5 -8
- data/lib/n/utils/string.rb +12 -10
- data/lib/n/utils/template.rb +3 -5
- data/lib/n/utils/time.rb +7 -5
- data/lib/n/utils/uri.rb +5 -4
- data/lib/p/README +1 -0
- data/lib/xsl/xforms.xsl +2 -0
- data/test/n/app/tc_cookie.rb +34 -0
- data/test/n/app/tc_request.rb +70 -0
- data/test/n/app/tc_requestpart.rb +28 -0
- data/test/n/app/tc_session.rb +34 -0
- data/test/n/tc_db.rb +223 -0
- data/test/n/tc_db_mysql.rb +241 -0
- data/test/n/tc_events.rb +44 -0
- data/test/n/tc_properties.rb +68 -0
- data/test/n/tc_sitemap.rb +37 -0
- data/test/n/ui/tc_pager.rb +52 -0
- data/test/n/utils/tc_cache.rb +47 -0
- data/test/n/utils/tc_hash.rb +39 -0
- data/test/n/utils/tc_html.rb +79 -0
- data/test/n/utils/tc_http.rb +18 -0
- data/test/n/utils/tc_number.rb +21 -0
- data/test/n/utils/tc_strings.rb +149 -0
- data/test/n/utils/tc_uri.rb +100 -0
- metadata +49 -22
- data/doc/css.txt +0 -20
- data/doc/ideas.txt +0 -120
- data/doc/pg.txt +0 -47
- data/doc/svn.txt +0 -82
- data/doc/todo.txt +0 -30
- data/examples/simple/conf/overrides.rb +0 -9
- data/examples/simple/logs/access_log +0 -2
- data/examples/simple/logs/apache.log +0 -3
- data/examples/simple/logs/app.log +0 -1
- data/examples/simple/logs/events.log +0 -1
- data/examples/tiny/conf/apache.conf +0 -100
- data/examples/tiny/logs/access_log +0 -9
- data/examples/tiny/logs/apache.log +0 -9
- data/lib/n/db/make-release.sh +0 -26
- data/lib/n/tools/README +0 -11
- data/lib/xsl/ce.xsl +0 -30
- data/lib/xsl/localization.xsl +0 -23
- data/test/run.rb +0 -95
data/AUTHORS
CHANGED
data/ChangeLog
CHANGED
|
@@ -1,5 +1,88 @@
|
|
|
1
|
+
25-10-2004 George Moschovitis <gm@navel.gr>
|
|
2
|
+
|
|
3
|
+
* test cases pass again.
|
|
4
|
+
|
|
5
|
+
* lib/n/app/webrick-servlet.rb: fixed bug with default index,
|
|
6
|
+
better handler selection.
|
|
7
|
+
|
|
8
|
+
* lib/n/db/utils.rb: prepend _ before tables. it was dangerous!
|
|
9
|
+
|
|
10
|
+
* lib/n/db.rb: wrap drop table.
|
|
11
|
+
|
|
12
|
+
* lib/n/db/psql.rb: use Base64.decode64.
|
|
13
|
+
|
|
14
|
+
* examples/ndb/rub.rb: implemented.
|
|
15
|
+
|
|
16
|
+
23-10-2004 George Moschovitis <gm@navel.gr>
|
|
17
|
+
|
|
18
|
+
* examples/ndb/*: introduced.
|
|
19
|
+
|
|
20
|
+
* lib/n/app/webrick-servlet.rb (#create_request): enforce default
|
|
21
|
+
index if missing.
|
|
22
|
+
|
|
23
|
+
* lib/n/config.rb: index_filename renamed from $srv_default_file.
|
|
24
|
+
|
|
25
|
+
* lib/n/utils/string.rb (#extension_from_path): returns nil if no
|
|
26
|
+
exception.
|
|
27
|
+
|
|
28
|
+
* lib/n/app/server.rb: info msg on start to let the admin know,
|
|
29
|
+
the server has started.
|
|
30
|
+
|
|
31
|
+
* lib/n/app/webrick.rb: extend from App::Server.
|
|
32
|
+
|
|
33
|
+
* examples/tiny/ctl: run without apache.
|
|
34
|
+
* examples/tiny/conf/config.rb: run without apache.
|
|
35
|
+
|
|
36
|
+
* examples/simple/README: improved.
|
|
37
|
+
|
|
38
|
+
22-10-2004 George Moschovitis <gm@navel.gr>
|
|
39
|
+
|
|
40
|
+
* README: updated.
|
|
41
|
+
|
|
42
|
+
* fixed many file permissions.
|
|
43
|
+
|
|
44
|
+
* examples/simple/conf/config.rb: fixes.
|
|
45
|
+
|
|
46
|
+
* examples/simple/app.rb: fixes.
|
|
47
|
+
|
|
48
|
+
* test/*: copied all tests here,
|
|
49
|
+
too many fixes to list to make all tests pass again.
|
|
50
|
+
|
|
51
|
+
* Rakefile: fixed :install,
|
|
52
|
+
TestTask.
|
|
53
|
+
|
|
54
|
+
* lib/n/tools: removed.
|
|
55
|
+
|
|
56
|
+
* lib/n/app/request.rb: params alias for parameters.
|
|
57
|
+
|
|
58
|
+
* lib/xsl/ce.xsl: removed, not ready.
|
|
59
|
+
|
|
60
|
+
* lib/xsl/localization.xsl: deprecated.
|
|
61
|
+
|
|
62
|
+
* no need for action=#{request.uri} in forms.
|
|
63
|
+
|
|
64
|
+
* improved RDoc documentation to many, many souce files.
|
|
65
|
+
|
|
1
66
|
21-10-2004 George Moschovitis <gm@navel.gr>
|
|
2
67
|
|
|
68
|
+
* lib/n/db/make-release.sh: removed.
|
|
69
|
+
|
|
70
|
+
* improved RDoc documentation to many, many, many source files.
|
|
71
|
+
|
|
72
|
+
* lib/n/app/user.rb (AnonymousUser#role?): introduced.
|
|
73
|
+
|
|
74
|
+
* lib/n/db/utils.rb (#write_prop): use base64 encoding.
|
|
75
|
+
|
|
76
|
+
* lib/n/db/psql.rb (#read_prop): use base64 encoding.
|
|
77
|
+
|
|
78
|
+
* Rakefile: added dependency for postgres-0.7.1
|
|
79
|
+
|
|
80
|
+
* doc/*: moved many txt files to the gen/doc directory.
|
|
81
|
+
|
|
82
|
+
21-10-2004 George Moschovitis <gm@navel.gr>
|
|
83
|
+
|
|
84
|
+
* --- VERSION 0.1.2 ---
|
|
85
|
+
|
|
3
86
|
* README: final changes before the release.
|
|
4
87
|
|
|
5
88
|
20-10-2004 George Moschovitis <gm@navel.gr>
|
data/LICENCE
CHANGED
|
@@ -7,16 +7,16 @@ Redistribution and use in source and binary forms, with or without
|
|
|
7
7
|
modification, are permitted provided that the following conditions are
|
|
8
8
|
met:
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
* Redistributions of source code must retain the above copyright
|
|
11
|
+
notice, this list of conditions and the following disclaimer.
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
* Redistributions in binary form must reproduce the above copyright
|
|
14
|
+
notice, this list of conditions and the following disclaimer in the
|
|
15
|
+
documentation and/or other materials provided with the distribution.
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
* Neither the name of Navel nor the names of its contributors may be
|
|
18
|
+
used to endorse or promote products derived from this software
|
|
19
|
+
without specific prior written permission.
|
|
20
20
|
|
|
21
21
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
22
22
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
data/README
CHANGED
data/RELEASES
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
|
|
2
|
+
== Version 0.2.0 was released on 25/10/2004.
|
|
3
|
+
|
|
4
|
+
Greatly improved RDoc documentation. Cleaned up many source files,
|
|
5
|
+
and improved the directory structure to be more compatible with
|
|
6
|
+
other Ruby projects. Introduced a test suite. Important bug fixes
|
|
7
|
+
in NDB. Tiny example no longer requires apache so sholud run out
|
|
8
|
+
of the box.
|
|
9
|
+
|
|
10
|
+
|
|
2
11
|
== Version 0.1.2 was released on 21/10/2004.
|
|
3
12
|
|
|
4
13
|
The first public version. Features 2 examples and limited
|
data/Rakefile
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
|
|
9
9
|
require "rake"
|
|
10
10
|
require "rake/rdoctask"
|
|
11
|
-
require "rubygems"
|
|
12
11
|
require "rake/gempackagetask"
|
|
12
|
+
require "rake/testtask"
|
|
13
|
+
require "rubygems"
|
|
13
14
|
|
|
14
15
|
require "lib/n/config"
|
|
15
16
|
|
|
@@ -20,9 +21,28 @@ task :default => :package
|
|
|
20
21
|
|
|
21
22
|
# ----------------------------------------------------------------------
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
# Run the tests
|
|
25
|
+
|
|
26
|
+
Rake::TestTask.new do |t|
|
|
27
|
+
t.libs << "test"
|
|
28
|
+
t.test_files = FileList["test/**/tc*.rb"].exclude("**/tc*db*.rb")
|
|
29
|
+
t.verbose = true
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Run all tests
|
|
33
|
+
|
|
34
|
+
Rake::TestTask.new(:test_all) do |t|
|
|
35
|
+
t.libs << "test"
|
|
36
|
+
t.test_files = FileList["test/**/tc*.rb"].exclude("**/tc*mysql*.rb")
|
|
37
|
+
t.verbose = true
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Run experimental tests
|
|
41
|
+
|
|
42
|
+
Rake::TestTask.new(:test_exp) do |t|
|
|
43
|
+
t.libs << "test"
|
|
44
|
+
t.test_files = FileList["test/**/tc*.rb"]
|
|
45
|
+
t.verbose = true
|
|
26
46
|
end
|
|
27
47
|
|
|
28
48
|
# ----------------------------------------------------------------------
|
|
@@ -37,30 +57,30 @@ end
|
|
|
37
57
|
|
|
38
58
|
PKG_VERSION = $srv_version
|
|
39
59
|
PKG_FILES = FileList[
|
|
40
|
-
"[A-Z]*", "{bin,etc,examples,doc,lib,test}/**/*"
|
|
60
|
+
"[A-Z]*", "{bin,etc,ext,examples,doc,lib,test}/**/*"
|
|
41
61
|
# "examples/*.rb"
|
|
42
62
|
].exclude(".svn/**/*")
|
|
43
63
|
|
|
44
64
|
spec = Gem::Specification.new do |s|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
s.name = "nitro"
|
|
66
|
+
s.version = PKG_VERSION
|
|
67
|
+
s.summary = "Web Engine"
|
|
68
|
+
s.description = "An efficient, yet simple engine for Web Applications"
|
|
69
|
+
s.add_dependency("postgres", ">= 0.7.1")
|
|
70
|
+
s.add_dependency("extensions", ">= 0.5")
|
|
71
|
+
s.required_ruby_version = ">= 1.8.1"
|
|
72
|
+
s.files = PKG_FILES.to_a
|
|
73
|
+
s.require_path = "lib"
|
|
74
|
+
s.autorequire = "n/std"
|
|
75
|
+
s.has_rdoc = true
|
|
76
|
+
s.extra_rdoc_files = FileList["[A-Z]*"].to_a
|
|
77
|
+
s.rdoc_options << "--main" << "README" << "--title" << "Nitro Documentation"
|
|
78
|
+
s.test_files = []
|
|
59
79
|
s.bindir = "bin"
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
80
|
+
s.author = "George Moschovitis"
|
|
81
|
+
s.email = "gm@navel.gr"
|
|
82
|
+
s.homepage = "http://www.navel.gr/nitro"
|
|
83
|
+
s.rubyforge_project = "nitro"
|
|
64
84
|
end
|
|
65
85
|
|
|
66
86
|
Rake::GemPackageTask.new(spec) do |pkg|
|
data/bin/cluster.rb
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
# TODO: use Sync instead of Monitor
|
|
4
|
-
#
|
|
5
|
-
# code:: gmosx
|
|
1
|
+
# code:
|
|
2
|
+
# * George Moschovitis <gm@navel.gr>
|
|
6
3
|
#
|
|
7
4
|
# (c) 2004 Navel, all rights reserved.
|
|
8
|
-
# $Id: cluster.rb
|
|
5
|
+
# $Id: cluster.rb 104 2004-10-22 13:35:03Z gmosx $
|
|
9
6
|
|
|
10
|
-
$:.unshift "
|
|
7
|
+
$:.unshift "lib"
|
|
11
8
|
|
|
12
9
|
require "drb"
|
|
13
10
|
require "monitor"
|
|
@@ -21,16 +18,20 @@ module N
|
|
|
21
18
|
|
|
22
19
|
# = Cluster
|
|
23
20
|
#
|
|
24
|
-
# A Cluster
|
|
25
|
-
# servers and distributes the state. An older version
|
|
26
|
-
# system, ie: the servers polled the cluster to
|
|
27
|
-
# version uses a push system, ie when the
|
|
28
|
-
# is pushed to the clients.
|
|
21
|
+
# A Cluster manages the state of a collection of servers. The cluster
|
|
22
|
+
# synchronizes the servers and distributes the state. An older version
|
|
23
|
+
# used a polling system, ie: the servers polled the cluster to
|
|
24
|
+
# obtain the state. This version uses a push system, ie when the
|
|
25
|
+
# state is changed a delta is pushed to the clients.
|
|
26
|
+
#
|
|
27
|
+
# TODO: use Sync instead of Monitor
|
|
29
28
|
#
|
|
30
29
|
class Cluster < N::Application
|
|
31
30
|
|
|
32
31
|
# = CHash ClusterHash
|
|
33
32
|
#
|
|
33
|
+
# The CHash 'endpoint' resides in the Cluster server
|
|
34
|
+
#
|
|
34
35
|
class CHash < Hash
|
|
35
36
|
attr :mon
|
|
36
37
|
|
|
@@ -111,6 +112,8 @@ class Cluster < N::Application
|
|
|
111
112
|
|
|
112
113
|
# = SHash ServerHash
|
|
113
114
|
#
|
|
115
|
+
# The SHash 'endpoint' resides in the App server
|
|
116
|
+
#
|
|
114
117
|
class SHash < Hash
|
|
115
118
|
attr :mon
|
|
116
119
|
|
data/examples/ndb/README
ADDED
data/examples/ndb/run.rb
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# = NDB Example
|
|
2
|
+
#
|
|
3
|
+
# A simple example to demonstrate the NDB library.
|
|
4
|
+
# Ignore the errors marked as surpressed.
|
|
5
|
+
#
|
|
6
|
+
# code:
|
|
7
|
+
# * George Moschovitis <gm@navel.gr>
|
|
8
|
+
#
|
|
9
|
+
# (c) 2004 Navel, all rights reserved.
|
|
10
|
+
# $Id: run.rb 106 2004-10-25 11:31:11Z gmosx $
|
|
11
|
+
|
|
12
|
+
$:.unshift "../../lib"
|
|
13
|
+
|
|
14
|
+
require "n/std"
|
|
15
|
+
require "n/logger"
|
|
16
|
+
require "n/db"
|
|
17
|
+
|
|
18
|
+
# = A parent class
|
|
19
|
+
#
|
|
20
|
+
class Article
|
|
21
|
+
manage {
|
|
22
|
+
# include some Mixins to 'synthesize' the class.
|
|
23
|
+
include N::Entity
|
|
24
|
+
include N::CreateTime
|
|
25
|
+
|
|
26
|
+
prop_accessor String, :title
|
|
27
|
+
prop_accessor String, :body
|
|
28
|
+
# override the default O->R mapping
|
|
29
|
+
prop_accessor Fixnum, "smallint DEFAULT 1", :level
|
|
30
|
+
# store a Ruby Hash in the Database. Marshal
|
|
31
|
+
# is used for serializing the attribute.
|
|
32
|
+
prop_accessor Hash, :options
|
|
33
|
+
}
|
|
34
|
+
# this attribute is NOT stored in the db.
|
|
35
|
+
attr_accessor :other_options
|
|
36
|
+
|
|
37
|
+
# Managed object constructors with no args, take *args
|
|
38
|
+
# as parameter to allow for Mixin chaining.
|
|
39
|
+
#
|
|
40
|
+
def initialize(title = nil, body = nil)
|
|
41
|
+
# call the constructors of the mixins
|
|
42
|
+
super
|
|
43
|
+
@title, @body = title, body
|
|
44
|
+
options = {}
|
|
45
|
+
other_options = {}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def to_s
|
|
49
|
+
return "#@title: #@body"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# = Another Parent class
|
|
54
|
+
#
|
|
55
|
+
class User
|
|
56
|
+
manage {
|
|
57
|
+
include N::Entity
|
|
58
|
+
include N::Named
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
def initialize(name = nil)
|
|
62
|
+
@name = name
|
|
63
|
+
# can be called afterwards if you want.
|
|
64
|
+
super
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def to_s
|
|
68
|
+
return @name
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# = A child class
|
|
73
|
+
#
|
|
74
|
+
class Comment
|
|
75
|
+
manage {
|
|
76
|
+
# include some Mixins to 'synthesize' the class.
|
|
77
|
+
# This way we get OO sql table definitions.
|
|
78
|
+
include N::Entity
|
|
79
|
+
include N::Child
|
|
80
|
+
# by including this mixin the object can be attached
|
|
81
|
+
# to different parents.
|
|
82
|
+
include N::ParentClass
|
|
83
|
+
include N::CreateTime
|
|
84
|
+
|
|
85
|
+
prop_accessor String, :body
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
def initialize(body = nil)
|
|
89
|
+
super
|
|
90
|
+
@body = body
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def to_s
|
|
94
|
+
return @body
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# = Another child class
|
|
99
|
+
#
|
|
100
|
+
class DummyChild
|
|
101
|
+
manage {
|
|
102
|
+
include N::Entity
|
|
103
|
+
include N::Child
|
|
104
|
+
|
|
105
|
+
prop_accessor String, :body
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
def initialize(body = nil)
|
|
109
|
+
super
|
|
110
|
+
@body = body
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def to_s
|
|
114
|
+
return @body
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Initialize a logger.
|
|
119
|
+
|
|
120
|
+
$log = Logger.new(STDERR);
|
|
121
|
+
|
|
122
|
+
# Intialize NDB
|
|
123
|
+
|
|
124
|
+
begin
|
|
125
|
+
$db = N::Db.new(
|
|
126
|
+
:address => "localhost",
|
|
127
|
+
:database => "test",
|
|
128
|
+
:user => "postgres",
|
|
129
|
+
:password => "navelrulez",
|
|
130
|
+
:connection_count => 5
|
|
131
|
+
)
|
|
132
|
+
rescue => ex
|
|
133
|
+
puts "Database 'test' does not exist"
|
|
134
|
+
puts "Create a new database with the following command: "
|
|
135
|
+
puts "$ createdb test -U postgres"
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Cleanup the database for earlier executions
|
|
139
|
+
|
|
140
|
+
$db.drop_table(Article)
|
|
141
|
+
$db.drop_table(Comment)
|
|
142
|
+
|
|
143
|
+
# Create some articles
|
|
144
|
+
|
|
145
|
+
a1 = Article.new("Title1", "Body1")
|
|
146
|
+
# by adding the managed object to the $db virtual array you denote
|
|
147
|
+
# that this object should be managed.
|
|
148
|
+
$db << a1
|
|
149
|
+
|
|
150
|
+
a2 = Article.new("Title2", "Body2")
|
|
151
|
+
$db << a2
|
|
152
|
+
|
|
153
|
+
puts "\n\n"
|
|
154
|
+
puts "Ignore the errors, NDB automatically initialized the schema"
|
|
155
|
+
|
|
156
|
+
# Until now we use $db as a helper. From now on we 'll explicitly
|
|
157
|
+
# require a connection to the db. The standard block idiom is used.
|
|
158
|
+
# You can also use the $db.xxx helpers if you just want to execute
|
|
159
|
+
# one command.
|
|
160
|
+
|
|
161
|
+
$db.open { |db|
|
|
162
|
+
|
|
163
|
+
puts "\n\n"
|
|
164
|
+
puts "* Get and print all articles:"
|
|
165
|
+
articles = db.get_all(Article)
|
|
166
|
+
articles.each { |a| puts a }
|
|
167
|
+
|
|
168
|
+
puts "\n\n"
|
|
169
|
+
puts "* Print all children of the root (oid = -1) of class Aritcle:"
|
|
170
|
+
articles = db.children(-1, Article)
|
|
171
|
+
articles.each { |a| puts a }
|
|
172
|
+
|
|
173
|
+
# Create some comments
|
|
174
|
+
|
|
175
|
+
c1 = Comment.new("Comment 1")
|
|
176
|
+
c1.set_parent(a1)
|
|
177
|
+
$db << c1
|
|
178
|
+
|
|
179
|
+
c2 = Comment.new("Comment 2")
|
|
180
|
+
# alternative way to set the parent.
|
|
181
|
+
c2.pid = a1.oid
|
|
182
|
+
$db << c2
|
|
183
|
+
|
|
184
|
+
c3 = Comment.new("Comment 3")
|
|
185
|
+
# alternative way to set the parent.
|
|
186
|
+
c3.pid = a1.oid
|
|
187
|
+
$db << c3
|
|
188
|
+
|
|
189
|
+
puts "\n\n"
|
|
190
|
+
puts "* Print all all comments for article 1:"
|
|
191
|
+
comments = db.children(a1, Comment)
|
|
192
|
+
comments.each { |c| puts c }
|
|
193
|
+
|
|
194
|
+
# Most NDB commands allow you to fine-tune the low level
|
|
195
|
+
# SQL code by passing extra_sql parameters, here is an
|
|
196
|
+
# example
|
|
197
|
+
puts "\n\n"
|
|
198
|
+
puts "* comments with sql finetunings:"
|
|
199
|
+
# use a standard SQL limit clause
|
|
200
|
+
comments = db.children(a1, Comment, "LIMIT 2")
|
|
201
|
+
comments.each { |c| puts c }
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
# Change a managed object
|
|
205
|
+
a1.title = "Changed Title"
|
|
206
|
+
# NDB knows that this is a managed object and executes
|
|
207
|
+
# an SQL UPDATE instead of an SQL INSERT
|
|
208
|
+
$db << a1
|
|
209
|
+
|
|
210
|
+
puts "\n\n"
|
|
211
|
+
db.get_all(Article).each { |a| puts a }
|
|
212
|
+
|
|
213
|
+
# The previous command updates the whole object. It is used
|
|
214
|
+
# when there are many updates or you dont care about speed.
|
|
215
|
+
# To update only specific fields use pupdate or properties_update
|
|
216
|
+
db.pupdate("title='A specific title'", a2)
|
|
217
|
+
|
|
218
|
+
puts "\n\n"
|
|
219
|
+
db.get_all(Article).each { |a| puts a }
|
|
220
|
+
|
|
221
|
+
# delete an object
|
|
222
|
+
db.delete(c3)
|
|
223
|
+
|
|
224
|
+
puts "\n\n"
|
|
225
|
+
db.get_all(Comment).each { |a| puts a }
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# Serialize a hash
|
|
229
|
+
a1.options = { "k1" => "val1", "k2" => "val2" }
|
|
230
|
+
db << a1
|
|
231
|
+
|
|
232
|
+
# lookup an object
|
|
233
|
+
article = db.get(a1.oid, Article)
|
|
234
|
+
|
|
235
|
+
puts "\n\n"
|
|
236
|
+
puts article.options.inspect
|
|
237
|
+
|
|
238
|
+
# attach another class of child objects to Article:
|
|
239
|
+
|
|
240
|
+
d1 = DummyChild.new("hello")
|
|
241
|
+
d1.set_parent(a1)
|
|
242
|
+
db << d1
|
|
243
|
+
|
|
244
|
+
d1 = DummyChild.new("world")
|
|
245
|
+
d1.set_parent(a1)
|
|
246
|
+
db << d1
|
|
247
|
+
|
|
248
|
+
# Show the dummy children and not the comments.
|
|
249
|
+
|
|
250
|
+
dummies = db.children(a1, DummyChild)
|
|
251
|
+
dummies.each { |d| puts d }
|
|
252
|
+
|
|
253
|
+
# And now something cool: We attach the Comment objects to different
|
|
254
|
+
# parents
|
|
255
|
+
|
|
256
|
+
u = User.new("gmosx")
|
|
257
|
+
db << u
|
|
258
|
+
|
|
259
|
+
c4 = Comment.new("Comment 4")
|
|
260
|
+
c4.set_parent(u)
|
|
261
|
+
$db << c4
|
|
262
|
+
|
|
263
|
+
c5 = Comment.new("Comment 5")
|
|
264
|
+
c5.set_parent(u)
|
|
265
|
+
$db << c5
|
|
266
|
+
|
|
267
|
+
comments = db.children(u, Comment)
|
|
268
|
+
comments.each { |c| puts c }
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
|