summaryrefslogtreecommitdiff
path: root/couchdb_functions
blob: cf6cb2b7c58fb5605fd6d2b2e32bb462afbac21d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# dump_db() and restore_db() rely on python-couchdb package, 
# python-couchdb =< 0.8-1 needs to be patched, see
# http://code.google.com/p/couchdb-python/issues/detail?id=194 


create_db () {
  local url=$1
  local db=$2
  $CURL -X PUT "${url}/${db}"
}

db_exists () {
  local url=$1
  local db=$2
  $CURL -X GET "${url}/${db}" | grep -q -v '{"error":"not_found"'
  return $?
}

delete_db () {
  local url=$1
  local db=$2
  $CURL -X DELETE "${url}/${db}"
}

delete_doc () {
  local url=$1
  local db=$2
  local doc=$3
  local latest_rev=`get_latest_rev $url $db $doc`
  $CURL -X DELETE "${url}/${db}/${doc}?rev=$latest_rev"
}

doc_exists () {
  local url=$1
  local db=$2
  local doc=$3
  $CURL -X GET "${url}/${db}/${doc}" | grep -q -v '{"error":"not_found"'
  return $?
}


dump_db () {
  local url=$1
  local db=$2
  local user=$3
  local pw=$4
  local dumpdir=$5

  [ -z $dumpdir ] && dumpdir='/var/backups/couchdb'
  
  echo "Dumping db \"$db\" to ${dumpdir}/$db"
  # couchdb-dump cmd is VERY slow, simply dumping _all_docs?include_docs=true 
  # to a file is faster with the factor ~60 (!)
  couchdb-dump -u $user -p $pw ${url}/$db > ${dumpdir}/$db #2>/dev/null

  # restoring from this will not include _design/User right
  #$CURL -X GET "${URL}/${db}/_all_docs?include_docs=true" > ${DUMPDIR}/$db

  echo "Dumping _security to ${DUMPDIR}/${db}_security"
  $CURL -X GET "${URL}/${db}/_security" > ${DUMPDIR}/${db}_security

  chmod 600 ${dumpdir}/${db}*
}

get_dbs () { 
  local url=$1
  local dbs="`$CURL -X GET "${url}/_all_dbs" | sed 's/[\[",]/ /g' | sed 's/]//'`"
  echo "$dbs"
}

get_security () {
  local url=$1
  local db=$2
  local security=`$CURL -X GET "${url}/${db}/_security"`
  echo $security
}

get_latest_rev () {
  local url=$1
  local db=$2
  local doc=$3
  local latest_rev=''
  latest_rev=`$CURL -X GET "${url}/${db}/${doc}" | sed 's/^.*"_rev":"//'|cut -d'"' -f 1`
  echo $latest_rev
}

replicate_db () {
  local url=$1
  local backend_url=$2
  local source_db=$3
  local target_db=$4
  local additional_opts=$5
  local task=''
  # old style replication, no status can be queried
  # -X POST http://localhost:5984/_replicate -d ' {"source": "http://admin:zyMM7LZMjGE2aUvJ5sH_8SraPuxB2H5L@localhost:5984/users", "target": "http://admin:zyMM7LZMjGE2aUvJ5sH_8SraPuxB2H5L@localhost:5984/users_replicated", "create_target": true }
  # netrcfile doesn't work with replicate, we need to use username + pw here
  #echo "Getting _security from $db"
  local security=`get_security $url $source_db` 

  create_db $url $target_db

  #echo "Set security for $tmpdb"
  set_security $url $target_db $security

  #echo "Replicating $db to $tmpdb"
  #$CURL -X POST ${BACKEND_URL}/_replicator -d " { \"_id\":  \"${source_db}_${target_db}\", \"source\": \"$auth_url/${source_db}\", \"target\": \"$auth_url/${target_db}\", \"create_target\": true $additional_opts }"
  task="${source_db}_${target_db}"
  $CURL -X POST ${BACKEND_URL}/_replicator -d " { \"_id\":  \"${task}\", \"source\": \"$auth_url/${source_db}\", \"target\": \"$auth_url/${target_db}\" $additional_opts }"
  
  #echo -e "\nGetting replication status of task \"$task\":"
  #$CURL -X GET ${BACKEND_URL}/_replicator/$task

  wait_for_complete_replication $backend_url
}

restore_db () {
  local url=$1
  local db=$2
  local user=$3
  local pw=$4
  local dumpdir=$5
  [ -z $dumpdir ] && dumpdir='/var/backups/couchdb'

  # restore with couchdb-load only works with an empty db
  db_exists $url $db && delete_db $url $db
  create_db $url $db
  
  $CURL -X PUT "${url}/${db}/_security" -d  @${dumpdir}/${db}_security
  
  couchdb-load -u $user -p $pw ${url}/$db <  ${dumpdir}/$db 

  # old style
  # $CURL -d @${dumpdir}/$db -X POST "${url}/${db}/_bulk_docs"
}

set_security () {
  local url=$1
  local db=$2
  local security=$3
  $CURL -X PUT "${url}/${db}/_security" -d $security
}

wait_for_complete_replication () {
  local backend_url=$1
  local uncomplete_tasks=1
  echo -e "\nWaiting for uncompleted replication tasks"
  while [ $uncomplete_tasks -gt 0 ]
  do
    uncomplete_tasks=`$CURL -X GET "${backend_url}/_replicator/_all_docs/?include_docs=true" | egrep -v '("_replication_state":"completed"|"id":"_design/_replicator"|{"total_rows":|^]}$)'|wc -l`
    sleep 1
  done
}